package gueei.binding.utility; import gueei.binding.Command; import gueei.binding.IObservable; import gueei.binding.InnerFieldObservable; import gueei.binding.Observable; import java.lang.reflect.Field; import java.util.HashMap; public class CachedModelReflector<T> implements ICachedModelReflector<T> { private HashMap<String, Field> observables = new HashMap<String, Field>(); private HashMap<String, Field> commands= new HashMap<String, Field>(); private HashMap<String, Field> values= new HashMap<String, Field>(); public HashMap<String, Field> getObservables() { return observables; } public HashMap<String, Field> getCommands() { return commands; } public HashMap<String, Field> getValues() { return values; } public CachedModelReflector(Class<T> type) throws IllegalArgumentException, IllegalAccessException{ for (Field f: type.getFields()){ if (IObservable.class.isAssignableFrom(f.getType())){ observables.put(f.getName(), f); } else if (Command.class.isAssignableFrom(f.getType())){ commands.put(f.getName(), f); } else{ values.put(f.getName(), f); } } observables.put(".", null); } public Command getCommandByName(String name, Object object) throws Exception { if (commands.containsKey(name)){ return (Command) commands.get(name).get(object); } return null; } @SuppressWarnings({ "unchecked", "rawtypes" }) public IObservable<Object> getObservableByName(String name, Object object) throws Exception { if (name.equals(".")) return new Observable(object.getClass(), object); if( name.contains(".")) { InnerFieldObservable ifo = new InnerFieldObservable(name); if (ifo.createNodes(object)) return ifo; return null; } else { Field obs = observables.get(name); if (obs==null) return null; return (IObservable) obs.get(object); } } public Object getValueByName(String name, Object object) throws Exception { if (values.containsKey(name)){ return values.get(name).get(object); } return null; } public Class<?> getValueTypeByName(String name){ if (values.containsKey(name)){ return values.get(name).getType(); } return null; } }