package com.brightgenerous.datasource;
import java.lang.reflect.Method;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource;
import org.apache.derby.jdbc.EmbeddedDataSourceInterface;
import com.brightgenerous.datasource.jdbc.guice.mapper._mapper_;
import com.brightgenerous.datasource.jdbc.guice.mapper.derby._mapper_derby_;
import com.brightgenerous.datasource.jdbc.guice.transaction._transaction_;
import com.brightgenerous.injection.PackageImplResolver;
import com.brightgenerous.injection.PatternClassFilter;
import com.brightgenerous.injection.PatternMemberFilter;
import com.brightgenerous.injection.jdbc.guice.InjectorConfig;
import com.brightgenerous.injection.jdbc.guice.InjectorFactory;
import com.brightgenerous.orm.mapper.MapperMethods;
import com.brightgenerous.orm.mapper.TypeComparator;
public class JdbcGuiceDataSource extends DataSource {
@Override
protected InjectorFactory createInjectorFactory() {
return new InjectorFactoryImpl();
}
static class InjectorFactoryImpl extends InjectorFactory {
private static final long serialVersionUID = -8248458184709739906L;
private static final String DATASOURCE_NAME = "jdbc/derby";
@Override
protected InjectorConfig createConfig() {
InjectorConfig config = new InjectorConfig();
config.setDataSourceName(DATASOURCE_NAME);
config.setTransactionPackages(_transaction_.class);
config.setTransactionClassFilter(new PatternClassFilter("^.*Transaction$"));
config.setTransactionMethodFilter(new PatternMemberFilter<Method>(
"^(add|edit|remove|initialize|destroy).*$"));
config.setMapperPackages(_mapper_.class);
config.setMapperClassFilter(new PatternClassFilter("^.*Mapper$"));
config.setMapperImplResolver(new PackageImplResolver(_mapper_derby_.class));
return config;
}
@Override
public void onInitialize() {
super.onInitialize();
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
EmbeddedDataSourceInterface dataSource = new EmbeddedConnectionPoolDataSource();
dataSource.setDatabaseName("test");
dataSource.setCreateDatabase("create");
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.naming.java.javaURLContextFactory");
// System.setProperty(Context.URL_PKG_PREFIXES, "org.apache.naming");
Context context = new InitialContext();
{
{
int index = 0;
if ((index = DATASOURCE_NAME.indexOf(":")) != -1) {
context.createSubcontext(DATASOURCE_NAME.substring(0, index + 1));
}
}
{
int index = 0;
while ((index = DATASOURCE_NAME.indexOf("/", index)) != -1) {
context.createSubcontext(DATASOURCE_NAME.substring(0, index));
index += 1;
}
}
}
context.bind(DATASOURCE_NAME, dataSource);
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| NamingException e) {
throw new RuntimeException(e);
}
MapperMethods
.set(com.brightgenerous.datasource.mybatis.guice.mapper.MapperMethods.class);
}
@Override
protected boolean compareBeanToTable(DatabaseMetaData dmd, Set<Class<?>> beanClasses)
throws SQLException {
MapperMethods mapperMethods = MapperMethods.get();
Map<Class<?>, String> targetTables = mapperMethods.getTargetTables();
for (Class<?> beanClass : beanClasses) {
String table = targetTables.get(beanClass);
if (table != null) {
Map<String, String> columnTypes = new TreeMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.toLowerCase().compareTo(o2.toLowerCase());
}
});
try (ResultSet rs = dmd.getColumns(null, "APP", table.toUpperCase(), "%")) {
while (rs.next()) {
String name = rs.getString("COLUMN_NAME");
String type = rs.getString("TYPE_NAME");
columnTypes.put(name, type);
}
}
mapperMethods.verify(table, columnTypes, TypeComparator.DERBY);
}
}
return true;
}
@Override
public void onDestroy() {
super.onDestroy();
try {
DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (Exception ex) {
}
Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
try {
DriverManager.deregisterDriver(driver);
} catch (SQLException e) {
}
}
}
}
}