1 package com.atlassian.activeobjects.test;
2
3 import com.atlassian.activeobjects.internal.EntityManagedActiveObjects;
4 import com.atlassian.activeobjects.internal.TransactionManager;
5 import com.atlassian.activeobjects.spi.DatabaseType;
6 import com.atlassian.sal.api.transaction.TransactionCallback;
7 import com.google.common.collect.ImmutableMap;
8 import net.java.ao.ActiveObjectsException;
9 import net.java.ao.EntityManager;
10 import net.java.ao.Transaction;
11
12 import java.sql.Connection;
13 import java.sql.SQLException;
14 import java.util.Map;
15
16 public final class TestActiveObjects extends EntityManagedActiveObjects {
17
18 private static final Map<String, DatabaseType> DATABASE_PRODUCT_TO_TYPE_MAP = ImmutableMap.<String, DatabaseType>builder()
19 .put("H2", DatabaseType.H2)
20 .put("HSQL Database Engine", DatabaseType.HSQL)
21 .put("MySQL", DatabaseType.MYSQL)
22 .put("PostgreSQL", DatabaseType.POSTGRESQL)
23 .put("Oracle", DatabaseType.ORACLE)
24 .put("Microsoft SQL Server", DatabaseType.MS_SQL)
25 .put("DB2", DatabaseType.DB2)
26 .build();
27
28 public TestActiveObjects(final EntityManager entityManager) {
29 super(entityManager, new TransactionManager() {
30 public <T> T doInTransaction(final TransactionCallback<T> callback) {
31 try {
32 return new Transaction<T>(entityManager) {
33 public T run() {
34 return callback.doInTransaction();
35 }
36 }.execute();
37 } catch (SQLException e) {
38 throw new ActiveObjectsException(e);
39 }
40 }
41 }, findDatabaseType(entityManager));
42 }
43
44 private static DatabaseType findDatabaseType(EntityManager entityManager) {
45 Connection connection = null;
46 try {
47 connection = entityManager.getProvider().getConnection();
48 String dbName = connection.getMetaData().getDatabaseProductName();
49 for (Map.Entry<String, DatabaseType> entry : DATABASE_PRODUCT_TO_TYPE_MAP.entrySet()) {
50
51 if (dbName.startsWith(entry.getKey())) {
52 return entry.getValue();
53 }
54 }
55 } catch (SQLException e) {
56 throw new ActiveObjectsException(e);
57 } finally {
58 if (connection != null) {
59 try {
60 connection.close();
61 } catch (SQLException e) {
62 throw new ActiveObjectsException(e);
63 }
64 }
65 }
66
67 return DatabaseType.UNKNOWN;
68 }
69 }