package org.concord.otrunk;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.concord.framework.otrunk.OTController;
import org.concord.framework.otrunk.OTControllerRegistry;
import org.concord.framework.otrunk.OTObject;
public class OTControllerRegistryImpl implements OTControllerRegistry
{
// This maps from the class that can be managed to
// the OTController which can handle it. This can be a one to
// many map. So the values are Lists.
Map<Class<?>, Class<? extends OTController>> controllerClassesFromRealObject =
new HashMap<Class<?>, Class<? extends OTController>>();
// This maps from the otObject class that can be managed to
// the list of OTControllers which can handle it.
Map<Class<? extends OTObject>, Class<? extends OTController>> controllerClassesFromOTObject =
new HashMap<Class<? extends OTObject>, Class<? extends OTController>>();
ArrayList<Class<? extends OTController>> controllerClasses = new ArrayList<Class<? extends OTController>>();
/* (non-Javadoc)
* @see org.concord.otrunk.OTControllerRegistry#registerControllerClass(java.lang.Class)
*/
public void registerControllerClass(Class<? extends OTController> controllerClass) {
if(controllerClasses.contains(controllerClass)){
return;
}
controllerClasses.add(controllerClass);
Class<?> [] classes = getRealObjectClasses(controllerClass);
for(int i=0; i<classes.length; i++) {
controllerClassesFromRealObject.put(classes[i], controllerClass);
}
Class<? extends OTObject> klass = getOTObjectClass(controllerClass);
controllerClassesFromOTObject.put(klass, controllerClass);
}
public final static Class<?> [] getRealObjectClasses(Class<? extends OTController> controllerClass) {
try {
Field field = controllerClass.getField("realObjectClasses");
return (Class [])field.get(null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
@SuppressWarnings("unchecked")
public final static Class<? extends OTObject> getOTObjectClass(Class<? extends OTController> controllerClass) {
try {
Field field = controllerClass.getField("otObjectClass");
return (Class<? extends OTObject>)field.get(null);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
System.err.println("invalid controller class: " + controllerClass);
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.concord.otrunk.OTControllerRegistry#getControllerClassByOTObjectClass(java.lang.Class)
*/
public Class<? extends OTController> getControllerClassByOTObjectClass(Class<? extends OTObject> otObjectClass)
{
return controllerClassesFromOTObject.get(otObjectClass);
}
/* (non-Javadoc)
* @see org.concord.otrunk.OTControllerRegistry#getControllerClassByRealObjectClass(java.lang.Class)
*/
public Class<? extends OTController> getControllerClassByRealObjectClass(Class<?> realObjectClass)
{
return controllerClassesFromRealObject.get(realObjectClass);
}
}