Package org.objectstyle.wolips.eomodeler.core.sql

Source Code of org.objectstyle.wolips.eomodeler.core.sql.EOFSQLGeneratorFactory$ReflectionSQLGenerator

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;
    if (WOUtils.version(eomodelClassLoader) == WOUtils.Version.WO_5_6) {
      className = "org.objectstyle.wolips.eomodeler.core.sql.EOFSQLGenerator56";
    }
    else {
      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);
      }
    }
  }
}
TOP

Related Classes of org.objectstyle.wolips.eomodeler.core.sql.EOFSQLGeneratorFactory$ReflectionSQLGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.