import java.lang.invoke.MethodHandle;
import static java.lang.invoke.MethodHandles.*;
import java.lang.invoke.MethodType;
import static java.lang.invoke.MethodType.*;
import java.lang.invoke.WrongMethodTypeException;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import static java.lang.Integer.*;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class asCollectorIAE01 {

  private static int[] VALID_ARRAY_LENGTHS = {
    0, 1, 2, 3, 67, 128, 252, 253
  };

  private static int[] INVALID_ARRAY_LENGTHS = {
    MIN_VALUE, MIN_VALUE + 1, -2, -1, 254, 255, 256, MAX_VALUE - 1, MAX_VALUE
  };

  public static MethodHandle asCollectorIAE01(int length) throws NoSuchMethodException, IllegalAccessException {

    MethodHandle target = publicLookup().findStatic(Arrays.class,
                                                    "deepToString", 
                                                    methodType(String.class, Object[].class));
    return target.asCollector(String[].class, length);
  }
  
  public static void main(String[] args) throws Throwable {
    for (int i=0; i < INVALID_ARRAY_LENGTHS.length; i++) {
      boolean catched = false;
      try {
        asCollectorIAE01(INVALID_ARRAY_LENGTHS[i]);
      }
      catch (IllegalArgumentException iae) {
        catched = true;
        System.out.println("OK: " + iae);
      }
      if (!catched) {
        System.out.println("Error: IllegalArgumentException not catched for invalid array length " + INVALID_ARRAY_LENGTHS[i]);
      }
    }

    System.out.println();

    for (int i=0; i < VALID_ARRAY_LENGTHS.length; i++) {
      boolean catched = false;
      try {
        asCollectorIAE01(VALID_ARRAY_LENGTHS[i]);
      }
      catch (IllegalArgumentException iae) {
        catched = true;
        System.out.println("Error: " + iae);
      }
      if (!catched) {
        System.out.println("OK: IllegalArgumentException not thrown for valid array length " + VALID_ARRAY_LENGTHS[i]);
      }
    }

    System.out.println();

    MethodHandle mh253 = asCollectorIAE01(253);
    String s253 = (String)mh253.invokeExact(  "1",  " 2",  " 3",  " 4",  " 5",  " 6",  " 7",  " 8",  " 9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53"
                                           );
    System.out.println(s253);

    System.out.println();

    MethodHandle mh254 = asCollectorIAE01(254);
    String s254 = (String)mh254.invokeExact(  "1",  " 2",  " 3",  " 4",  " 5",  " 6",  " 7",  " 8",  " 9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54"
                                              );
    System.out.println(s254);

    System.out.println();

    MethodHandle mh255 = asCollectorIAE01(255);
    String s255 = (String)mh255.invokeExact(  "1",  " 2",  " 3",  " 4",  " 5",  " 6",  " 7",  " 8",  " 9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55",  "56",  "57",  "58",  "59",  "60",
                                              "61",  "62",  "63",  "64",  "65",  "66",  "67",  "68",  "69",  "70",
                                              "71",  "72",  "73",  "74",  "75",  "76",  "77",  "78",  "79",  "80",
                                              "81",  "82",  "83",  "84",  "85",  "86",  "87",  "88",  "89",  "90",
                                              "91",  "92",  "93",  "94",  "95",  "96",  "97",  "98",  "99", "100",
                                              "1",   "2",   "3",   "4",   "5",   "6",   "7",   "8",   "9",  "10",
                                              "11",  "12",  "13",  "14",  "15",  "16",  "17",  "18",  "19",  "20",
                                              "21",  "22",  "23",  "24",  "25",  "26",  "27",  "28",  "29",  "30",
                                              "31",  "32",  "33",  "34",  "35",  "36",  "37",  "38",  "39",  "40",
                                              "41",  "42",  "43",  "44",  "45",  "46",  "47",  "48",  "49",  "50",
                                              "51",  "52",  "53",  "54",  "55"
                                              );
    System.out.println(s255);
  }

}