package net.onedaybeard.dominatrix.inject; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.Properties; final class Injector { public static final String TAG = Injector.class.getSimpleName(); private final Map<Class<?>,TypeInjector> typeInjectors; Injector() { typeInjectors = new HashMap<Class<?>,TypeInjector>(); typeInjectors.put(String.class, new InjectString()); typeInjectors.put(boolean.class, new InjectBoolean()); typeInjectors.put(short.class, new InjectShort()); typeInjectors.put(byte.class, new InjectByte()); typeInjectors.put(int.class, new InjectInt()); typeInjectors.put(long.class, new InjectLong()); typeInjectors.put(double.class, new InjectDouble()); typeInjectors.put(float.class, new InjectFloat()); } void setTypeInjector(Class<?> klazz, TypeInjector injector) { typeInjectors.put(klazz, injector); } void inject(InjectableProperties instance, Properties properties) { Field[] fields = instance.getClass().getDeclaredFields(); for (int i = 0; fields.length > i; i++) { InjectProperty injectProperty = fields[i].getAnnotation(InjectProperty.class); if (injectProperty != null) inject(instance, fields[i], properties.getProperty(injectProperty.value())); } } private void inject(InjectableProperties instance, Field field, String data) { if (data == null) return; if (!field.isAccessible()) field.setAccessible(true); TypeInjector injector = typeInjectors.get(field.getType()); assert injector != null : "Missing injector for type " + field.getType(); try { injector.inject(instance, field, data); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } private static class InjectString implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, data); } } private static class InjectLong implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Long.parseLong(data)); } } private static class InjectInt implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Integer.parseInt(data)); } } private static class InjectDouble implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Double.parseDouble(data)); } } private static class InjectFloat implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Float.parseFloat(data)); } } private static class InjectBoolean implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { data = data.toLowerCase(); boolean v = (data.equals("1") || data.startsWith("y") || data.startsWith("t")); field.set(instance, v); } } private static class InjectShort implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Short.parseShort(data)); } } private static class InjectByte implements TypeInjector { @Override public void inject(InjectableProperties instance, Field field, String data) throws IllegalArgumentException, IllegalAccessException { field.set(instance, Byte.parseByte(data)); } } }