001package Torello.Java.JSON;
002
003import Torello.Java.StringParse;
004import Torello.Java.UnreachableError;
005
006import Torello.Java.Additional.Ret3;
007import Torello.Java.Additional.EffectivelyFinal;
008import Torello.Java.Additional.Counter;
009
010import Torello.Java.Function.ToByteFunction;
011import Torello.Java.Function.ToFloatFunction;
012import Torello.Java.Function.ToShortFunction;
013
014import Torello.JavaDoc.StaticFunctional;
015import Torello.JavaDoc.JDHeaderBackgroundImg;
016import Torello.JavaDoc.LinkJavaSource;
017
018import Torello.JavaDoc.IntoHTMLTable;
019import static Torello.JavaDoc.IntoHTMLTable.Background.GreenDither;
020import static Torello.JavaDoc.IntoHTMLTable.Background.BlueDither;
021
022import java.util.Objects;
023
024import java.util.stream.Stream;
025import java.util.stream.IntStream;
026import java.util.stream.LongStream;
027import java.util.stream.DoubleStream;
028
029import java.util.function.ToIntFunction;
030import java.util.function.ToLongFunction;
031import java.util.function.ToDoubleFunction;
032import java.util.function.Predicate;
033import java.util.function.Function;
034
035import javax.json.JsonArray;
036import javax.json.Json;
037
038import static Torello.Java.JSON.JFlag.NOT_ALLOWED_RET_NULL_MASKS;
039
040
041/**
042 * Parses Multi-Dimensional JSON Array's into Multi-Dimensional Java Array's.
043 * 
044 * <EMBED CLASS='external-html' DATA-FILE-ID=GLASS_FISH_NOTE>
045 * <EMBED CLASS='external-html' DATA-FILE-ID=RJA_DIM_N>
046 * <EMBED CLASS='external-html' DATA-FILE-ID=JSON_BINDING_NOTE>
047 * 
048 * <BR /><HR> <BR />
049 * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN>
050 *
051 * <EMBED CLASS=globalDefs DATA-A_AN=A>
052 * @see Json
053 * @see JsonArray
054 */
055@StaticFunctional
056@JDHeaderBackgroundImg(EmbedTagFileID="RJA_JDHBI_DIM_N")
057public class RJArrDimN
058{
059    private RJArrDimN() { }
060
061
062    private static final boolean REFERENCE_1D_ARRAY = true;
063    private static final boolean BOXED_1D_ARRAY     = true;
064    private static final boolean PRIMITIVE_1D_ARRAY = false;
065
066
067    // ********************************************************************************************
068    // ********************************************************************************************
069    // Primitive Multi-Dimensional Array Methods
070    // ********************************************************************************************
071    // ********************************************************************************************
072
073
074    /**
075     * <EMBED CLASS=defs DATA-A_AN=An DATA-TYPE=int DATA-DEFVAL="-1">
076     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
077     */
078    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Primitive-Integers")
079    @LinkJavaSource(handle="BASIC_TYPES", name="INTEGER")
080    @LinkJavaSource(handle="STREAM_BUILDER", name="intStream")
081    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
082    public static <T> T intArr(
083            final JsonArray             ja,
084            final int                   defaultValue,
085            final int                   FLAGS,
086            final ToIntFunction<String> optionalUserParser,
087            final Class<T>              retArrClass
088        )
089    {
090        return ProcessMultiDimJsonArray.jsonArrayToJava(
091            ja,
092            // new SettingsRec<Integer, IntStream>(
093            SETTINGS_REC_BUILDER.createForDimNArrays(
094                defaultValue,
095                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,
096                (optionalUserParser == null) ? null : optionalUserParser::applyAsInt,
097                BASIC_TYPES.PRIMITIVE_INTEGER(),
098                STREAM_BUILDER.intStream(),
099                PRIMITIVE_1D_ARRAY
100            ),
101            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, int.class)
102        );
103    }
104
105    /**
106     * <EMBED CLASS=defs DATA-TYPE=long DATA-DEFVAL="-1">
107     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
108     */
109    @IntoHTMLTable(background=BlueDither,
110        title="Multi-Dimensional Array of Primitive Long-Integers")
111    @LinkJavaSource(handle="BASIC_TYPES", name="LONG")
112    @LinkJavaSource(handle="STREAM_BUILDER", name="longStream")
113    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
114    public static <T> T longArr(
115            final JsonArray                 ja,
116            final long                      defaultValue,
117            final int                       FLAGS,
118            final ToLongFunction<String>    optionalUserParser,
119            final Class<T>                  retArrClass
120        )
121    {
122        return ProcessMultiDimJsonArray.jsonArrayToJava(
123            ja,
124            // new SettingsRec<Long, LongStream>(
125            SETTINGS_REC_BUILDER.createForDimNArrays(
126                defaultValue,
127                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,
128                (optionalUserParser == null) ? null : optionalUserParser::applyAsLong,
129                BASIC_TYPES.PRIMITIVE_LONG(),
130                STREAM_BUILDER.longStream(),
131                PRIMITIVE_1D_ARRAY
132            ),
133            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, long.class)
134        );
135    }
136
137    /**
138     * <EMBED CLASS=defs DATA-TYPE=double DATA-DEFVAL="-1.0">
139     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
140     */
141    @IntoHTMLTable(background=GreenDither,
142        title="Multi-Dimensional Array of Primitive-Doubles")
143    @LinkJavaSource(handle="BASIC_TYPES", name="DOUBLE")
144    @LinkJavaSource(handle="STREAM_BUILDER", name="doubleStream")
145    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
146    public static <T> T doubleArr(
147            final JsonArray                 ja,
148            final double                    defaultValue,
149            final int                       FLAGS,
150            final ToDoubleFunction<String>  optionalUserParser,
151            final Class<T>                  retArrClass
152        )
153    {
154        return ProcessMultiDimJsonArray.jsonArrayToJava(
155            ja,
156            // new SettingsRec<Double, DoubleStream>(
157            SETTINGS_REC_BUILDER.createForDimNArrays(
158                defaultValue,
159                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,    
160                (optionalUserParser == null) ? null : optionalUserParser::applyAsDouble,
161                BASIC_TYPES.PRIMITIVE_DOUBLE(),
162                STREAM_BUILDER.doubleStream(),
163                PRIMITIVE_1D_ARRAY
164            ),
165            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, double.class)
166        );
167    }
168
169    /**
170     * <EMBED CLASS=defs DATA-TYPE=short DATA-DEFVAL="-1">
171     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
172     */
173    @IntoHTMLTable(background=BlueDither,
174        title="Multi-Dimensional Array of Primitive Short-Integers")
175    @LinkJavaSource(handle="BASIC_TYPES", name="SHORT")
176    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
177    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
178    public static <T> T shortArr(
179            final JsonArray                 ja,
180            final short                     defaultValue,
181            final int                       FLAGS,
182            final ToShortFunction<String>   optionalUserParser,
183            final Class<T>                  retArrClass
184        )
185    {
186        return ProcessMultiDimJsonArray.jsonArrayToJava(
187            ja,
188            // new SettingsRec<Short, Stream<Short>>(
189            SETTINGS_REC_BUILDER.createForDimNArrays(
190                defaultValue,
191                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,    
192                (optionalUserParser == null) ? null : optionalUserParser::applyAsShort,
193                BASIC_TYPES.BOXED_SHORT(),
194                STREAM_BUILDER.normalStream(),
195                PRIMITIVE_1D_ARRAY
196            ),
197            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, short.class)
198        );
199    }
200
201    /**
202     * <EMBED CLASS=defs DATA-TYPE=byte DATA-DEFVAL="-1">
203     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
204     */
205    @IntoHTMLTable(background=GreenDither,
206        title="Multi-Dimensional Array of Primitive-Bytes")
207    @LinkJavaSource(handle="BASIC_TYPES", name="BYTE")
208    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
209    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
210    public static <T> T byteArr(
211            final JsonArray                 ja,
212            final byte                      defaultValue,
213            final int                       FLAGS,
214            final ToByteFunction<String>    optionalUserParser,
215            final Class<T>                  retArrClass
216        )
217    {
218        return ProcessMultiDimJsonArray.jsonArrayToJava(
219            ja,
220            // new SettingsRec<Byte, Stream<Byte>>(
221            SETTINGS_REC_BUILDER.createForDimNArrays(
222                defaultValue,
223                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,    
224                (optionalUserParser == null) ? null : optionalUserParser::applyAsByte,
225                BASIC_TYPES.BOXED_BYTE(),
226                STREAM_BUILDER.normalStream(),
227                PRIMITIVE_1D_ARRAY
228            ),
229            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, byte.class)
230        );
231    }
232
233    /**
234     * <EMBED CLASS=defs DATA-TYPE=float DATA-DEFVAL="-1.0f">
235     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
236     */
237    @IntoHTMLTable(background=BlueDither,
238        title="Multi-Dimensional Array of Primitive-Floats")
239    @LinkJavaSource(handle="BASIC_TYPES", name="FLOAT")
240    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
241    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
242    public static <T> T floatArr(
243            final JsonArray                 ja,
244            final float                     defaultValue,
245            final int                       FLAGS,
246            final ToFloatFunction<String>   optionalUserParser,
247            final Class<T>                  retArrClass
248        )
249    {
250        return ProcessMultiDimJsonArray.jsonArrayToJava(
251            ja,
252            // new SettingsRec<Float, Stream<Float>>(
253            SETTINGS_REC_BUILDER.createForDimNArrays(
254                defaultValue,
255                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,    
256                (optionalUserParser == null) ? null : optionalUserParser::applyAsFloat,
257                BASIC_TYPES.BOXED_FLOAT(),
258                STREAM_BUILDER.normalStream(),
259                PRIMITIVE_1D_ARRAY
260            ),
261            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, float.class)
262        );
263    }
264
265    /**
266     * <EMBED CLASS=defs DATA-TYPE=boolean DATA-DEFVAL="false">
267     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_PRIM>
268     */
269    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Primitive-Booleans")
270    @LinkJavaSource(handle="BASIC_TYPES", name="BOOLEAN")
271    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
272    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
273    public static <T> T booleanArr(
274            final JsonArray         ja,
275            final boolean           defaultValue,
276            final int               FLAGS,
277            final Predicate<String> optionalUserParser,
278            final Class<T>          retArrClass
279        )
280    {
281        return ProcessMultiDimJsonArray.jsonArrayToJava(
282            ja,
283            // new SettingsRec<Boolean, Stream<Boolean>>(
284            SETTINGS_REC_BUILDER.createForDimNArrays(
285                defaultValue,
286                FLAGS & NOT_ALLOWED_RET_NULL_MASKS,    
287                (optionalUserParser == null) ? null : optionalUserParser::test,
288                BASIC_TYPES.BOXED_BOOLEAN(),
289                STREAM_BUILDER.normalStream(),
290                PRIMITIVE_1D_ARRAY
291            ),
292            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, boolean.class)
293        );
294    }
295
296
297    // ********************************************************************************************
298    // ********************************************************************************************
299    // Boxed-Primitive Multi-Dimensional Array Methods
300    // ********************************************************************************************
301    // ********************************************************************************************
302
303
304    /**
305     * <EMBED CLASS=defs DATA-A_AN=An DATA-TYPE=Integer DATA-METH_NAME=INTEGER DATA-DEF_VAL="-1">
306     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
307     */
308    @IntoHTMLTable(background=BlueDither, title="Multi-Dimensional Array of Boxed-Integers")
309    @LinkJavaSource(handle="BASIC_TYPES", name="INTEGER")
310    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
311    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
312    public static <T> T arrINTEGER(
313            final JsonArray                 ja,
314            final int                       defaultValue,
315            final int                       FLAGS,
316            final Function<String, Integer> optionalUserParser,
317            final Class<T>                  retArrClass
318        )
319    {
320        return ProcessMultiDimJsonArray.jsonArrayToJava(
321            ja,
322            // new SettingsRec<Integer, Stream<Integer>>(
323            SETTINGS_REC_BUILDER.createForDimNArrays(
324                defaultValue,
325                FLAGS,
326                optionalUserParser,
327                BASIC_TYPES.BOXED_INTEGER(),
328                STREAM_BUILDER.normalStream(),
329                BOXED_1D_ARRAY
330            ),
331            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Integer.class)
332        );
333    }
334
335    /**
336     * <EMBED CLASS=defs DATA-TYPE=Long DATA-METH_NAME=LONG DATA-DEF_VAL="-1">
337     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
338     */
339    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Boxed Long-Integers")
340    @LinkJavaSource(handle="BASIC_TYPES", name="LONG")
341    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
342    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
343    public static <T> T arrLONG(
344            final JsonArray                 ja,
345            final long                      defaultValue,
346            final int                       FLAGS,
347            final Function<String, Long>    optionalUserParser,
348            final Class<T>                  retArrClass
349        )
350    {
351        return ProcessMultiDimJsonArray.jsonArrayToJava(
352            ja,
353            // new SettingsRec<Long, Stream<Long>>(
354            SETTINGS_REC_BUILDER.createForDimNArrays(
355                defaultValue,
356                FLAGS,
357                optionalUserParser,
358                BASIC_TYPES.BOXED_LONG(),
359                STREAM_BUILDER.normalStream(),
360                BOXED_1D_ARRAY
361            ),
362            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Long.class)
363        );
364    }
365
366    /**
367     * <EMBED CLASS=defs DATA-TYPE=Double DATA-METH_NAME=DOUBLE DATA-DEF_VAL="-1.0">
368     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
369     */
370    @IntoHTMLTable(background=BlueDither, title="Multi-Dimensional Array of Boxed-Doubles")
371    @LinkJavaSource(handle="BASIC_TYPES", name="DOUBLE")
372    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
373    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
374    public static <T> T arrDOUBLE(
375            final JsonArray                 ja,
376            final double                    defaultValue,
377            final int                       FLAGS,
378            final Function<String, Double>  optionalUserParser,
379            final Class<T>                  retArrClass
380        )
381    {
382        return ProcessMultiDimJsonArray.jsonArrayToJava(
383            ja,
384            // new SettingsRec<Double, Stream<Double>>(
385            SETTINGS_REC_BUILDER.createForDimNArrays(
386                defaultValue,
387                FLAGS,
388                optionalUserParser,
389                BASIC_TYPES.BOXED_DOUBLE(),
390                STREAM_BUILDER.normalStream(),
391                BOXED_1D_ARRAY
392            ),
393            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Double.class)
394        );
395    }
396
397    /**
398     * <EMBED CLASS=defs DATA-TYPE=Short DATA-METH_NAME=SHORT DATA-DEF_VAL="-1">
399     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
400     */
401    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Boxed Short-Integers")
402    @LinkJavaSource(handle="BASIC_TYPES", name="SHORT")
403    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
404    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
405    public static <T> T arrSHORT(
406            final JsonArray                 ja,
407            final short                     defaultValue,
408            final int                       FLAGS,
409            final Function<String, Short>   optionalUserParser,
410            final Class<T>                  retArrClass
411        )
412    {
413        return ProcessMultiDimJsonArray.jsonArrayToJava(
414            ja,
415            // new SettingsRec<Short, Stream<Short>>(
416            SETTINGS_REC_BUILDER.createForDimNArrays(
417                defaultValue,
418                FLAGS,
419                optionalUserParser,
420                BASIC_TYPES.BOXED_SHORT(),
421                STREAM_BUILDER.normalStream(),
422                BOXED_1D_ARRAY
423            ),
424            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Short.class)
425        );
426    }
427
428    /**
429     * <EMBED CLASS=defs DATA-TYPE=Byte DATA-METH_NAME=BYTE DATA-DEF_VAL="-1">
430     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
431     */
432    @IntoHTMLTable(background=BlueDither, title="Multi-Dimensional Array of Boxed-Bytes")
433    @LinkJavaSource(handle="BASIC_TYPES", name="BYTE")
434    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
435    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
436    public static <T> T arrBYTE(
437            final JsonArray                 ja,
438            final byte                      defaultValue,
439            final int                       FLAGS,
440            final Function<String, Byte>    optionalUserParser,
441            final Class<T>                  retArrClass
442        )
443    {
444        return ProcessMultiDimJsonArray.jsonArrayToJava(
445            ja,
446            // new SettingsRec<Byte, Stream<Byte>>(
447            SETTINGS_REC_BUILDER.createForDimNArrays(
448                defaultValue,
449                FLAGS,
450                optionalUserParser,
451                BASIC_TYPES.BOXED_BYTE(),
452                STREAM_BUILDER.normalStream(),
453                BOXED_1D_ARRAY
454            ),
455            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Byte.class)
456        );
457    }
458
459    /**
460     * <EMBED CLASS=defs DATA-TYPE=Float DATA-METH_NAME=FLOAT DATA-DEF_VAL="-1.0f">
461     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
462     */
463    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Boxed-Floats")
464    @LinkJavaSource(handle="BASIC_TYPES", name="FLOAT")
465    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
466    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
467    public static <T> T arrFLOAT(
468            final JsonArray                 ja,
469            final float                     defaultValue,
470            final int                       FLAGS,
471            final Function<String, Float>   optionalUserParser,
472            final Class<T>                  retArrClass
473        )
474    {
475        return ProcessMultiDimJsonArray.jsonArrayToJava(
476            ja,
477            // new SettingsRec<Float, Stream<Float>>(
478            SETTINGS_REC_BUILDER.createForDimNArrays(
479                defaultValue,
480                FLAGS,
481                optionalUserParser,
482                BASIC_TYPES.BOXED_FLOAT(),
483                STREAM_BUILDER.normalStream(),
484                BOXED_1D_ARRAY
485            ),
486            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Float.class)
487        );
488    }
489
490    /**
491     * <EMBED CLASS=defs DATA-TYPE=Boolean DATA-METH_NAME=BOOLEAN DATA-DEF_VAL=false>
492     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
493     */
494    @IntoHTMLTable(background=BlueDither, title="Multi-Dimensional Array of Boxed-Booleans")
495    @LinkJavaSource(handle="BASIC_TYPES", name="BOOLEAN")
496    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
497    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
498    public static <T> T arrBOOLEAN(
499            final JsonArray                 ja,
500            final boolean                   defaultValue,
501            final int                       FLAGS,
502            final Function<String, Boolean> optionalUserParser,
503            final Class<T>                  retArrClass
504        )
505    {
506        return ProcessMultiDimJsonArray.jsonArrayToJava(
507            ja,
508            // new SettingsRec<Boolean, Stream<Boolean>>(
509            SETTINGS_REC_BUILDER.createForDimNArrays(
510                defaultValue,
511                FLAGS,
512                optionalUserParser,
513                BASIC_TYPES.BOXED_BOOLEAN(),
514                STREAM_BUILDER.normalStream(),
515                BOXED_1D_ARRAY
516            ),
517            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Boolean.class)
518        );
519    }
520
521    /**
522     * <EMBED CLASS=defs DATA-TYPE=Number DATA-METH_NAME=Number DATA-DEF_VAL=0>
523     * <EMBED CLASS='external-html' DATA-FILE-ID=RJ_ARR_DIMN_METH_BOXED>
524     */
525    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Best-Fit Boxed-Numbers")
526    @LinkJavaSource(handle="BASIC_TYPES", name="NUMBER")
527    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
528    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
529    public static <T> T arrNumber(
530            final JsonArray                 ja,
531            final Number                    defaultValue,
532            final int                       FLAGS,
533            final Function<String, Number>  optionalUserParser,
534            final Class<T>                  retArrClass
535        )
536    {
537        return ProcessMultiDimJsonArray.jsonArrayToJava(
538            ja,
539            // new SettingsRec<Number, Stream<Number>>(
540            SETTINGS_REC_BUILDER.createForDimNArrays(
541                defaultValue,
542                FLAGS,
543                optionalUserParser,
544                BASIC_TYPES.NUMBER_REC(),
545                STREAM_BUILDER.normalStream(),
546                BOXED_1D_ARRAY
547            ),
548            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, Number.class)
549        );
550    }
551
552
553    // *******************************************************************************************
554    // *******************************************************************************************
555    // Non-Primitive Multi-Dimensional Array Methods
556    // *******************************************************************************************
557    // *******************************************************************************************
558
559
560    /**
561     * <BR>Invokes: {@link ProcessMultiDimJsonArray#jsonArrayToJava(JsonArray, SettingsRec, Class)}
562     * <BR>Passes: {@code String} Configurations / SettingsRec
563     * <BR>See: Class {@link JFlag} for more information about parameter {@code 'FLAGS'}.
564     * <BR>Note: {@code retArrClass} must be a multi-dimensinal {@code String}-array.
565     * <BR>:(See last <B>"return-type"</B> parameter in example below)
566     * 
567     * <BR>COL-SPAN-2:
568     * <DIV CLASS=LOC>{@code
569     * String[][] arr = ReadArrJSON.DimN.strArr(jsonArray, null, 0, String[][].class);
570     * }</DIV>
571     */
572    @IntoHTMLTable(background=BlueDither, title="Multi-Dimensional Array of Strings")
573    @LinkJavaSource(handle="BASIC_TYPES", name="STRING")
574    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
575    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
576    public static <T> T strArr(
577            final JsonArray ja,
578            final String    defaultValue,
579            final int       FLAGS,
580            final Class<T>  retArrClass
581        )
582    {
583        return ProcessMultiDimJsonArray.jsonArrayToJava(
584            ja, 
585            // new SettingsRec<String, Stream<String>>(
586            SETTINGS_REC_BUILDER.createForDimNArrays(
587                defaultValue,
588                FLAGS,
589                null, // no optional user parser, input is supposed to be a string
590                BASIC_TYPES.STRING_REC(),
591                STREAM_BUILDER.normalStream(),
592                REFERENCE_1D_ARRAY
593            ),
594            RJArrDimN.CHECK_ARRAY_CLASS(retArrClass, String.class)
595        );
596    }
597
598    /**
599     * <BR>Invokes: {@link ProcessMultiDimJsonArray#jsonArrayToJava(JsonArray, SettingsRec, Class)}
600     * <BR>Passes: {@code Object} Configurations / SettingsRec
601     * <BR>See: class {@link JFlag} for more information about parameter {@code 'FLAGS'}.
602     * <BR>Note: {@code retArrClass} must be a multi-dimensinal {@code Object}-array.
603     * <BR>:(See last <B>"return-type"</B> parameter in example below)
604     * 
605     * <BR>COL-SPAN-2:
606     * <DIV CLASS=LOC>{@code
607     * MyClass[][] arr = ReadArrJSON.DimN.strArr(jsonArray, null, 0, MyClass[][].class);
608     * }</DIV>
609     */
610    @SuppressWarnings({"rawtypes", "unchecked"})
611    @IntoHTMLTable(background=GreenDither, title="Multi-Dimensional Array of Object &lt;T&gt;")
612    @LinkJavaSource(handle="BASIC_TYPES", name="OBJECT", paramCount=1)
613    @LinkJavaSource(handle="STREAM_BUILDER", name="normalStream")
614    @LinkJavaSource(handle="SETTINGS_REC_BUILDER", name="createForDimNArrays")
615    public static <RET_ARR_CLASS> RET_ARR_CLASS objArr(
616            final JsonArray             ja,
617            final Object                defaultValue,
618            final int                   FLAGS,
619            final Class<RET_ARR_CLASS>  retArrClass
620        )
621    {
622        throw new Torello.Java.ToDoException();
623
624        /*
625        Class baseClass = // (Class<U>)
626            RJArrDimN.GET_ARRAY_BASE_COMPONENT_CLASS_AND_CHECK
627                (retArrClass, defaultValue);
628
629        return ProcessMultiDimJsonArray.jsonArrayToJava(
630            ja,
631            new SettingsRec /* <T, Stream<T>> * /(
632                defaultValue,
633                FLAGS,
634                optionalUserParser,
635                BASIC_TYPES.OBJECT(baseClass),
636                STREAM_BUILDER.normalStream(),
637                REFERENCE_1D_ARRAY
638            ),
639            retArrClass
640        );
641        */
642    }
643
644
645    // ********************************************************************************************
646    // ********************************************************************************************
647    // Two Helpers
648    // ********************************************************************************************
649    // ********************************************************************************************
650
651
652    /**
653     * Check user input, and throws exceptions if the array-class has not been properly
654     * chosen.
655     * 
656     * @param retArrClass This must be a primitive-array class, possibly of multiple dimensions
657     * 
658     * @param expectedRootClass The expected "root class".  For {@code int[][].class}, the root
659     * class would be {@code int.class}.
660     * 
661     * @return Parameter {@code retArrClass} is the return value of this checker method
662     * 
663     * @throws IllegalArgumentExcetion If parameter retArrClass:
664     * If calling retArrClass.isArray() returns FALSE
665     * If the root-array type is not the appropriate type for the method that was called
666     */
667    protected static <T> Class<T> CHECK_ARRAY_CLASS(
668            final Class<T> retArrClass,
669            final Class<?> expectedRootClass
670        )
671    {
672        Objects.requireNonNull(retArrClass, "Return-Array Type, Parameter 'retArrClass' is null");
673
674        if (! retArrClass.isArray()) throw new IllegalArgumentException(
675            "The class you have passed to parameter 'retArrClass' " +
676            "[" + retArrClass.getSimpleName() + "], is not an array"
677        );
678
679        Class<?> componentClass = retArrClass.getComponentType();
680
681        while (componentClass.isArray()) componentClass = componentClass.getComponentType();
682
683        if (! expectedRootClass.equals(componentClass)) throw new IllegalArgumentException(
684            "The class you have passed to parameter 'retArrClass' " +
685            "[" + retArrClass.getSimpleName() + "], is not a(n) " +
686            expectedRootClass.getSimpleName() + "-array."
687        );
688
689        return retArrClass;
690    }
691}
692