/activeobjects-plugin/src/main/java/com/atlassian/activeobjects/internal/JdbcDriverDatabaseProviderFactory.java
Java | 152 lines | 131 code | 15 blank | 6 comment | 8 complexity | db430c5e445eb0cce43f1a58cfe2fd24 MD5 | raw file
Possible License(s): Apache-2.0
1package com.atlassian.activeobjects.internal;
2
3import com.atlassian.activeobjects.spi.DatabaseType;
4import net.java.ao.DatabaseProvider;
5import net.java.ao.Disposable;
6import net.java.ao.DisposableDataSource;
7import net.java.ao.builder.DelegatingDisposableDataSourceHandler;
8import net.java.ao.db.ClientDerbyDatabaseProvider;
9import net.java.ao.db.EmbeddedDerbyDatabaseProvider;
10import net.java.ao.db.H2DatabaseProvider;
11import net.java.ao.db.HSQLDatabaseProvider;
12import net.java.ao.db.MsJdbcSQLServerDatabaseProvider;
13import net.java.ao.db.MySQLDatabaseProvider;
14import net.java.ao.db.NuoDBDatabaseProvider;
15import net.java.ao.db.NuoDBDisposableDataSourceHandler;
16import net.java.ao.db.OracleDatabaseProvider;
17import net.java.ao.db.PostgreSQLDatabaseProvider;
18import net.java.ao.db.SQLServerDatabaseProvider;
19
20import javax.sql.DataSource;
21
22import static com.atlassian.activeobjects.ao.ConverterUtils.toLowerCase;
23import static com.google.common.base.Preconditions.checkNotNull;
24
25public final class JdbcDriverDatabaseProviderFactory implements DatabaseProviderFactory {
26 private final DriverNameExtractor driverNameExtractor;
27
28 public JdbcDriverDatabaseProviderFactory(DriverNameExtractor driverNameExtractor) {
29 this.driverNameExtractor = checkNotNull(driverNameExtractor);
30 }
31
32 public DatabaseProvider getDatabaseProvider(DataSource dataSource, DatabaseType databaseType, String schema) {
33 final String driverName = getDriverName(dataSource);
34 for (DatabaseProviderFactoryEnum dbProviderFactory : DatabaseProviderFactoryEnum.values()) {
35 if (dbProviderFactory.accept(databaseType, driverName)) {
36 return dbProviderFactory.getDatabaseProvider(dataSource, schema);
37 }
38 }
39 throw new DatabaseProviderNotFoundException(driverName);
40 }
41
42 private String getDriverName(DataSource dataSource) {
43 return driverNameExtractor.getDriverName(dataSource);
44 }
45
46 /**
47 * TODO fix, this is actually not tested and needs to be. This is possibly quite fragile as well, as I don't know
48 * yet what happens to the driver name when using connection pooling, but I'd bet it changes to something that doesn't
49 * give much information
50 */
51 private static enum DatabaseProviderFactoryEnum {
52 MYSQL(DatabaseType.MYSQL, "mysql", false) {
53 @Override
54 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
55 return new MySQLDatabaseProvider(getDisposableDataSource(dataSource));
56 }
57 },
58 DERBY_NETWORK(DatabaseType.DERBY_NETWORK, "derby", false) {
59 @Override
60 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
61 return new ClientDerbyDatabaseProvider(getDisposableDataSource(dataSource));
62 }
63 },
64 DERBY_EMBEDDED(DatabaseType.DERBY_EMBEDDED, "derby", false) {
65 @Override
66 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
67 return new EmbeddedDerbyDatabaseProvider(getDisposableDataSource(dataSource), "a-fake-uri"); // TODO handle the URI issue
68 }
69 },
70 ORACLE(DatabaseType.ORACLE, "oracle", false) {
71 @Override
72 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
73 return new OracleDatabaseProvider(getDisposableDataSource(dataSource), schema);
74 }
75 },
76 POSTGRESQL(DatabaseType.POSTGRESQL, "postgres", false) {
77 @Override
78 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
79 return new PostgreSQLDatabaseProvider(getDisposableDataSource(dataSource), schema);
80 }
81 },
82 MSSQL(DatabaseType.MS_SQL, "microsoft", true) {
83 @Override
84 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
85 return new MsJdbcSQLServerDatabaseProvider(getDisposableDataSource(dataSource), schema);
86 }
87 },
88 MSSQL_JTDS(DatabaseType.MS_SQL, "jtds", true) {
89 @Override
90 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
91 return new SQLServerDatabaseProvider(getDisposableDataSource(dataSource), schema);
92 }
93 },
94 HSQLDB(DatabaseType.HSQL, "hsql", false) {
95 @Override
96 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
97 return new HSQLDatabaseProvider(getDisposableDataSource(dataSource), schema);
98 }
99 },
100 H2(DatabaseType.H2, "h2", false) {
101 @Override
102 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
103 return new H2DatabaseProvider(getDisposableDataSource(dataSource), schema);
104 }
105 },
106 NUODB(DatabaseType.NUODB, "nuodb", false) {
107 @Override
108 public DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema) {
109 return new NuoDBDatabaseProvider(NuoDBDisposableDataSourceHandler.newInstance(dataSource), schema);
110 }
111 };
112
113 private final DatabaseType databaseType;
114 private final String driverName;
115 private final boolean needsDatabaseTypeAndDriverName;
116
117 DatabaseProviderFactoryEnum(DatabaseType databaseType, String driverName, boolean needsDatabaseTypeAndDriverName) {
118 this.databaseType = checkNotNull(databaseType);
119 this.driverName = checkNotNull(driverName);
120 this.needsDatabaseTypeAndDriverName = needsDatabaseTypeAndDriverName;
121 }
122
123 boolean accept(DatabaseType otherDatabaseType, String otherDriverName) {
124 final boolean acceptDatabaseType = acceptDatabaseType(otherDatabaseType);
125 final boolean acceptDriverName = acceptDriverName(otherDriverName);
126 if (needsDatabaseTypeAndDriverName) {
127 return acceptDatabaseType && acceptDriverName;
128 } else {
129 return acceptDatabaseType || acceptDriverName;
130 }
131 }
132
133 private boolean acceptDatabaseType(DatabaseType otherDatabaseType) {
134 return databaseType.equals(otherDatabaseType);
135 }
136
137 private boolean acceptDriverName(String otherDriverName) {
138 return otherDriverName != null && toLowerCase(otherDriverName).contains(this.driverName);
139 }
140
141 // apparently useless, I know, but the compiler complains if not there
142 public abstract DatabaseProvider getDatabaseProvider(DataSource dataSource, String schema);
143 }
144
145 private static DisposableDataSource getDisposableDataSource(final DataSource dataSource) {
146 return DelegatingDisposableDataSourceHandler.newInstance(dataSource, new Disposable() {
147 @Override
148 public void dispose() {
149 }
150 });
151 }
152}