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 | package Torello.Java; import static Torello.Java.StrSource.GENERIC_PARAMS; import java.util.regex.Matcher; import java.util.stream.Stream; class ParseGenericType { static String[] parse(String genericTypeParamOrDefinition) { Matcher m = GENERIC_PARAMS.matcher(genericTypeParamOrDefinition); String innerGenericStr = m.find() ? m.group(1) : null; if (innerGenericStr == null) throw new NoMatchException( "The provided value to parameter 'genericTypeParamOrDefinition' [" + genericTypeParamOrDefinition + "] did not match the Java Generics " + "Regular-Expression:\n" + GENERIC_PARAMS.toString() ); Stream.Builder<String> b = Stream.builder(); String[] sArr = innerGenericStr.split(","); for (int i=0; i < sArr.length; i++) // We have shifted elements, and now all of the remaining elements would be null // return immediately if (sArr[i] == null) return b.build().toArray(String[]::new); // Simple generic-type definition: has no "sub-generics" or "inner-generics" // Add this to the list, and move on else if ((! sArr[i].contains("<")) && (! sArr[i].contains(">"))) b.accept(sArr[i].trim()); // This is a generic-type definition that has at least one "sub-generic" // If there are an equal number of '<' and '>' then there were no commas // in between the sub-generics. Add this to this list, and move on. else if ( StringParse.countCharacters(sArr[i], '<') == StringParse.countCharacters(sArr[i], '>') ) b.accept(sArr[i].trim()); // There was a generic with a sub-generic that had a comma... else { // If we have reached the end of the String, the number of greater than and // less than symbols was not balanced. if (i == (sArr.length - 1)) throw new StringFormatException( "The provided value to parameter 'genericTypeParamOrDefinition' [" + genericTypeParamOrDefinition + "], was not properly formatted, and could " + "not be parsed." ); // Join the next String Array Element with the current one. sArr[i] = sArr[i].trim() + ", " + sArr[i + 1].trim(); // Shift the rest of the array left. for (int j=i+1; j < (sArr.length-1); j++) sArr[j] = sArr[j+1]; sArr[sArr.length - 1] = null; // decrement the counter to retest this array-index location i--; } // Return the list return b.build().toArray(String[]::new); } } |