View Javadoc
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                  // We use "startsWith" here, because the ProductName for DB2 contains OS information.
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  }