Print

Print


Author: [log in to unmask]
Date: Wed Dec 10 19:18:35 2014
New Revision: 1685

Log:
Modify the conditions API by adding a better base type for object collections.  (This required touching a lot of code that used the objects from these collections.)

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java
      - copied, changed from r1678, java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
Removed:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java
    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
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDetectorSetup.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
    java/trunk/conditions/src/test/java/org/hps/conditions/ConditionsObjectTest.java
    java/trunk/conditions/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java
    java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java

Copied: java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java (from r1678, java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java)
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java	Wed Dec 10 19:18:35 2014
@@ -1,65 +1,57 @@
 package org.hps.conditions.api;
 
 import java.sql.SQLException;
-import java.util.Collections;
-import java.util.Iterator;
 import java.util.LinkedHashSet;
-import java.util.Set;
 
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.database.TableMetaData;
 
-public class ConditionsObjectCollection<ObjectType extends ConditionsObject> implements Iterable<ObjectType> {
+public class AbstractConditionsObjectCollection<ObjectType extends ConditionsObject> extends LinkedHashSet<ObjectType> {
 
-    protected Set<ObjectType> objects = new LinkedHashSet<ObjectType>();
-    protected TableMetaData tableMetaData;
+    protected TableMetaData tableMetaData = null;
     protected int collectionId = -1;
-    protected ConditionsRecord conditionsRecord;
-
-    protected ConditionsObjectCollection() {
+    protected ConditionsRecord conditionsRecord = null;
+    
+    public AbstractConditionsObjectCollection() {
     }
-
-    public ConditionsObjectCollection(TableMetaData tableMetaData, int collectionId) {
+    
+    public AbstractConditionsObjectCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) {
+        this.conditionsRecord = conditionsRecord;
         this.tableMetaData = tableMetaData;
-        this.collectionId = collectionId;
+        this.collectionId = conditionsRecord.getCollectionId();
     }
-
-    public ObjectType get(int index) {
-        Iterator<ObjectType> iterator = objects.iterator();
-        ObjectType current = iterator.next();
-        for (int i = 0; i < index; i++) {
-            current = iterator.next();
+    
+    public AbstractConditionsObjectCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData, int collectionID) {
+        this.conditionsRecord = conditionsRecord;
+        this.tableMetaData = tableMetaData;
+        this.collectionId = collectionID;
+    }
+    
+    public void setTableMetaData(TableMetaData tableMetaData) {
+        /**
+         * Setting this more than once is disallowed.
+         */
+        if (this.tableMetaData != null) {
+            throw new RuntimeException("The table meta data cannot be reset.");
         }
-        return current;
+        this.tableMetaData = tableMetaData;
     }
-
-    public Set<ObjectType> getObjects() {
-        return Collections.unmodifiableSet(objects);
+    
+    public void setConditionsRecord(ConditionsRecord conditionsRecord) {
+        /**
+         * Setting this more than once is disallowed.
+         */
+        if (this.conditionsRecord != null) {
+            throw new RuntimeException("The table meta data cannot be reset.");
+        }
+        this.conditionsRecord = conditionsRecord;
     }
-
-    public boolean contains(Object object) {
-        return getObjects().contains(object);
-    }
-
-    // TODO: Should check here if object has an existing collection ID that is
-    // different from this collection's, in which case this collection becomes "mixed" and
-    // it should be flagged as read only.
-    public void add(ObjectType object) throws ConditionsObjectException {
-        if (objects.contains(object)) {
-            throw new IllegalArgumentException("Collection already contains this object.");
+    
+    public boolean add(ObjectType object) {
+        if (contains(object)) {
+            throw new IllegalArgumentException("Cannot add duplicate object " + object);
         }
-        try {
-            // Only assign a collection ID to the object if this collection has a valid ID
-            // and the object does not have one already.
-            if (getCollectionId() != -1)
-                object.setCollectionId(getCollectionId());
-        } catch (ConditionsObjectException x) {
-            throw new IllegalArgumentException("Error assigning collection ID to object.", x);
-        }
-        // Set the table meta data on the object if it does not have any.
-        if (object.getTableMetaData() == null && tableMetaData != null)
-            object.setTableMetaData(tableMetaData);
-        objects.add(object);
+        return super.add(object);
     }
 
     public TableMetaData getTableMetaData() {
@@ -69,60 +61,46 @@
     public int getCollectionId() {
         return collectionId;
     }
-
-    // TODO: Should this also insert new records that do not exist?
-    // TODO: This operation should lock the table.
-    public void update() throws ConditionsObjectException {
-        for (ConditionsObject object : objects) {
-            object.update();
+    
+    public ConditionsRecord getConditionsRecord() {
+        return conditionsRecord;
+    }
+        
+    public void setCollectionId(int collectionId) throws ConditionsObjectException {
+        if (collectionId != -1) {
+            throw new ConditionsObjectException("The collectionId already has the value " + collectionId + " and cannot be reset."); 
         }
+        this.collectionId = collectionId;
     }
-
-    // TODO: This does not need to loop. It should just call delete on the collection ID value.
-    public void delete() throws ConditionsObjectException {
-        // TODO: Replace with call to a deleteCollection DatabaseConditionsManager method.
-        for (ConditionsObject object : objects) {
-            object.delete();
-        }
-    }
-
-    // TODO: This should not loop. It should select all the objects with a matching collection ID 
-    //       from the database replacing the current contents of the collection (if any).
-    public void select() throws ConditionsObjectException, SQLException {
-        // TODO: Replace with call to a selectCollection DatabaseConditionsManager method.
-        for (ConditionsObject object : objects) {
-            object.select();
-        }
-    }
-
+    
     public void insert() throws ConditionsObjectException, SQLException {
         DatabaseConditionsManager.getInstance().insertCollection(this);
     }
-
-    public void setCollectionId(int collectionId) throws ConditionsObjectException {
-        if (this.collectionId != -1)
-            throw new ConditionsObjectException("The collection ID is already set.");
-        this.collectionId = collectionId;
-        for (ConditionsObject object : this.objects) {
-            object.setCollectionId(this.collectionId);
-        }
+    
+    // Should select all records into the collection by collection ID.
+    public int select() {
+        System.out.println("implement me");
+        return -1;
     }
-
-    public void setTableMetaData(TableMetaData tableMetaData) {
-        this.tableMetaData = tableMetaData;
+    
+    // Should delete all records by collection ID in the database and clear the local objects.
+    public int delete() {
+        System.out.println("implement me");
+        return -1;
     }
-
-    @Override
-    public Iterator<ObjectType> iterator() {
-        return objects.iterator();
-    }       
+    
+    // Should update objects in the database with their values in the set.
+    public int update() {
+        System.out.println("implement me");
+        return -1;
+    }
     
     public String toString() {
         StringBuffer buffer = new StringBuffer();
-        for (ConditionsObject object : this.getObjects()) {
+        for (ConditionsObject object : this) {
             buffer.append(object.toString());
             buffer.append('\n');
         }
         return buffer.toString();
-    }
+    }       
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java	Wed Dec 10 19:18:35 2014
@@ -13,6 +13,10 @@
     public ConditionsObjectException(String message) {
         super(message);
     }
+    
+    public ConditionsObjectException(String message, Throwable cause) {
+        super(message, cause);
+    }
 
     public ConditionsObjectException(String message, ConditionsObject object) {
         super(message);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Wed Dec 10 19:18:35 2014
@@ -1,5 +1,8 @@
 package org.hps.conditions.api;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -18,14 +21,64 @@
     /**
      * Collection type.
      */
-    public static class ConditionsRecordCollection extends ConditionsObjectCollection<ConditionsRecord> {
-        /**
-         * Since ConditionsRecord collections are always "mixed", meaning the
-         * collection ID values are usually all going to be different, the
-         * default behavior of the super class is overridden.
-         */
-        public void add(ConditionsRecord record) {
-            objects.add(record);
+    public static class ConditionsRecordCollection extends AbstractConditionsObjectCollection<ConditionsRecord> {
+        
+        public List<ConditionsRecord> sortedByUpdated() {
+            List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
+            Collections.sort(list, new UpdatedComparator());
+            return list;
+        }
+        
+        public List<ConditionsRecord> sortedByCreated() {
+            List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
+            Collections.sort(list, new CreatedComparator());
+            return list;
+        }
+        
+        public List<ConditionsRecord> sortedByRunStart() {
+            List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
+            Collections.sort(list, new RunStartComparator());
+            return list;
+        }
+        
+        private static class RunStartComparator implements Comparator<ConditionsRecord> {
+            @Override
+            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
+                if (c1.getRunStart() < c2.getRunStart()) {
+                    return -1;
+                } else if (c1.getRunStart() > c2.getRunStart()) {
+                    return 1;
+                } 
+                return 0;
+            }
+        }
+        
+        private static class UpdatedComparator implements Comparator<ConditionsRecord> {
+            @Override
+            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
+                Date date1 = c1.getUpdated();
+                Date date2 = c2.getUpdated();                
+                if (date1.before(date2)) {
+                    return -1;
+                } else if (date1.after(date2)) {
+                    return 1;
+                }
+                return 0;                
+            }            
+        }
+        
+        private static class CreatedComparator implements Comparator<ConditionsRecord> {
+            @Override
+            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
+                Date date1 = c1.getCreated();
+                Date date2 = c2.getCreated();                
+                if (date1.before(date2)) {
+                    return -1;
+                } else if (date1.after(date2)) {
+                    return 1;
+                }
+                return 0;                
+            }            
         }
     }
     

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java	Wed Dec 10 19:18:35 2014
@@ -13,13 +13,13 @@
 @SuppressWarnings("rawtypes")
 public class ConditionsSeries {
 
-    List<ConditionsObjectCollection> collections = new ArrayList<ConditionsObjectCollection>();
+    List<AbstractConditionsObjectCollection> collections = new ArrayList<AbstractConditionsObjectCollection>();
 
-    public ConditionsObjectCollection getCollection(int series) {
+    public AbstractConditionsObjectCollection getCollection(int series) {
         return collections.get(series);
     }
 
-    public int addCollection(ConditionsObjectCollection collection) {
+    public int addCollection(AbstractConditionsObjectCollection collection) {
         if (collections.contains(collection))
             throw new IllegalArgumentException("The collection is already registered with this object.");
         collections.add(collection);
@@ -30,15 +30,15 @@
         return collections.size();
     }
 
-    public ConditionsObjectCollection findCollection(ConditionsRecord record) {
-        for (ConditionsObjectCollection collection : collections) {
+    public AbstractConditionsObjectCollection findCollection(ConditionsRecord record) {
+        for (AbstractConditionsObjectCollection collection : collections) {
             if (collection.conditionsRecord == record)
                 return collection;
         }
         return null;
     }
     
-    public List<ConditionsObjectCollection> getCollections() {
+    public List<AbstractConditionsObjectCollection> getCollections() {
         return collections;
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.beam;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class is a simple data holder for the integrated beam current condition.
@@ -9,7 +9,7 @@
  */
 public final class BeamCurrent extends AbstractConditionsObject {
 
-    public static class BeamCurrentCollection extends ConditionsObjectCollection<BeamCurrent> {
+    public static class BeamCurrentCollection extends AbstractConditionsObjectCollection<BeamCurrent> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	Wed Dec 10 19:18:35 2014
@@ -23,6 +23,7 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+// TODO: Add detector name and run number as arguments on the basic tool rather than sub-commands.
 public class CommandLineTool {
 
     Options options = new Options();
@@ -99,7 +100,7 @@
             conditionsManager.setXmlConfig(xmlConfigFile);
             if (verbose)
                 System.out.println("using XML config file " + xmlConfigFile.getPath());
-        } 
+        }         
         conditionsManager.openConnection();
     }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java	Wed Dec 10 19:18:35 2014
@@ -7,7 +7,7 @@
 import java.io.PrintStream;
 
 import org.apache.commons.cli.Option;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsSeries;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
@@ -99,8 +99,8 @@
         }
         ps.println();
         
-        for (ConditionsObjectCollection collection : series.getCollections()) {
-            for (Object object : collection.getObjects()) {
+        for (AbstractConditionsObjectCollection collection : series.getCollections()) {
+            for (Object object : collection) {
                 ps.print(object.toString());
                 ps.println();
             }

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	Wed Dec 10 19:18:35 2014
@@ -1,11 +1,15 @@
 package org.hps.conditions.database;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
-
+import java.util.ArrayList;
+import java.util.List;
+
+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;
@@ -17,36 +21,41 @@
  * <p>
  * Implementation of default conversion from database tables to a
  * {@link ConditionsObject} class.
- * </p>
  * <p>
  * This class actually returns collections and not individual objects.
- * </p>
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  * 
- * @param <T> The type of the returned data which should be a class extending
- *            {@link ConditionsObjectCollection}.
+ * @param <T> The type of the returned data which should be a class extending {@link AbstractConditionsObjectCollection}.
  */
-// FIXME: This class should only allow one collection to be returned and not mix
-// the database records together.
-// TODO: This class can probably be removed in favor of using the
-// ConditionsSeriesConverter in all cases.
 public abstract class ConditionsObjectConverter<T> implements ConditionsConverter<T> {
 
+    // This is the strategy used for disambiguating multiple overlapping conditions sets.
+    enum MultipleRecordsStrategy {
+        LAST_UPDATED,
+        LAST_CREATED,
+        LATEST_RUN_START,
+        COMBINE,
+        ERROR
+    }
+    
+    MultipleRecordsStrategy multiStrat = MultipleRecordsStrategy.LAST_UPDATED;
+    
     public ConditionsObjectConverter() {
     }
+    
+    public void setMultipleRecordsStrategy(MultipleRecordsStrategy multiStrat) {
+        this.multiStrat = multiStrat;
+    }
 
     /**
-     * Classes that extend this must define this method to specify what type the
-     * converter is able to handle.
+     * Child classes must extend this method to specify what type the converter handles.
      * @return The Class that this converter handles.
      */
-    public abstract Class getType();
+    public abstract Class<T> getType();
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     public T getData(ConditionsManager conditionsManager, String name) {
-
-        // System.out.println("finding conditions for key " + name + " ...");
 
         // Get the DatabaseConditionsManager which is required for using this converter.
         DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
@@ -56,39 +65,52 @@
         if (tableMetaData == null)
             throw new RuntimeException("Table meta data for " + name + " was not found.");
 
-        // Create a collection to return.
-        ConditionsObjectCollection collection = createCollection(tableMetaData);
-
-        // Get the ConditionsRecord with the meta-data, which will use the
-        // current run
-        // number from the manager.
+        // Get the ConditionsRecordCollection with the run number assignments.
         ConditionsRecordCollection conditionsRecords = databaseConditionsManager.findConditionsRecords(name);
-
-        if (conditionsRecords.getObjects().size() == 0) {
-            // There were no records returned, which is a fatal error.
-            throw new RuntimeException("No conditions found with key: " + name);
-        } else if (conditionsRecords.getObjects().size() > 1) {
-            // 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.
-                throw new RuntimeException("Multiple conditions records returned but this is not allowed.");
+        
+        // By default use all conditions records, which works if there is a single one, or if the COMBINE strategy is being used.
+        List<ConditionsRecord> filteredList = new ArrayList<ConditionsRecord>(conditionsRecords); 
+        
+        // Now we need to determine which ConditionsRecord objects to use according to configuration.
+        if (conditionsRecords.size() == 0) {
+            // No conditions records were found, and this is an error.
+            throw new RuntimeException("No conditions were found with key " + name);
         } else {
-            // There was a single conditions record so the collection
-            // information can be
-            // set meaningfully.
-            try {
-                collection.setCollectionId(conditionsRecords.get(0).getCollectionId());
-                collection.setTableMetaData(tableMetaData);
-            } catch (ConditionsObjectException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        // Loop over conditions records. This will usually just be one record.
-        for (ConditionsRecord conditionsRecord : conditionsRecords.getObjects()) {
-
+            /*
+             * Figure out which disambiguation strategy to use.
+             */
+            if (multiStrat.equals(MultipleRecordsStrategy.LAST_UPDATED)) {
+                // Use the conditions set with the latest updated date.
+                filteredList = conditionsRecords.sortedByUpdated();
+            } else if (multiStrat.equals(MultipleRecordsStrategy.LAST_CREATED)){
+                // Use the conditions set with the latest created date.
+                filteredList = conditionsRecords.sortedByCreated();                
+            } else if (multiStrat.equals(MultipleRecordsStrategy.LATEST_RUN_START)) {
+                // Use the conditions set with the greatest run start value.
+                filteredList = conditionsRecords.sortedByRunStart();
+            } else if (multiStrat.equals(MultipleRecordsStrategy.ERROR)) {            
+                // The converter has been configured to throw an error when this happens!
+                throw new RuntimeException("Multiple ConditionsRecord object found for conditions key " + name);
+            }           
+        }             
+        
+        // Create a collection of objects to to return.        
+        AbstractConditionsObjectCollection collection = null;
+        
+        try {
+            ConditionsRecord conditionsRecord = null;
+            if (filteredList.size() == 1) {
+                // If there is a single ConditionsRecord, then it can be assigned to the collection.
+                conditionsRecord = filteredList.get(0);
+            }
+            collection = createCollection(conditionsRecord, tableMetaData);
+        } catch (ConditionsObjectException e) {
+            throw new RuntimeException(e);
+        }
+   
+        // Loop over all records, which could just be a single one.
+        for (ConditionsRecord conditionsRecord : filteredList) {
+        
             // Get the table name.
             String tableName = conditionsRecord.getTableName();
 
@@ -98,30 +120,24 @@
             // Build a select query.
             String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
 
-            // Query the database.
+            // Query the database to get the conditions collection's rows.
             ResultSet resultSet = databaseConditionsManager.selectQuery(query);
 
             try {
-                // Loop over rows.
+                // Loop over the rows.
                 while (resultSet.next()) {
-                    // Create new ConditionsObject.
+                    // Create a new ConditionsObject from this row.
                     ConditionsObject newObject = createConditionsObject(resultSet, tableMetaData);
 
-                    // Add new object to collection, which will also assign it a
-                    // collection ID if applicable.
+                    // Add the object to the collection.
                     collection.add(newObject);
                 }
-            } catch (SQLException | ConditionsObjectException e) {
+            } catch (SQLException e) {
                 throw new RuntimeException(e);
             }
         }
-
-        // Return new collection.
+        
         return (T) collection;
-    }
-
-    public boolean allowMultipleCollections() {
-        return true;
     }
     
     static final ConditionsObject createConditionsObject(ResultSet resultSet, TableMetaData tableMetaData) throws SQLException {
@@ -152,13 +168,38 @@
         return newObject;
     }
     
-    static final ConditionsObjectCollection<?> createCollection(TableMetaData tableMetaData) {
-        ConditionsObjectCollection<?> collection;
+    static final AbstractConditionsObjectCollection<?> createCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) throws ConditionsObjectException {
+        AbstractConditionsObjectCollection<?> collection;
         try {
             collection = tableMetaData.getCollectionClass().newInstance();
+            if (conditionsRecord != null) {
+                collection.setConditionsRecord(conditionsRecord);
+                collection.setTableMetaData(tableMetaData);
+            }
         } catch (InstantiationException | IllegalAccessException e) {
-            throw new RuntimeException(e);
+            throw new ConditionsObjectException("Error creating conditions object collection.", e);
         }
         return collection;
     }
+
+    // This would only work if every collection class had a constructor with the proper arguments.
+    /*
+    static final AbstractConditionsObjectCollection<?> createCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) throws ConditionsObjectException {
+        AbstractConditionsObjectCollection<?> collection;
+        try {
+            collection = tableMetaData.getCollectionClass().newInstance();
+            Class<?> collectionClass = tableMetaData.getCollectionClass();
+            try {
+                Constructor<?> constructor = collectionClass.getDeclaredConstructor(ConditionsRecord.class, TableMetaData.class);
+                collection = (AbstractConditionsObjectCollection) constructor.newInstance(new Object[] { conditionsRecord, tableMetaData } );
+            } catch (NoSuchMethodException | SecurityException | InvocationTargetException e) {
+                e.printStackTrace();
+                throw new ConditionsObjectException("Error creating conditions object collection.", e);
+            }
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+        return 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	Wed Dec 10 19:18:35 2014
@@ -3,17 +3,14 @@
 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.ConditionsRecordCollection;
 import org.lcsim.conditions.ConditionsManager;
 
 /**
  * Read ConditionsRecord objects from the conditions database.
  * @author Jeremy McCormick <[log in to unmask]>
- * @version $Id: ConditionsRecordConverter.java,v 1.5 2013/10/15 23:24:47 jeremy
- *          Exp $
  */
 class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
 
@@ -38,7 +35,7 @@
         ResultSet resultSet = databaseConditionsManager.selectQuery(query);
 
         // Create a collection to return.
-        ConditionsObjectCollection collection;
+        AbstractConditionsObjectCollection collection;
         try {
             collection = tableMetaData.getCollectionClass().newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
@@ -48,11 +45,7 @@
         try {
             while (resultSet.next()) {
                 ConditionsObject conditionsRecord = ConditionsObjectConverter.createConditionsObject(resultSet, tableMetaData);
-                try {
-                    collection.add(conditionsRecord);
-                } catch (ConditionsObjectException e) {
-                    throw new RuntimeException(e);
-                }
+                collection.add(conditionsRecord);
             }
         } catch (SQLException x) {
             throw new RuntimeException("Database error", x);
@@ -69,8 +62,4 @@
     public Class<ConditionsRecordCollection> getType() {
         return ConditionsRecordCollection.class;
     }
-
-    public boolean allowMultipleCollections() {
-        return true;
-    }
 }

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	Wed Dec 10 19:18:35 2014
@@ -4,7 +4,7 @@
 import java.sql.SQLException;
 
 import org.hps.conditions.api.ConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
@@ -59,21 +59,18 @@
         ConditionsSeries series = new ConditionsSeries();
 
         // Get the ConditionsRecord with the meta-data, which will use the
-        // current run
-        // number from the manager.
+        // 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.getObjects()) {
+        for (ConditionsRecord conditionsRecord : conditionsRecords) {
 
-            ConditionsObjectCollection collection = ConditionsRecordConverter.createCollection(tableMetaData);
-
+            AbstractConditionsObjectCollection collection;
             try {
-                collection.setCollectionId(conditionsRecord.getCollectionId());
+                collection = ConditionsRecordConverter.createCollection(conditionsRecord, tableMetaData);
             } catch (ConditionsObjectException e) {
                 throw new RuntimeException(e);
             }
-            collection.setTableMetaData(tableMetaData);
 
             // Get the table name.
             String tableName = conditionsRecord.getTableName();
@@ -97,7 +94,7 @@
                     // collection ID if applicable.
                     collection.add(newObject);
                 }
-            } catch (SQLException | ConditionsObjectException e) {
+            } catch (SQLException e) {
                 throw new RuntimeException(e);
             }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	Wed Dec 10 19:18:35 2014
@@ -22,8 +22,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+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;
@@ -133,7 +133,7 @@
      * Class constructor.
      */
     public DatabaseConditionsManager() {
-        logger.setLevel(Level.FINE);
+        logger.setLevel(Level.FINER);
         registerConditionsConverter(new DetectorConditionsConverter());
         setupConnectionFromSystemProperty();
         register();
@@ -179,7 +179,6 @@
         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("successfuly created connection");
@@ -233,7 +232,7 @@
      */
     // TODO: This should distinguish among multiple conditions sets of the same type by using the one with the most recent date
     //       in its ConditionsRecord.
-    public <CollectionType extends ConditionsObjectCollection> CollectionType getCollection(Class<CollectionType> type) {
+    public <CollectionType extends AbstractConditionsObjectCollection> CollectionType getCollection(Class<CollectionType> type) {
         TableMetaData metaData = this.findTableMetaData(type).get(0);
         if (metaData == null) {
             throw new RuntimeException("Table name data for condition of type " + type.getSimpleName() + " was not found.");
@@ -264,12 +263,12 @@
             }
             if (!this.isFrozen) {
                 if (!detectorName.equals(this.getDetector())) {
-                    logger.fine("detector name is different");
+                    logger.finest("detector name is different");
                 }
                 if (runNumber != this.getRun()) {
-                    logger.fine("run number is different");
+                    logger.finest("run number is different");
                 }            
-                logger.fine("setDetector with new detector " + detectorName + " and run #" + runNumber);
+                logger.info("setDetector with new detector " + detectorName + " and run #" + runNumber);
                 logger.fine("old detector " + this.getDetector() + " and run #" + this.getRun());
                 initialize(detectorName, runNumber);
             } else {
@@ -292,7 +291,7 @@
      */
     protected void initialize(String detectorName, int runNumber) throws ConditionsNotFoundException {
 
-        logger.log(Level.CONFIG, "initializing " + getClass().getSimpleName() + " with detector " + detectorName + " and run number " + runNumber);
+        logger.config("initializing " + getClass().getSimpleName() + " with detector " + detectorName + " and run number " + runNumber);
 
         // Did the user not specify a config?
         if (resourceConfig == null && fileConfig == null) {
@@ -565,9 +564,9 @@
      */
     public ConditionsRecordCollection findConditionsRecords(String name) {
         ConditionsRecordCollection runConditionsRecords = getConditionsData(ConditionsRecordCollection.class, TableConstants.CONDITIONS_RECORD);
-        logger.fine("searching for condition " + name + " in " + runConditionsRecords.getObjects().size() + " records");
+        logger.fine("searching for condition " + name + " in " + runConditionsRecords.size() + " records");
         ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();
-        for (ConditionsRecord record : runConditionsRecords.getObjects()) {
+        for (ConditionsRecord record : runConditionsRecords) {
             if (record.getName().equals(name)) {
                 if (tag == null || (tag != null && record.getTag().equals(tag))) {
                     foundConditionsRecords.add(record);
@@ -576,8 +575,8 @@
                 }
             }
         }
-        if (foundConditionsRecords.getObjects().size() > 0) {
-            for (ConditionsRecord record : foundConditionsRecords.getObjects()) {
+        if (foundConditionsRecords.size() > 0) {
+            for (ConditionsRecord record : foundConditionsRecords) {
                 logger.fine("found ConditionsRecord with key " + name + '\n' + record.toString());
             }
         }
@@ -613,11 +612,11 @@
         this.tag = tag;
     }
 
-    public <ObjectType extends ConditionsObject> void insertCollection(ConditionsObjectCollection<ObjectType> collection) throws SQLException {
+    public <ObjectType extends ConditionsObject> void insertCollection(AbstractConditionsObjectCollection<ObjectType> collection) throws SQLException {
         if (collection == null) {
             throw new IllegalArgumentException("The collection is null.");
         }
-        if (collection.getObjects().size() == 0) {
+        if (collection.size() == 0) {
             throw new IllegalArgumentException("The collection is empty.");
         }
         if (collection.getTableMetaData() == null) {
@@ -631,18 +630,18 @@
                 throw new RuntimeException(e);
             }
         }
-        logger.fine("inserting collection with ID " + collection.getCollectionId() 
+        logger.info("inserting collection with ID " + collection.getCollectionId() 
                 + " and key " + collection.getTableMetaData().getKey() + " into table " + tableMetaData.getTableName());
 
         try {
             connection.setAutoCommit(false);
             logger.finest("starting insert transaction");
-            String sql = QueryBuilder.buildPreparedInsert(collection.get(0));
+            String sql = QueryBuilder.buildPreparedInsert(collection.iterator().next());
             PreparedStatement preparedStatement = 
                 connection.prepareStatement(sql);
             logger.finest("using prepared statement: " + sql);
             logger.finest("preparing updates");
-            for (ConditionsObject object : collection.getObjects()) {
+            for (ConditionsObject object : collection) {
                 preparedStatement.setObject(1, object.getCollectionId());
                 int parameterIndex = 2;
                 for (Entry<String,Object> entry : object.getFieldValues().entrySet()) {
@@ -662,7 +661,7 @@
             connection.setAutoCommit(true);
         }
     }
-           
+                      
     private void setupEcal() {
         logger.config("setting up ECAL conditions on detector");
         EcalConditions conditions = getCachedConditions(EcalConditions.class, ECAL_CONDITIONS).getCachedData();
@@ -683,7 +682,6 @@
         logger.config("done loading SVT detector conditions");
     }
     
-
     /**
      * Check if connected to the database.
      * @return true if connected
@@ -816,13 +814,13 @@
                 throw new RuntimeException(e);
             }
 
-            Class<? extends ConditionsObjectCollection<?>> collectionClass;
+            Class<? extends AbstractConditionsObjectCollection<?>> collectionClass;
             Class<?> rawCollectionClass;
             try {
                 rawCollectionClass = Class.forName(collectionName);
-                if (!ConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
+                if (!AbstractConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
                     throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
-                collectionClass = (Class<? extends ConditionsObjectCollection<?>>) rawCollectionClass;
+                collectionClass = (Class<? extends AbstractConditionsObjectCollection<?>>) rawCollectionClass;
             } catch (ClassNotFoundException e) {
                 throw new RuntimeException(e);
             }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	Wed Dec 10 19:18:35 2014
@@ -4,7 +4,7 @@
 import java.util.Set;
 
 import org.hps.conditions.api.ConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * <p>
@@ -14,7 +14,7 @@
  * </p>
  * <p>
  * It also has references to the implementation classes which are used to map
- * the data onto {@link ConditionsObject} and {@link ConditionsObjectCollection}
+ * the data onto {@link ConditionsObject} and {@link AbstractConditionsObjectCollection}
  * s.
  * </p>
  * 
@@ -26,7 +26,7 @@
     String tableName;
     String key;
     Class<? extends ConditionsObject> objectClass;
-    Class<? extends ConditionsObjectCollection<?>> collectionClass;
+    Class<? extends AbstractConditionsObjectCollection<?>> collectionClass;
     Set<String> fieldNames = new LinkedHashSet<String>();
 
     /**
@@ -35,7 +35,7 @@
      * @param objectClass The type of object for the data mapping.
      * @param collectionClass The type of collection for the data mapping.
      */
-    TableMetaData(String key, String tableName, Class<? extends ConditionsObject> objectClass, Class<? extends ConditionsObjectCollection<?>> collectionClass) {
+    public TableMetaData(String key, String tableName, Class<? extends ConditionsObject> objectClass, Class<? extends AbstractConditionsObjectCollection<?>> collectionClass) {
         this.key = key;
         this.tableName = tableName;
         this.objectClass = objectClass;
@@ -54,7 +54,7 @@
      * Get the type of collection this table maps onto.
      * @return
      */
-    public Class<? extends ConditionsObjectCollection<?>> getCollectionClass() {
+    public Class<? extends AbstractConditionsObjectCollection<?>> getCollectionClass() {
         return collectionClass;
     }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.ecal;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class represents an ECAL channel that is considered "bad" which means it
@@ -9,7 +9,7 @@
  */
 public final class EcalBadChannel extends AbstractConditionsObject {
 
-    public static class EcalBadChannelCollection extends ConditionsObjectCollection<EcalBadChannel> {
+    public static class EcalBadChannelCollection extends AbstractConditionsObjectCollection<EcalBadChannel> {
     }
 
     int getChannelId() {

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.ecal;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class is a simplistic representation of ECal pedestal and noise values
@@ -14,7 +14,7 @@
  */
 public final class EcalCalibration extends AbstractConditionsObject {
 
-    public static class EcalCalibrationCollection extends ConditionsObjectCollection<EcalCalibration> {
+    public static class EcalCalibrationCollection extends AbstractConditionsObjectCollection<EcalCalibration> {
     }
     
     public EcalCalibration() {

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	Wed Dec 10 19:18:35 2014
@@ -5,7 +5,7 @@
 
 import org.hps.conditions.api.AbstractConditionsObject;
 import org.hps.conditions.api.AbstractIdentifier;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.lcsim.detector.identifier.ExpandedIdentifier;
 import org.lcsim.detector.identifier.IExpandedIdentifier;
@@ -123,7 +123,7 @@
     /**
      * A collection of {@link EcalChannel} objects.
      */
-    public static class EcalChannelCollection extends ConditionsObjectCollection<EcalChannel> {
+    public static class EcalChannelCollection extends AbstractConditionsObjectCollection<EcalChannel> {
 
         // Identifier maps for fast lookup.
         Map<Long, EcalChannel> daqMap = new HashMap<Long, EcalChannel>();
@@ -136,7 +136,7 @@
          * access to the Detector API.
          */
         @Override
-        public void add(EcalChannel channel) throws ConditionsObjectException {
+        public boolean add(EcalChannel channel)  {
             super.add(channel);
             DaqId daqId = channel.createDaqId();
             if (daqId.isValid())
@@ -144,6 +144,7 @@
             ChannelId channelId = channel.createChannelId();
             if (channelId.isValid())
                 channelMap.put(channelId.encode(), channel);
+            return true;
         }
 
         /**
@@ -152,7 +153,7 @@
          * @param system The system ID of the subdetector.
          */
         void buildGeometryMap(IIdentifierHelper helper, int system) {
-            for (EcalChannel channel : this.objects) {
+            for (EcalChannel channel : this) {
                 GeometryId geometryId = channel.createGeometryId(helper, system);
                 geometryMap.put(geometryId.encode(), channel);
             }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java	Wed Dec 10 19:18:35 2014
@@ -109,7 +109,7 @@
         buff.append('\n');
 
         // Loop over all channels.
-        for (EcalChannel channel : channelMap.getObjects()) {
+        for (EcalChannel channel : channelMap) {
 
             EcalChannelConstants constants = getChannelConstants(channel);
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	Wed Dec 10 19:18:35 2014
@@ -46,7 +46,7 @@
         // Get the ECal gains from the conditions database and add them to the
         // conditions set
         EcalGainCollection gains = dbConditionsManager.getCollection(EcalGainCollection.class);
-        for (EcalGain gain : gains.getObjects()) {
+        for (EcalGain gain : gains) {
             ChannelId channelId = new ChannelId(new int[] { gain.getChannelId() });
             EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setGain(gain);
@@ -55,7 +55,7 @@
         // Get the ECal bad channels and add them to the conditions set
         try {
             EcalBadChannelCollection badChannels = dbConditionsManager.getCollection(EcalBadChannelCollection.class);
-            for (EcalBadChannel badChannel : badChannels.getObjects()) {
+            for (EcalBadChannel badChannel : badChannels) {
                 ChannelId channelId = new ChannelId(new int[] { badChannel.getChannelId() });
                 EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setBadChannel(true);
@@ -67,7 +67,7 @@
         // Get the ECal calibrations from the conditions database and add them
         // to the conditions set.
         EcalCalibrationCollection calibrations = dbConditionsManager.getCollection(EcalCalibrationCollection.class);
-        for (EcalCalibration calibration : calibrations.getObjects()) {
+        for (EcalCalibration calibration : calibrations) {
             ChannelId channelId = new ChannelId(new int[] { calibration.getChannelId() });
             EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setCalibration(calibration);
@@ -76,7 +76,7 @@
         // Get the ECal time shifts from the conditions database and add them to
         // the conditions set.
         EcalTimeShiftCollection timeShifts = dbConditionsManager.getCollection(EcalTimeShiftCollection.class);
-        for (EcalTimeShift timeShift : timeShifts.getObjects()) {
+        for (EcalTimeShift timeShift : timeShifts) {
             ChannelId channelId = new ChannelId(new int[] { timeShift.getChannelId() });
             EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setTimeShift(timeShift);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.ecal;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * A simplistic representation of gain values from the ECal conditions database.
@@ -10,7 +10,7 @@
  */
 public final class EcalGain extends AbstractConditionsObject {
 
-    public static class EcalGainCollection extends ConditionsObjectCollection<EcalGain> {
+    public static class EcalGainCollection extends AbstractConditionsObjectCollection<EcalGain> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.ecal;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * A conditions class for representing the setup of the LED system in the ECAL
@@ -13,7 +13,7 @@
     /**
      * Generic collection class for these objects.
      */
-    public static class EcalLedCollection extends ConditionsObjectCollection<EcalLed> {
+    public static class EcalLedCollection extends AbstractConditionsObjectCollection<EcalLed> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.ecal;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class represents a time shift calibration value for an ECAL channel.
@@ -12,7 +12,7 @@
     /**
      * A collection of {@link EcalTimeShift} objects.
      */
-    public static class EcalTimeShiftCollection extends ConditionsObjectCollection<EcalTimeShift> {
+    public static class EcalTimeShiftCollection extends AbstractConditionsObjectCollection<EcalTimeShift> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	Wed Dec 10 19:18:35 2014
@@ -5,13 +5,11 @@
 import java.util.Map;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
-import org.hps.conditions.api.ConditionsObjectException;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.util.Pair;
 
 /**
- * This abstract class provides basic setup information for an SVT sensor
- * channel.
+ * This abstract class provides basic setup information for an SVT sensor channel.
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
@@ -20,7 +18,7 @@
     // TODO: Put constants into their own class
     public static final int MAX_NUMBER_OF_SAMPLES = 6;
 
-    public static abstract class AbstractSvtChannelCollection<T extends AbstractSvtChannel> extends ConditionsObjectCollection<T> {
+    public static abstract class AbstractSvtChannelCollection<T extends AbstractSvtChannel> extends AbstractConditionsObjectCollection<T> {
 
         Map<Integer, T> channelMap = new HashMap<Integer, T>();
 
@@ -30,7 +28,7 @@
          * 
          * @param A channel of a type extending {@link AbstractSvtChannel}
          */
-        public void add(T channel) {
+        public boolean add(T channel) {
 
             // If it doesn't exist, add the channel to the channel map
             if (channelMap.containsKey(channel.getChannelID())) {
@@ -39,11 +37,7 @@
             channelMap.put(channel.getChannelID(), channel);
 
             // Add to the collection
-            try {
-                super.add(channel);
-            } catch (ConditionsObjectException e) {
-                throw new RuntimeException(e);
-            }
+            return super.add(channel);                                  
         }
 
         /**
@@ -73,7 +67,7 @@
          */
         public String toString() {
             StringBuffer buff = new StringBuffer();
-            for (T channel : this.getObjects()) {
+            for (T channel : this) {
                 buff.append(channel.toString() + '\n');
             }
             return buff.toString();

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java	Wed Dec 10 19:18:35 2014
@@ -39,7 +39,7 @@
      */
     public ChannelConstants getChannelConstants(AbstractSvtChannel channel) {
         // This channel must come from the map.
-        if (!channelMap.getObjects().contains(channel)) {
+        if (!channelMap.contains(channel)) {
             System.err.println("[ " + this.getClass().getSimpleName() + " ]: Channel not found in map => " + channel);
             throw new IllegalArgumentException("Channel was not found in map.");
         }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	Wed Dec 10 19:18:35 2014
@@ -36,14 +36,14 @@
         // Get the SVT calibrations (baseline, noise) from the conditions
         // database
         SvtCalibrationCollection calibrations = dbConditionsManager.getCollection(SvtCalibrationCollection.class);
-        for (SvtCalibration calibration : calibrations.getObjects()) {
+        for (SvtCalibration calibration : calibrations) {
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(calibration.getChannelID());
             conditions.getChannelConstants(channel).setCalibration(calibration);
         }
 
         // Get the Channel pulse fit parameters from the conditions database
         SvtShapeFitParametersCollection shapeFitParametersCollection = dbConditionsManager.getCollection(SvtShapeFitParametersCollection.class);
-        for (SvtShapeFitParameters shapeFitParameters : shapeFitParametersCollection.getObjects()) {
+        for (SvtShapeFitParameters shapeFitParameters : shapeFitParametersCollection) {
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(shapeFitParameters.getChannelID());
             conditions.getChannelConstants(channel).setShapeFitParameters(shapeFitParameters);
         }
@@ -53,7 +53,7 @@
         // notify the user and move on.
         try {
             SvtBadChannelCollection badChannels = dbConditionsManager.getCollection(SvtBadChannelCollection.class);
-            for (SvtBadChannel badChannel : badChannels.getObjects()) {
+            for (SvtBadChannel badChannel : badChannels) {
                 AbstractSvtChannel channel = conditions.getChannelMap().findChannel(badChannel.getChannelId());
                 conditions.getChannelConstants(channel).setBadChannel(true);
             }
@@ -63,7 +63,7 @@
 
         // Get the gains and offsets from the conditions database
         SvtGainCollection channelGains = dbConditionsManager.getCollection(SvtGainCollection.class);
-        for (SvtGain channelGain : channelGains.getObjects()) {
+        for (SvtGain channelGain : channelGains) {
             int channelId = channelGain.getChannelID();
             AbstractSvtChannel channel = conditions.getChannelMap().findChannel(channelId);
             conditions.getChannelConstants(channel).setGain(channelGain);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	Wed Dec 10 19:18:35 2014
@@ -2,7 +2,7 @@
 
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.util.Pair;
 
 /**
@@ -13,7 +13,7 @@
  */
 public abstract class AbstractSvtDaqMapping extends AbstractConditionsObject {
 
-    public static abstract class AbstractSvtDaqMappingCollection<T extends AbstractSvtDaqMapping> extends ConditionsObjectCollection<T> {
+    public static abstract class AbstractSvtDaqMappingCollection<T extends AbstractSvtDaqMapping> extends AbstractConditionsObjectCollection<T> {
 
         /**
          * Flag values for top or bottom half.

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.util.Pair;
 
 /**
@@ -12,7 +12,7 @@
  */
 public class AbstractSvtT0Shift extends AbstractConditionsObject {
 
-    public static abstract class AbstractSvtT0ShiftCollection<T extends AbstractSvtT0Shift> extends ConditionsObjectCollection<T> {
+    public static abstract class AbstractSvtT0ShiftCollection<T extends AbstractSvtT0Shift> extends AbstractConditionsObjectCollection<T> {
 
         /**
          * Get the t0 shift associated with a given DAQ pair

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * <p>
@@ -20,7 +20,7 @@
  */
 public class SvtAlignmentConstant extends AbstractConditionsObject {
 
-    public static class SvtAlignmentCollection extends ConditionsObjectCollection<SvtAlignmentConstant> {
+    public static class SvtAlignmentCollection extends AbstractConditionsObjectCollection<SvtAlignmentConstant> {
     }
 
     /** Top or bottom half. */

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	Wed Dec 10 19:18:35 2014
@@ -1,11 +1,11 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 public final class SvtBadChannel extends AbstractConditionsObject {
 
-    public static class SvtBadChannelCollection extends ConditionsObjectCollection<SvtBadChannel> {
+    public static class SvtBadChannelCollection extends AbstractConditionsObjectCollection<SvtBadChannel> {
     }
 
     public int getChannelId() {

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 import static org.hps.conditions.svt.SvtChannel.MAX_NUMBER_OF_SAMPLES;
 
@@ -13,7 +13,7 @@
  */
 public final class SvtCalibration extends AbstractConditionsObject {
 
-    public static class SvtCalibrationCollection extends ConditionsObjectCollection<SvtCalibration> {
+    public static class SvtCalibrationCollection extends AbstractConditionsObjectCollection<SvtCalibration> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtChannel.java	Wed Dec 10 19:18:35 2014
@@ -27,7 +27,7 @@
             List<SvtChannel> channels = new ArrayList<SvtChannel>();
             int febID = pair.getFirstElement();
             int febHybridID = pair.getSecondElement();
-            for (SvtChannel channel : this.getObjects()) {
+            for (SvtChannel channel : this) {
                 if (channel.getFebID() == febID && channel.getFebHybridID() == febHybridID) {
                     channels.add(channel);
                 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditions.java	Wed Dec 10 19:18:35 2014
@@ -117,7 +117,7 @@
         }
         buff.append('\n');
         // Loop over channels.
-        for (SvtChannel channel : this.getChannelMap().getObjects()) {
+        for (SvtChannel channel : this.getChannelMap()) {
 
             // Get the conditions for the channel.
             ChannelConstants constants = getChannelConstants(channel);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	Wed Dec 10 19:18:35 2014
@@ -6,7 +6,7 @@
 import java.io.InputStream;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.jdom.Document;
 import org.jdom.JDOMException;
 import org.jdom.input.SAXBuilder;
@@ -18,7 +18,7 @@
  */
 public class SvtConfiguration extends AbstractConditionsObject {
 
-    public static class SvtConfigurationCollection extends ConditionsObjectCollection<SvtConfiguration> {
+    public static class SvtConfigurationCollection extends AbstractConditionsObjectCollection<SvtConfiguration> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	Wed Dec 10 19:18:35 2014
@@ -24,7 +24,7 @@
         public Pair<Integer, Integer> getDaqPair(HpsSiSensor sensor) {
 
             String svtHalf = sensor.isTopLayer() ? TOP_HALF : BOTTOM_HALF;
-            for (SvtDaqMapping object : this.getObjects()) {
+            for (SvtDaqMapping object : this) {
 
                 if (svtHalf.equals(object.getSvtHalf()) && object.getLayerNumber() == sensor.getLayerNumber() && object.getSide().equals(sensor.getSide())) {
 
@@ -46,7 +46,7 @@
          */
         public String getOrientation(Pair<Integer, Integer> daqPair) {
 
-            for (SvtDaqMapping daqMapping : this.getObjects()) {
+            for (SvtDaqMapping daqMapping : this) {
 
                 if (daqPair.getFirstElement() == daqMapping.getFebID() && daqPair.getSecondElement() == daqMapping.getFebHybridID()) {
                     return daqMapping.getOrientation();
@@ -76,7 +76,7 @@
             buff.append('\n');
             buff.append("----------------------");
             buff.append('\n');
-            for (SvtDaqMapping object : getObjects()) {
+            for (SvtDaqMapping object : this) {
                 buff.append(object.getFebID());
                 buff.append("    ");
                 buff.append(object.getFebHybridID());

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtDetectorSetup.java	Wed Dec 10 19:18:35 2014
@@ -43,7 +43,7 @@
         List<HpsSiSensor> sensors = subdetector.getDetectorElement().findDescendants(HpsSiSensor.class);
         logger.info("setting up " + sensors.size() + " SVT sensors");
         SvtChannelCollection channelMap = conditions.getChannelMap();
-        logger.info("channel map has " + conditions.getChannelMap().getObjects().size() + " entries");
+        logger.info("channel map has " + conditions.getChannelMap().size() + " entries");
         SvtDaqMappingCollection daqMap = conditions.getDaqMap();
         SvtT0ShiftCollection t0Shifts = conditions.getT0Shifts();
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class represents gain measurements for a single SVT channel.
@@ -9,7 +9,7 @@
  */
 public final class SvtGain extends AbstractConditionsObject {
 
-    public static class SvtGainCollection extends ConditionsObjectCollection<SvtGain> {
+    public static class SvtGainCollection extends AbstractConditionsObjectCollection<SvtGain> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	Wed Dec 10 19:18:35 2014
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
 import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.AbstractConditionsObjectCollection;
 
 /**
  * This class encapsulates the shape fit parameters for an SVT channel.
@@ -11,7 +11,7 @@
  */
 public final class SvtShapeFitParameters extends AbstractConditionsObject {
 
-    public static class SvtShapeFitParametersCollection extends ConditionsObjectCollection<SvtShapeFitParameters> {
+    public static class SvtShapeFitParametersCollection extends AbstractConditionsObjectCollection<SvtShapeFitParameters> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	Wed Dec 10 19:18:35 2014
@@ -24,7 +24,7 @@
         public SvtT0Shift getT0Shift(Pair<Integer, Integer> pair) {
             int febID = pair.getFirstElement();
             int febHybridID = pair.getSecondElement();
-            for (SvtT0Shift t0Shift : this.getObjects()) {
+            for (SvtT0Shift t0Shift : this) {
                 if (t0Shift.getFebID() == febID && t0Shift.getFebHybridID() == febHybridID) {
                     return t0Shift;
                 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	Wed Dec 10 19:18:35 2014
@@ -15,7 +15,7 @@
             List<TestRunSvtChannel> channels = new ArrayList<TestRunSvtChannel>();
             int fpga = pair.getFirstElement();
             int hybrid = pair.getSecondElement();
-            for (TestRunSvtChannel channel : this.getObjects()) {
+            for (TestRunSvtChannel channel : this) {
                 if (channel.getFpgaID() == fpga && channel.getHybridID() == hybrid) {
                     channels.add(channel);
                 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	Wed Dec 10 19:18:35 2014
@@ -119,7 +119,7 @@
         }
         buff.append('\n');
         // Loop over channels.
-        for (TestRunSvtChannel channel : this.getChannelMap().getObjects()) {
+        for (TestRunSvtChannel channel : this.getChannelMap()) {
 
             System.out.println("Channel: " + channel.toString());
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	Wed Dec 10 19:18:35 2014
@@ -24,7 +24,7 @@
         public Pair<Integer, Integer> getDaqPair(HpsSiSensor sensor) {
 
             String svtHalf = sensor.isTopLayer() ? TOP_HALF : BOTTOM_HALF;
-            for (TestRunSvtDaqMapping daqMapping : this.getObjects()) {
+            for (TestRunSvtDaqMapping daqMapping : this) {
 
                 if (svtHalf.equals(daqMapping.getSvtHalf()) && daqMapping.getLayerNumber() == sensor.getLayerNumber()) {
 
@@ -45,7 +45,7 @@
          */
         public String getOrientation(Pair<Integer, Integer> daqPair) {
 
-            for (TestRunSvtDaqMapping daqMapping : this.getObjects()) {
+            for (TestRunSvtDaqMapping daqMapping : this) {
 
                 if (daqPair.getFirstElement() == ((TestRunSvtDaqMapping) daqMapping).getFpgaID() && daqPair.getSecondElement() == ((TestRunSvtDaqMapping) daqMapping).getHybridID()) {
                     return daqMapping.getOrientation();
@@ -73,7 +73,7 @@
             buffer.append('\n');
             buffer.append("----------------------");
             buffer.append('\n');
-            for (TestRunSvtDaqMapping daqMapping : getObjects()) {
+            for (TestRunSvtDaqMapping daqMapping : this) {
                 TestRunSvtDaqMapping testRunDaqMapping = (TestRunSvtDaqMapping) daqMapping;
                 buffer.append(testRunDaqMapping.getFpgaID());
                 buffer.append("    ");

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDetectorSetup.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDetectorSetup.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtDetectorSetup.java	Wed Dec 10 19:18:35 2014
@@ -44,7 +44,7 @@
         List<HpsSiSensor> sensors = subdetector.getDetectorElement().findDescendants(HpsSiSensor.class);
         logger.info("setting up " + sensors.size() + " SVT sensors");
         TestRunSvtChannelCollection channelMap = conditions.getChannelMap();
-        logger.info("channel map has " + channelMap.getObjects().size() + " entries");
+        logger.info("channel map has " + channelMap.size() + " entries");
         TestRunSvtDaqMappingCollection daqMap = conditions.getDaqMap();
         TestRunSvtT0ShiftCollection t0Shifts = conditions.getT0Shifts();
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	Wed Dec 10 19:18:35 2014
@@ -25,7 +25,7 @@
 
             int fpgaID = pair.getFirstElement();
             int hybridID = pair.getSecondElement();
-            for (TestRunSvtT0Shift t0Shift : this.getObjects()) {
+            for (TestRunSvtT0Shift t0Shift : this) {
                 if (t0Shift.getFpgaID() == fpgaID && t0Shift.getHybridID() == hybridID) {
                     return t0Shift;
                 }

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	Wed Dec 10 19:18:35 2014
@@ -15,6 +15,7 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
+// FIXME: This test is berken.  It should probably be removed.
 public class ConditionsObjectTest extends TestCase {
 
     public void testBasicOperations() throws ConditionsObjectException {
@@ -25,7 +26,8 @@
         TableMetaData tableMetaData = conditionsManager.findTableMetaData(TableConstants.SVT_GAINS);
         int collectionId = conditionsManager.getNextCollectionID(tableMetaData.getTableName());
         SvtGainCollection collection = new SvtGainCollection();
-        collection.setTableMetaData(tableMetaData);
+        // FIXME: This can't be done through a setter anymore!
+        //collection.setTableMetaData(tableMetaData);
         try {
             collection.setCollectionId(collectionId);
         } catch (ConditionsObjectException e) {

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java	Wed Dec 10 19:18:35 2014
@@ -79,7 +79,7 @@
             if (currentRun != event.getRunNumber()) {
                 currentRun = event.getRunNumber();
                 BeamCurrentCollection collection = ConditionsManager.defaultInstance().getCachedConditions(BeamCurrentCollection.class, BEAM_CURRENT).getCachedData();
-                BeamCurrent beamCurrent = collection.get(0);
+                BeamCurrent beamCurrent = collection.iterator().next();
                 System.out.println("Run " + event.getRunNumber() + " has integrated beam current " + beamCurrent.getIntegratedBeamCurrent() + " nC.");
                 assertEquals("Wrong beam current for run.", beamCurrentAnswerKey.get(currentRun), beamCurrent.getIntegratedBeamCurrent());
             }

Modified: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java
 =============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java	(original)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/EcalCalibrationsDriver.java	Wed Dec 10 19:18:35 2014
@@ -127,7 +127,7 @@
         ecalConditions = conditionsManager.getCachedConditions(EcalConditions.class, TableConstants.ECAL_CONDITIONS).getCachedData();
         
         // Create a histogram for every ECAL channel.
-        for (EcalChannel channel : ecalConditions.getChannelCollection().getObjects()) {
+        for (EcalChannel channel : ecalConditions.getChannelCollection()) {
             aida.histogram1D("ECAL Channel " + channel.getChannelId(), 300, 0, 300.);
         }
     }
@@ -178,7 +178,7 @@
         calibrations.setTableMetaData(tableMetaData);
         
         // Loop over all ECAL channels.
-        for (EcalChannel channel : ecalConditions.getChannelCollection().getObjects()) {
+        for (EcalChannel channel : ecalConditions.getChannelCollection()) {
             
             // Get the histogram with ADC distribution for this channel. 
             IHistogram1D histogram = aida.histogram1D("ECAL Channel " + channel.getChannelId());
@@ -205,12 +205,7 @@
             
             // Create a new calibration object and add it to the collection, using mean for pedestal
             // and sigma for noise.
-            EcalCalibration calibration = new EcalCalibration(channelId, mean, sigma);
-            try {
-                calibrations.add(calibration);
-            } catch (ConditionsObjectException e) {
-                throw new RuntimeException(e);
-            }
+            calibrations.add(new EcalCalibration(channelId, mean, sigma));
         } 
         
         // Get the list of field names for the header.