public void setValue(String value) { if (!accepts(value)) { throw new IllegalArgumentException(this + " cannot accept argument " + value); } if (Integer.class.equals(type)) { this.value = Integer.parseInt(value); } else if (Double.class.equals(type)) { this.value = Double.parseDouble(value); } else if (Boolean.class.equals(type)) { this.value = ArrayUtils.contains(value, new String[] {"y", "yes", "true"}); } else if (EnumWrapper.class.equals(type)) { final EnumWrapper wrapper = EnumWrapper.getWrapper(typeArguments); wrapper.setValue(value); this.value = wrapper; } else if (TypedList.class.isAssignableFrom(type)) { TypedList typeObject = null; try { typeObject = (TypedList) type.newInstance(); } catch (Exception ignored) { } if (!value.matches("\\{.*?\\}")) { typeObject.addString(value); this.value = typeObject; return; } value = value.substring(1, value.length() - 1); String token = ""; while (!value.isEmpty()) { int pos = 0; Character quote = null; if ("\"'`".contains(Character.toString(value.charAt(0)))) { quote = value.charAt(0); pos++; } while (pos < value.length()) { if (value.substring(pos).startsWith("\\\\") || value.substring(pos).startsWith("\\\"") || value.substring(pos).startsWith("\\'") || value.substring(pos).startsWith("\\`")) { token += value.charAt(pos + 1); pos += 2; continue; } if (value.substring(pos).startsWith("\\n")) { token += "\n"; pos += 2; continue; } if (value.substring(pos).startsWith("\\t")) { token += "\t"; pos += 2; continue; } if (value.substring(pos).startsWith("\\r")) { token += "\r"; pos += 2; continue; } token += value.charAt(pos); if (quote == null && token.endsWith(",")) { token = token.substring(0, token.length() - 1); break; } if (quote != null && !token.isEmpty() && token.charAt(token.length() - 1) == quote) { break; } pos++; } if (quote != null) { token = token.substring(0, token.length() - 1); } value = value.substring(token.length()); typeObject.addString(token); if (!value.startsWith(",")) { token = value; break; } else { token = ""; } value = value.substring(1); } this.value = typeObject; } else { this.value = value; } }
public static boolean accepts(String value, Class<?> type, String typeArguments) { try { if (Integer.class.equals(type)) { Integer.parseInt(value); } else if (Double.class.equals(type)) { Double.parseDouble(value); } else if (EnumWrapper.class.equals(type)) { final EnumWrapper wrapper = EnumWrapper.getWrapper(typeArguments); return wrapper.matches(value); } else if (Boolean.class.equals(type)) { return ArrayUtils.contains( value.toLowerCase(), new String[] {"y", "n", "yes", "no", "true", "false"}); } else if (TypedList.class.isAssignableFrom(type)) { final TypedList typeObject = (TypedList) type.newInstance(); if (!value.matches("\\{.*?\\}")) { return accepts(value, typeObject.getType(), typeArguments); } value = value.substring(1, value.length() - 1); String token = ""; while (!value.isEmpty()) { int pos = 0; Character quote = null; if ("\"'`".contains(Character.toString(value.charAt(0)))) { quote = value.charAt(0); pos++; } while (pos < value.length()) { if (value.substring(pos).startsWith("\\\\") || value.substring(pos).startsWith("\\\"") || value.substring(pos).startsWith("\\'") || value.substring(pos).startsWith("\\`")) { token += value.charAt(pos + 1); pos += 2; continue; } if (value.substring(pos).startsWith("\\n")) { token += "\n"; pos += 2; continue; } if (value.substring(pos).startsWith("\\t")) { token += "\t"; pos += 2; continue; } if (value.substring(pos).startsWith("\\r")) { token += "\r"; pos += 2; continue; } token += value.charAt(pos); if (quote == null && token.endsWith(",")) { token = token.substring(0, token.length() - 1); break; } if (quote != null && !token.isEmpty() && token.charAt(token.length() - 1) == quote) { break; } pos++; } if (quote != null) { token = token.substring(0, token.length() - 1); } value = value.substring(token.length()); if (!accepts(token, typeObject.getType(), typeArguments)) { System.out.println(token); return false; } if (!value.startsWith(",")) { token = value; break; } else { token = ""; } value = value.substring(1); } } } catch (NumberFormatException e) { return false; } catch (InstantiationException e) { return false; } catch (IllegalAccessException e) { return false; } return true; }