package aQute.lib.json; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Map; import java.util.regex.Pattern; public class SpecialHandler extends Handler { @SuppressWarnings("rawtypes") final Class type; final Method valueOf; final Constructor< ? > constructor; public SpecialHandler(Class< ? > type, Constructor< ? > constructor, Method valueOf) { this.type = type; this.constructor = constructor; this.valueOf = valueOf; } @Override public void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception { StringHandler.string(app, object.toString()); } @Override public Object decode(Decoder dec, String s) throws Exception { if (type == Pattern.class) return Pattern.compile(s); if (constructor != null) return constructor.newInstance(s); if (valueOf != null) return valueOf.invoke(null, s); throw new IllegalArgumentException("Do not know how to convert a " + type + " from a string"); } }