Print

Print


Author: [log in to unmask]
Date: Mon Nov 10 00:01:21 2014
New Revision: 1462

Log:
Attempt to cleanup the conditions module mess.

Removed:
    java/trunk/conditions/src/main/java/org/hps/conditions/config/
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfigurationLoader.java
    java/trunk/conditions/src/main/resources/HPS-ECalCommissioning/
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_database_testrun_2012_connection.properties
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_dev.properties
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/conditions_dev_local.properties
    java/trunk/conditions/src/main/resources/org/hps/conditions/config/jlab_hpsuser.properties
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsDevTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsSeriesConverterTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsTestRunTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/DatabaseConditionsManagerTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDaqTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalGainCompareTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalLedTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/PhysicalToGainTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/TestRunEcalConditionsConverterTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtConditionsConverterTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtGainInsertTest.java
Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsObjectConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsRecordConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsSeriesConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ConnectionParameters.java
    java/trunk/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java
    java/trunk/conditions/src/main/java/org/hps/conditions/TestRunConditionsDriver.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsObjectTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalConditionsConverterTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtConditionsConverterTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	Mon Nov 10 00:01:21 2014
@@ -1,8 +1,6 @@
 package org.hps.conditions;
 
 import static org.hps.conditions.TableConstants.SVT_CONDITIONS;
-
-import java.io.File;
 
 import org.hps.conditions.svt.SvtConditions;
 import org.hps.conditions.svt.SvtDetectorSetup;
@@ -18,37 +16,15 @@
  */
 public class ConditionsDriver extends AbstractConditionsDriver {
 
-    // Default conditions system XML config, which is for the Test Run 2012 database.
-    static final String DB_CONFIG = "/org/hps/conditions/config/conditions_dev.xml";
-
-    // Default database connection parameters, which points to the SLAC development database.
-    static final String DB_CONNECTION = "/org/hps/conditions/config/conditions_dev.properties";
-    
-    File connectionFile;
-
     public ConditionsDriver() {
         if (ConditionsManager.defaultInstance() instanceof DatabaseConditionsManager) {
         	getLogger().config("ConditionsDriver found existing DatabaseConditionsManager.");
             manager = (DatabaseConditionsManager) ConditionsManager.defaultInstance();
         } else {
             manager = new DatabaseConditionsManager();
-            manager.setConnectionResource(DB_CONNECTION);
-            manager.configure(DB_CONFIG);
-            manager.register();
         }
     }
-   
-    public void setConnectionFile(String connectionFile) {
-    	getLogger().config("set connectionFile to " + connectionFile);
-    	this.connectionFile = new File(connectionFile);
-    	manager.setConnectionProperties(this.connectionFile);
-    }
-    
-    public void setConnectionResource(String connectionResource) {
-    	getLogger().config("set connection resource to " + connectionResource);
-    	manager.setConnectionResource(connectionResource);
-    }
-   
+      
     /**
      * Load the {@link SvtConditions} set onto <code>HpsSiSensor</code>.
      * @param detector The detector to update.

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsObjectConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsObjectConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsObjectConverter.java	Mon Nov 10 00:01:21 2014
@@ -62,8 +62,7 @@
             // There were multiple records returned.
             if (!allowMultipleCollections())
                 // If there are multiple records returned but this is not allowed by the
-                // converter,
-                // then this is a fatal error.
+                // converter, then this is a fatal error.
                 throw new RuntimeException("Multiple conditions records returned but this is not allowed.");
         } else {
             // There was a single conditions record so the collection information can be

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsRecordConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsRecordConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsRecordConverter.java	Mon Nov 10 00:01:21 2014
@@ -11,7 +11,7 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @version $Id: ConditionsRecordConverter.java,v 1.5 2013/10/15 23:24:47 jeremy Exp $
  */
-public final class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
+class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
 
     /**
      * Get the ConditionsRecords for a run based on current configuration of the

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsSeriesConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsSeriesConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsSeriesConverter.java	Mon Nov 10 00:01:21 2014
@@ -20,7 +20,7 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-public class ConditionsSeriesConverter {
+class ConditionsSeriesConverter {
 
     DatabaseConditionsManager conditionsManager = null;
     

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConnectionParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConnectionParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConnectionParameters.java	Mon Nov 10 00:01:21 2014
@@ -17,14 +17,20 @@
  * @author Jeremy McCormick <[log in to unmask]>
  * @version $Id: ConnectionParameters.java,v 1.8 2013/10/04 01:54:16 jeremy Exp $
  */
-public final class ConnectionParameters {
+public class ConnectionParameters {
 
-    private String user;
-    private String password;
-    private int port;
-    private String hostname;
-    private String database;
+    protected String user;
+    protected String password;
+    protected int port;
+    protected String hostname;
+    protected String database;
 
+    /**
+     * Protected constructor for sub-classes.
+     */	
+    protected ConnectionParameters() {
+    }
+    
     /**
      * Fully qualified constructor.
      * @param user The user name.
@@ -41,11 +47,11 @@
         this.port = port;
     }
 
-    /**
+   /**
      * Get Properties object for this connection.
      * @return The Properties for this connection.
      */
-  public  Properties getConnectionProperties() {
+    public Properties getConnectionProperties() {
         Properties p = new Properties();
         p.put("user", user);
         p.put("password", password);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/DatabaseConditionsManager.java	Mon Nov 10 00:01:21 2014
@@ -5,6 +5,8 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -51,23 +53,13 @@
     protected List<TableMetaData> tableMetaData;
     protected List<ConditionsConverter> converters;
     protected File connectionPropertiesFile;
-    //protected ConditionsReader baseReader;
     protected static Logger logger = null;
-    protected ConnectionParameters connectionParameters;
+    protected ConnectionParameters connectionParameters = new DefaultConnectionParameters();
     protected Connection connection;
-    protected boolean wasConfigured = false;
     protected boolean isConnected = false;
     protected ConditionsSeriesConverter conditionsSeriesConverter = new ConditionsSeriesConverter(this);
-
-    /**
-     * Class constructor.
-     */
-    public DatabaseConditionsManager() {
-        registerConditionsConverter(new DetectorConditionsConverter());
-        //baseReader = new BaseClasspathConditionsReader();
-        setupConnectionFromSystemProperty();
-    }
-
+    protected static final String DEFAULT_CONFIG = "/org/hps/conditions/config/conditions_dev.xml";
+    
     /**
      * Simple log formatter for this class.
      */
@@ -79,7 +71,7 @@
             return sb.toString();
         }
     }
-
+    
     /**
      * Setup the logger for this class, with initial level of ALL.
      */
@@ -93,6 +85,38 @@
         logger.addHandler(handler);
         logger.config("logger initialized with level " + handler.getLevel());
     }
+    
+    /**
+     * Default connection parameters.
+     */
+    static class DefaultConnectionParameters extends ConnectionParameters {
+    	DefaultConnectionParameters() {
+    		this.port = 3306;
+    		try {
+				if (InetAddress.getLocalHost().getHostName().contains("jlab.org")) {
+					this.hostname = "jmysql.jlab.org";
+					this.database = "hps_conditions";
+				} else {
+					this.hostname = "ppa-jeremym-l.slac.stanford.edu";
+					this.database = "hps_conditions_dev";
+				}
+			} catch (UnknownHostException e) {
+				throw new RuntimeException(e);
+			}
+    		this.user = "hpsuser";
+    		this.password = "darkphoton";
+    	}
+    }
+
+    /**
+     * Class constructor.
+     */
+    public DatabaseConditionsManager() {
+        registerConditionsConverter(new DetectorConditionsConverter());
+        setupConnectionFromSystemProperty();
+        configure(DEFAULT_CONFIG);
+        register();        
+    }
 
     /**
      * Register this conditions manager as the global default.
@@ -110,11 +134,10 @@
 
         // Perform default setup if necessary.
         if (!ConditionsManager.isSetup()) {
-            DatabaseConditionsManager manager = new DatabaseConditionsManager();
-            manager.register();
-        }
-
-        // Get the instance of the manager from the conditions system and
+            new DatabaseConditionsManager();
+        }
+
+        // Get the instance of the manager from the conditions system and check
         // that the type is valid.
         ConditionsManager manager = ConditionsManager.defaultInstance();
         if (!(manager instanceof DatabaseConditionsManager)) {
@@ -127,15 +150,98 @@
     public Connection getConnection() {
         return this.connection;
     }
-
-    /**
-     * This method catches changes to the detector name and run number. Somewhat
-     * unintuitively, this method is actually called every time an lcsim event is created,
-     * so it has internal logic to figure out if the conditions system actually needs to
-     * be updated.
+    
+    /**
+     * Open the database connection.
+     */
+    public void openConnection() {
+        if (connectionParameters == null) {
+            throw new RuntimeException("The connection parameters are null.");
+        }
+        logger.config("opening connection to " + connectionParameters.getConnectionString());
+        logger.config("host " + connectionParameters.getHostname());
+        logger.config("port " + connectionParameters.getPort());
+        logger.config("user " + connectionParameters.getUser());
+        logger.config("password " + connectionParameters.getPassword());
+        logger.config("database " + connectionParameters.getDatabase());
+        connection = connectionParameters.createConnection();
+        logger.config("created connection " + connectionParameters.getConnectionString());
+        isConnected = true;
+    }
+
+    /**
+     * Close the database connection.
+     */
+    public void closeConnection() {
+        logger.config("closing connection");
+        if (connection != null) {
+            try {
+                if (!connection.isClosed()) {
+                    connection.close();
+                    logger.config("connection closed");
+                } else {
+                    logger.config("connection already closed");
+                }
+            } catch (SQLException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        connection = null;
+        connectionParameters = null;
+        isConnected = false;
+    }
+
+    @Override
+    public void finalize() {
+        if (isConnected())
+            closeConnection();
+    }
+    
+    /**
+     * Get multiple <code>ConditionsObjectCollection</code> objects that may have overlapping time validity information.
+     * @param conditionsKey The conditions key.
+     * @return The <code>ConditionsSeries</code> containing the matching <code>ConditionsObjectCollection</code>. 
+     */
+    public <CollectionType extends ConditionsObjectCollection> ConditionsSeries<CollectionType> getConditionsSeries(String conditionsKey) {
+        return conditionsSeriesConverter.createSeries(conditionsKey);
+    }
+    
+	/**
+	 * Get a given collection of the given type from the conditions database.
+	 * @param type Class type
+	 * @return A collection of objects of the given type from the conditions database
+	 */
+	public <CollectionType extends ConditionsObjectCollection> CollectionType getCollection(Class<CollectionType> type){
+		TableMetaData metaData = this.findTableMetaData(type);
+		if(metaData == null) {
+			throw new RuntimeException("Table name data for condition of type " + type.getSimpleName() + " was not found.");
+		}
+		String tableName = metaData.getTableName();
+		CollectionType conditionsCollection = this.getCachedConditions(type, tableName).getCachedData(); 
+		return conditionsCollection; 
+	}
+       
+    /**
+     * Simple utility method to cast the generic <code>ConditionsManager</code> to this class.
+     * @param conditionsManager The <code>ConditionsManager</code>.
+     * @return The <code>DatabaseConditionsManager</code> object.
+     */
+    public static DatabaseConditionsManager castFrom(ConditionsManager conditionsManager) {
+        if (conditionsManager instanceof DatabaseConditionsManager) {
+            return (DatabaseConditionsManager) conditionsManager;
+        } else {
+            throw new RuntimeException("The conditionsManager points to an object of the wrong type: " + conditionsManager.getClass().getCanonicalName());
+        }
+    }    
+
+    /**
+     * This method catches changes to the detector name and run number. 
+     * It is actually called every time an lcsim event is created, so it has internal logic 
+     * to figure out if the conditions system actually needs to be updated.
      */
     @Override
     public void setDetector(String detectorName, int runNumber) throws ConditionsNotFoundException {
+    	    	
         // Detector update.
         if (getDetector() == null || !getDetector().equals(detectorName)) {
             logger.config("setting new detector " + detectorName);
@@ -150,7 +256,6 @@
 
         // Let the super class do whatever it think it needs to do.
         super.setDetector(detectorName, runNumber);        
-        //super.setConditionsReader(this.baseReader, detectorName);
     }
 
     /**
@@ -158,10 +263,6 @@
      * @param detectorName the name of the detector
      */
     void setup(String detectorName) {
-        //if (baseReader instanceof BaseClasspathConditionsReader) {
-        //    ((BaseClasspathConditionsReader) baseReader).setResourcePath(detectorName);
-        //    logger.config("set resource path " + detectorName + " on conditions reader");
-        //}
         if (!isConnected())
             openConnection();
         else
@@ -234,18 +335,6 @@
         logger.config("setting connection resource " + resource);
         connectionParameters = ConnectionParameters.fromResource(resource);
     }
-
-    /**
-     * Set externally the base ConditionsReader that will be used to find non-database
-     * conditions such as the compact.xml file for the detector.
-     * @param reader The base ConditionsReader.
-     */
-    // FIXME: This doesn't work because the super class has some convoluted logic that always overrides
-    //        whatever is set manually as the conditions reader.
-    //public void setBaseConditionsReader(ConditionsReader baseReader) {
-    //    logger.config("setting conditions reader to " + baseReader.getClass().getCanonicalName());
-    //    this.baseReader = baseReader;
-    //}
 
     /**
      * Get the next collection ID for a database conditions table.
@@ -418,14 +507,6 @@
     }
 
     /**
-     * Return if the manager was configured e.g. from an XML configuration file.
-     * @return true if manager was configured
-     */
-    public boolean wasConfigured() {
-        return wasConfigured;
-    }
-
-    /**
      * Get the current run number.
      * @return the current run number
      */
@@ -491,9 +572,6 @@
 
         // Load the converter classes.
         loadConverters(config);
-
-        // Set configured state to true.
-        wasConfigured = true;
     }
 
     /**
@@ -501,7 +579,7 @@
      * @param in The InputStream.
      * @return The XML document.
      */
-    private Document createDocument(InputStream in) {
+    private static Document createDocument(InputStream in) {
         // Create an XML document from an InputStream.
         SAXBuilder builder = new SAXBuilder();
         Document config = null;
@@ -519,12 +597,14 @@
      */
     private void loadConverters(Document config) {
 
-        // Load the list of converters from the "converters" section of the config
-        // document.
-        (this.new ConditionsConverterLoader()).load(config.getRootElement().getChild("converters"));
+    	if (this.converters != null) {
+            this.converters.clear();
+    	}
+    	
+        // Load the list of converters from the "converters" section of the config document.
+        loadConditionsConverters(config.getRootElement().getChild("converters"));
 
         // Register the list of converters with this manager.
-        // FIXME: Should this happen here or when setup is called on the manager?
         for (ConditionsConverter converter : converters) {
             registerConditionsConverter(converter);
             logger.config("registered converter " + converter.getClass().getSimpleName());
@@ -536,168 +616,85 @@
      * @param config The XML document.
      */
     private void loadTableMetaData(Document config) {
+    	
+        if (this.tableMetaData != null) {
+        	this.tableMetaData.clear();
+        }
+        	
         // Load table meta data from the "tables" section of the config document.
-        (this.new TableMetaDataLoader()).load(config.getRootElement().getChild("tables"));
+        loadTableMetaData(config.getRootElement().getChild("tables"));
     }
     
     /**
      * Setup the database connection from a file specified by Java system property setting.
      * This is possible overridden by subsequent API calls to {@link #setConnectionProperties(File)} or
-     * {@link #setConnectionResource(String)}, as it is setup in this class's constructor.
+     * {@link #setConnectionResource(String)}, as it is called in the class's constructor.
      */
     private void setupConnectionFromSystemProperty() {
         String systemPropertiesConnectionPath = (String)System.getProperties().get(connectionProperty);
         if (systemPropertiesConnectionPath != null) {
             File f = new File(systemPropertiesConnectionPath);
             if (!f.exists())
-                throw new RuntimeException("Connection properties specified from system property does not exist!");
+                throw new RuntimeException("Connection properties specified from system property does not exist.");
             this.setConnectionProperties(f);
         }
     }
-
-    /**
-     * Open the database connection.
-     */
-    public void openConnection() {
-        if (connectionParameters == null)
-            throw new RuntimeException("The connection parameters were not configured.");
-        connection = connectionParameters.createConnection();
-        logger.config("created connection " + connectionParameters.getConnectionString());
-        isConnected = true;
-    }
-
-    /**
-     * Close the database connection.
-     */
-    public void closeConnection() {
-        logger.config("closing connection");
-        if (connection != null) {
-            try {
-                if (!connection.isClosed()) {
-                    connection.close();
-                    logger.config("connection closed");
-                } else {
-                    logger.config("connection already closed");
-                }
-            } catch (SQLException e) {
-                throw new RuntimeException(e);
-            }
-        }
-        connection = null;
-        connectionParameters = null;
-    }
-
-    @Override
-    public void finalize() {
-        if (isConnected())
-            closeConnection();
-    }
-    
-    /**
-     * Get multiple <code>ConditionsObjectCollection</code> objects that may have overlapping time validity information.
-     * @param conditionsKey The conditions key.
-     * @return The <code>ConditionsSeries</code> containing the matching <code>ConditionsObjectCollection</code>. 
-     */
-    public <CollectionType extends ConditionsObjectCollection> ConditionsSeries<CollectionType> getConditionsSeries(String conditionsKey) {
-        return conditionsSeriesConverter.createSeries(conditionsKey);
-    }
     
 	/**
-	 * Get a given collection of the given type from the conditions database.
-	 * 
-	 * @param type Class type
-	 * @return A collection of objects of the given type from the conditions database
+	 * This method expects an XML element containing child "table" elements.
+	 * @param element
 	 */
-	public <CollectionType extends ConditionsObjectCollection> CollectionType getCollection(Class<CollectionType> type){
-		
-		// Get the table name from the database configuration
-		TableMetaData metaData = this.findTableMetaData(type);
-		if(metaData == null) 
-			throw new RuntimeException("Table name data for condition of type " + type.getSimpleName() + " was not found.");
-		String tableName = metaData.getTableName();
-
-		// FIXME: This should be changed to catch a conditions record not found exception instead of 
-		// 		  a runtime exception.
-		CollectionType conditionsCollection = this.getCachedConditions(type, tableName).getCachedData(); 
-		return conditionsCollection; 
+	@SuppressWarnings("unchecked")
+	void loadTableMetaData(Element element) {
+
+		tableMetaData = new ArrayList<TableMetaData>();
+
+		for (Iterator<?> iterator = element.getChildren("table").iterator(); iterator.hasNext();) {
+			Element tableElement = (Element) iterator.next();
+			String tableName = tableElement.getAttributeValue("name");
+			String key = tableElement.getAttributeValue("key");
+
+			Element classesElement = tableElement.getChild("classes");
+			Element classElement = classesElement.getChild("object");
+			Element collectionElement = classesElement.getChild("collection");
+
+			String className = classElement.getAttributeValue("class");
+			String collectionName = collectionElement.getAttributeValue("class");
+
+			Class<? extends ConditionsObject> objectClass;
+			Class<?> rawObjectClass;
+			try {
+				rawObjectClass = Class.forName(className);
+				if (!ConditionsObject.class.isAssignableFrom(rawObjectClass)) {
+					throw new RuntimeException("The class " + rawObjectClass.getSimpleName() + " does not extend ConditionsObject.");
+				}
+				objectClass = (Class<? extends ConditionsObject>) rawObjectClass;
+			} catch (ClassNotFoundException e) {
+				throw new RuntimeException(e);
+			}
+
+			Class<? extends ConditionsObjectCollection<?>> collectionClass;
+			Class<?> rawCollectionClass;
+			try {
+				rawCollectionClass = Class.forName(collectionName);
+				if (!ConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
+					throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
+				collectionClass = (Class<? extends ConditionsObjectCollection<?>>) rawCollectionClass;
+			} catch (ClassNotFoundException e) {
+				throw new RuntimeException(e);
+			}
+
+			TableMetaData tableData = new TableMetaData(key, tableName, objectClass, collectionClass);
+			Element fieldsElement = tableElement.getChild("fields");
+			for (Iterator<?> fieldsIterator = fieldsElement.getChildren("field").iterator(); fieldsIterator.hasNext();) {
+				Element fieldElement = (Element) fieldsIterator.next();
+				String fieldName = fieldElement.getAttributeValue("name");
+				tableData.addField(fieldName);
+			}
+
+			tableMetaData.add(tableData);
+		}
 	}
-       
-    /**
-     * Simple utility method to cast the generic <code>ConditionsManager</code> to this class.
-     * @param conditionsManager The <code>ConditionsManager</code>.
-     * @return The <code>DatabaseConditionsManager</code> object.
-     */
-    public static DatabaseConditionsManager castFrom(ConditionsManager conditionsManager) {
-        if (conditionsManager instanceof DatabaseConditionsManager) {
-            return (DatabaseConditionsManager) conditionsManager;
-        } else {
-            throw new RuntimeException("The conditionsManager points to an object of the wrong type: " + conditionsManager.getClass().getCanonicalName());
-        }
-    }    
-        
-    /**
-     * This class loads an XML configuration of conditions table meta data.
-     * 
-     * @author Jeremy McCormick <[log in to unmask]>
-     */
-    class TableMetaDataLoader {
-
-        /**
-         * This method expects an XML element containing child "table" elements.
-         * @param element
-         */
-        @SuppressWarnings("unchecked")
-        void load(Element element) {
-
-            tableMetaData = new ArrayList<TableMetaData>();
-
-            for (Iterator<?> iterator = element.getChildren("table").iterator(); iterator.hasNext();) {
-                Element tableElement = (Element) iterator.next();
-                String tableName = tableElement.getAttributeValue("name");
-                String key = tableElement.getAttributeValue("key");
-
-                Element classesElement = tableElement.getChild("classes");
-                Element classElement = classesElement.getChild("object");
-                Element collectionElement = classesElement.getChild("collection");
-
-                String className = classElement.getAttributeValue("class");
-                String collectionName = collectionElement.getAttributeValue("class");
-
-                Class<? extends ConditionsObject> objectClass;
-                Class<?> rawObjectClass;
-                try {
-                    rawObjectClass = Class.forName(className);
-                    if (!ConditionsObject.class.isAssignableFrom(rawObjectClass)) {
-                        throw new RuntimeException("The class " + rawObjectClass.getSimpleName() + " does not extend ConditionsObject.");
-                    }
-                    objectClass = (Class<? extends ConditionsObject>) rawObjectClass;
-                } catch (ClassNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-
-                Class<? extends ConditionsObjectCollection<?>> collectionClass;
-                Class<?> rawCollectionClass;
-                try {
-                    rawCollectionClass = Class.forName(collectionName);
-                    if (!ConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
-                        throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
-                    collectionClass = (Class<? extends ConditionsObjectCollection<?>>) rawCollectionClass;
-                } catch (ClassNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-
-                TableMetaData tableData = new TableMetaData(key, tableName, objectClass, collectionClass);
-                Element fieldsElement = tableElement.getChild("fields");
-                for (Iterator<?> fieldsIterator = fieldsElement.getChildren("field").iterator(); fieldsIterator.hasNext();) {
-                    Element fieldElement = (Element) fieldsIterator.next();
-                    String fieldName = fieldElement.getAttributeValue("name");
-                    tableData.addField(fieldName);
-                }
-
-                tableMetaData.add(tableData);
-            }
-        }
-    }
 
     /**
      * This class reads in an XML configuration specifying a list of converter classes,
@@ -705,28 +702,24 @@
      * 
      * @author Jeremy McCormick <[log in to unmask]>
      */
-    class ConditionsConverterLoader {
-
-        void load(Element element) {
-            converters = new ArrayList<ConditionsConverter>();
-            for (Iterator iterator = element.getChildren("converter").iterator(); iterator.hasNext();) {
-                Element converterElement = (Element) iterator.next();
-                try {
-                    Class converterClass = Class.forName(converterElement.getAttributeValue("class"));
-                    if (ConditionsConverter.class.isAssignableFrom(converterClass)) {
-                        try {
-                            converters.add((ConditionsConverter) converterClass.newInstance());
-                        } catch (InstantiationException | IllegalAccessException e) {
-                            throw new RuntimeException(e);
-                        }
-                    } else {
-                        throw new RuntimeException("The converter class " + converterClass.getSimpleName() + " does not extend the correct base type.");
-                    }
-                } catch (ClassNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-        }
-    }
-
+	private void loadConditionsConverters(Element element) {
+		converters = new ArrayList<ConditionsConverter>();
+		for (Iterator iterator = element.getChildren("converter").iterator(); iterator.hasNext();) {
+			Element converterElement = (Element) iterator.next();
+			try {
+				Class converterClass = Class.forName(converterElement.getAttributeValue("class"));
+				if (ConditionsConverter.class.isAssignableFrom(converterClass)) {
+					try {
+						converters.add((ConditionsConverter) converterClass.newInstance());
+					} catch (InstantiationException | IllegalAccessException e) {
+						throw new RuntimeException(e);
+					}
+				} else {
+					throw new RuntimeException("The converter class " + converterClass.getSimpleName() + " does not extend the correct base type.");
+				}
+			} catch (ClassNotFoundException e) {
+				throw new RuntimeException(e);
+			}
+		}
+	}
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/TestRunConditionsDriver.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/TestRunConditionsDriver.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/TestRunConditionsDriver.java	Mon Nov 10 00:01:21 2014
@@ -18,21 +18,15 @@
  */
 public class TestRunConditionsDriver extends AbstractConditionsDriver {
 
-	// Default conditions system XML config, which is for the Test Run 2012 database.
-    static final String TEST_RUN_CONFIG = "/org/hps/conditions/config/conditions_database_testrun_2012.xml";
-
-    // Default database connection parameters, which points to the SLAC development database.
-    static final String TEST_RUN_CONNECTION = "/org/hps/conditions/config/conditions_dev.properties";
-
     // Default constructor used to setup the database connection
-    public TestRunConditionsDriver(){
+    public TestRunConditionsDriver() {
         if (ConditionsManager.defaultInstance() instanceof DatabaseConditionsManager) {
-            System.out.println(this.getName()+": Found existing DatabaseConditionsManager");
-            manager = (DatabaseConditionsManager) ConditionsManager.defaultInstance();
+        	//System.out.println(this.getName()+": Found existing DatabaseConditionsManager");
+            //manager = (DatabaseConditionsManager) ConditionsManager.defaultInstance();
+        	throw new RuntimeException("ConditionsManager was already setup.");
         } else { 
             manager = new DatabaseConditionsManager();
-            manager.setConnectionResource(TEST_RUN_CONNECTION);
-            manager.configure(TEST_RUN_CONFIG);
+            manager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
             manager.register();
         }
     }

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsObjectTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsObjectTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsObjectTest.java	Mon Nov 10 00:01:21 2014
@@ -2,7 +2,6 @@
 
 import junit.framework.TestCase;
 
-import org.hps.conditions.config.TestRunReadOnlyConfiguration;
 import org.hps.conditions.svt.SvtGain;
 import org.hps.conditions.svt.SvtGain.SvtGainCollection;
 
@@ -11,19 +10,12 @@
  * {@link org.hps.conditions.svt.SvtGain} type.
  * 
  * @author Jeremy McCormick <[log in to unmask]>
- * 
  */
-// TODO: Add test of collection operations similar to the one for individual objects.
 public class ConditionsObjectTest extends TestCase {
 
-    DatabaseConditionsManager conditionsManager;
-
-    public void setUp() {
-        new TestRunReadOnlyConfiguration(true);
-        conditionsManager = DatabaseConditionsManager.getInstance();
-    }
-
     public void testBasicOperations() throws ConditionsObjectException {
+    	
+        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
 
         // Create a new collection, setting its table meta data and collection ID.
         TableMetaData tableMetaData = conditionsManager.findTableMetaData(TableConstants.SVT_GAINS);

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalConditionsConverterTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalConditionsConverterTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalConditionsConverterTest.java	Mon Nov 10 00:01:21 2014
@@ -3,7 +3,7 @@
 import junit.framework.TestCase;
 
 import org.hps.conditions.DatabaseConditionsManager;
-import org.hps.conditions.config.DevReadOnlyConfiguration;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
 
 /**
  * Tests that a {@link EcalConditions} objects loads without errors.
@@ -14,8 +14,12 @@
     DatabaseConditionsManager conditionsManager;
     
     public void setUp() {                
-        new DevReadOnlyConfiguration().setup().load("HPS-Proposal2014-v7-2pt2", 0);
         conditionsManager = DatabaseConditionsManager.getInstance();
+        try {
+			conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 0);
+		} catch (ConditionsNotFoundException e) {
+			throw new RuntimeException(e);
+		}
     }
 
     public void test() {       

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/ecal/EcalDetectorSetupTest.java	Mon Nov 10 00:01:21 2014
@@ -5,13 +5,13 @@
 import junit.framework.TestCase;
 
 import org.hps.conditions.DatabaseConditionsManager;
-import org.hps.conditions.config.TestRunReadOnlyConfiguration;
 import org.lcsim.detector.converter.compact.EcalCrystal;
 import org.lcsim.geometry.Detector;
 
 /**
- * This test loads ECal conditions data onto the detector and checks some of the results
+ * This test loads ECal conditions data onto a Test Run detector and checks some of the results
  * for basic validity.
+ * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public class EcalDetectorSetupTest extends TestCase {
@@ -33,19 +33,17 @@
     // The total number of crystals that should be processed.
     private static final int CRYSTAL_COUNT = 442;
 
-    public void setUp() {
-        new TestRunReadOnlyConfiguration(true);
-    }
-
     /**
      * Load SVT conditions data onto the detector and perform basic checks afterwards.
      */
-    public void testLoad() {
+    public void testLoad() throws Exception {
 
         DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        conditionsManager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
+        conditionsManager.setDetector("HPS-TestRun-v5", 1351);
 
         // Get the detector.
-        Detector detector = conditionsManager.getCachedConditions(Detector.class, "compact.xml").getCachedData();
+        Detector detector = conditionsManager.getDetectorObject();
 
         // Get conditions.
         EcalConditions conditions = conditionsManager.getCachedConditions(EcalConditions.class, "ecal_conditions").getCachedData();

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java	Mon Nov 10 00:01:21 2014
@@ -6,7 +6,6 @@
 
 import org.hps.conditions.DatabaseConditionsManager;
 import org.hps.conditions.TableConstants;
-import org.hps.conditions.config.ResourceConfiguration;
 import org.hps.conditions.svt.SvtConfiguration.SvtConfigurationCollection;
 import org.jdom.Document;
 import org.jdom.JDOMException;
@@ -15,15 +14,8 @@
 
     DatabaseConditionsManager manager;
     
-    public void setUp() {
-        new ResourceConfiguration(
-                "/org/hps/conditions/config/conditions_dev.xml", 
-                "/org/hps/conditions/config/conditions_dev_local.properties").setup();
-        manager = DatabaseConditionsManager.getInstance();
-        manager.openConnection();        
-    }
-    
     public void testSvtConfiguration() {
+    	DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         SvtConfigurationCollection collection = manager.getCachedConditions(SvtConfigurationCollection.class, TableConstants.SVT_CONFIGURATIONS).getCachedData();
         
         for (SvtConfiguration config : collection) {

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	Mon Nov 10 00:01:21 2014
@@ -4,21 +4,15 @@
 
 import org.hps.conditions.DatabaseConditionsManager;
 import org.hps.conditions.TableMetaData;
-import org.hps.conditions.config.DevReadOnlyConfiguration;
 import org.hps.conditions.svt.SvtDaqMapping.SvtDaqMappingCollection;
-
 
 /**
  * This test checks if the SVT DAQ map was loaded with reasonable values and
  * is being read correctly from the conditions database.
  * 
  * @author Omar Moreno <[log in to unmask]>
- * @version $Id$ 
  */
 public class SvtDaqMappingTest extends TestCase {
-
-	TableMetaData metaData = null;
-	DatabaseConditionsManager conditionsManager = null;
 	
 	//--- Constants ---//
 	//-----------------//
@@ -31,18 +25,13 @@
 	
 	//-----------------//
 
-	DevReadOnlyConfiguration dbConfig = new DevReadOnlyConfiguration();
-	
-	public void setUp(){
-        new DevReadOnlyConfiguration().setup().load("HPS-Proposal2014-v7-2pt2", 0);
-        conditionsManager = DatabaseConditionsManager.getInstance();
+
+	public void test() throws Exception {
 		
+		DatabaseConditionsManager conditionsManager = new DatabaseConditionsManager();
+		conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 0);
 		
-	}
-	
-	public void test(){
-		
-		metaData = conditionsManager.findTableMetaData(SvtDaqMappingCollection.class);
+		TableMetaData metaData = conditionsManager.findTableMetaData(SvtDaqMappingCollection.class);
 		SvtDaqMappingCollection daqMappingCollection 
 			= conditionsManager.getConditionsData(SvtDaqMappingCollection.class, metaData.getTableName());
 		
@@ -65,9 +54,7 @@
 		
 	}
 	
-	private void printDebug(String debugMessage){
+	private void printDebug(String debugMessage) {
 		System.out.println(this.getClass().getSimpleName() + ":: " + debugMessage);
-	}
-	
-	
+	}	
 }

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/SvtDetectorSetupTest.java	Mon Nov 10 00:01:21 2014
@@ -5,7 +5,6 @@
 import junit.framework.TestCase;
 
 import org.hps.conditions.DatabaseConditionsManager;
-import org.hps.conditions.config.DevReadOnlyConfiguration;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.lcsim.geometry.Detector;
 
@@ -35,16 +34,13 @@
 	// SVT Subdetector name
 	public static final String SVT_SUBDETECTOR_NAME = "Tracker";
 	
-	public void setUp(){
-	    new DevReadOnlyConfiguration().setup().load("HPS-Proposal2014-v7-2pt2", 0);
-	}
-
     /**
      * Load SVT conditions data onto the detector and perform basic checks afterwards.
      */
-    public void test() {
+    public void test() throws Exception {
     	
 		DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+		conditionsManager.setDetector("HPS-Proposal2014-v7-2pt2", 0);
     	
         // Get the detector.
         Detector detector = conditionsManager.getCachedConditions(Detector.class, "compact.xml").getCachedData();

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtConditionsConverterTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtConditionsConverterTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtConditionsConverterTest.java	Mon Nov 10 00:01:21 2014
@@ -3,18 +3,14 @@
 import junit.framework.TestCase;
 
 import org.hps.conditions.DatabaseConditionsManager;
-import org.hps.conditions.config.TestRunReadOnlyConfiguration;
 
 public class TestRunSvtConditionsConverterTest extends TestCase {
-
-    DatabaseConditionsManager conditionsManager;
-   
-	public void setUp(){
-        new TestRunReadOnlyConfiguration().setup().load("HPS-TestRun-v5", 1351);
-        conditionsManager = DatabaseConditionsManager.getInstance();
-	}
-	
-	public void test(){
+   	
+	public void test() throws Exception {
+		DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+		conditionsManager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
+		conditionsManager.setDetector("HPS-TestRun-v5", 1351);
+		
         TestRunSvtConditions svtConditions = conditionsManager.getCachedConditions(TestRunSvtConditions.class, "svt_conditions").getCachedData();
         assertNotNull(svtConditions);
         System.out.println("[ " + this.getClass().getSimpleName() + "]: Printing test run SVT conditions.");

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	Mon Nov 10 00:01:21 2014
@@ -4,7 +4,6 @@
 
 import org.hps.conditions.DatabaseConditionsManager;
 import org.hps.conditions.TableMetaData;
-import org.hps.conditions.config.TestRunReadOnlyConfiguration;
 import org.hps.conditions.svt.TestRunSvtDaqMapping.TestRunSvtDaqMappingCollection;
 
 /**
@@ -16,7 +15,6 @@
 public class TestRunSvtDaqMappingTest extends TestCase {
 
 	TableMetaData metaData = null;
-	DatabaseConditionsManager conditionsManager = null;
 	
 	//--- Constants ---//
 	//-----------------//
@@ -32,20 +30,16 @@
 	// Min and max layer number values 
 	public static final int MIN_LAYER_NUMBER = 1; 
 	public static final int MAX_LAYER_NUMBER = 10; 
-	
-	
-	
-	public void setUp(){
-        new TestRunReadOnlyConfiguration().setup().load("HPS-TestRun-v5", 1351);
-        conditionsManager = DatabaseConditionsManager.getInstance();
-	}
-	
-	public void test(){
 		
+	public void test() throws Exception {
+		
+		DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        conditionsManager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
+        conditionsManager.setDetector("HPS-TestRun-v5", 1351);
+
 		metaData = conditionsManager.findTableMetaData(TestRunSvtDaqMappingCollection.class);
-		TestRunSvtDaqMappingCollection daqMappingCollection 
-			= conditionsManager.getConditionsData(TestRunSvtDaqMappingCollection.class, metaData.getTableName());
-
+		TestRunSvtDaqMappingCollection daqMappingCollection = 
+				conditionsManager.getConditionsData(TestRunSvtDaqMappingCollection.class, metaData.getTableName());
 	
 		int totalSensors = 0; 
 		this.printDebug("");
@@ -75,7 +69,7 @@
 		assertTrue(totalSensors == TOTAL_NUMBER_OF_SENSORS);
 	}
 
-	private void printDebug(String debugMessage){
+	private void printDebug(String debugMessage) {
 		System.out.println("[ " + this.getClass().getSimpleName() + " ]: " + debugMessage);
 	}
 }

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/svt/TestRunSvtDetectorSetupTest.java	Mon Nov 10 00:01:21 2014
@@ -4,11 +4,9 @@
 
 import junit.framework.TestCase;
 
+import org.hps.conditions.DatabaseConditionsManager;
 import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor;
 import org.lcsim.geometry.Detector;
-
-import org.hps.conditions.DatabaseConditionsManager;
-import org.hps.conditions.config.TestRunReadOnlyConfiguration;
 
 /**
  * This test loads {@link TestRunSvtConditions} data onto the detector and then checks that all
@@ -32,17 +30,15 @@
 	public static final int MAX_CHANNEL_NUMBER = 639;
 	// SVT Subdetector name
 	public static final String SVT_SUBDETECTOR_NAME = "Tracker";
-	
-	public void setUp(){
-        new TestRunReadOnlyConfiguration().setup().load("HPS-TestRun-v5", 1351);
-	}
-	
+		
     /**
      * Load SVT conditions data onto the detector and perform basic checks afterwards.
      */
-	public void test() { 
+	public void test() throws Exception { 
      
 		DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        conditionsManager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
+		conditionsManager.setDetector("HPS-TestRun-v5", 1351);
 	
         // Get the detector.
         Detector detector = conditionsManager.getCachedConditions(Detector.class, "compact.xml").getCachedData();