(no commit message)
[utils] / test / enterprise / src / main / java / org / wamblee / support / persistence / AbstractDatabase.java
diff --git a/test/enterprise/src/main/java/org/wamblee/support/persistence/AbstractDatabase.java b/test/enterprise/src/main/java/org/wamblee/support/persistence/AbstractDatabase.java
new file mode 100644 (file)
index 0000000..59f3d77
--- /dev/null
@@ -0,0 +1,78 @@
+package org.wamblee.support.persistence;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnectionFactory;
+import org.apache.commons.dbcp.PoolingDataSource;
+import org.apache.commons.pool.impl.GenericObjectPool;
+
+public abstract class AbstractDatabase implements Database {
+       private static final int CONNECTION_POOL_SIZE = 16;
+
+    private DataSource itsDataSource; 
+       
+       private boolean started; 
+       
+       protected AbstractDatabase() { 
+               started = false; 
+       }
+       
+       protected abstract void doStart();
+       
+       protected abstract void doStop();
+       
+       /**
+        * This method must be called from the start method. 
+        */
+       protected final void createDataSource() { 
+               GenericObjectPool connectionPool = new GenericObjectPool(null);
+               connectionPool.setMaxActive(CONNECTION_POOL_SIZE);
+               ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(getJdbcUrl(), getUsername(), getPassword());
+               // The following line must be kept in although it does not appear to be used, the constructor regsiters the
+               // constructed object at the connection pool. 
+               PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
+               itsDataSource = new PoolingDataSource(connectionPool);
+       }
+       
+       
+       /// BELOW THIS LINE IS NOT OF INTEREST TO SUBCLASSES.
+       
+       public final DataSource start() {
+               if ( started ) { 
+                       throw new RuntimeException("Database already started"); 
+               }
+               started = true; 
+               doStart();
+               return getDatasource();
+       }
+       
+       public final void stop() { 
+               if ( ! started ) { 
+                       return; // nothing to do. 
+               }
+               started = false;
+               doStop(); 
+       }
+
+       private final DataSource getDatasource() {
+               if ( !started) { 
+                       throw new RuntimeException("Database is not started!");
+               }
+               return itsDataSource;
+       }
+       
+       protected String getProperty(String aName) { 
+               String value = System.getProperty(aName); 
+               if ( value != null ) { 
+                       return value;
+               }
+               value = System.getenv(aName); 
+               if ( value != null ) { 
+                       return value; 
+               }
+               throw new RuntimeException("This class expects the '" + aName + "' property to be set");
+       }
+
+}