package org.objectstyle.wolips.eomodeler.core.sql; import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Map; import org.objectstyle.wolips.eomodeler.core.model.EODatabaseConfig; public class EOFSQLReverseEngineerFactory implements IEOSQLReverseEngineerFactory { public IEOSQLReverseEngineer reverseEngineer(EODatabaseConfig databaseConfig, ClassLoader eomodelClassLoader) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { WOUtils.setWOSystemProperties(); String className = "org.objectstyle.wolips.eomodeler.core.sql.EOFSQLReverseEngineer53"; Class reverseEngineerClass = Class.forName(className, true, eomodelClassLoader); Constructor reverseEngineerConstructor = reverseEngineerClass.getConstructor(new Class[] { String.class, Map.class }); Object reverseEngineerButICantCastItBecauseItCrossesClassLoaders = reverseEngineerConstructor.newInstance(new Object[] { databaseConfig.getAdaptorName(), databaseConfig.getConnectionDictionary() }); IEOSQLReverseEngineer reverseEngineer = new ReflectionSQLReverseEngineer(reverseEngineerButICantCastItBecauseItCrossesClassLoaders); return reverseEngineer; } protected static class ReflectionSQLReverseEngineer implements IEOSQLReverseEngineer { private Object _eofSQLReverseEngineer; public ReflectionSQLReverseEngineer(Object eofSQLReverseEngineer) { _eofSQLReverseEngineer = eofSQLReverseEngineer; } public File reverseEngineerIntoModel() throws IOException { try { return (File) _eofSQLReverseEngineer.getClass().getMethod("reverseEngineerIntoModel").invoke(_eofSQLReverseEngineer); } catch (Throwable e) { throw new RuntimeException("Failed to reverse engineer.", e); } } public List<String> reverseEngineerTableNames() { try { return (List<String>) _eofSQLReverseEngineer.getClass().getMethod("reverseEngineerTableNames").invoke(_eofSQLReverseEngineer); } catch (Throwable e) { throw new RuntimeException("Failed to reverse engineer.", e); } } public File reverseEngineerWithTableNamesIntoModel(List<String> tableNamesList) throws IOException { try { return (File) _eofSQLReverseEngineer.getClass().getMethod("reverseEngineerWithTableNamesIntoModel", List.class).invoke(_eofSQLReverseEngineer, tableNamesList); } catch (Throwable e) { throw new RuntimeException("Failed to reverse engineer.", e); } } } }