package org.objectstyle.wolips.eomodeler.core.sql;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.objectstyle.wolips.eomodeler.core.model.EODatabaseConfig;
import org.objectstyle.wolips.eomodeler.core.model.EOModel;
public class EOFSQLGeneratorFactory implements IEOSQLGeneratorFactory {
public IEOSQLGenerator sqlGenerator(EOModel model, List<String> entityNames, EODatabaseConfig databaseConfig, ClassLoader eomodelClassLoader, boolean runInEntityModeler) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {
WOUtils.setWOSystemProperties();
String className = "org.objectstyle.wolips.eomodeler.core.sql.EOFSQLGenerator53";
Class sqlGeneratorClass = Class.forName(className, true, eomodelClassLoader);
List<URL> modelURLs = new LinkedList();
// AK: I hope this does the right thing... we add all other models
// before the one in question
Iterator modelsIter = model.getModelGroup().getModels().iterator();
while (modelsIter.hasNext()) {
EOModel otherModel = (EOModel) modelsIter.next();
if (otherModel != model) {
URL otherModelURL = otherModel.getModelURL();
modelURLs.add(WOUtils.trimModelURLs(otherModelURL));
}
}
modelURLs.add(WOUtils.trimModelURLs(model.getModelURL()));
Constructor sqlGeneratorConstructor = sqlGeneratorClass.getConstructor(new Class[] { String.class, List.class, List.class, Map.class, boolean.class });
if (databaseConfig == null) {
throw new IllegalStateException("Database config is not defined");
}
Object sqlGeneratorButICantCastItBecauseItCrossesClassLoaders = sqlGeneratorConstructor.newInstance(new Object[] { model.getName(), modelURLs, entityNames, databaseConfig.toMap().getBackingMap(), Boolean.valueOf(runInEntityModeler) });
IEOSQLGenerator sqlGenerator = new ReflectionSQLGenerator(sqlGeneratorButICantCastItBecauseItCrossesClassLoaders);
return sqlGenerator;
}
protected static class ReflectionSQLGenerator implements IEOSQLGenerator {
private Object _eofSQLGenerator;
public ReflectionSQLGenerator(Object eofSQLGenerator) {
_eofSQLGenerator = eofSQLGenerator;
}
public void executeSQL(String sql) throws SQLException {
try {
_eofSQLGenerator.getClass().getMethod("executeSQL", String.class).invoke(_eofSQLGenerator, sql);
} catch (Throwable e) {
throw new RuntimeException("Failed to generate SQL.", e);
}
}
public String generateSchemaCreationScript(Map flagsMap) {
try {
return (String) _eofSQLGenerator.getClass().getMethod("generateSchemaCreationScript", Map.class).invoke(_eofSQLGenerator, flagsMap);
} catch (Throwable e) {
throw new RuntimeException("Failed to generate SQL.", e);
}
}
}
}