package edu.ualberta.med.biobank.treeview.util; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.List; import net.sf.cglib.proxy.Enhancer; import edu.ualberta.med.biobank.common.wrappers.ModelWrapper; import edu.ualberta.med.biobank.treeview.AbstractAdapterBase; import edu.ualberta.med.biobank.treeview.AdapterBase; public class AdapterFactory { private static List<String> adaptersPackages; static { String topPackage = AbstractAdapterBase.class.getPackage().getName(); adaptersPackages = new ArrayList<String>(); for (Package p : Package.getPackages()) { if (p.getName().startsWith(topPackage)) { adaptersPackages.add(p.getName()); } } } public static AbstractAdapterBase getAdapter(Object object) { Class<?> objectClass = object.getClass(); // FIXME need something better in common, or just this might be inside // presenters or actions ? if (Enhancer.isEnhanced(objectClass)) { objectClass = objectClass.getSuperclass(); } String objectClassName = objectClass.getSimpleName(); String adapterClassName = objectClassName.replace("Wrapper", "") + "Adapter"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ try { for (String packageName : adaptersPackages) { Class<?> klass; try { klass = Class.forName(packageName + "." + adapterClassName); //$NON-NLS-1$ } catch (ClassNotFoundException e) { // try next package continue; } Class<?> parentClass = AbstractAdapterBase.class; if (object instanceof ModelWrapper) parentClass = AdapterBase.class; Constructor<?> constructor = klass.getConstructor(new Class[] { parentClass, objectClass }); return (AbstractAdapterBase) constructor .newInstance(new Object[] { null, object }); } throw new Exception("No adapter class found:" + adapterClassName); //$NON-NLS-1$ } catch (Exception e) { throw new RuntimeException( "error in invoking adapter for object: " + objectClassName //$NON-NLS-1$ + " (adapter name is " + adapterClassName + "). ", e); //$NON-NLS-1$ //$NON-NLS-2$ } } }