Print

Print


Author: [log in to unmask]
Date: Thu Jan  1 23:08:18 2015
New Revision: 1820

Log:
Add open and close of connection in converters if there is not a usable connection already.

Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java	Thu Jan  1 23:08:18 2015
@@ -6,6 +6,7 @@
 
 import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
@@ -65,93 +66,88 @@
         // Get the DatabaseConditionsManager which is required for using this converter.
         DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) conditionsManager;
         
+        // Setup connection if necessary.
+        boolean reopenedConnection = false;
+        if (!databaseConditionsManager.isConnected()) {
+            // Open a connection to the database.
+            databaseConditionsManager.openConnection();
+            reopenedConnection = true;
+        }
+        
         // Get the TableMetaData for the type.
         TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(getType());    
         
         // Get the ConditionsRecordCollection with the run number assignments.
         ConditionsRecordCollection conditionsRecords = databaseConditionsManager.findConditionsRecords(name);
-                
-        // The records to use will be added to this collection, which may depend on multiple record disambiguation.
-        ConditionsRecordCollection filteredConditionsRecords = new ConditionsRecordCollection();
-        
-        // Now we need to determine which ConditionsRecord objects to use according to configuration.
+                        
+        // The record with the collection information.
+        ConditionsRecord conditionsRecord = null;
+        
+        // Now we need to determine which ConditionsRecord object to use.
         if (conditionsRecords.size() == 0) {
             // No conditions records were found for the key.
+            // FIXME: This should possibly just return an empty collection instead.
             throw new RuntimeException("No conditions were found with key: " + name);
+        } else if (conditionsRecords.size() == 1) {
+            // Use the single conditions set that was found.
+            conditionsRecord = conditionsRecords.get(0);
         } else if (conditionsRecords.size() > 1) {           
             if (multipleCollections.equals(MultipleCollectionsAction.LAST_UPDATED)) {
                 // Use the conditions set with the latest updated date.
-                filteredConditionsRecords.add(conditionsRecords.sortedByUpdated().get(conditionsRecords.size() - 1));
+                conditionsRecord = conditionsRecords.sortedByUpdated().get(conditionsRecords.size() - 1);
             } else if (multipleCollections.equals(MultipleCollectionsAction.LAST_CREATED)){
                 // Use the conditions set with the latest created date.
-                filteredConditionsRecords.add(conditionsRecords.sortedByCreated().get(conditionsRecords.size() - 1));
+                conditionsRecord = conditionsRecords.sortedByCreated().get(conditionsRecords.size() - 1);
             } else if (multipleCollections.equals(MultipleCollectionsAction.LATEST_RUN_START)) {
                 // Use the conditions set with the greatest run start value.
-                filteredConditionsRecords.add(conditionsRecords.sortedByRunStart().get(conditionsRecords.size() - 1));
-            } else if (multipleCollections.equals(MultipleCollectionsAction.COMBINE)) {
-                // Combine all the records.
-                filteredConditionsRecords.addAll(conditionsRecords);                
+                conditionsRecord = conditionsRecords.sortedByRunStart().get(conditionsRecords.size() - 1);
             } else if (multipleCollections.equals(MultipleCollectionsAction.ERROR)) {            
-                // The converter has been configured to throw an error when this happens!
+                // The converter has been configured to throw an error.
                 throw new RuntimeException("Multiple ConditionsRecord object found for conditions key " + name);
             }           
-        } else {
-            // Single record was found.
-            filteredConditionsRecords.addAll(conditionsRecords);
-        }
+        } 
                 
-        // Create a collection of objects to to return.
-        AbstractConditionsObjectCollection collection = null;        
-        try {
-            // If there is a single ConditionsRecord, then it can be assigned to the collection.
-            ConditionsRecord collectionConditionsRecord = null;
-            if (filteredConditionsRecords.size() == 1) {
-                collectionConditionsRecord = filteredConditionsRecords.get(0);
+        // Create a collection of objects to return.
+        ConditionsObjectCollection collection = null;
+        try {
+            collection = createCollection(conditionsRecord, tableMetaData);
+        } catch (ConditionsObjectException e) {
+            throw new RuntimeException(e);
+        }
+                               
+        // Get the table name.
+        String tableName = conditionsRecord.getTableName();
+
+        // Get the collection ID.
+        int collectionId = conditionsRecord.getCollectionId();
+
+        // Build a select query.
+        String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
+
+        // Query the database to get the collection's rows.
+        ResultSet resultSet = databaseConditionsManager.selectQuery(query);
+
+        try {
+            // Loop over the rows.
+            while (resultSet.next()) {
+                // Create a new ConditionsObject from this row.
+                ConditionsObject newObject = createConditionsObject(resultSet, tableMetaData);
+
+                // Add the object to the collection.
+                collection.add(newObject);
             }
-            
-            // Create the collection with a ConditionsRecord that might be null.
-            collection = createCollection(collectionConditionsRecord, tableMetaData);
-        } catch (ConditionsObjectException e) {
-            throw new RuntimeException(e);
-        }
-   
-        // Open a database connection.
-        databaseConditionsManager.openConnection();
-        
-        // Loop over all records, which could just be a single one.
-        for (ConditionsRecord conditionsRecord : filteredConditionsRecords) {
-                    
-            // Get the table name.
-            String tableName = conditionsRecord.getTableName();
-
-            // Get the collection ID.
-            int collectionId = conditionsRecord.getCollectionId();
-
-            // Build a select query.
-            String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
-
-            // Query the database to get the conditions collection's rows.
-            ResultSet resultSet = databaseConditionsManager.selectQuery(query);
-
-            try {
-                // Loop over the rows.
-                while (resultSet.next()) {
-                    // Create a new ConditionsObject from this row.
-                    ConditionsObject newObject = createConditionsObject(resultSet, tableMetaData);
-
-                    // Add the object to the collection.
-                    collection.add(newObject);
-                }
-            } catch (SQLException e) {
-                throw new RuntimeException(e);
-            }
-            
-            // Close the Statement and the ResultSet.
-            DatabaseUtilities.cleanup(resultSet);
-        }
-        
-        // Close the database connection.
-        databaseConditionsManager.closeConnection();
+        } catch (SQLException e) {
+            // Some kind of database error occurred.
+            throw new RuntimeException(e);
+        }
+
+        // Close the Statement and the ResultSet.
+        DatabaseUtilities.cleanup(resultSet);
+        
+        if (reopenedConnection) {
+            // Close connection if one was opened.
+            databaseConditionsManager.closeConnection();
+        }
         
         return (T) collection;
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	Thu Jan  1 23:08:18 2015
@@ -25,9 +25,13 @@
     public ConditionsRecordCollection getData(ConditionsManager manager, String name) {
 
         DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
-
-        // Open the db connection.
-        databaseConditionsManager.openConnection();
+        
+        // Setup connection if necessary.
+        boolean reopenedConnection = false;
+        if (!databaseConditionsManager.isConnected()) {
+            databaseConditionsManager.openConnection();
+            reopenedConnection = true;
+        }
         
         TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(name);
 
@@ -58,9 +62,10 @@
         // Close the ResultSet and Statement.
         DatabaseUtilities.cleanup(resultSet);
         
-        // Close the db connection.
-        databaseConditionsManager.closeConnection();
-
+        if (reopenedConnection) {
+            databaseConditionsManager.closeConnection();
+        }
+        
         return getType().cast(collection);
     }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	Thu Jan  1 23:08:18 2015
@@ -3,80 +3,82 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.hps.conditions.api.ConditionsSeries;
 
 /**
- * <p>
- * This converter creates a <tt>ConditionsSeries</tt> which is a set of
- * <tt>ConditionsObjectCollection</tt> objects with the same type. This can be
- * used to retrieve sets of conditions that may overlap in time validity, such
- * as sets of bad channels .
- * </p>
- * <p>
- * Since type inference from the target variable is used in the
- * {@link #createSeries(String)} method signature, there only needs to be one of
- * these converters per {@link DatabaseConditionsManager}. The creation of the
- * specific types is also done automatically, so each type of conditions object
- * does not need its own converter class.
- * </p>
+ * This converter creates a {@link org.hps.conditions.api.ConditionsSeries} which is a list of
+ * {@link org.hps.conditions.api.ConditionsObjectCollection} objects having the same type. 
+ * This can be used to retrieve sets of conditions that may overlap in time validity.  The user
+ * may then use whichever collections are of interest to them.
+ * 
+ * @see org.hps.conditions.api.ConditionsSeries
+ * @see org.hps.conditions.api.ConditionsObjectCollection
+ * @see org.hps.conditions.api.ConditionsObject
+ * @see DatabaseConditionsManager
+ * 
+ * @param <ObjectType> The type of the ConditionsObject.
+ * @param <CollectionType> The type of the collection.
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-class ConditionsSeriesConverter {
+// FIXME: The ObjectType and CollectionType should probably not extend in order to simplify the types.
+class ConditionsSeriesConverter<ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>> {
 
-    DatabaseConditionsManager conditionsManager = null;
-
-    ConditionsSeriesConverter(DatabaseConditionsManager conditionsManager) {
-        if (conditionsManager == null)
-            throw new RuntimeException("The conditionsManager is null.");
-        this.conditionsManager = conditionsManager;
+    Class<ObjectType> objectType;
+    Class<CollectionType> collectionType;
+     
+    ConditionsSeriesConverter(Class<ObjectType> objectType, Class<CollectionType> collectionType) {
+        this.collectionType = collectionType;
+        this.objectType = objectType;
     }
 
     /**
-     * Create a <tt>ConditionsSeries</tt> which is a series of
-     * <tt>ConditionsObjectCollections</tt> of the same type, each of which have
-     * their own <tt>ConditionsRecord</tt>. This should be used for overlapping
-     * conditions, such as sets of bad channels that are combined together as in
-     * the test run.
-     * 
-     * @param conditionsKey The name of the conditions key to retrieve from the conditions table.
-     * @return The <tt>ConditionsSeries</tt> matching <tt>conditionsKey</tt>
-     *         which type inferred from target variable.
-     */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    // FIXME: This should take a type name to enforce that all collections returned are of the same class.
-    public ConditionsSeries createSeries(String conditionsKey) {
+     * Create a new conditions series.
+     * @param tableName The name of the data table.
+     * @return The conditions series.
+     */ 
+    @SuppressWarnings({ "unchecked" })
+    ConditionsSeries<ObjectType, CollectionType> createSeries(String tableName) {
+
+        if (tableName == null) {
+            throw new IllegalArgumentException("The tableName argument is null.");
+        }
         
-        conditionsManager.openConnection();
+        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        
+        // Setup connection if necessary.
+        boolean reopenedConnection = false;
+        if (!conditionsManager.isConnected()) {
+            conditionsManager.openConnection();
+            reopenedConnection = true;
+        }
+        
+        // Get the table meta data for the collection type.
+        TableMetaData tableMetaData = conditionsManager.findTableMetaData(collectionType);
+        if (tableMetaData == null) {
+            throw new RuntimeException("Table meta data for " + collectionType + " was not found.");
+        }
 
-        // Get the table meta data from the key given by the caller.
-        TableMetaData tableMetaData = conditionsManager.findTableMetaData(conditionsKey);
-        if (tableMetaData == null)
-            throw new RuntimeException("Table meta data for " + conditionsKey + " was not found.");
+        // Create a new conditions series.
+        ConditionsSeries<ObjectType, CollectionType> series = new ConditionsSeries<ObjectType, CollectionType>(objectType, collectionType);
+        
+        // Get the ConditionsRecord with the meta-data, which will use the current run number from the manager.
+        ConditionsRecordCollection conditionsRecords = conditionsManager.findConditionsRecords(tableName);
 
-        ConditionsSeries series = new ConditionsSeries();
-
-        // Get the ConditionsRecord with the meta-data, which will use the
-        // current run number from the manager.
-        ConditionsRecordCollection conditionsRecords = conditionsManager.findConditionsRecords(conditionsKey);
-
-        // Loop over conditions records. This will usually just be one record.
         for (ConditionsRecord conditionsRecord : conditionsRecords) {
 
-            AbstractConditionsObjectCollection collection;
+            ConditionsObjectCollection<ObjectType> collection;
             try {
-                collection = ConditionsRecordConverter.createCollection(conditionsRecord, tableMetaData);
+                collection = (ConditionsObjectCollection<ObjectType>) 
+                        ConditionsRecordConverter.createCollection(conditionsRecord, tableMetaData);
             } catch (ConditionsObjectException e) {
                 throw new RuntimeException(e);
             }
-
-            // Get the table name.
-            String tableName = conditionsRecord.getTableName();
 
             // Get the collection ID.
             int collectionId = conditionsRecord.getCollectionId();
@@ -93,9 +95,8 @@
                     // Create new ConditionsObject.
                     ConditionsObject newObject = ConditionsRecordConverter.createConditionsObject(resultSet, tableMetaData);
 
-                    // Add new object to collection, which will also assign it a
-                    // collection ID if applicable.
-                    collection.add(newObject);
+                    // Add new object to collection.
+                    collection.add((ObjectType) newObject);
                 }
             } catch (SQLException e) {
                 throw new RuntimeException(e);
@@ -103,11 +104,13 @@
 
             DatabaseUtilities.cleanup(resultSet);
             
-            series.add(collection);
+            series.add((CollectionType) collection);
         }
         
-        conditionsManager.closeConnection();
-
+        if (reopenedConnection) {
+            conditionsManager.closeConnection();
+        }
+        
         // Return new collection.
         return series;
     }