LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  April 2015

HPS-SVN April 2015

Subject:

r2787 - in /java/branches/conditions-HPSJAVA-488/src: main/java/org/hps/conditions/api/ main/java/org/hps/conditions/cli/ main/java/org/hps/conditions/database/ main/java/org/hps/conditions/dummy/ main/java/org/hps/conditions/ecal/ main/java/org/hps/conditions/svt/ test/java/org/hps/conditions/ test/java/org/hps/conditions/api/ test/java/org/hps/conditions/apinew/ test/java/org/hps/conditions/beam/ test/java/org/hps/conditions/database/ test/java/org/hps/conditions/ecal/ test/java/org/hps/conditions/svt/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Wed, 22 Apr 2015 20:38:56 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (5814 lines)

Author: [log in to unmask]
Date: Wed Apr 22 13:38:35 2015
New Revision: 2787

Log:
Refactoring codepocalypse on conditions branch.

Added:
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/AbstractConditionsObjectConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValues.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValuesMap.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableMetaData.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableRegistry.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/
      - copied from r2744, java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/apinew/
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/DummyConditionsObjectConverterTest.java
      - copied, changed from r2756, java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/apinew/DummyConditionsObjectConverterTest.java
Removed:
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValueMap.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/AbstractConditionsObjectConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/TableMetaData.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/TableRegistry.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/apinew/
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/database/TableRegistryTest.java
Modified:
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObject.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObject.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/AddCommand.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/PrintCommand.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/TagCommand.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/Converter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConverterRegistry.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/QueryBuilder.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObject.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObjectConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalChannel.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditions.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalGain.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalLed.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtChannel.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditions.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
    java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/EngRunConditionsTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectCollectionTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamConditionsTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalHardwareConditionsTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalLedTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
    java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java

Added: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/AbstractConditionsObjectConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/AbstractConditionsObjectConverter.java	(added)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/AbstractConditionsObjectConverter.java	Wed Apr 22 13:38:35 2015
@@ -0,0 +1,176 @@
+package org.hps.conditions.api;
+
+import java.sql.SQLException;
+
+import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.conditions.database.MultipleCollectionsAction;
+import org.lcsim.conditions.ConditionsConverter;
+import org.lcsim.conditions.ConditionsManager;
+
+/**
+ * <p>
+ * Implementation of default conversion from database tables to a {@link ConditionsObject} class.
+ * <p>
+ * This class actually returns collections and not individual objects.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @param <T> The type of the returned data which should be a class extending {@link BaseConditionsObjectCollection}.
+ */
+public abstract class AbstractConditionsObjectConverter<T> implements ConditionsConverter<T> {
+
+    /**
+     * Create a conditions object collection.
+     *
+     * @param conditionsRecord the conditions record
+     * @param tableMetaData the table data
+     * @return the conditions object collection
+     * @throws ConditionsObjectException if there is a problem creating the collection
+     */
+    static final BaseConditionsObjectCollection<?> createCollection(final DatabaseConditionsManager manager,
+            final ConditionsRecord conditionsRecord, final TableMetaData tableMetaData)
+            throws ConditionsObjectException {
+        BaseConditionsObjectCollection<?> collection;
+        try {
+            collection = tableMetaData.getCollectionClass().newInstance();
+            if (conditionsRecord != null) {
+                collection.setConnection(manager.getConnection());
+                collection.setTableMetaData(tableMetaData);
+                collection.setCollectionId(conditionsRecord.getCollectionId());
+            }
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new ConditionsObjectException("Error creating conditions object collection.", e);
+        }
+        return collection;
+    }
+
+    /**
+     * The action to take if multiple overlapping conditions sets are found. The default is using the most recently
+     * updated one.
+     */
+    private MultipleCollectionsAction multipleCollections = MultipleCollectionsAction.LAST_UPDATED;
+
+    /**
+     * Class constructor.
+     */
+    public AbstractConditionsObjectConverter() {
+    }
+
+    /**
+     * Get the conditions data based on the name, e.g. "ecal_channels". The table information is found using the type
+     * handled by the Converter.
+     *
+     * @param conditionsManager the current conditions manager
+     * @param name the name of the conditions set (maps to table name)
+     * @return the conditions data
+     */
+    @Override
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    public T getData(final ConditionsManager conditionsManager, final String name) {
+
+        // Get the DatabaseConditionsManager which is required for using this converter.
+        final DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) conditionsManager;
+
+        // Setup connection if necessary.
+        final boolean openedConnection = databaseConditionsManager.openConnection();
+
+        // Get the TableMetaData from the table name.
+        final TableMetaData tableMetaData = TableRegistry.getTableRegistry().findByTableName(name);
+
+        // Throw an exception if the table name does not map to a known type.
+        if (tableMetaData == null) {
+            throw new RuntimeException(new ConditionsObjectException("No table information found for name: " + name));
+        }
+
+        // Get the ConditionsRecordCollection with the run number assignments.
+        final ConditionsRecordCollection conditionsRecords = databaseConditionsManager.findConditionsRecords(name);
+
+        // 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.
+            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 (this.multipleCollections.equals(MultipleCollectionsAction.LAST_UPDATED)) {
+                // Use the conditions set with the latest updated date.
+                conditionsRecord = conditionsRecords.sortedByUpdated().get(conditionsRecords.size() - 1);
+            } else if (this.multipleCollections.equals(MultipleCollectionsAction.LAST_CREATED)) {
+                // Use the conditions set with the latest created date.
+                conditionsRecord = conditionsRecords.sortedByCreated().get(conditionsRecords.size() - 1);
+            } else if (this.multipleCollections.equals(MultipleCollectionsAction.LATEST_RUN_START)) {
+                // Use the conditions set with the greatest run start value.
+                conditionsRecord = conditionsRecords.sortedByRunStart().get(conditionsRecords.size() - 1);
+            } else if (this.multipleCollections.equals(MultipleCollectionsAction.ERROR)) {
+                // The converter has been configured to throw an error.
+                throw new RuntimeException("Multiple ConditionsRecord object found for conditions key " + name);
+            }
+        }
+
+        // Create a collection of objects to return.
+        ConditionsObjectCollection collection = null;
+        try {
+            collection = createCollection(databaseConditionsManager, conditionsRecord, tableMetaData);
+        } catch (final ConditionsObjectException e) {
+            throw new RuntimeException(e);
+        }
+
+        DatabaseConditionsManager.getLogger().info("loading conditions set..." + '\n' + conditionsRecord);
+
+        // Select the objects into the collection by the collection ID.
+        try {
+            collection.select(conditionsRecord.getCollectionId());
+        } catch (ConditionsObjectException | SQLException e) {
+            throw new RuntimeException("Error creating conditions collection from table " + name
+                    + " with collection ID " + conditionsRecord.getCollectionId(), e);
+        }
+
+        if (openedConnection) {
+            // Close connection if one was opened.
+            databaseConditionsManager.closeConnection();
+        }
+
+        return (T) collection;
+    }
+
+    /**
+     * Get the multiple collections action.
+     *
+     * @return the multiple collections action
+     */
+    public final MultipleCollectionsAction getMultipleCollectionsAction() {
+        return this.multipleCollections;
+    }
+
+    /**
+     * Get the specific type converted by this class.
+     *
+     * @return the class that this converter handles
+     */
+    @Override
+    public abstract Class<T> getType();
+
+    /**
+     * Set the action that the converter will use to disambiguate when multiple conditions sets are found.
+     *
+     * @param multipleCollections the multiple collections action
+     */
+    public final void setMultipleCollectionsAction(final MultipleCollectionsAction multipleCollections) {
+        this.multipleCollections = multipleCollections;
+    }
+
+    /**
+     * Convert object to string.
+     *
+     * @return the object converted to string
+     */
+    @Override
+    public String toString() {
+        return "ConditionsObjectConverter: type = " + this.getType() + ", multipleCollectionsAction = "
+                + this.getMultipleCollectionsAction().toString();
+    }
+}

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObject.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObject.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObject.java	Wed Apr 22 13:38:35 2015
@@ -1,146 +1,367 @@
 package org.hps.conditions.api;
 
-import java.util.Map.Entry;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.hps.conditions.database.Field;
 
 /**
- * The basic implementation of {@link ConditionsObject}.
+ * This is a basic ORM class for performing CRUD (create, read, update, delete) operations on objects in the conditions
+ * system. Each object is mapped to a single row in a database table.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public class BaseConditionsObject implements ConditionsObject {
 
     /**
-     * The database row ID.
-     */
-    private int rowID = -1;
-
-    /**
-     * The map of field-value pairs.
-     */
-    private FieldValueMap fieldValues;
-
-    /**
-     * Constructor for sub-classing.
-     */
+     * Field name for collection ID.
+     */
+    static final String COLLECTION_ID_FIELD = "collection_id";
+
+    /**
+     * Date formatting for insert statement.
+     */
+    static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
+
+    static final int UNSET_COLLECTION_ID = -1;
+
+    static final int UNSET_ID = -1;
+
+    protected static String defaultToString(final BaseConditionsObject object) {
+        final StringBuffer sb = new StringBuffer();
+        sb.append("id: " + object.getId() + ", ");
+        for (final String field : object.getFieldValues().getFieldNames()) {
+            sb.append(field + "=" + object.getFieldValue(Object.class, field) + ", ");
+        }
+        sb.setLength(sb.length() - 2);
+        sb.append('\n');
+        return sb.toString();
+    }
+
+    /**
+     * The JDBC database connection.
+     */
+    private Connection connection;
+
+    /**
+     * The field values.
+     */
+    private FieldValues fieldValues;
+
+    /**
+     * The row ID of the object in its table. This will be -1 for new objects that are not in the database.
+     */
+    private int id = UNSET_ID;
+
+    /**
+     * Flag to indicate object is locally changed and database update has not been executed.
+     */
+    private boolean isDirty;
+
+    /**
+     * The information about the associated table such as the table and column names.
+     */
+    private TableMetaData tableMetaData;
+
     protected BaseConditionsObject() {
-        fieldValues = new FieldValueMap();
-    }
-
-    /**
-     * Get the row ID of this object.
+        this.fieldValues = new FieldValuesMap();
+    }
+
+    /**
+     * Class constructor.
      * <p>
-     * Implements {@link ConditionsObject#getRowId()}.
+     * This should be used when creating new objects without a list of field values. A new <code>FieldValues</code>
+     * object will be automatically created from the table information.
      *
-     * @return the row ID
-     */
-    @Override
-    public final int getRowId() {
-        return rowID;
-    }
-
-    /**
-     * True if object is new e.g. not in the database.
+     * @param connection
+     * @param tableMetaData
+     */
+    public BaseConditionsObject(final Connection connection, final TableMetaData tableMetaData) {
+        this.connection = connection;
+        this.tableMetaData = tableMetaData;
+        this.fieldValues = new FieldValuesMap(tableMetaData);
+    }
+
+    /**
+     * Class constructor.
      * <p>
-     * Implements {@link ConditionsObject#isNew()}.
+     * This should be used when creating new objects with a list of field values.
      *
-     * @return <code>true</code> if object is new
-     */
+     * @param connection
+     * @param tableMetaData
+     * @param fields
+     */
+    public BaseConditionsObject(final Connection connection, final TableMetaData tableMetaData, final FieldValues fields) {
+        this.connection = connection;
+        this.tableMetaData = tableMetaData;
+        this.fieldValues = fields;
+    }
+
+    /**
+     * Class constructor.
+     * <p>
+     * This should be used when the object is already in the database and the row ID is known. A SQL SELECT operation
+     * will be performed to get data into this object from the database.
+     *
+     * @param connection
+     * @param rowId
+     * @param tableMetaData
+     * @throw ConditionsObjectException if getting data into this object fails
+     * @throw SQLException if there is an SQL error when executing the SELECT operation
+     */
+    public BaseConditionsObject(final Connection connection, final TableMetaData tableMetaData, final int rowId)
+            throws ConditionsObjectException, SQLException {
+        this.connection = connection;
+        this.tableMetaData = tableMetaData;
+        this.fieldValues = new FieldValuesMap(tableMetaData);
+        final boolean selected = select(rowId);
+        if (!selected) {
+            throw new ConditionsObjectException("Failed to select data into object using row ID " + rowId);
+        }
+    }
+
+    @Override
+    public final boolean delete() throws ConditionsObjectException, SQLException {
+        if (isNew()) {
+            throw new ConditionsObjectException("Object is not in database and so cannot be deleted.");
+        }
+        final String sql = "DELETE FROM " + this.tableMetaData.getTableName() + " WHERE id=" + this.getId();
+        // if (this.verbose) {
+        // System.out.println(sql);
+        // }
+        Statement statement = null;
+        int rowsUpdated;
+        try {
+            statement = this.connection.createStatement();
+            rowsUpdated = statement.executeUpdate(sql);
+        } finally {
+            if (statement != null) {
+                statement.close();
+            }
+        }
+        return rowsUpdated != 0;
+    }
+
+    @Override
+    @Field(names = {"collection_id"})
+    public final Integer getCollectionId() {
+        if (this.fieldValues.isNonNull(COLLECTION_ID_FIELD)) {
+            return getFieldValue(Integer.class, COLLECTION_ID_FIELD);
+        } else {
+            return UNSET_COLLECTION_ID;
+        }
+    }
+
+    @Override
+    public FieldValues getFieldValues() {
+        return this.fieldValues;
+    }
+
+    @Override
+    public final int getId() {
+        return this.id;
+    }
+
+    @Override
+    public final TableMetaData getTableMetaData() {
+        return this.tableMetaData;
+    }
+
+    @Override
+    public final <T> T getFieldValue(final Class<T> type, final String name) {
+        return type.cast(this.fieldValues.getValue(type, name));
+    }
+
+    @Override
+    public final boolean insert() throws ConditionsObjectException, SQLException {
+        if (!isNew()) {
+            throw new ConditionsObjectException("Cannot insert an existing record.");
+        }
+        final StringBuffer sb = new StringBuffer();
+        sb.append("INSERT INTO " + this.tableMetaData.getTableName() + " (");
+        for (final String fieldName : this.fieldValues.getFieldNames()) {
+            sb.append(fieldName + ", ");
+        }
+        sb.setLength(sb.length() - 2);
+        sb.append(") VALUES (");
+        for (final Object value : this.fieldValues.getValues()) {
+            if (value instanceof Date) {
+                sb.append("STR_TO_DATE( '" + DATE_FORMAT.format((Date) value) + "', '%Y-%m-%d %H:%i:%S' ), ");
+            } else {
+                sb.append("'" + value + "', ");
+            }
+        }
+        sb.setLength(sb.length() - 2);
+        sb.append(")");
+        final String sql = sb.toString();
+        // if (this.verbose) {
+        // System.out.println(sql);
+        // }
+        Statement statement = null;
+        ResultSet resultSet = null;
+        int rowsUpdated = 0;
+        try {
+            statement = this.connection.createStatement();
+            rowsUpdated = statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
+            resultSet = statement.getGeneratedKeys();
+            while (resultSet.next()) {
+                final int key = resultSet.getInt(1);
+                this.id = key;
+                break;
+            }
+        } finally {
+            if (resultSet != null) {
+                resultSet.close();
+            }
+            if (statement != null) {
+                statement.close();
+            }
+        }
+        return rowsUpdated != 0;
+    }
+
+    @Override
+    public final boolean isDirty() {
+        return this.isDirty;
+    }
+
     @Override
     public final boolean isNew() {
-        return rowID == -1;
-    }
-
-    /**
-     * Set the value of a field.
-     * <p>
-     * Implements {@link ConditionsObject#setFieldValue(String, Object)}.
-     *
-     * @param key the name of the field
-     * @param value the value of the field
-     */
-    @Override
-    public final void setFieldValue(final String key, final Object value) {
-        fieldValues.put(key, value);
-    }
-
-    /**
-     * Set all field values using a {@link FieldValueMap}.
-     * <p>
-     * Implements {@link ConditionsObject#setFieldValues(FieldValueMap)}.
-     *
-     * @param fieldValues the list of key-value pairs
-     */
-    @Override
-    public final void setFieldValues(final FieldValueMap fieldValues) {
+        return getId() == UNSET_ID;
+    }
+
+    @Override
+    public final boolean select(final int id) throws ConditionsObjectException, SQLException {
+        this.id = id;
+        if (id < 1) {
+            throw new IllegalArgumentException("bad row ID value: " + id);
+        }
+        final StringBuffer sb = new StringBuffer();
+        sb.append("SELECT");
+        for (final String fieldName : this.tableMetaData.getFieldNames()) {
+            sb.append(" " + fieldName + ",");
+        }
+        sb.setLength(sb.length() - 1);
+        sb.append(" FROM " + this.tableMetaData.getTableName());
+        sb.append(" WHERE id = " + this.getId());
+        final String sql = sb.toString();
+        // if (this.verbose) {
+        // System.out.println(sql);
+        // }
+        Statement statement = null;
+        ResultSet resultSet = null;
+        boolean selected = false;
+        try {
+            statement = this.connection.createStatement();
+            resultSet = statement.executeQuery(sql);
+            while (resultSet.next()) {
+                for (int columnIndex = 1; columnIndex <= this.tableMetaData.getFieldNames().length; columnIndex++) {
+                    this.setFieldValue(this.tableMetaData.getFieldNames()[columnIndex - 1], resultSet.getObject(columnIndex));
+                }
+                selected = true;
+            }
+        } finally {
+            if (resultSet != null) {
+                resultSet.close();
+            }
+            if (statement != null) {
+                statement.close();
+            }
+        }
+        return selected;
+    }
+
+    @Override
+    public void setCollectionId(final int collectionId) throws ConditionsObjectException {
+        if (this.getCollectionId() != UNSET_COLLECTION_ID) {
+            throw new ConditionsObjectException("The collection ID is already set on this object.");
+        }
+        if (collectionId <= UNSET_COLLECTION_ID) {
+            throw new ConditionsObjectException("Invalid collection ID value: " + collectionId);
+        }
+        this.setFieldValue(COLLECTION_ID_FIELD, collectionId);
+    }
+
+    @Override
+    public final void setConnection(final Connection connection) {
+        this.connection = connection;
+    }
+
+    @Override
+    public void setFieldValues(final FieldValues fieldValues) {
         this.fieldValues = fieldValues;
     }
 
-    /**
-     * Get the value of a field.
-     * <p>
-     * Implements {@link ConditionsObject#getFieldValue(Class, String)}.
-     *
-     * @param klass the inferred return type
-     * @param field the name of the field
-     * @param <T> the type for inference of return type
-     * @return the value of the field
-     */
-    @Override
-    public final <T> T getFieldValue(final Class<T> klass, final String field) {
-        return klass.cast(fieldValues.get(field));
-    }
-
-    /**
-     * Get the field-value map.
-     * <p>
-     * Implements {@link ConditionsObject#getFieldValues()}.
-     *
-     * @return the field-value map
-     */
-    @Override
-    public final FieldValueMap getFieldValues() {
-        return this.fieldValues;
-    }
-
-    /**
-     * Get a field value.
-     *
-     * @param field the field name
-     * @param <T> the type inferred from the assigned variable
-     * @return the field value
-     */
-    @SuppressWarnings("unchecked")
-    public final <T> T getFieldValue(final String field) {
-        return (T) fieldValues.get(field);
-    }
-
-    /**
-     * Set the database row ID of the object.
-     *
-     * @param rowId the database row ID
-     * @throws ConditionsObjectException if the object already has a row ID
-     */
-    public final void setRowID(final int rowId) throws ConditionsObjectException {
-        if (!isNew()) {
-            throw new ConditionsObjectException("The row ID cannot be reassigned on an existing object.");
-        }
-        this.rowID = rowId;
-    }
-
-    /**
-     * Convert this object to a string, which is a tab-separated row appropriate
-     * for display in a table for console output.
-     *
-     * @return The object converted to a string.
-     */
+    @Override
+    public void setId(final int id) {
+        this.id = id;
+    }
+
+    @Override
+    public final void setTableMetaData(final TableMetaData tableMetaData) {
+        this.tableMetaData = tableMetaData;
+    }
+
+    @Override
+    public final void setFieldValue(final String name, final Object value) {
+        this.fieldValues.setValue(name, value);
+        this.isDirty = true;
+    }
+
+    @Override
     public String toString() {
-        final StringBuffer sb = new StringBuffer();
-        sb.append(this.getRowId());
-        sb.append('\t');
-        for (Entry<String, Object> entries : this.getFieldValues().entrySet()) {
-            sb.append(entries.getValue());
-            sb.append('\t');
-        }
-        return sb.toString();
+        return defaultToString(this);
+    }
+
+    @Override
+    public final boolean update() throws ConditionsObjectException, SQLException {
+        if (isDirty()) {
+            if (isNew()) {
+                throw new ConditionsObjectException("Cannot update a new object.");
+            }
+            final StringBuffer sb = new StringBuffer();
+            sb.append("UPDATE " + this.tableMetaData.getTableName() + " SET ");
+            for (final String fieldName : this.fieldValues.getFieldNames()) {
+                sb.append(fieldName + "=");
+                final Object value = this.fieldValues.getValue(fieldName);
+                if (value instanceof Date) {
+                    // FIXME: Is there a more generic way to handle this?
+                    sb.append("STR_TO_DATE( '" + DATE_FORMAT.format((Date) value) + "', '%Y-%m-%d %H:%i:%S' ), ");
+                } else {
+                    sb.append("'" + value + "', ");
+                }
+            }
+            sb.setLength(sb.length() - 2);
+            sb.append(" WHERE id=" + this.getId());
+            final String sql = sb.toString();
+            // if (this.verbose) {
+            // System.out.println(sql);
+            // }
+            Statement statement = null;
+            int rowsUpdated = 0;
+            try {
+                statement = this.connection.createStatement();
+                rowsUpdated = statement.executeUpdate(sql);
+                if (rowsUpdated > 0) {
+                    this.isDirty = false;
+                }
+            } finally {
+                if (statement != null) {
+                    statement.close();
+                }
+            }
+            return rowsUpdated != 0;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public <T> T getFieldValue(final String name) {
+        return (T) this.fieldValues.getValue(name);
     }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java	Wed Apr 22 13:38:35 2015
@@ -1,316 +1,298 @@
-package org.hps.conditions.api;
-
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import org.hps.conditions.api.ConditionsObject.DefaultConditionsObjectComparator;
-import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.conditions.database.TableMetaData;
-
-/**
- * This class implements a collection API for ConditionsObjects, using a <code>LinkedHashSet</code>.
- *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
- * @param <ObjectType> The concrete type of the collection class.
- */
-@SuppressWarnings("serial")
-public class BaseConditionsObjectCollection<ObjectType extends ConditionsObject> extends LinkedHashSet<ObjectType>
-        implements ConditionsObjectCollection<ObjectType> {
-
-    /**
-     * The associated table meta data.
-     */
-    private TableMetaData tableMetaData = null;
-
-    /**
-     * The collection ID which is -1 if the collection is not in the database.
-     */
-    private int collectionId = -1;
-
-    /**
-     * The associated conditions record information including run validity.
-     */
-    private ConditionsRecord conditionsRecord = null;
-
-    /**
-     * This is the no argument constructor that would be used when creating a new collection that is not in the
-     * database.
-     */
-    public BaseConditionsObjectCollection() {
-    }
-
-    /**
-     * This constructor uses the given conditions record and table meta data objects and will assign the collection ID
-     * from the conditions record.
-     *
-     * @param tableMetaData the table meta data
-     * @param conditionsRecord the conditions record
-     */
-    public BaseConditionsObjectCollection(final ConditionsRecord conditionsRecord, final TableMetaData tableMetaData) {
-        this.conditionsRecord = conditionsRecord;
-        this.tableMetaData = tableMetaData;
-        this.collectionId = conditionsRecord.getCollectionId();
-    }
-
-    /**
-     * This constructor is used to explicitly assign all class variable values.
-     *
-     * @param conditionsRecord the conditions record
-     * @param tableMetaData the table meta data
-     * @param collectionID the new collection ID
-     */
-    public BaseConditionsObjectCollection(final ConditionsRecord conditionsRecord, final TableMetaData tableMetaData,
-            final int collectionID) {
-        this.conditionsRecord = conditionsRecord;
-        this.tableMetaData = tableMetaData;
-        this.collectionId = collectionID;
-    }
-
-    /**
-     * Set the associated table meta data for this collection. Once set it cannot be reassigned, which will cause an
-     * exception to be thrown.
-     *
-     * @param tableMetaData the table meta data for this collection
-     */
-    public final void setTableMetaData(final TableMetaData tableMetaData) {
-        if (this.tableMetaData != null) {
-            throw new RuntimeException("The table meta data cannot be reset once assigned.");
-        }
-        this.tableMetaData = tableMetaData;
-    }
-
-    /**
-     * Set the associated conditions record this collection. Once set it cannot be reassigned, which will cause an
-     * exception to be thrown.
-     *
-     * @param conditionsRecord the conditions record for the collection
-     */
-    public final void setConditionsRecord(final ConditionsRecord conditionsRecord) {
-        if (this.conditionsRecord != null) {
-            throw new RuntimeException("The conditions record cannot be reset once assigned.");
-        }
-        this.conditionsRecord = conditionsRecord;
-    }
-
-    /**
-     * Add an object to the collection.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#add(Object)}.
-     *
-     * @param object the object do add to the collection
-     * @return <code>true</code> if the add operation succeeded
-     */
-    @Override
-    public boolean add(final ObjectType object) {
-        if (contains(object)) {
-            throw new IllegalArgumentException("Cannot add duplicate object " + object + " to collection.");
-        }
-        return super.add(object);
-    }
-
-    /**
-     * Get the table meta data.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#getTableMetaData()}.
-     *
-     * @return the table meta data for the collection.
-     */
-    @Override
-    public final TableMetaData getTableMetaData() {
-        return tableMetaData;
-    }
-
-    /**
-     * Get the collection ID.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#getCollectionId()}.
-     *
-     * @return the collection ID
-     */
-    @Override
-    public final int getCollectionId() {
-        if (conditionsRecord != null) {
-            return conditionsRecord.getCollectionId();
-        } else {
-            return collectionId;
-        }
-    }
-
-    /**
-     * Get the conditions record.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#getConditionsRecord()}.
-     *
-     * @return the conditions record for the collection
-     */
-    @Override
-    public final ConditionsRecord getConditionsRecord() {
-        return conditionsRecord;
-    }
-
-    /**
-     * Set the collection ID. Once set it cannot be assigned again.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#setCollectionId(int)}.
-     *
-     * @param collectionId the new collection ID
-     * @throws ConditionsObjectException if the ID was already assigned
-     */
-    @Override
-    public final void setCollectionId(final int collectionId) throws ConditionsObjectException {
-        if (this.collectionId != -1) {
-            throw new ConditionsObjectException("The collectionId already has the value " + collectionId
-                    + " and cannot be reset.");
-        }
-        this.collectionId = collectionId;
-    }
-
-    /**
-     * Insert the collection into the database.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#insert()}.
-     *
-     * @throws ConditionsObjectException if there was a problem inserting the object
-     * @throws SQLException if there was a SQL syntax error while executing the operation
-     */
-    @Override
-    public final void insert() throws ConditionsObjectException, SQLException {
-        DatabaseConditionsManager.getInstance().insertCollection(this);
-    }
-
-    /**
-     * Select objects into this collection from the database.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#select()}.
-     *
-     * @return the number of records selected
-     */
-    @Override
-    public final int select() {
-        return 0;
-    }
-
-    /**
-     * Delete the collection's object's from the database.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#delete()}.
-     *
-     * @return the number of objects deleted
-     */
-    @Override
-    public int delete() {
-        return 0;
-    }
-
-    /**
-     * Update the collection's objects in the database.
-     * <p>
-     * Implements {@link ConditionsObjectCollection#update()}.
-     *
-     * @return the number of records updated
-     */
-    @Override
-    public final int update() {
-        return 0;
-    }
-
-    /**
-     * Convert this object to a string.
-     * @return the object converted to a string
-     */
-    public String toString() {
-        final StringBuffer buffer = new StringBuffer();
-        for (ConditionsObject object : this) {
-            buffer.append(object.toString());
-            buffer.append('\n');
-        }
-        return buffer.toString();
-    }
-
-    /**
-     * Get an object by index.
-     *
-     * @param index the index in the set
-     * @return the object at the index
-     * @throws IndexOutOfBoundsException if the index is out of bounds
-     */
-    public final ObjectType get(final int index) {
-        if (index + 1 > this.size() || index < 0) {
-            throw new IndexOutOfBoundsException("The index is out of bounds: " + index);
-        }
-        int current = 0;
-        final Iterator<ObjectType> iterator = this.iterator();
-        ObjectType object = iterator.next();
-        while (current != index && iterator.hasNext()) {
-            object = iterator.next();
-            current++;
-        }
-        return object;
-    }
-
-    /**
-     * Sort the collection in place.
-     *
-     * @param comparator the comparator to use for sorting
-     */
-    public void sort(final Comparator<ObjectType> comparator) {
-        final List<ObjectType> objects = new ArrayList<ObjectType>(this);
-        Collections.sort(objects, comparator);
-        clear();
-        addAll(objects);
-    }
-
-    /**
-     * Get a sorted list of the objects, leaving original collection in place.
-     *
-     * @param comparator the comparator to use for the sort
-     * @return a sorted list of the objects
-     */
-    @SuppressWarnings("unchecked")
-    public BaseConditionsObjectCollection<ObjectType> sorted(final Comparator<ObjectType> comparator) {
-        final List<ObjectType> objects = new ArrayList<ObjectType>(this);
-        Collections.sort(objects, comparator);
-        BaseConditionsObjectCollection<ObjectType> collection = null;
-        try {
-            collection = (BaseConditionsObjectCollection<ObjectType>) getClass().newInstance();
-        } catch (InstantiationException | IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-        collection.addAll(objects);
-        return collection;
-    }
-
-    /**
-     * Sort this collection in place.
-     */
-    @Override
-    public void sort() {
-        final BaseConditionsObjectCollection<ObjectType> sortedCollection = sorted();
-        this.clear();
-        this.addAll(sortedCollection);
-    }
-
-    /**
-     * Sort and return a copy of the collection.
-     * @return the sorted collection
-     */
-    @SuppressWarnings("unchecked")
-    @Override
-    public BaseConditionsObjectCollection<ObjectType> sorted() {
-        final List<ObjectType> objects = new ArrayList<ObjectType>(this);
-        Collections.sort(objects, new DefaultConditionsObjectComparator());
-        BaseConditionsObjectCollection<ObjectType> collection = null;
-        try {
-            collection = ((BaseConditionsObjectCollection<ObjectType>) getClass().newInstance());
-        } catch (InstantiationException | IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-        collection.addAll(objects);
-        return collection;
-    }
-}
+package org.hps.conditions.api;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ *
+ */
+public class BaseConditionsObjectCollection<ObjectType extends ConditionsObject> implements
+        ConditionsObjectCollection<ObjectType> {
+
+    private int collectionId = BaseConditionsObject.UNSET_COLLECTION_ID;
+    private Connection connection;
+    private final Set<ObjectType> objects = new LinkedHashSet<ObjectType>();
+    private TableMetaData tableMetaData;
+
+    protected BaseConditionsObjectCollection() {
+    }
+
+    public BaseConditionsObjectCollection(final Connection connection, final TableMetaData tableMetaData,
+            final int collectionId) throws SQLException, ConditionsObjectException {
+        this.connection = connection;
+        this.tableMetaData = tableMetaData;
+        this.collectionId = collectionId;
+        if (collectionId != -1) {
+            select(collectionId);
+        }
+    }
+
+    @Override
+    public boolean add(final ObjectType object) {
+        // System.out.println("adding object " + object + " to collection " + getCollectionId());
+        if (getCollectionId() != BaseConditionsObject.UNSET_COLLECTION_ID) {
+            if (object.getCollectionId() != BaseConditionsObject.UNSET_ID) {
+                if (object.getCollectionId() != this.collectionId) {
+                    throw new IllegalArgumentException("Cannot add object with different collection ID: "
+                            + object.getCollectionId());
+                }
+            } else {
+                // System.out.println("object.setCollectionId - " + this.collectionId);
+                try {
+                    object.setCollectionId(this.collectionId);
+                } catch (final ConditionsObjectException e) {
+                    throw new RuntimeException("Error assigning collection ID " + this.collectionId + " to object.", e);
+                }
+            }
+        }
+        return this.objects.add(object);
+    }
+
+    /**
+     * @throws ConditionsObjectException
+     * @throws SQLException
+     */
+    @Override
+    public void deleteAll() throws ConditionsObjectException, SQLException {
+        Statement statement = null;
+        try {
+            final String sql = "DELETE FROM `" + this.tableMetaData.getTableName() + "` WHERE collection_id = '"
+                    + getCollectionId() + "'";
+            statement = this.connection.createStatement();
+            statement.executeUpdate(sql);
+            // System.out.println("result from delete: " + result);
+            this.connection.commit();
+        } catch (final SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (statement != null) {
+                statement.close();
+            }
+        }
+    }
+
+    @Override
+    public ObjectType get(final int index) {
+        if (index + 1 > this.size() || index < 0) {
+            throw new IndexOutOfBoundsException("index out of bounds: " + index);
+        }
+        int current = 0;
+        final Iterator<ObjectType> iterator = this.objects.iterator();
+        ObjectType object = iterator.next();
+        while (current != index && iterator.hasNext()) {
+            object = iterator.next();
+            current++;
+        }
+        return object;
+    }
+
+    @Override
+    public int getCollectionId() {
+        return this.collectionId;
+    }
+
+    @Override
+    public Collection<ObjectType> getObjects() {
+        // return Collections.unmodifiableCollection(this.objects);
+        return this.objects;
+    }
+
+    @Override
+    public TableMetaData getTableMetaData() {
+        return this.tableMetaData;
+    }
+
+    /**
+     * @param collectionId
+     * @throws ConditionsObjectException
+     * @throws SQLException
+     */
+    @Override
+    public void insertAll(final int collectionId) throws ConditionsObjectException, SQLException {
+        if (this.collectionId != -1) {
+            throw new RuntimeException("collection already exists");
+        }
+        this.collectionId = collectionId;
+
+        PreparedStatement insertObjects = null;
+        final StringBuffer sb = new StringBuffer();
+        sb.append("INSERT INTO " + this.getTableMetaData().getTableName() + " (");
+        for (final String field : this.getTableMetaData().getFieldNames()) {
+            sb.append(field + ", ");
+        }
+        sb.setLength(sb.length() - 2);
+        sb.append(") VALUES (");
+        for (int fieldIndex = 0; fieldIndex < this.getTableMetaData().getFieldNames().length; fieldIndex++) {
+            sb.append("?, ");
+        }
+        sb.setLength(sb.length() - 2);
+        sb.append(")");
+        final String updateStatement = sb.toString();
+        // System.out.println(updateStatement);
+        try {
+            this.connection.setAutoCommit(false);
+            insertObjects = this.connection.prepareStatement(updateStatement, Statement.RETURN_GENERATED_KEYS);
+            for (final ObjectType object : this.getObjects()) {
+                object.setCollectionId(this.collectionId);
+                for (int fieldIndex = 0; fieldIndex < this.getTableMetaData().getFieldNames().length; fieldIndex++) {
+                    final String fieldName = this.getTableMetaData().getFieldNames()[fieldIndex];
+                    final Object value = object.getFieldValue(getTableMetaData().getFieldType(fieldName), fieldName);
+                    System.out.println(fieldName + "=" + value);
+                    insertObjects.setObject(fieldIndex + 1,
+                            object.getFieldValue(getTableMetaData().getFieldType(fieldName), fieldName));
+                }
+                insertObjects.executeUpdate();
+                this.connection.commit();
+                final ResultSet resultSet = insertObjects.getGeneratedKeys();
+                resultSet.next();
+                object.setId(resultSet.getInt(1));
+                // System.out.println("set id to " + resultSet.getInt(1) + " from generated keys");
+                resultSet.close();
+            }
+        } catch (final SQLException e1) {
+            e1.printStackTrace();
+            if (this.connection != null) {
+                try {
+                    System.err.println("Transaction is being rolled back ...");
+                    this.connection.rollback();
+                    System.err.println("Done rolling back transaction!");
+                } catch (final SQLException e2) {
+                    e2.printStackTrace();
+                }
+            }
+        } finally {
+            if (insertObjects != null) {
+                insertObjects.close();
+            }
+        }
+    }
+
+    @Override
+    public boolean remove(final int index) {
+        final ObjectType object = get(index);
+        if (object != null) {
+            return this.objects.remove(object);
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public void select(final int collectionId) throws SQLException, ConditionsObjectException {
+        // System.out.println("BaseConditionsObjectCollection.select - " + collectionId);
+        this.collectionId = collectionId;
+        Statement statement = null;
+        try {
+            statement = this.connection.createStatement();
+            final StringBuffer sb = new StringBuffer();
+            sb.append("SELECT id, ");
+            for (final String fieldName : this.tableMetaData.getFieldNames()) {
+                sb.append(fieldName + ", ");
+            }
+            sb.setLength(sb.length() - 2);
+            sb.append(" FROM " + this.tableMetaData.getTableName() + " WHERE collection_id=" + collectionId);
+            final String sql = sb.toString();
+            // System.out.println(sql);
+            final ResultSet resultSet = statement.executeQuery(sql);
+            while (resultSet.next()) {
+                try {
+                    final ObjectType newObject = (ObjectType) this.tableMetaData.getObjectClass().newInstance();
+                    newObject.setConnection(this.connection);
+                    newObject.setTableMetaData(this.tableMetaData);
+                    final int id = resultSet.getInt(1);
+                    newObject.setId(id);
+                    for (int fieldIndex = 0; fieldIndex < this.tableMetaData.getFieldNames().length; fieldIndex++) {
+                        final String fieldName = this.tableMetaData.getFieldNames()[fieldIndex];
+                        newObject.setFieldValue(fieldName, resultSet.getObject(fieldIndex + 2));
+                    }
+                    add(newObject);
+                } catch (InstantiationException | IllegalAccessException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        } finally {
+            if (statement != null) {
+                statement.close();
+            }
+        }
+    }
+
+    @Override
+    public void setCollectionId(final int collectionId) {
+        this.collectionId = collectionId;
+    }
+
+    @Override
+    public void setConnection(final Connection connection) {
+        this.connection = connection;
+        // TODO: This should set the connection on all objects also.
+    }
+
+    @Override
+    public void setTableMetaData(final TableMetaData tableMetaData) {
+        this.tableMetaData = tableMetaData;
+    }
+
+    @Override
+    public int size() {
+        return this.objects.size();
+    }
+
+    @Override
+    // FIXME: Should execute prepared statement in transaction.
+    public void updateAll() throws ConditionsObjectException, SQLException {
+        for (final ObjectType object : this.objects) {
+            if (object.isDirty()) {
+                object.update();
+            }
+        }
+    }
+
+    /**
+     * Sort the collection in place.
+     *
+     * @param comparator the comparison to use for sorting
+     */
+    @Override
+    public final void sort(final Comparator<ObjectType> comparator) {
+        final List<ObjectType> list = new ArrayList<ObjectType>(this.getObjects());
+        Collections.sort(list, comparator);
+        this.getObjects().clear();
+        this.getObjects().addAll(list);
+    }
+
+    @Override
+    public ConditionsObjectCollection<ObjectType> sorted(final Comparator<ObjectType> comparator) {
+        final List<ObjectType> list = new ArrayList<ObjectType>(this.getObjects());
+        Collections.sort(list, comparator);
+        BaseConditionsObjectCollection<ObjectType> collection;
+        try {
+            collection = this.getClass().newInstance();
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new RuntimeException("Error creating new collection instance.", e);
+        }
+        collection.getObjects().addAll(list);
+        return collection;
+    }
+
+    @Override
+    public boolean contains(final Object object) {
+        return getObjects().contains(object);
+    }
+
+    @Override
+    public void addAll(final ConditionsObjectCollection<ObjectType> collection) {
+        this.objects.addAll(collection.getObjects());
+    }
+}

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObject.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObject.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObject.java	Wed Apr 22 13:38:35 2015
@@ -1,98 +1,90 @@
 package org.hps.conditions.api;
 
-import java.util.Comparator;
+import java.sql.Connection;
+import java.sql.SQLException;
 
-/**
- * This is an ORM interface for accessing conditions information by row from a database table.
- *
- * @author <a href="mailto:[log in to unmask]>Jeremy McCormick</a>
- */
 public interface ConditionsObject {
 
     /**
-     * Get the row ID of this object, which will be -1 for records not in the database.
-     *
-     * @return the database row ID
+     * @return
+     * @throws ConditionsObjectException
+     * @throws SQLException
      */
-    int getRowId();
+    boolean delete() throws ConditionsObjectException, SQLException;
 
     /**
-     * Set the value of a field.
-     *
-     * @param field the name of the field
-     * @param value the field value
+     * @return
      */
-    void setFieldValue(String field, Object value);
+    Integer getCollectionId();
+
+    FieldValues getFieldValues();
 
     /**
-     * Set all of the field values on this object.
-     *
-     * @param fieldValues the map containing pairs of field names and values
+     * @return
      */
-    void setFieldValues(FieldValueMap fieldValues);
+    int getId();
 
     /**
-     * Get the map of field values for the object.
-     *
-     * @return the <code>FieldValueMap</code> containing keys and values for the conditions object
+     * @return
      */
-    FieldValueMap getFieldValues();
+    TableMetaData getTableMetaData();
 
     /**
-     * Get a field value, cast to the given class.
+     * q
      *
-     * @param field the field value
-     * @param type the class of the field
-     * @param <T> the inferred type of the field
-     * @return the field value cast to type T
+     * @param type
+     * @param name
+     * @return
      */
-    <T> T getFieldValue(Class<T> type, String field);
+    <T> T getFieldValue(final Class<T> type, final String name);
+
+    <T> T getFieldValue(final String name);
 
     /**
-     * Get a field value with implicit return type.
-     *
-     * @param field the field's name
-     * @param <T> the inferred type of the field
-     * @return the field value cast to type
+     * @return
+     * @throws ConditionsObjectException
+     * @throws SQLException
      */
-    <T> T getFieldValue(String field);
+    boolean insert() throws ConditionsObjectException, SQLException;
 
     /**
-     * Set the row ID of this object. This cannot be reset once set to a value > 0.
-     *
-     * @param rowId the object's row ID
-     * @throws ConditionsObjectException if already set
+     * @return
      */
-    void setRowID(int rowId) throws ConditionsObjectException;
+    boolean isDirty();
 
     /**
-     * Return true if this object is new, e.g. it does not have a valid row ID. This means that it does not have a
-     * database record in its table.
-     *
-     * @return <code>true</code> if record is new
+     * @return
      */
     boolean isNew();
 
+    boolean select(final int rowId) throws ConditionsObjectException, SQLException;
+
     /**
-     * Default comparator for this interface which uses row ID.
+     * @param collectionId
+     * @throws ConditionsObjectException
      */
-    static class DefaultConditionsObjectComparator implements Comparator<ConditionsObject> {
+    void setCollectionId(int collectionId) throws ConditionsObjectException;
 
-        /**
-         * Compare objects according to standard Java conventions.
-         *
-         * @param o1 the first object
-         * @param o2 the second object
-         * @return the result of comparison operation
-         */
-        public int compare(final ConditionsObject o1, final ConditionsObject o2) {
-            if (o1.getRowId() < o2.getRowId()) {
-                return -1;
-            } else if (o1.getRowId() > o2.getRowId()) {
-                return 1;
-            } else {
-                return 0;
-            }
-        }
-    }
+    /**
+     * @param connection
+     */
+    void setConnection(Connection connection);
+
+    void setFieldValues(FieldValues fieldValues);
+
+    void setId(int id);
+
+    void setTableMetaData(TableMetaData tableMetaData);
+
+    /**
+     * @param name
+     * @param value
+     */
+    void setFieldValue(String name, Object value);
+
+    /**
+     * @return
+     * @throws ConditionsObjectException
+     */
+    boolean update() throws ConditionsObjectException, SQLException;
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	Wed Apr 22 13:38:35 2015
@@ -1,110 +1,45 @@
 package org.hps.conditions.api;
 
+import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Collection;
 import java.util.Comparator;
-import java.util.Set;
 
-import org.hps.conditions.database.TableMetaData;
+public interface ConditionsObjectCollection<ObjectType extends ConditionsObject> {
 
-/**
- * An interface representing a collection of conditions objects.
- *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
- * @param <ObjectType> The type of the conditions object contained in the collection.
- */
-public interface ConditionsObjectCollection<ObjectType extends ConditionsObject> extends Set<ObjectType> {
+    boolean add(final ObjectType object);
 
-    /**
-     * Get the table meta data.
-     *
-     * @return the table meta data
-     */
+    void deleteAll() throws ConditionsObjectException, SQLException;
+
+    ObjectType get(final int index);
+
+    int getCollectionId();
+
+    Collection<ObjectType> getObjects();
+
     TableMetaData getTableMetaData();
 
-    /**
-     * Get the collection ID.
-     *
-     * @return the collection ID
-     */
-    int getCollectionId();
+    void insertAll(final int collectionId) throws ConditionsObjectException, SQLException;
 
-    /**
-     * Get the conditions record.
-     *
-     * @return the conditions record
-     */
-    ConditionsRecord getConditionsRecord();
+    boolean remove(final int index);
 
-    /**
-     * Set the collection ID. Once set it cannot be assigned again, which will cause an exception.
-     *
-     * @param collectionId the collection ID
-     * @throws ConditionsObjectException if reassignment of the ID is attempted
-     */
-    void setCollectionId(int collectionId) throws ConditionsObjectException;
+    void select(final int collectionId) throws ConditionsObjectException, SQLException;
 
-    /**
-     * Insert all objects from the collection into the database.
-     *
-     * @throws ConditionsObjectException if there is a conditions object error
-     * @throws SQLException if there is a SQL syntax or execution error
-     */
-    void insert() throws ConditionsObjectException, SQLException;
+    void setCollectionId(int collectionId);
 
-    /**
-     * Select objects into this collection by collection ID.
-     *
-     * @return the number of rows selected
-     */
-    int select();
+    void setTableMetaData(TableMetaData tableMetaData);
 
-    /**
-     * Delete objects in this from the database.
-     *
-     * @return the number of rows deleted
-     */
-    int delete();
+    void setConnection(Connection connection);
 
-    /**
-     * Update rows in the database from these objects.
-     *
-     * @return the number of rows updated
-     */
-    int update();
+    int size();
 
-    /**
-     * Get an object by its index.
-     *
-     * @param index the index in the set
-     * @return the object at the index
-     * @throws IndexOutOfBoundsException if the index value is out of bounds
-     */
-    ObjectType get(int index);
+    void updateAll() throws ConditionsObjectException, SQLException;
 
-    /**
-     * Sort the collection in place.
-     *
-     * @param comparator the comparator to use for sorting
-     */
-    void sort(Comparator<ObjectType> comparator);
+    void sort(final Comparator<ObjectType> comparator);
 
-    /**
-     * Get a sorted list of the objects, leaving original collection in place.
-     *
-     * @param comparator the comparator to use for the sort
-     * @return a sorted list of the objects
-     */
-    BaseConditionsObjectCollection<ObjectType> sorted(Comparator<ObjectType> comparator);
+    ConditionsObjectCollection<ObjectType> sorted(final Comparator<ObjectType> comparator);
 
-    /**
-     * Sort the collection in place.
-     */
-    void sort();
+    boolean contains(Object object);
 
-    /**
-     * Get a new, sorted collection.
-     *
-     * @return the new sorted collection
-     */
-    BaseConditionsObjectCollection<ObjectType> sorted();
+    void addAll(ConditionsObjectCollection<ObjectType> collection);
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	Wed Apr 22 13:38:35 2015
@@ -19,9 +19,77 @@
 public final class ConditionsObjectUtilities {
 
     /**
-     * Do not allow class to be instantiated.
+     * Find all available classes that extend ConditionsObject.
+     *
+     * @return The set of all available classes that extend ConditionsObject.
      */
-    private ConditionsObjectUtilities() {
+    public static Set<Class<? extends ConditionsObject>> findConditionsObjectTypes() {
+        final Reflections reflections = new Reflections("org.hps.conditions");
+        final Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
+        for (final Class<? extends ConditionsObject> objectType : reflections.getSubTypesOf(ConditionsObject.class)) {
+            if (Modifier.isAbstract(objectType.getModifiers())) {
+                continue;
+            }
+            if (objectType.getAnnotation(Table.class) == null) {
+                continue;
+            }
+            objectTypes.add(objectType);
+        }
+        return objectTypes;
+    }
+
+    /**
+     * Get the class for the collection of the ConditionsObject type.
+     *
+     * @param type the class of the ConditionsObject
+     * @return the class of the collection
+     */
+    @SuppressWarnings("unchecked")
+    public static Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(
+            final Class<? extends ConditionsObject> type) {
+        final String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
+        Class<?> rawCollectionClass;
+        try {
+            rawCollectionClass = Class.forName(collectionClassName);
+        } catch (final ClassNotFoundException e) {
+            throw new RuntimeException("The type does not define a nested collection class.", e);
+        }
+        if (!BaseConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass)) {
+            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName()
+                    + " does not extend ConditionsObjectCollection.");
+        }
+        return (Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
+    }
+
+    /**
+     * Get the list of database field names for the class.
+     *
+     * @param type the class
+     * @return the list of field names
+     */
+    public static Set<String> getFieldNames(final Class<? extends ConditionsObject> type) {
+        final Set<String> fieldNames = new HashSet<String>();
+        for (final Method method : type.getMethods()) {
+            System.out.println(method.getName());
+            if (!method.getReturnType().equals(Void.TYPE)) {
+                for (final Annotation annotation : method.getAnnotations()) {
+                    if (annotation.annotationType().equals(Field.class)) {
+                        if (!Modifier.isPublic(method.getModifiers())) {
+                            throw new RuntimeException("The method " + type.getName() + "." + method.getName()
+                                    + " has a Field annotation but is not public.");
+                        }
+                        final Field field = (Field) annotation;
+                        for (final String fieldName : field.names()) {
+                            if (fieldName != null && !"".equals(fieldName)) {
+                                System.out.println("  " + fieldName);
+                                fieldNames.add(fieldName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return fieldNames;
     }
 
     /**
@@ -40,74 +108,8 @@
     }
 
     /**
-     * Get the list of database field names for the class.
-     *
-     * @param type the class
-     * @return the list of field names
+     * Do not allow class to be instantiated.
      */
-    public static Set<String> getFieldNames(final Class<? extends ConditionsObject> type) {
-        final Set<String> fieldNames = new HashSet<String>();
-        for (Method method : type.getMethods()) {
-            if (!method.getReturnType().equals(Void.TYPE)) {
-                for (Annotation annotation : method.getAnnotations()) {
-                    if (annotation.annotationType().equals(Field.class)) {
-                        if (!Modifier.isPublic(method.getModifiers())) {
-                            throw new RuntimeException("The method " + type.getName() + "." + method.getName()
-                                    + " has a Field annotation but is not public.");
-                        }
-                        final Field field = (Field) annotation;
-                        for (String fieldName : field.names()) {
-                            if (fieldName != null && !("".equals(fieldName))) {
-                                fieldNames.add(fieldName);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return fieldNames;
-    }
-
-    /**
-     * Get the class for the collection of the ConditionsObject type.
-     *
-     * @param type the class of the ConditionsObject
-     * @return the class of the collection
-     */
-    @SuppressWarnings("unchecked")
-    public static Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(
-            final Class<? extends ConditionsObject> type) {
-        final String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
-        Class<?> rawCollectionClass;
-        try {
-            rawCollectionClass = Class.forName(collectionClassName);
-        } catch (ClassNotFoundException e) {
-            throw new RuntimeException("The type does not define a nested collection class.", e);
-        }
-        if (!BaseConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass)) {
-            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName()
-                    + " does not extend ConditionsObjectCollection.");
-        }
-        return (Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
-    }
-
-    /**
-     * Find all available classes that extend ConditionsObject.
-     *
-     * @return The set of all available classes that extend ConditionsObject.
-     */
-    public static Set<Class<? extends ConditionsObject>> findConditionsObjectTypes() {
-        final Reflections reflections = new Reflections("org.hps.conditions");
-        final Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
-        for (Class<? extends ConditionsObject> objectType : reflections.getSubTypesOf(ConditionsObject.class)) {
-            if (Modifier.isAbstract(objectType.getModifiers())) {
-                continue;
-            }
-            if (objectType.getAnnotation(Table.class) == null) {
-                continue;
-            }
-            objectTypes.add(objectType);
-        }
-        return objectTypes;
+    private ConditionsObjectUtilities() {
     }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Wed Apr 22 13:38:35 2015
@@ -1,20 +1,14 @@
 package org.hps.conditions.api;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import org.hps.conditions.database.ConditionsRecordConverter;
 import org.hps.conditions.database.Converter;
-import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.database.Field;
-import org.hps.conditions.database.QueryBuilder;
 import org.hps.conditions.database.Table;
-import org.hps.conditions.database.TableMetaData;
 
 /**
  * This class represents a single record from the primary conditions data table, which defines the validity range for a
@@ -127,23 +121,10 @@
          */
         public final Set<String> getConditionsKeys() {
             final Set<String> conditionsKeys = new HashSet<String>();
-            for (final ConditionsRecord record : this) {
+            for (final ConditionsRecord record : this.getObjects()) {
                 conditionsKeys.add(record.getName());
             }
             return conditionsKeys;
-        }
-
-        /**
-         * Sort the collection in place.
-         *
-         * @param comparator the comparison to use for sorting
-         */
-        @Override
-        public final void sort(final Comparator<ConditionsRecord> comparator) {
-            final List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
-            Collections.sort(list, comparator);
-            this.clear();
-            this.addAll(list);
         }
 
         /**
@@ -175,54 +156,39 @@
         }
 
         /**
-         * Sort using a comparator and leave the original collection unchanged.
-         *
-         * @param comparator the comparison to use for sorting
+         * Sort and return collection by creation date.
+         *
          * @return the sorted collection
          */
-        @Override
-        public final ConditionsRecordCollection sorted(final Comparator<ConditionsRecord> comparator) {
-            final List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
-            Collections.sort(list, comparator);
-            final ConditionsRecordCollection collection = new ConditionsRecordCollection();
-            collection.addAll(list);
-            return collection;
-        }
-
-        /**
-         * Sort and return collection by creation date.
+        public final ConditionsRecordCollection sortedByCreated() {
+            return (ConditionsRecordCollection) sorted(new CreatedComparator());
+        }
+
+        /**
+         * Sort and return by key (table name).
          *
          * @return the sorted collection
          */
-        public final ConditionsRecordCollection sortedByCreated() {
-            return sorted(new CreatedComparator());
-        }
-
-        /**
-         * Sort and return by key (table name).
+        public final ConditionsRecordCollection sortedByKey() {
+            return (ConditionsRecordCollection) sorted(new KeyComparator());
+        }
+
+        /**
+         * Sort and return by run start number.
          *
          * @return the sorted collection
          */
-        public final ConditionsRecordCollection sortedByKey() {
-            return sorted(new KeyComparator());
-        }
-
-        /**
-         * Sort and return by run start number.
+        public final ConditionsRecordCollection sortedByRunStart() {
+            return (ConditionsRecordCollection) sorted(new RunStartComparator());
+        }
+
+        /**
+         * Sort and return collection by updated date.
          *
          * @return the sorted collection
          */
-        public final ConditionsRecordCollection sortedByRunStart() {
-            return sorted(new RunStartComparator());
-        }
-
-        /**
-         * Sort and return collection by updated date.
-         *
-         * @return the sorted collection
-         */
         public final ConditionsRecordCollection sortedByUpdated() {
-            return sorted(new UpdatedComparator());
+            return (ConditionsRecordCollection) sorted(new UpdatedComparator());
         }
     }
 
@@ -274,16 +240,6 @@
     }
 
     /**
-     * Get the collection ID, overriding this method from the parent class.
-     *
-     * @return the collection ID
-     */
-    @Field(names = {"collection_id"})
-    public int getCollectionId() {
-        return getFieldValue("collection_id");
-    }
-
-    /**
      * Get the date this record was created.
      *
      * @return the date this record was created
@@ -375,29 +331,6 @@
     }
 
     /**
-     * Insert the conditions record into the database.
-     *
-     * @throws ConditionsObjectException if there are errors inserting the record
-     */
-    public void insert() throws ConditionsObjectException {
-        if (getFieldValues().size() == 0) {
-            throw new ConditionsObjectException("There are no field values to insert.");
-        }
-        final TableMetaData tableMetaData = DatabaseConditionsManager.getInstance()
-                .findTableMetaData(ConditionsRecordCollection.class).get(0);
-        if (tableMetaData == null) {
-            throw new ConditionsObjectException("Failed to get meta data for ConditionsRecord.");
-        }
-        final String query = QueryBuilder.buildInsert(tableMetaData.getTableName(), this.getFieldValues());
-        // System.out.println(query);
-        final List<Integer> keys = DatabaseConditionsManager.getInstance().updateQuery(query);
-        if (keys.size() != 1) {
-            throw new ConditionsObjectException("SQL insert returned wrong number of keys: " + keys.size());
-        }
-        setRowID(keys.get(0));
-    }
-
-    /**
      * Convert this record to a human readable string, one field per line.
      *
      * @return this object represented as a string
@@ -405,7 +338,7 @@
     @Override
     public String toString() {
         final StringBuffer sb = new StringBuffer();
-        sb.append("id: " + getRowId() + '\n');
+        sb.append("id: " + getId() + '\n');
         sb.append("name: " + getName() + '\n');
         sb.append("runStart: " + getRunStart() + '\n');
         sb.append("runEnd: " + getRunEnd() + '\n');

Added: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValues.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValues.java	(added)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValues.java	Wed Apr 22 13:38:35 2015
@@ -0,0 +1,28 @@
+package org.hps.conditions.api;
+
+import java.util.Collection;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public interface FieldValues {
+
+    Set<String> getFieldNames();
+
+    <T> T getValue(Class<T> type, String name);
+
+    Object getValue(String name);
+
+    Collection<Object> getValues();
+
+    boolean hasField(String name);
+
+    boolean isNonNull(String name);
+
+    boolean isNull(String name);
+
+    void setValue(String name, Object value);
+
+    int size();
+}

Added: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValuesMap.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValuesMap.java	(added)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/FieldValuesMap.java	Wed Apr 22 13:38:35 2015
@@ -0,0 +1,68 @@
+package org.hps.conditions.api;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public class FieldValuesMap implements FieldValues {
+
+    Map<String, Object> data = new HashMap<String, Object>();
+
+    public FieldValuesMap() {
+    }
+
+    FieldValuesMap(final TableMetaData tableMetaData) {
+        for (final String fieldName : tableMetaData.getFieldNames()) {
+            this.data.put(fieldName, null);
+        }
+    }
+
+    @Override
+    public Set<String> getFieldNames() {
+        return this.data.keySet();
+    }
+
+    @Override
+    public <T> T getValue(final Class<T> type, final String name) {
+        return type.cast(this.data.get(name));
+    }
+
+    @Override
+    public Object getValue(final String name) {
+        return this.data.get(name);
+    }
+
+    @Override
+    public Collection<Object> getValues() {
+        return this.data.values();
+    }
+
+    @Override
+    public boolean hasField(final String name) {
+        return this.data.containsKey(name);
+    }
+
+    @Override
+    public boolean isNonNull(final String name) {
+        return this.data.get(name) != null;
+    }
+
+    @Override
+    public boolean isNull(final String name) {
+        return this.data.get(name) == null;
+    }
+
+    @Override
+    public void setValue(final String name, final Object value) {
+        this.data.put(name, value);
+    }
+
+    @Override
+    public int size() {
+        return this.data.size();
+    }
+}

Added: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableMetaData.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableMetaData.java	(added)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableMetaData.java	Wed Apr 22 13:38:35 2015
@@ -0,0 +1,208 @@
+package org.hps.conditions.api;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * <p>
+ * This class provides meta data about a conditions table, including a list of conditions data fields. The list of
+ * fields does not include the collection ID or row ID, which are implicitly assumed to exist.
+ * <p>
+ * It also has references to the implementation classes which are used for the ORM onto {@link ConditionsObject} and
+ * {@link ConditionsObjectCollection}.
+ *
+ * @see org.hps.conditions.api.ConditionsObject
+ * @see org.hps.conditions.api.BaseConditionsObjectCollection
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public final class TableMetaData {
+
+    /**
+     * Find table meta data by object type.
+     *
+     * @param tableMetaDataList the list of table meta data e.g. from the registry
+     * @param objectType the type of the object
+     * @return the list of table meta data that have that object type
+     */
+    public static List<TableMetaData> findByObjectType(final List<TableMetaData> tableMetaDataList,
+            final Class<? extends ConditionsObject> objectType) {
+        final List<TableMetaData> list = new ArrayList<TableMetaData>();
+        for (final TableMetaData tableMetaData : tableMetaDataList) {
+            if (tableMetaData.getObjectClass().equals(objectType)) {
+
+                list.add(tableMetaData);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * The collection class.
+     */
+    private Class<? extends BaseConditionsObjectCollection<?>> collectionClass;
+
+    /**
+     * The set of field names.
+     */
+    private Set<String> fieldNames = new LinkedHashSet<String>();
+
+    /**
+     * The map of field names to their types.
+     */
+    private Map<String, Class<?>> fieldTypes = new HashMap<String, Class<?>>();
+
+    /**
+     * The conditions key named (unused???).
+     */
+    private String key;
+
+    /**
+     * The object class.
+     */
+    private Class<? extends ConditionsObject> objectClass;
+
+    /**
+     * The table name.
+     */
+    private String tableName;
+
+    public TableMetaData() {
+    }
+
+    /**
+     * Fully qualified constructor.
+     *
+     * @param key the conditions key
+     * @param tableName the table name
+     * @param objectClass the object class
+     * @param collectionClass the collection class
+     * @param fieldNames the field names
+     * @param fieldTypes the field types
+     */
+    public TableMetaData(final String key, final String tableName, final Class<? extends ConditionsObject> objectClass,
+            final Class<? extends BaseConditionsObjectCollection<?>> collectionClass, final Set<String> fieldNames,
+            final Map<String, Class<?>> fieldTypes) {
+        if (key == null) {
+            throw new IllegalArgumentException("key is null");
+        }
+        if (tableName == null) {
+            throw new IllegalArgumentException("tableName is null");
+        }
+        if (objectClass == null) {
+            throw new IllegalArgumentException("objectClass is null");
+        }
+        if (fieldNames == null) {
+            throw new IllegalArgumentException("fieldNames is null");
+        }
+        if (collectionClass == null) {
+            throw new IllegalArgumentException("collectionClass is null");
+        }
+        if (fieldTypes == null) {
+            throw new IllegalArgumentException("fieldTypes is null");
+        }
+        this.key = key;
+        this.tableName = tableName;
+        this.objectClass = objectClass;
+        this.collectionClass = collectionClass;
+        this.fieldNames = fieldNames;
+        this.fieldTypes = fieldTypes;
+    }
+
+    /**
+     * Get the type of collection this table maps onto.
+     *
+     * @return the collection class
+     */
+    public Class<? extends BaseConditionsObjectCollection<?>> getCollectionClass() {
+        return this.collectionClass;
+    }
+
+    /**
+     * Get the names of the fields. Types are implied from the database tables.
+     *
+     * @return the names of the fields
+     */
+    public String[] getFieldNames() {
+        return this.fieldNames.toArray(new String[] {});
+    }
+
+    /**
+     * Get the type of the field called <code>fieldName</code>.
+     *
+     * @return the type of the field
+     */
+    public Class<?> getFieldType(final String fieldName) {
+        return this.fieldTypes.get(fieldName);
+    }
+
+    /**
+     * Get the key of this conditions type. May be different from table name but is usually the same.
+     *
+     * @return the key name of the conditions type
+     */
+    public String getKey() {
+        return this.key;
+    }
+
+    /**
+     * Get the type of object this table maps onto.
+     *
+     * @return the type of object
+     */
+    public Class<? extends ConditionsObject> getObjectClass() {
+        return this.objectClass;
+    }
+
+    /**
+     * Get the name of the table.
+     *
+     * @return the name of the table
+     */
+    public String getTableName() {
+        return this.tableName;
+    }
+
+    void setFieldNames(final String[] fieldNames) {
+        this.fieldNames = new HashSet<String>();
+        for (final String fieldName : fieldNames) {
+            this.fieldNames.add(fieldName);
+        }
+    }
+
+    void setFieldType(final String fieldName, final Class<?> fieldType) {
+        this.fieldTypes.put(fieldName, fieldType);
+    }
+
+    void setObjectClass(final Class<? extends ConditionsObject> objectClass) {
+        this.objectClass = objectClass;
+    }
+
+    void setTableName(final String tableName) {
+        this.tableName = tableName;
+    }
+
+    /**
+     * Convert to a string.
+     *
+     * @return This object converted to a string.
+     */
+    @Override
+    public String toString() {
+        final StringBuffer buff = new StringBuffer();
+        buff.append("tableMetaData: tableName = " + this.getTableName());
+        buff.append(", objectClass = " + this.getObjectClass().getCanonicalName());
+        buff.append(", collectionClass = " + this.getCollectionClass().getCanonicalName());
+        buff.append(", fieldNames = ");
+        for (final String field : this.getFieldNames()) {
+            buff.append(field + " ");
+        }
+        buff.setLength(buff.length() - 1);
+        buff.append('\n');
+        return buff.toString();
+    }
+}

Added: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableRegistry.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableRegistry.java	(added)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/api/TableRegistry.java	Wed Apr 22 13:38:35 2015
@@ -0,0 +1,172 @@
+package org.hps.conditions.api;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.hps.conditions.database.Field;
+
+/**
+ * This is a registry providing a map between tables and their meta-data.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+@SuppressWarnings("serial")
+public final class TableRegistry extends HashMap<String, TableMetaData> {
+
+    /**
+     * Maps collection types to table meta data.
+     */
+    static class CollectionTypeMap extends
+            HashMap<Class<? extends BaseConditionsObjectCollection<?>>, List<TableMetaData>> {
+
+        /**
+         * Add a mapping between a collection type and table meta data.
+         *
+         * @param type the collection type
+         * @param metaData the table meta data
+         */
+        void add(final Class<? extends BaseConditionsObjectCollection<?>> type, final TableMetaData metaData) {
+            if (this.get(type) == null) {
+                this.put(type, new ArrayList<TableMetaData>());
+            }
+            this.get(type).add(metaData);
+        }
+    }
+
+    /**
+     * Maps types to table meta data.
+     */
+    static class ObjectTypeMap extends HashMap<Class<? extends ConditionsObject>, List<TableMetaData>> {
+        /**
+         * Add a connection between an object type and table meta data.
+         *
+         * @param type the object type
+         * @param metaData the table meta data
+         */
+        void add(final Class<? extends ConditionsObject> type, final TableMetaData metaData) {
+            if (this.get(type) == null) {
+                this.put(type, new ArrayList<TableMetaData>());
+            }
+            this.get(type).add(metaData);
+        }
+    }
+
+    static TableRegistry instance = null;
+
+    /**
+     * Create a new table meta data registry.
+     *
+     * @return the meta data registry
+     */
+    public static TableRegistry create() {
+        final TableRegistry registry = new TableRegistry();
+        for (final Class<? extends ConditionsObject> objectType : ConditionsObjectUtilities.findConditionsObjectTypes()) {
+
+            // Get the collection type.
+            final Class<? extends BaseConditionsObjectCollection<?>> collectionType = ConditionsObjectUtilities
+                    .getCollectionType(objectType);
+
+            // Get the list of field names.
+            final Set<String> fieldNames = ConditionsObjectUtilities.getFieldNames(objectType);
+
+            // Create map of fields to their types.
+            final Map<String, Class<?>> fieldTypes = new HashMap<String, Class<?>>();
+            for (final Method method : objectType.getMethods()) {
+                if (!method.getReturnType().equals(Void.TYPE)) {
+                    for (final Annotation annotation : method.getAnnotations()) {
+                        if (annotation.annotationType().equals(Field.class)) {
+                            final Field field = (Field) annotation;
+                            for (final String fieldName : field.names()) {
+                                fieldTypes.put(fieldName, method.getReturnType());
+                            }
+                        }
+                    }
+                }
+            }
+
+            for (final String name : ConditionsObjectUtilities.getTableNames(objectType)) {
+                // Create a meta data mapping for each table name in the class description.
+                final TableMetaData data = new TableMetaData(name, name, objectType, collectionType, fieldNames,
+                        fieldTypes);
+                registry.put(name, data);
+                registry.objectTypeMap.add(objectType, data);
+                registry.collectionTypeMap.add(collectionType, data);
+            }
+        }
+        return registry;
+    }
+
+    public synchronized static TableRegistry getTableRegistry() {
+        if (instance == null) {
+            instance = TableRegistry.create();
+        }
+        return instance;
+    }
+
+    /**
+     * Map between collection types and meta data.
+     */
+    private final CollectionTypeMap collectionTypeMap = new CollectionTypeMap();
+
+    /**
+     * Map between object types and meta data.
+     */
+    private final ObjectTypeMap objectTypeMap = new ObjectTypeMap();
+
+    /**
+     * Class should not be directly instantiated.
+     * <p>
+     * Use the {@link #create()} method instead.
+     */
+    private TableRegistry() {
+    }
+
+    /**
+     * Find meta data by collection type.
+     *
+     * @param collectionType the collection type
+     * @return the meta data or <code>null</code> if none exists.
+     */
+    public List<TableMetaData> findByCollectionType(final Class<?> collectionType) {
+        return this.collectionTypeMap.get(collectionType);
+    }
+
+    /**
+     * Find meta data by object type.
+     *
+     * @param objectType the object type
+     * @return the meta data or <code>null</code> if none exists.
+     */
+    public List<TableMetaData> findByObjectType(final Class<? extends ConditionsObject> objectType) {
+        return this.objectTypeMap.get(objectType);
+    }
+
+    /**
+     * Find meta data by table name.
+     *
+     * @param name the table name
+     * @return the meta data or <code>null</code> if none exists
+     */
+    public TableMetaData findByTableName(final String name) {
+        return this.get(name);
+    }
+
+    /**
+     * Convert this object to a string.
+     *
+     * @return this object converted to a string
+     */
+    @Override
+    public String toString() {
+        final StringBuffer buff = new StringBuffer();
+        for (final TableMetaData tableMetaData : this.values()) {
+            buff.append(tableMetaData.toString());
+        }
+        return buff.toString();
+    }
+}

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/AddCommand.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/AddCommand.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/AddCommand.java	Wed Apr 22 13:38:35 2015
@@ -1,5 +1,6 @@
 package org.hps.conditions.cli;
 
+import java.sql.SQLException;
 import java.util.Date;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -9,7 +10,7 @@
 import org.apache.commons.cli.Options;
 import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.api.ConditionsRecord;
-import org.hps.conditions.api.FieldValueMap;
+import org.hps.conditions.api.FieldValuesMap;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.lcsim.util.log.LogUtil;
 
@@ -68,21 +69,21 @@
     private ConditionsRecord createConditionsRecord(final int runStart, final int runEnd, final String tableName,
             final String name, final int collectionId, final String createdBy, final String tag, final String notes) {
         final ConditionsRecord conditionsRecord = new ConditionsRecord();
-        final FieldValueMap fieldValues = new FieldValueMap();
-        fieldValues.put("run_start", runStart);
-        fieldValues.put("run_end", runEnd);
-        fieldValues.put("table_name", tableName);
-        fieldValues.put("name", name);
-        fieldValues.put("collection_id", collectionId);
-        fieldValues.put("created_by", createdBy);
+        final FieldValuesMap fieldValues = new FieldValuesMap();
+        fieldValues.setValue("run_start", runStart);
+        fieldValues.setValue("run_end", runEnd);
+        fieldValues.setValue("table_name", tableName);
+        fieldValues.setValue("name", name);
+        fieldValues.setValue("collection_id", collectionId);
+        fieldValues.setValue("created_by", createdBy);
         if (tag != null) {
-            fieldValues.put("tag", tag);
+            fieldValues.setValue("tag", tag);
         }
         if (notes != null) {
-            fieldValues.put("notes", notes);
+            fieldValues.setValue("notes", notes);
         }
         conditionsRecord.setFieldValues(fieldValues);
-        fieldValues.put("created", new Date());
+        fieldValues.setValue("created", new Date());
         return conditionsRecord;
     }
 
@@ -160,7 +161,11 @@
             if (!DatabaseConditionsManager.getInstance().isConnected()) {
                 createdConnection = manager.openConnection();
             }
-            conditionsRecord.insert();
+            try {
+                conditionsRecord.insert();
+            } catch (final SQLException e) {
+                throw new RuntimeException("Error inserting new conditions record.", e);
+            }
             manager.closeConnection(createdConnection);
         } catch (final ConditionsObjectException e) {
             LOGGER.log(Level.SEVERE, "Error adding conditions record", e);

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/PrintCommand.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/PrintCommand.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/PrintCommand.java	Wed Apr 22 13:38:35 2015
@@ -16,8 +16,8 @@
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.conditions.database.TableMetaData;
 import org.lcsim.util.log.LogUtil;
 
 /**
@@ -176,7 +176,7 @@
      */
     private void printCollection(final ConditionsObjectCollection<?> collection) {
         final StringBuffer buffer = new StringBuffer();
-        for (final Object object : collection) {
+        for (final Object object : collection.getObjects()) {
             for (final String columnName : collection.getTableMetaData().getFieldNames()) {
                 buffer.append(((ConditionsObject) object).getFieldValue(columnName));
                 buffer.append(this.fieldDelimiter);
@@ -195,8 +195,8 @@
      * @param collection the collection
      */
     private void printCollectionHeader(final ConditionsObjectCollection<?> collection) {
-        LOGGER.info('\n' + "--------------------------------------" + '\n' + collection.getConditionsRecord()
-                + "--------------------------------------");
+        // LOGGER.info('\n' + "--------------------------------------" + '\n' + collection.getConditionsRecord()
+        // + "--------------------------------------");
     }
 
     /**

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/TagCommand.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/TagCommand.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/cli/TagCommand.java	Wed Apr 22 13:38:35 2015
@@ -10,12 +10,11 @@
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
-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.TableMetaData;
 import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.conditions.database.TableMetaData;
 import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
 import org.lcsim.util.log.LogUtil;
 
@@ -117,18 +116,19 @@
                 // Get the table meta data for the key.
                 final TableMetaData tableMetaData = manager.findTableMetaData(key);
 
-                // Get the default collection for this key in the run.
-                final ConditionsObjectCollection<?> collection = manager.getCachedConditions(
-                        tableMetaData.getCollectionClass(), tableMetaData.getTableName()).getCachedData();
+                manager.getCachedConditions(tableMetaData.getCollectionClass(), tableMetaData.getTableName())
+                        .getCachedData();
 
                 // Get the ConditionsRecord from the collection.
-                final ConditionsRecord record = collection.getConditionsRecord();
+                // final ConditionsRecord record = collection.getConditionsRecord();
+                final ConditionsRecord record = null;
 
                 // Is this record already part of the new tag?
-                if (!addedIds.contains(record.getRowId())) {
+                if (!addedIds.contains(record.getId())) {
                     // Create a new record copied from the old one.
                     final ConditionsRecord newRecord = new ConditionsRecord(record);
 
+                    // FIXME: This is berken because collection no longer directly links to ConditionsRecord.
                     // Set the tag value.
                     newRecord.setFieldValue("tag", newTag);
 
@@ -136,14 +136,14 @@
                     tagRecords.add(newRecord);
 
                     // Flag the record's ID as used so it is only added once.
-                    addedIds.add(record.getRowId());
+                    addedIds.add(record.getId());
                 }
             }
         }
 
         // Print out all the records that were found.
         LOGGER.info("found ConditionsRecords for tag " + newTag + " ...");
-        for (final ConditionsRecord record : tagRecords) {
+        for (final ConditionsRecord record : tagRecords.getObjects()) {
             LOGGER.info(record.toString());
         }
 
@@ -160,7 +160,7 @@
         // Create the tag in the database if user verified or force option was present.
         if (makeTag) {
             try {
-                tagRecords.insert();
+                tagRecords.insertAll(-1); // FIXME: I guess insertAll should be overridden for ConditionsRecord.
             } catch (ConditionsObjectException | SQLException e) {
                 throw new RuntimeException(e);
             }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	Wed Apr 22 13:38:35 2015
@@ -3,9 +3,13 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
+import org.hps.conditions.api.ConditionsObjectException;
+import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
+import org.hps.conditions.api.TableMetaData;
 import org.lcsim.conditions.ConditionsManager;
 
 /**
@@ -22,7 +26,8 @@
      * @param name The name of the conditions set.
      * @return The matching ConditionsRecords.
      */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @Override
+    @SuppressWarnings({"unchecked", "rawtypes"})
     public ConditionsRecordCollection getData(final ConditionsManager manager, final String name) {
 
         final DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
@@ -55,12 +60,18 @@
 
         try {
             while (resultSet.next()) {
-                final ConditionsObject conditionsRecord = AbstractConditionsObjectConverter.createConditionsObject(resultSet,
-                        tableMetaData);
+                final ConditionsObject conditionsRecord = new ConditionsRecord();
+                conditionsRecord.setConnection(databaseConditionsManager.getConnection());
+                conditionsRecord.setTableMetaData(tableMetaData);
+                conditionsRecord.select(resultSet.getInt(1));
+                // AbstractConditionsObjectConverter.createConditionsObject(
+                // resultSet, tableMetaData);
                 collection.add(conditionsRecord);
             }
-        } catch (SQLException x) {
+        } catch (final SQLException x) {
             throw new RuntimeException("Database error", x);
+        } catch (final ConditionsObjectException e) {
+            throw new RuntimeException("Error creating new conditions record.", e);
         }
 
         // Close the ResultSet and Statement.
@@ -75,9 +86,10 @@
 
     /**
      * Get the type handled by this converter.
-     * 
+     *
      * @return The type handled by this converter, which is <code>ConditionsRecordCollection</code>.
      */
+    @Override
     public Class<ConditionsRecordCollection> getType() {
         return ConditionsRecordCollection.class;
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	Wed Apr 22 13:38:35 2015
@@ -1,6 +1,5 @@
 package org.hps.conditions.database;
 
-import java.sql.ResultSet;
 import java.sql.SQLException;
 
 import org.hps.conditions.api.ConditionsObject;
@@ -9,25 +8,23 @@
 import org.hps.conditions.api.ConditionsRecord;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.hps.conditions.api.ConditionsSeries;
+import org.hps.conditions.api.TableMetaData;
 
 /**
  * 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.
+ * {@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 <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-final class ConditionsSeriesConverter<ObjectType extends ConditionsObject, 
-    CollectionType extends ConditionsObjectCollection<ObjectType>> {
+final class ConditionsSeriesConverter<ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>> {
 
     /**
      * The type of the object.
@@ -41,6 +38,7 @@
 
     /**
      * Class constructor.
+     *
      * @param objectType the type of the object
      * @param collectionType the type of the collection
      */
@@ -51,10 +49,11 @@
 
     /**
      * Create a new conditions series.
+     *
      * @param tableName the name of the data table
      * @return the conditions series
      */
-    @SuppressWarnings({ "unchecked" })
+    @SuppressWarnings({"unchecked"})
     final ConditionsSeries<ObjectType, CollectionType> createSeries(final String tableName) {
 
         if (tableName == null) {
@@ -73,53 +72,31 @@
         // Get the table meta data for the collection type.
         final TableMetaData tableMetaData = conditionsManager.findTableMetaData(tableName);
         if (tableMetaData == null) {
-            throw new RuntimeException("Table meta data for " + collectionType + " was not found.");
+            throw new RuntimeException("Table meta data for " + this.collectionType + " was not found.");
         }
 
         // Create a new conditions series.
-        final ConditionsSeries<ObjectType, CollectionType> series =
-                new ConditionsSeries<ObjectType, CollectionType>();
+        final ConditionsSeries<ObjectType, CollectionType> series = new ConditionsSeries<ObjectType, CollectionType>();
 
         // Get the ConditionsRecord with the meta-data, which will use the current run number from the manager.
         final ConditionsRecordCollection conditionsRecords = conditionsManager.findConditionsRecords(tableName);
 
-        for (ConditionsRecord conditionsRecord : conditionsRecords) {
+        for (final ConditionsRecord conditionsRecord : conditionsRecords.getObjects()) {
 
-            ConditionsObjectCollection<ObjectType> collection;
+            ConditionsObjectCollection<?> collection = null;
             try {
-                collection = (ConditionsObjectCollection<ObjectType>)
-                        ConditionsRecordConverter.createCollection(conditionsRecord, tableMetaData);
-            } catch (ConditionsObjectException e) {
+                collection = tableMetaData.getCollectionClass().newInstance();
+            } catch (InstantiationException | IllegalAccessException e1) {
+                throw new RuntimeException(e1);
+            }
+            try {
+                collection.setTableMetaData(tableMetaData);
+                collection.setConnection(conditionsManager.getConnection());
+                collection.select(conditionsRecord.getCollectionId());
+            } catch (final ConditionsObjectException | SQLException e) {
                 throw new RuntimeException(e);
             }
-
-            // Get the collection ID.
-            final int collectionId = conditionsRecord.getCollectionId();
-
-            // Build a select query.
-            final String query = QueryBuilder.buildSelect(tableName, collectionId,
-                    tableMetaData.getFieldNames(), "id ASC");
-
-            // Query the database.
-            final ResultSet resultSet = conditionsManager.selectQuery(query);
-
-            try {
-                // Loop over rows.
-                while (resultSet.next()) {
-                    // Create new ConditionsObject.
-                    final ConditionsObject newObject =
-                            ConditionsRecordConverter.createConditionsObject(resultSet, tableMetaData);
-
-                    // Add new object to collection.
-                    collection.add((ObjectType) newObject);
-                }
-            } catch (SQLException e) {
-                throw new RuntimeException(e);
-            }
-
-            DatabaseUtilities.cleanup(resultSet);
-
-            series.add((CollectionType) collection);
+            series.add((ConditionsObjectCollection<ObjectType>) collection);
         }
 
         if (reopenedConnection) {

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/Converter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/Converter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/Converter.java	Wed Apr 22 13:38:35 2015
@@ -4,6 +4,8 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
+
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 
 /**
  * This is an annotation for providing converter configuration for {@link org.hps.conditions.api.ConditionsObject}

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConverterRegistry.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConverterRegistry.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/ConverterRegistry.java	Wed Apr 22 13:38:35 2015
@@ -6,6 +6,7 @@
 
 import javassist.Modifier;
 
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectUtilities;
@@ -21,26 +22,26 @@
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @SuppressWarnings("serial")
-public final class ConverterRegistry extends HashMap<Class<? extends ConditionsObject>, AbstractConditionsObjectConverter> {
+public final class ConverterRegistry extends
+        HashMap<Class<? extends ConditionsObject>, AbstractConditionsObjectConverter> {
 
     /**
-     * Class should not be instantiated by users.
-     * The {@link #create()} method should be used instead.
+     * Class should not be instantiated by users. The {@link #create()} method should be used instead.
      */
     private ConverterRegistry() {
     }
 
     /**
      * Automatically create converters for all {@link org.hps.conditions.api.ConditionsObject} classes.
-     * 
+     *
      * @return the global registry of converters
      */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
+    @SuppressWarnings({"unchecked", "rawtypes"})
     static ConverterRegistry create() {
         final ConverterRegistry registry = new ConverterRegistry();
         final Reflections reflections = new Reflections("org.hps.conditions");
         final Set<Class<? extends ConditionsObject>> objectTypes = reflections.getSubTypesOf(ConditionsObject.class);
-        for (Class<? extends ConditionsObject> objectType : objectTypes) {
+        for (final Class<? extends ConditionsObject> objectType : objectTypes) {
             if (Modifier.isAbstract(objectType.getModifiers())) {
                 continue;
             }
@@ -57,8 +58,8 @@
                 }
             }
 
-            final Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> 
-                collectionType = ConditionsObjectUtilities.getCollectionType(objectType);
+            final Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> collectionType = ConditionsObjectUtilities
+                    .getCollectionType(objectType);
 
             AbstractConditionsObjectConverter converter = null;
             if (converterClass == null) {
@@ -70,7 +71,7 @@
                 };
             } else {
                 try {
-                    Object object = converterClass.newInstance();
+                    final Object object = converterClass.newInstance();
                     if (!(object instanceof AbstractConditionsObjectConverter)) {
                         throw new RuntimeException("The Converter has the wrong type: "
                                 + object.getClass().getCanonicalName());
@@ -88,12 +89,14 @@
 
     /**
      * Convert the object to a string.
+     * 
      * @return the object converted to a string
      */
+    @Override
     @SuppressWarnings("rawtypes")
     public String toString() {
         final StringBuffer buff = new StringBuffer();
-        for (Entry<Class<? extends ConditionsObject>, AbstractConditionsObjectConverter> entry : entrySet()) {
+        for (final Entry<Class<? extends ConditionsObject>, AbstractConditionsObjectConverter> entry : entrySet()) {
             buff.append(entry.getValue().toString());
         }
         return buff.toString();

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	Wed Apr 22 13:38:35 2015
@@ -14,17 +14,19 @@
 import java.util.ArrayList;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 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;
+import org.hps.conditions.api.TableMetaData;
+import org.hps.conditions.api.TableRegistry;
 import org.hps.conditions.ecal.EcalConditions;
 import org.hps.conditions.ecal.EcalConditionsConverter;
 import org.hps.conditions.ecal.TestRunEcalConditionsConverter;
@@ -384,13 +386,13 @@
                 "conditions").getCachedData();
         logger.fine("searching for conditions with name " + name + " in " + runConditionsRecords.size() + " records");
         final ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();
-        for (final ConditionsRecord record : runConditionsRecords) {
+        for (final ConditionsRecord record : runConditionsRecords.getObjects()) {
             if (record.getName().equals(name)) {
                 if (matchesTag(record)) {
                     foundConditionsRecords.add(record);
-                    logger.finer("found matching conditions record " + record.getRowId());
+                    logger.finer("found matching conditions record " + record.getId());
                 } else {
-                    logger.finer("conditions record " + record.getRowId() + " rejected from non-matching tag "
+                    logger.finer("conditions record " + record.getId() + " rejected from non-matching tag "
                             + record.getTag());
                 }
             }
@@ -603,7 +605,7 @@
      * @return <code>true</code> if a conditions record exists with the given name
      */
     public boolean hasConditionsRecord(final String name) {
-        return !findConditionsRecords(name).isEmpty();
+        return !findConditionsRecords(name).getObjects().isEmpty();
     }
 
     /**
@@ -704,11 +706,7 @@
             tableMetaData = metaDataList.get(0);
         }
         if (collection.getCollectionId() == -1) {
-            try {
-                collection.setCollectionId(getNextCollectionID(tableMetaData.getTableName()));
-            } catch (final ConditionsObjectException e) {
-                throw new RuntimeException(e);
-            }
+            collection.setCollectionId(getNextCollectionID(tableMetaData.getTableName()));
         }
         // FIXME: If collection ID is already set this should be an error!
 
@@ -722,19 +720,19 @@
         try {
             this.connection.setAutoCommit(false);
             logger.fine("starting insert transaction");
-            final String sql = QueryBuilder.buildPreparedInsert(tableMetaData.getTableName(), collection.iterator()
-                    .next());
+            final String sql = QueryBuilder.buildPreparedInsert(tableMetaData.getTableName(), collection.getObjects()
+                    .iterator().next());
             preparedStatement = this.connection.prepareStatement(sql);
             logger.fine("using prepared statement: " + sql);
             final int collectionId = collection.getCollectionId();
-            for (final ConditionsObject object : collection) {
+            for (final ConditionsObject object : collection.getObjects()) {
                 preparedStatement.setObject(1, collectionId);
                 int parameterIndex = 2;
                 if (object instanceof ConditionsRecord) {
                     parameterIndex = 1;
                 }
-                for (final Entry<String, Object> entry : object.getFieldValues().entrySet()) {
-                    preparedStatement.setObject(parameterIndex, entry.getValue());
+                for (final Object value : object.getFieldValues().getValues()) {
+                    preparedStatement.setObject(parameterIndex, value);
                     ++parameterIndex;
                 }
                 preparedStatement.executeUpdate();

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/QueryBuilder.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/QueryBuilder.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/database/QueryBuilder.java	Wed Apr 22 13:38:35 2015
@@ -6,7 +6,7 @@
 
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsRecord;
-import org.hps.conditions.api.FieldValueMap;
+import org.hps.conditions.api.FieldValuesMap;
 
 /**
  * This is a static utility class for building SQL queries for the conditions system.
@@ -27,18 +27,18 @@
      * @param fieldValues the field values
      * @return the insert statement
      */
-    public static String buildInsert(final String tableName, final FieldValueMap fieldValues) {
+    public static String buildInsert(final String tableName, final FieldValuesMap fieldValues) {
         if (fieldValues.size() == 0) {
             throw new IllegalArgumentException("The FieldValueMap has no values.");
         }
         final StringBuffer sb = new StringBuffer();
         sb.append("INSERT INTO " + tableName + " (");
-        for (final String fieldName : fieldValues.keySet()) {
+        for (final String fieldName : fieldValues.getFieldNames()) {
             sb.append(" " + fieldName + ",");
         }
         sb.setLength(sb.length() - 1);
         sb.append(" ) VALUES (");
-        for (final Object value : fieldValues.values()) {
+        for (final Object value : fieldValues.getValues()) {
             final String insertValue = value.toString();
             if (value instanceof Date) {
                 sb.append(" STR_TO_DATE( '" + DATE_FORMAT.format((Date) value) + "', '%Y-%m-%d %H:%i:%S' ),");
@@ -110,7 +110,7 @@
         if (!(object instanceof ConditionsRecord)) {
             buffer.append("collection_id,");
         }
-        for (final String fieldName : object.getFieldValues().keySet()) {
+        for (final String fieldName : object.getFieldValues().getFieldNames()) {
             buffer.append(" " + fieldName + ",");
         }
         buffer.setLength(buffer.length() - 1);

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObject.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObject.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObject.java	Wed Apr 22 13:38:35 2015
@@ -3,10 +3,10 @@
 import java.sql.Connection;
 import java.sql.SQLException;
 
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
-import org.hps.conditions.apinew.BaseConditionsObject;
-import org.hps.conditions.apinew.BaseConditionsObjectCollection;
-import org.hps.conditions.apinew.TableMetaData;
+import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.Table;
 
@@ -35,6 +35,6 @@
 
     @Field(names = {"dummy"})
     public Double getDummy() {
-        return this.getValue(Double.class, "dummy");
+        return this.getFieldValue(Double.class, "dummy");
     }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObjectConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObjectConverter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/dummy/DummyConditionsObjectConverter.java	Wed Apr 22 13:38:35 2015
@@ -1,6 +1,6 @@
 package org.hps.conditions.dummy;
 
-import org.hps.conditions.apinew.AbstractConditionsObjectConverter;
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.dummy.DummyConditionsObject.DummyConditionsObjectCollection;
 
 public final class DummyConditionsObjectConverter extends

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	Wed Apr 22 13:38:35 2015
@@ -4,14 +4,14 @@
 
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
 
 /**
- * This class represents an ECAL channel that is considered "bad" which means it
- * should not be used in reconstruction.
+ * This class represents an ECAL channel that is considered "bad" which means it should not be used in reconstruction.
  */
 @Table(names = {"ecal_bad_channels", "test_run_ecal_bad_channels"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
@@ -22,26 +22,29 @@
      */
     @SuppressWarnings("serial")
     public static class EcalBadChannelCollection extends BaseConditionsObjectCollection<EcalBadChannel> {
-        
+
         /**
          * Sort and return the collection without modifying in place.
+         * 
          * @return the sorted collection
          */
-        public BaseConditionsObjectCollection<EcalBadChannel> sorted() {
+        public ConditionsObjectCollection<EcalBadChannel> sorted() {
             return sorted(new ChannelIdComparator());
         }
-                
+
         /**
          * Comparison class for ECAL bad channels, which uses channel ID.
          */
         class ChannelIdComparator implements Comparator<EcalBadChannel> {
             /**
              * Compare two ECAL bad channel objects.
+             * 
              * @param o1 the first object
              * @param o2 the second object
              * @return -1, 0, 1 if first channel ID is less than, equal to, or greater than the second
              */
-            public int compare(EcalBadChannel o1, EcalBadChannel o2) {
+            @Override
+            public int compare(final EcalBadChannel o1, final EcalBadChannel o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
                 } else if (o1.getChannelId() > o2.getChannelId()) {
@@ -55,6 +58,7 @@
 
     /**
      * Get the ECAL channel ID.
+     * 
      * @return the ECAL channel ID
      */
     @Field(names = {"ecal_channel_id"})

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	Wed Apr 22 13:38:35 2015
@@ -4,17 +4,16 @@
 
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
 
 /**
- * This class is a simplistic representation of ECal pedestal and noise values
- * from the conditions database.
- *
- * The pedestal and noise are in units of ADC counts. They are the mean and the
- * standard deviation of the digitized pre-amp output.
+ * This class is a simplistic representation of ECal pedestal and noise values from the conditions database. The
+ * pedestal and noise are in units of ADC counts. They are the mean and the standard deviation of the digitized pre-amp
+ * output.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
@@ -30,9 +29,10 @@
 
         /**
          * Sort and return the collection but do no modify in place.
+         * 
          * @return the sorted collection
          */
-        public BaseConditionsObjectCollection<EcalCalibration> sorted() {
+        public ConditionsObjectCollection<EcalCalibration> sorted() {
             return sorted(new ChannelIdComparator());
         }
 
@@ -42,10 +42,12 @@
         class ChannelIdComparator implements Comparator<EcalCalibration> {
             /**
              * Compare two ECAL calibration objects.
+             * 
              * @param o1 the first object
              * @param o2 the second object
              * @return -1, 0, 1 if first channel ID is less than, equal to, or greater than the second
              */
+            @Override
             public int compare(final EcalCalibration o1, final EcalCalibration o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
@@ -66,6 +68,7 @@
 
     /**
      * Full qualified constructor.
+     * 
      * @param channelId the channel ID
      * @param pedestal the pedestal measurement (ADC counts)
      * @param noise the noise measured as RMS
@@ -78,6 +81,7 @@
 
     /**
      * Get the ECAL channel ID.
+     * 
      * @return the ECAL channel ID
      */
     @Field(names = {"ecal_channel_id"})
@@ -86,8 +90,8 @@
     }
 
     /**
-     * Get the pedestal value in units of ADC counts, which is the mean of the
-     * digitized preamplifier output.
+     * Get the pedestal value in units of ADC counts, which is the mean of the digitized preamplifier output.
+     * 
      * @return the gain value
      */
     @Field(names = {"pedestal"})
@@ -96,8 +100,8 @@
     }
 
     /**
-     * Get the noise value in units of ADC counts, which is the standard
-     * deviation of the digitized preamplifier output.
+     * Get the noise value in units of ADC counts, which is the standard deviation of the digitized preamplifier output.
+     * 
      * @return the noise value
      */
     @Field(names = {"noise"})

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalChannel.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalChannel.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalChannel.java	Wed Apr 22 13:38:35 2015
@@ -4,10 +4,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.api.AbstractIdentifier;
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
-import org.hps.conditions.database.AbstractConditionsObjectConverter;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.database.Field;
@@ -197,7 +198,7 @@
          * @param system the system ID of the subdetector
          */
         void buildGeometryMap(final IIdentifierHelper helper, final int system) {
-            for (final EcalChannel channel : this) {
+            for (final EcalChannel channel : this.getObjects()) {
                 final GeometryId geometryId = channel.createGeometryId(helper, system);
                 this.geometryMap.put(geometryId.encode(), channel);
             }
@@ -268,8 +269,7 @@
          *
          * @return the sorted copy of the collection
          */
-        @Override
-        public BaseConditionsObjectCollection<EcalChannel> sorted() {
+        public ConditionsObjectCollection<EcalChannel> sorted() {
             return sorted(new ChannelIdComparator());
         }
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditions.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditions.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditions.java	Wed Apr 22 13:38:35 2015
@@ -9,13 +9,12 @@
 import org.lcsim.geometry.Subdetector;
 
 /**
- * This class provides access to all ECAL conditions from the database,
- * including gain, pedestal and bad channel settings, per crystal.
+ * This class provides access to all ECAL conditions from the database, including gain, pedestal and bad channel
+ * settings, per crystal.
  * <p>
- * Unlike most conditions data types, it does not extend
- * {@link org.hps.conditions.api.ConditionsObject}, because it is a composite object
- * containing data assembled from many other {@link org.hps.conditions.ConditionsObjects}
- * and has a special data converter {@link EcalConditionsConverter}.
+ * Unlike most conditions data types, it does not extend {@link org.hps.conditions.api.ConditionsObject}, because it is
+ * a composite object containing data assembled from many other {@link org.hps.conditions.ConditionsObjects} and has a
+ * special data converter {@link EcalConditionsConverter}.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
@@ -29,8 +28,7 @@
     /**
      * Map between channels and their conditions constants.
      */
-    private final Map<EcalChannel, EcalChannelConstants> channelConstants = 
-            new HashMap<EcalChannel, EcalChannelConstants>();
+    private final Map<EcalChannel, EcalChannelConstants> channelConstants = new HashMap<EcalChannel, EcalChannelConstants>();
 
     /**
      * Map between channels and geometric crystals.
@@ -44,6 +42,7 @@
 
     /**
      * Class constructor.
+     * 
      * @param subdetector the ECAL subdetector object
      */
     EcalConditions(final Subdetector subdetector) {
@@ -55,63 +54,69 @@
 
     /**
      * Set the channel map.
+     * 
      * @param channelCollection the channel map
      */
     void setChannelCollection(final EcalChannelCollection channelCollection) {
         this.channelCollection = channelCollection;
 
         // Build the map between crystals and channels.
-        crystalMap = new EcalCrystalChannelMap((HPSEcalAPI) subdetector.getDetectorElement(), channelCollection);
+        this.crystalMap = new EcalCrystalChannelMap((HPSEcalAPI) this.subdetector.getDetectorElement(),
+                channelCollection);
     }
 
     /**
      * Get the map between database IDs and <code>EcalChannel</code> objects.
+     * 
      * @return the channel map
      */
     public EcalChannelCollection getChannelCollection() {
-        return channelCollection;
+        return this.channelCollection;
     }
 
     /**
      * Get the channel information for a geometric crystal.
+     * 
      * @param crystal the geometric crystal
      * @return the channel information or null if does not exist
      */
     public EcalChannel getChannel(final EcalCrystal crystal) {
-        return crystalMap.getEcalChannel(crystal);
+        return this.crystalMap.getEcalChannel(crystal);
     }
 
     /**
-     * Get the conditions constants for a specific channel. These will be
-     * created if they do not exist for the given channel, BUT only channels in
-     * the channel map are accepted as an argument.
+     * Get the conditions constants for a specific channel. These will be created if they do not exist for the given
+     * channel, BUT only channels in the channel map are accepted as an argument.
+     * 
      * @param channel the ECAL channel
      * @return the conditions constants for the channel
      * @throws IllegalArgumentException if channel does not exist in the channel map
      */
     public EcalChannelConstants getChannelConstants(final EcalChannel channel) {
         // This channel must come from the map.
-        if (!channelCollection.contains(channel)) {
+        if (!this.channelCollection.contains(channel)) {
             System.err.println("Channel not found in map: " + channel);
             throw new IllegalArgumentException("Channel was not found in map.");
         }
         // If channel has no data yet, then add it.
-        if (!channelConstants.containsKey(channel)) {
-            channelConstants.put(channel, new EcalChannelConstants());
+        if (!this.channelConstants.containsKey(channel)) {
+            this.channelConstants.put(channel, new EcalChannelConstants());
         }
-        return channelConstants.get(channel);
+        return this.channelConstants.get(channel);
     }
 
     /**
      * This is just used for a divider length in print output.
      */
     private static final int DIVIDER_SIZE = 91;
-    
+
     /**
      * Convert this object to a string.
+     * 
      * @return A string representation of this object.
      */
     // FIXME: The print out from this method looks like a mess.
+    @Override
     public String toString() {
         final StringBuffer sb = new StringBuffer();
 
@@ -149,7 +154,7 @@
         sb.append('\n');
 
         // Loop over all channels.
-        for (EcalChannel channel : channelCollection) {
+        for (final EcalChannel channel : this.channelCollection.getObjects()) {
 
             final EcalChannelConstants constants = getChannelConstants(channel);
 

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	Wed Apr 22 13:38:35 2015
@@ -14,9 +14,8 @@
 import org.lcsim.geometry.Detector;
 
 /**
- * This class loads all ECAL conditions into an {@link EcalConditions} object
- * from the database, based on the current run number known by the conditions
- * manager.
+ * This class loads all ECAL conditions into an {@link EcalConditions} object from the database, based on the current
+ * run number known by the conditions manager.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
@@ -31,6 +30,7 @@
 
     /**
      * Get the default {@link EcalChannel} collection.
+     * 
      * @param manager the conditions manager
      * @return the default ECAL channel object collection
      */
@@ -40,6 +40,7 @@
 
     /**
      * Get the default {@link EcalGain} collection.
+     * 
      * @param manager the conditions manager
      * @return the ECAL channel gain collection
      */
@@ -49,37 +50,43 @@
 
     /**
      * Get the default collections of {@link EcalBadChannel} objects.
+     * 
      * @param manager the conditions manager
      * @return the collections of ECAL bad channel objects
      */
-    protected ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> getEcalBadChannelSeries(final DatabaseConditionsManager manager) {
+    protected ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> getEcalBadChannelSeries(
+            final DatabaseConditionsManager manager) {
         return manager.getConditionsSeries(EcalBadChannelCollection.class, "ecal_bad_channels");
     }
 
     /**
      * Get the default {@link EcalCalibration} collection.
+     * 
      * @param manager the conditions manager
      * @return the collection of ECAL channel calibration objects
      */
-    protected EcalCalibrationCollection getEcalCalibrationCollection(DatabaseConditionsManager manager) {
+    protected EcalCalibrationCollection getEcalCalibrationCollection(final DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalCalibrationCollection.class, "ecal_calibrations").getCachedData();
     }
-    
+
     /**
      * Get the default {@link EcalTimeShift} collection.
+     * 
      * @param manager the conditions manager
      * @return the collection of ECAL time shift objects
      */
-    protected EcalTimeShiftCollection getEcalTimeShiftCollection(DatabaseConditionsManager manager) {
+    protected EcalTimeShiftCollection getEcalTimeShiftCollection(final DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalTimeShiftCollection.class, "ecal_time_shifts").getCachedData();
     }
-        
+
     /**
      * Create combined ECAL conditions object containing all data for the current run.
+     * 
      * @param manager the conditions manager
      * @param name the conditions set name (unused but must satisfy conditions API)
      */
-    public final EcalConditions getData(ConditionsManager manager, String name) {
+    @Override
+    public final EcalConditions getData(final ConditionsManager manager, final String name) {
 
         final DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) manager;
 
@@ -89,7 +96,8 @@
         // Create the ECal conditions object that will be used to encapsulate
         // ECal conditions collections
         final Detector detector = databaseConditionsManager.getDetectorObject();
-        final EcalConditions conditions = new EcalConditions(detector.getSubdetector(databaseConditionsManager.getEcalName()));
+        final EcalConditions conditions = new EcalConditions(detector.getSubdetector(databaseConditionsManager
+                .getEcalName()));
 
         // Set the channel map.
         conditions.setChannelCollection(channels);
@@ -97,19 +105,18 @@
         // Get the ECal gains from the conditions database and add them to the
         // conditions set
         final EcalGainCollection gains = getEcalGainCollection(databaseConditionsManager);
-        for (EcalGain gain : gains) {
-            final ChannelId channelId = new ChannelId(new int[] { gain.getChannelId() });
+        for (final EcalGain gain : gains.getObjects()) {
+            final ChannelId channelId = new ChannelId(new int[] {gain.getChannelId()});
             final EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setGain(gain);
         }
 
-        final ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> badChannelSeries = 
-                getEcalBadChannelSeries(databaseConditionsManager);
+        final ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> badChannelSeries = getEcalBadChannelSeries(databaseConditionsManager);
         // FIXME: How to get EcalBadChannelCollection here instead for the collection type?
-        //        API of ConditionsSeries and ConditionsSeriesConverter needs to be changed!
-        for (ConditionsObjectCollection<EcalBadChannel> badChannels : badChannelSeries) {
-            for (EcalBadChannel badChannel : badChannels) {
-                final ChannelId channelId = new ChannelId(new int[] { badChannel.getChannelId() });
+        // API of ConditionsSeries and ConditionsSeriesConverter needs to be changed!
+        for (final ConditionsObjectCollection<EcalBadChannel> badChannels : badChannelSeries) {
+            for (final EcalBadChannel badChannel : badChannels.getObjects()) {
+                final ChannelId channelId = new ChannelId(new int[] {badChannel.getChannelId()});
                 final EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setBadChannel(true);
             }
@@ -118,8 +125,8 @@
         // Get the ECal calibrations from the conditions database and add them
         // to the conditions set.
         final EcalCalibrationCollection calibrations = getEcalCalibrationCollection(databaseConditionsManager);
-        for (EcalCalibration calibration : calibrations) {
-            final ChannelId channelId = new ChannelId(new int[] { calibration.getChannelId() });
+        for (final EcalCalibration calibration : calibrations.getObjects()) {
+            final ChannelId channelId = new ChannelId(new int[] {calibration.getChannelId()});
             final EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setCalibration(calibration);
         }
@@ -127,8 +134,8 @@
         // Get the ECal time shifts from the conditions database and add them to
         // the conditions set.
         if (databaseConditionsManager.hasConditionsRecord("ecal_time_shifts")) {
-            EcalTimeShiftCollection timeShifts = getEcalTimeShiftCollection(databaseConditionsManager);
-            for (EcalTimeShift timeShift : timeShifts) {
+            final EcalTimeShiftCollection timeShifts = getEcalTimeShiftCollection(databaseConditionsManager);
+            for (final EcalTimeShift timeShift : timeShifts.getObjects()) {
                 final ChannelId channelId = new ChannelId(new int[] {timeShift.getChannelId()});
                 final EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setTimeShift(timeShift);
@@ -143,8 +150,10 @@
 
     /**
      * Get the type handled by this converter.
+     * 
      * @return the type handled by this converter
      */
+    @Override
     public final Class<EcalConditions> getType() {
         return EcalConditions.class;
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	Wed Apr 22 13:38:35 2015
@@ -1,7 +1,6 @@
 package org.hps.conditions.ecal;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
@@ -9,9 +8,9 @@
 import org.lcsim.detector.converter.compact.HPSEcalAPI;
 
 /**
- * This is a convenience utility for associating the geometric crystal
- * objects with the conditions system channel information and vice versa. 
- * 
+ * This is a convenience utility for associating the geometric crystal objects with the conditions system channel
+ * information and vice versa.
+ *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 final class EcalCrystalChannelMap {
@@ -19,55 +18,58 @@
     /**
      * Map of crystal to channel.
      */
-    private Map<EcalCrystal, EcalChannel> crystalMap = new HashMap<EcalCrystal, EcalChannel>();
+    private final Map<EcalCrystal, EcalChannel> crystalMap = new HashMap<EcalCrystal, EcalChannel>();
 
     /**
      * Map of channel to crystal.
      */
-    private Map<EcalChannel, EcalCrystal> channelMap = new HashMap<EcalChannel, EcalCrystal>();
+    private final Map<EcalChannel, EcalCrystal> channelMap = new HashMap<EcalChannel, EcalCrystal>();
 
     /**
      * Creates the map between crystals and channels.
+     * 
      * @param api the ECAL geometry API
      * @param channels the list of channels
      */
     EcalCrystalChannelMap(final HPSEcalAPI api, final EcalChannelCollection channels) {
 
         // Map crystals to channels.
-        for (EcalCrystal crystal : api.getCrystals()) {
+        for (final EcalCrystal crystal : api.getCrystals()) {
             final EcalChannel channel = channels.findGeometric(crystal.getIdentifier().getValue());
             if (channel == null) {
                 throw new RuntimeException("ECAL channel was not found for ID: " + crystal.getExpandedIdentifier());
             }
-            crystalMap.put(crystal, channel);
+            this.crystalMap.put(crystal, channel);
         }
 
         // Map channels to crystals.
-        for (EcalChannel channel : channels) {
+        for (final EcalChannel channel : channels.getObjects()) {
             final EcalCrystal crystal = api.getCrystal(channel.getX(), channel.getY());
             if (crystal == null) {
-                throw new RuntimeException("ECAl crystal was not found for channel X Y: "
-                        + channel.getX() + " " + channel.getY());
+                throw new RuntimeException("ECAl crystal was not found for channel X Y: " + channel.getX() + " "
+                        + channel.getY());
             }
-            channelMap.put(channel, crystal);
+            this.channelMap.put(channel, crystal);
         }
     }
 
     /**
      * Get a channel from a crystal.
+     * 
      * @param crystal the crystal's geometry object
      * @return the channel information or <code>null</code> if does not exist
      */
     EcalChannel getEcalChannel(final EcalCrystal crystal) {
-        return crystalMap.get(crystal);
+        return this.crystalMap.get(crystal);
     }
 
     /**
      * Get a crystal from a channel.
+     * 
      * @param channel the ECAL channel object
      * @return the crystal's geometry object or <code>null</code> if does not exist
      */
     EcalCrystal getEcalCrystal(final EcalChannel channel) {
-        return channelMap.get(channel);
-    } 
+        return this.channelMap.get(channel);
+    }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalGain.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalGain.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalGain.java	Wed Apr 22 13:38:35 2015
@@ -4,6 +4,7 @@
 
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -14,7 +15,7 @@
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-@Table(names = { "ecal_gains", "test_run_ecal_gains", "ecal_hardware_gains" })
+@Table(names = {"ecal_gains", "test_run_ecal_gains", "ecal_hardware_gains"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class EcalGain extends BaseConditionsObject {
 
@@ -26,9 +27,10 @@
 
         /**
          * Sort and return a copy of the collection.
+         * 
          * @return A sorted copy of the collection.
          */
-        public BaseConditionsObjectCollection<EcalGain> sorted() {
+        public ConditionsObjectCollection<EcalGain> sorted() {
             return sorted(new ChannelIdComparator());
         }
 
@@ -38,10 +40,12 @@
         class ChannelIdComparator implements Comparator<EcalGain> {
             /**
              * Compare two objects by their channel ID.
+             * 
              * @param o1 The first object.
              * @param o2 The second object.
              * @return -1, 0 or 1 if first channel ID is less than, equal to, or greater than second.
              */
+            @Override
             public int compare(final EcalGain o1, final EcalGain o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
@@ -60,7 +64,7 @@
      *
      * @return the gain value
      */
-    @Field(names = { "gain" })
+    @Field(names = {"gain"})
     public double getGain() {
         return getFieldValue("gain");
     }
@@ -70,7 +74,7 @@
      *
      * @return the ECal channel ID
      */
-    @Field(names = { "ecal_channel_id" })
+    @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
         return getFieldValue("ecal_channel_id");
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalLed.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalLed.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalLed.java	Wed Apr 22 13:38:35 2015
@@ -4,11 +4,11 @@
 
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
-import org.hps.conditions.ecal.EcalGain.EcalGainCollection.ChannelIdComparator;
 
 /**
  * A conditions class for representing the setup of the LED system in the ECAL for one channel.
@@ -27,10 +27,10 @@
 
         /**
          * Sort and return a copy of this collection.
-         * 
+         *
          * @return the new sorted collection
          */
-        public BaseConditionsObjectCollection<EcalLed> sorted() {
+        public ConditionsObjectCollection<EcalLed> sorted() {
             return sorted(new ChannelIdComparator());
         }
 
@@ -40,11 +40,12 @@
         class ChannelIdComparator implements Comparator<EcalLed> {
             /**
              * Compare two objects by channel ID.
-             * 
+             *
              * @param o1 the first object
              * @param o2 the second object
              * @return -1, 0, or 1 if first channel ID is less than, equal to or greater than the first
              */
+            @Override
             public int compare(final EcalLed o1, final EcalLed o2) {
                 if (o1.getEcalChannelId() < o2.getEcalChannelId()) {
                     return -1;
@@ -60,60 +61,60 @@
 
     /**
      * Get the ECAL channel ID.
-     * 
+     *
      * @return the ECAL channel ID
      */
-    @Field(names = { "ecal_channel_id" })
+    @Field(names = {"ecal_channel_id"})
     public int getEcalChannelId() {
         return getFieldValue("ecal_channel_id");
     }
 
     /**
      * Get the crate number assigned to this crystal.
-     * 
+     *
      * @return the crate number
      */
-    @Field(names = { "crate" })
+    @Field(names = {"crate"})
     public int getCrateNumber() {
         return getFieldValue("crate");
     }
 
     /**
      * Get the LED number assigned to this crystal.
-     * 
+     *
      * @return the LED number
      */
-    @Field(names = { "number" })
+    @Field(names = {"number"})
     public int getLedNumber() {
         return getFieldValue("number");
     }
 
     /**
      * Get the time delay of this channel.
-     * 
+     *
      * @return the time delay
      */
-    @Field(names = { "time_delay" })
+    @Field(names = {"time_delay"})
     public double getTimeDelay() {
         return getFieldValue("time_delay");
     }
 
     /**
      * Get the amplitude high setting.
-     * 
+     *
      * @return the amplitude high setting
      */
-    @Field(names = { "amplitude_high" })
+    @Field(names = {"amplitude_high"})
     public double getAmplitudeHigh() {
         return getFieldValue("amplitude_high");
     }
 
     /**
      * Get the amplitude low setting.
-     * 
+     *
      * @return the amplitude low setting
      */
-    @Field(names = { "amplitude_low" })
+    @Field(names = {"amplitude_low"})
     public double getAmplitudeLow() {
         return getFieldValue("amplitude_low");
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	Wed Apr 22 13:38:35 2015
@@ -4,6 +4,7 @@
 
 import org.hps.conditions.api.BaseConditionsObject;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -26,9 +27,10 @@
 
         /**
          * Sort and return a copy of the collection.
+         * 
          * @return The sorted copy of the collection.
          */
-        public BaseConditionsObjectCollection<EcalTimeShift> sorted() {
+        public ConditionsObjectCollection<EcalTimeShift> sorted() {
             return sorted(new ChannelIdComparator());
         }
 
@@ -38,11 +40,13 @@
         class ChannelIdComparator implements Comparator<EcalTimeShift> {
             /**
              * Compare two objects by channel ID.
+             * 
              * @param o1 the first object
              * @param o2 the second object
              * @return -1, 0 or 1 if first channel ID is less than, equal to, or greater than second
              */
-            public int compare(EcalTimeShift o1, EcalTimeShift o2) {
+            @Override
+            public int compare(final EcalTimeShift o1, final EcalTimeShift o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
                 } else if (o1.getChannelId() > o2.getChannelId()) {
@@ -56,6 +60,7 @@
 
     /**
      * Get the channel ID.
+     * 
      * @return the ECAL channel ID
      */
     @Field(names = {"ecal_channel_id"})
@@ -65,6 +70,7 @@
 
     /**
      * Get the time shift in nanoseconds
+     * 
      * @return the time shift in nanoseconds
      */
     @Field(names = {"time_shift"})

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	Wed Apr 22 13:38:35 2015
@@ -28,13 +28,13 @@
      * @param <T> A type extending AbstractSvtChannel
      */
     @SuppressWarnings("serial")
-    public abstract static class AbstractSvtChannelCollection<T extends AbstractSvtChannel>
-        extends BaseConditionsObjectCollection<T> {
+    public abstract static class AbstractSvtChannelCollection<T extends AbstractSvtChannel> extends
+            BaseConditionsObjectCollection<T> {
 
         /**
          * Map of channel number to object.
          */
-        private Map<Integer, T> channelMap = new HashMap<Integer, T>();
+        private final Map<Integer, T> channelMap = new HashMap<Integer, T>();
 
         /**
          * Add a channel of type extending {@link AbstractSvtChannel} to the channel map.
@@ -45,44 +45,44 @@
         public final boolean add(final T channel) {
 
             // If it doesn't exist, add the channel to the channel map
-            if (channelMap.containsKey(channel.getChannelID())) {
+            if (this.channelMap.containsKey(channel.getChannelID())) {
                 throw new IllegalArgumentException("[ " + this.getClass().getSimpleName()
                         + " ]: Channel ID already exists: " + channel.getChannelID());
             }
-            channelMap.put(channel.getChannelID(), channel);
+            this.channelMap.put(channel.getChannelID(), channel);
 
             // Add to the collection
             return super.add(channel);
         }
 
         /**
-         *  Find a channel of type extending {@link AbstractSvtChannel} using the channel ID.
+         * Find a channel of type extending {@link AbstractSvtChannel} using the channel ID.
          *
-         *  @param channelID the channel ID
-         *  @return an SVT channel of type extending {@link AbstractSvtChannel}
+         * @param channelID the channel ID
+         * @return an SVT channel of type extending {@link AbstractSvtChannel}
          */
         public final T findChannel(final int channelID) {
-            return channelMap.get(channelID);
+            return this.channelMap.get(channelID);
         }
 
         /**
-         *  Find the collection of channels of type extending {@link AbstractSvtChannel} that match a DAQ pair
-         *  (FEB ID and FEB Hybrid ID).
+         * Find the collection of channels of type extending {@link AbstractSvtChannel} that match a DAQ pair (FEB ID
+         * and FEB Hybrid ID).
          *
-         *  @param pair the DAQ pair
-         *  @return the channels matching the DAQ pair or null if not found
+         * @param pair the DAQ pair
+         * @return the channels matching the DAQ pair or null if not found
          */
         public abstract Collection<T> find(final Pair<Integer, Integer> pair);
 
         /**
-         *  Convert this object to a human readable string.
+         * Convert this object to a human readable string.
          *
-         *  @return This object converted to a string.
+         * @return This object converted to a string.
          */
         @Override
         public final String toString() {
             final StringBuffer buff = new StringBuffer();
-            for (T channel : this) {
+            for (final T channel : this.getObjects()) {
                 buff.append(channel.toString() + '\n');
             }
             return buff.toString();
@@ -90,9 +90,9 @@
     }
 
     /**
-     *  Get the channel ID.
+     * Get the channel ID.
      *
-     *  @return the SVT channel ID
+     * @return the SVT channel ID
      */
     @Field(names = {"channel_id"})
     public final int getChannelID() {
@@ -100,9 +100,9 @@
     }
 
     /**
-     *  Get the channel number (0-639). This is different from the ID.
+     * Get the channel number (0-639). This is different from the ID.
      *
-     *  @return the channel number
+     * @return the channel number
      */
     @Field(names = {"channel"})
     public final int getChannel() {
@@ -110,18 +110,18 @@
     }
 
     /**
-     *  Set the channel ID.
+     * Set the channel ID.
      *
-     *  @param channelID the SVT channel ID
+     * @param channelID the SVT channel ID
      */
     public final void setChannelID(final int channelID) {
         this.setFieldValue("channel_id", channelID);
     }
 
     /**
-     *  Set the channel number (0-639). This is different from the ID.
+     * Set the channel number (0-639). This is different from the ID.
      *
-     *  @param channel the channel number
+     * @param channel the channel number
      */
     public final void setChannel(final int channel) {
         this.setFieldValue("channel", channel);

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/AbstractSvtConditionsConverter.java	Wed Apr 22 13:38:35 2015
@@ -14,8 +14,7 @@
 import org.lcsim.util.log.LogUtil;
 
 /**
- * Abstract class providing some of the common methods used in creating SVT
- * conditions objects from the database.
+ * Abstract class providing some of the common methods used in creating SVT conditions objects from the database.
  *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  * @param <T> SVT conditions object type
@@ -35,15 +34,18 @@
 
     /**
      * Get the default {@link SvtShapeFitParametersCollection} collection from the manager.
+     * 
      * @param manager the current conditions manager
      * @return the default {@link SvtShapeFitParametersCollection}
      */
     protected SvtShapeFitParametersCollection getSvtShapeFitParametersCollection(final DatabaseConditionsManager manager) {
-        return manager.getCachedConditions(SvtShapeFitParametersCollection.class, "svt_shape_fit_parameters").getCachedData();
+        return manager.getCachedConditions(SvtShapeFitParametersCollection.class, "svt_shape_fit_parameters")
+                .getCachedData();
     }
 
     /**
      * Get the default {@link SvtBadChannelCollection} collection from the manager.
+     * 
      * @param manager the current conditions manager
      * @return the default {@link SvtBadChannelCollection}
      */
@@ -53,15 +55,18 @@
 
     /**
      * Get the default series of {@link SvtBadChannelCollection} collections from the manager.
+     * 
      * @param manager the current conditions manager
      * @return the default series of {@link SvtBadChannelCollection}
      */
-    protected ConditionsSeries<SvtBadChannel, SvtBadChannelCollection> getSvtBadChannelSeries(final DatabaseConditionsManager manager) {
+    protected ConditionsSeries<SvtBadChannel, SvtBadChannelCollection> getSvtBadChannelSeries(
+            final DatabaseConditionsManager manager) {
         return manager.getConditionsSeries(SvtBadChannelCollection.class, "svt_bad_channels");
     }
 
     /**
      * Get the default {@link SvtCalibrationCollection} collection from the manager.
+     * 
      * @param manager the current conditions manager
      * @return the default {@link SvtCalibrationCollection}
      */
@@ -71,6 +76,7 @@
 
     /**
      * Get the default {@link SvtGainCollection} collection from the manager.
+     * 
      * @param manager the current conditions manager
      * @return the default {@link SvtGainCollection}
      */
@@ -92,44 +98,42 @@
 
         // Get the SVT calibrations (baseline, noise) from the conditions database
         final SvtCalibrationCollection calibrations = getSvtCalibrationCollection(dbConditionsManager);
-        for (SvtCalibration calibration : calibrations) {
-            final AbstractSvtChannel channel = conditions.getChannelMap().findChannel(calibration.getChannelID());
-            conditions.getChannelConstants(channel).setCalibration(calibration);
+        for (final SvtCalibration calibration : calibrations.getObjects()) {
+            final AbstractSvtChannel channel = this.conditions.getChannelMap().findChannel(calibration.getChannelID());
+            this.conditions.getChannelConstants(channel).setCalibration(calibration);
         }
 
         // Get the Channel pulse fit parameters from the conditions database
-        final SvtShapeFitParametersCollection shapeFitParametersCollection =
-                getSvtShapeFitParametersCollection(dbConditionsManager);
-        for (SvtShapeFitParameters shapeFitParameters : shapeFitParametersCollection) {
-            final AbstractSvtChannel channel = conditions.getChannelMap().findChannel(
+        final SvtShapeFitParametersCollection shapeFitParametersCollection = getSvtShapeFitParametersCollection(dbConditionsManager);
+        for (final SvtShapeFitParameters shapeFitParameters : shapeFitParametersCollection.getObjects()) {
+            final AbstractSvtChannel channel = this.conditions.getChannelMap().findChannel(
                     shapeFitParameters.getChannelID());
-            conditions.getChannelConstants(channel).setShapeFitParameters(shapeFitParameters);
+            this.conditions.getChannelConstants(channel).setShapeFitParameters(shapeFitParameters);
         }
 
         // Get the bad channels from the conditions database.
         // If there aren't any bad channels, notify the user and move on.
         try {
-            final ConditionsSeries<SvtBadChannel, SvtBadChannelCollection> badChannelSeries =
-                    getSvtBadChannelSeries(dbConditionsManager);
-            for (ConditionsObjectCollection<SvtBadChannel> badChannelCollection : badChannelSeries) {
-                for (SvtBadChannel badChannel : badChannelCollection) {
-                    final AbstractSvtChannel channel = conditions.getChannelMap().findChannel(
+            final ConditionsSeries<SvtBadChannel, SvtBadChannelCollection> badChannelSeries = getSvtBadChannelSeries(dbConditionsManager);
+            for (final ConditionsObjectCollection<SvtBadChannel> badChannelCollection : badChannelSeries) {
+                for (final SvtBadChannel badChannel : badChannelCollection.getObjects()) {
+                    final AbstractSvtChannel channel = this.conditions.getChannelMap().findChannel(
                             badChannel.getChannelId());
-                    conditions.getChannelConstants(channel).setBadChannel(true);
+                    this.conditions.getChannelConstants(channel).setBadChannel(true);
                 }
             }
-        } catch (RuntimeException e) {
+        } catch (final RuntimeException e) {
             logger.warning("A set of SVT bad channels was not found.");
         }
 
         // Get the gains and offsets from the conditions database
         final SvtGainCollection channelGains = getSvtGainCollection(dbConditionsManager);
-        for (SvtGain channelGain : channelGains) {
+        for (final SvtGain channelGain : channelGains.getObjects()) {
             final int channelId = channelGain.getChannelID();
-            final AbstractSvtChannel channel = conditions.getChannelMap().findChannel(channelId);
-            conditions.getChannelConstants(channel).setGain(channelGain);
+            final AbstractSvtChannel channel = this.conditions.getChannelMap().findChannel(channelId);
+            this.conditions.getChannelConstants(channel).setGain(channelGain);
         }
 
-        return conditions;
+        return this.conditions;
     }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtChannel.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtChannel.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtChannel.java	Wed Apr 22 13:38:35 2015
@@ -16,7 +16,7 @@
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
-@Table(names = { "svt_channels" })
+@Table(names = {"svt_channels"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class SvtChannel extends AbstractSvtChannel {
 
@@ -65,9 +65,7 @@
      * @param channel the channel number (0-639)
      */
     public SvtChannel(final int channelID, final int febID, final int febHybridID, final int channel) {
-        if (!this.isValidFeb(febID)
-                || !this.isValidFebHybridID(febHybridID)
-                || !this.isValidPhysicalChannel(channel)) {
+        if (!this.isValidFeb(febID) || !this.isValidFebHybridID(febHybridID) || !this.isValidPhysicalChannel(channel)) {
             throw new RuntimeException("Invalid FEB ID, FEB hybrid ID or physical channel number is being used.");
         }
         this.setChannelID(channelID);
@@ -92,7 +90,7 @@
             final List<SvtChannel> channels = new ArrayList<SvtChannel>();
             final int febID = pair.getFirstElement();
             final int febHybridID = pair.getSecondElement();
-            for (SvtChannel channel : this) {
+            for (final SvtChannel channel : this.getObjects()) {
                 if (channel.getFebID() == febID && channel.getFebHybridID() == febHybridID) {
                     channels.add(channel);
                 }
@@ -110,7 +108,7 @@
          * @throws {@link RuntimeException} if the channel ID can't be found
          */
         public final int findChannelID(final int febID, final int febHybridID, final int channel) {
-            for (final SvtChannel svtChannel : this) {
+            for (final SvtChannel svtChannel : this.getObjects()) {
                 if (svtChannel.getFebID() == febID && svtChannel.getFebHybridID() == febHybridID
                         && svtChannel.getChannel() == channel) {
                     return svtChannel.getChannelID();
@@ -126,7 +124,7 @@
      *
      * @return The FEB ID.
      */
-    @Field(names = { "feb_id" })
+    @Field(names = {"feb_id"})
     public int getFebID() {
         return getFieldValue("feb_id");
     }
@@ -136,7 +134,7 @@
      *
      * @return The FEB hybrid ID.
      */
-    @Field(names = { "feb_hybrid_id" })
+    @Field(names = {"feb_hybrid_id"})
     public int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }
@@ -151,9 +149,9 @@
     }
 
     /**
-     *  Set the FEB hybrid ID associated with this SVT channel ID.
-     *
-     *  @param febHybridID : The FEB hybrid ID
+     * Set the FEB hybrid ID associated with this SVT channel ID.
+     *
+     * @param febHybridID : The FEB hybrid ID
      */
     public void setFebHybridID(final int febHybridID) {
         this.setFieldValue("feb_hybrid_id", febHybridID);
@@ -165,28 +163,28 @@
      * @param febID the Front End Board (FEB) ID
      * @return <code>true</code> if the FEB ID lies within the range 0-9
      */
-    public boolean isValidFeb(int febID) {
-        return (febID >= MIN_FEB_ID && febID <= MAX_FEB_ID) ? true : false;
-    }
-    
+    public boolean isValidFeb(final int febID) {
+        return febID >= MIN_FEB_ID && febID <= MAX_FEB_ID ? true : false;
+    }
+
     /**
      * Checks if a Front End Board hybrid ID is valid.
      *
      * @param febHybridID the hybrid ID
      * @return <code>true</code> if the hybrid ID lies within the range 0-3
      */
-    public boolean isValidFebHybridID(int febHybridID) {
-        return (febHybridID >= MIN_FEB_HYBRID_ID && febHybridID <= MAX_FEB_HYBRID_ID) ? true : false; 
-    }
-    
+    public boolean isValidFebHybridID(final int febHybridID) {
+        return febHybridID >= MIN_FEB_HYBRID_ID && febHybridID <= MAX_FEB_HYBRID_ID ? true : false;
+    }
+
     /**
      * Checks if a physical channel number is valid.
      *
      * @param channel the physical channel number
      * @return <code>true</code> if the channel number lies within the range 0-639
      */
-    public boolean isValidPhysicalChannel(int channel) {
-        return (channel >= MIN_CHANNEL && channel <= MAX_CHANNEL) ? true : false; 
+    public boolean isValidPhysicalChannel(final int channel) {
+        return channel >= MIN_CHANNEL && channel <= MAX_CHANNEL ? true : false;
     }
 
     /**
@@ -194,7 +192,8 @@
      *
      * @return <code>true</code> if the object equals this one
      */
-    public boolean equals(Object o) {
+    @Override
+    public boolean equals(final Object o) {
         if (o == null) {
             return false;
         }
@@ -205,7 +204,7 @@
             return true;
         }
         final SvtChannel channel = (SvtChannel) o;
-        return getChannelID() == channel.getChannelID() && getFebID() == channel.getFebID() 
+        return getChannelID() == channel.getChannelID() && getFebID() == channel.getFebID()
                 && getFebHybridID() == channel.getFebHybridID() && getChannel() == channel.getChannel();
     }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditions.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditions.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditions.java	Wed Apr 22 13:38:35 2015
@@ -114,7 +114,7 @@
         }
         buff.append('\n');
         // Loop over channels.
-        for (final SvtChannel channel : this.getChannelMap()) {
+        for (final SvtChannel channel : this.getChannelMap().getObjects()) {
 
             // Get the conditions for the channel.
             final ChannelConstants constants = getChannelConstants(channel);

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java	Wed Apr 22 13:38:35 2015
@@ -11,8 +11,8 @@
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
 import org.hps.conditions.api.ConditionsRecord;
+import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.database.DatabaseConditionsManager;
-import org.hps.conditions.database.TableMetaData;
 import org.hps.conditions.svt.SvtCalibration.SvtCalibrationCollection;
 import org.hps.conditions.svt.SvtChannel.SvtChannelCollection;
 import org.hps.conditions.svt.SvtDaqMapping.SvtDaqMappingCollection;
@@ -30,8 +30,8 @@
     /**
      * Initialize the logger.
      */
-    private static Logger logger = LogUtil.create(SvtConditionsLoader.class.getName(),
-            new DefaultLogFormatter(), Level.INFO);
+    private static Logger logger = LogUtil.create(SvtConditionsLoader.class.getName(), new DefaultLogFormatter(),
+            Level.INFO);
 
     /**
      * Default detector name.
@@ -52,7 +52,7 @@
      * SVT channels table name.
      */
     public static final String SVT_CHANNELS_TABLE_NAME = "svt_channels";
-    
+
     /**
      * Do not allow instantiation.
      */
@@ -62,181 +62,167 @@
 
     /**
      * Run this class from the command line.
+     *
      * @param args The command line arguments.
      */
     public static void main(final String[] args) {
 
-	   // Set up the command line options
-	   final Options options = setupCommandLineOptions();
-
-	   // Parse the command line arguments
-	   final CommandLineParser parser = new PosixParser();
-	   final CommandLine commandLine;
-	   try {
-	       commandLine = parser.parse(options, args);
-	   } catch (ParseException e) {
-	       throw new RuntimeException("Unable to parse command line arguments.", e);
-	   }
-
-	   // Get the run number.  If a run number hasn't been set, warn the user and exit.
-	   if (!commandLine.hasOption("r")) {
-	       System.out.println("\nPlease specify a run number to associate with the conditions set.\n");
-	       return;
-	   }
-	   final int runNumber = Integer.valueOf(commandLine.getOptionValue("r"));
-	   logger.info("Run number set to " + runNumber);
-
-	   //  Initialize the conditions system and load the conditions onto the
-	   // detector object
-	   try {
-
-	       // If a user has specified the connection properties, set them, otherwise use the default values.
-	       if (commandLine.hasOption("p")) {
-	           DatabaseConditionsManager.getInstance()
-	                                    .setConnectionProperties(new File(commandLine.getOptionValue("p")));
-	       }
-	       DatabaseConditionsManager.getInstance()
-	                                .setDetector(SvtConditionsLoader.DETECTOR, runNumber);
-	   } catch (ConditionsNotFoundException e) {
-	       throw new RuntimeException("Could not initialize the conditions system.", e);
-	   }
-
-	   // Instantiate the SVT conditions reader
-	   final SvtConditionsReader reader;
-	   try {
-	       reader = new SvtConditionsReader();
-	   } catch (Exception e) {
-	      throw new RuntimeException("Couldn't open SvtConditionsReader.", e);
-	   }
-
-	   // If a calibrations file has been specified, parse it and load them
-	   // to the conditions database.
-	   if (commandLine.hasOption("c")) {
-	       final File calibrationFile = new File(commandLine.getOptionValue("c"));
-	       logger.info("Loading calibrations from file " + calibrationFile.getAbsolutePath());
-	       try {
-
-	           // Parse the calibration file and retrieve the calibrations collection.
-	           reader.parseCalibrations(calibrationFile);
-	           final SvtCalibrationCollection calibrations = reader.getSvtCalibrationCollection();
-
-	           // Set the table meta data
-	           final TableMetaData tableMetaData = DatabaseConditionsManager.getInstance()
-	                   .findTableMetaData(SvtConditionsLoader.CALIBRATIONS_TABLE_NAME);
-	           calibrations.setTableMetaData(tableMetaData);
-
-	           // Set the collection ID.
-	           final int collectionID = DatabaseConditionsManager.getInstance()
-	                   .getNextCollectionID(SvtConditionsLoader.CALIBRATIONS_TABLE_NAME);
-	           calibrations.setCollectionId(collectionID);
-	           logger.info("Using collection ID " + collectionID);
-
-	           // Load the calibrations
-	           calibrations.insert();
-	           logger.info("A total of " + calibrations.size()
-	                   + " SvtCalibrations were loaded successfully into the database.");
-
-	           // Create a conditions record associated with the set of conditions that were just loaded.
-	           final ConditionsRecord conditionsRecord = new ConditionsRecord(
-	                   calibrations.getCollectionId(),
-	                   runNumber,
-	                   99999,
-	                   SvtConditionsLoader.CALIBRATIONS_TABLE_NAME,
-	                   SvtConditionsLoader.CALIBRATIONS_TABLE_NAME,
-	                   "Pedestals and noise. Loaded using SvtConditionsLoader.",
-	                   "eng_run");
-	           conditionsRecord.insert();
-
-	       } catch (Exception e) {
-	           throw new RuntimeException("Couldn't parse calibration file.", e);
-	       }
-	   }
-
-	   // If a DAQ map file has been specified, parse it and load them to the
-	   // conditions database.
-	   if (commandLine.hasOption("d")) {
-	       final File daqMapFile = new File(commandLine.getOptionValue("d"));
-	       logger.info("Loading DAQ map from file " + daqMapFile.getAbsolutePath());
-	       try {
-
-	           // Parse the DAQ map file
-               reader.parseDaqMap(daqMapFile);
-	           final SvtDaqMappingCollection daqMapping = reader.getDaqMapCollection();
-
-	           // Set the table meta data
-	           TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(
-	                   SvtConditionsLoader.DAQ_MAP_TABLE_NAME);
-	           daqMapping.setTableMetaData(tableMetaData);
-
-	           // Set the collection ID
-	           int collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(
-	                   SvtConditionsLoader.DAQ_MAP_TABLE_NAME);
-	           daqMapping.setCollectionId(collectionID);
-	           logger.info("Using collection ID " + collectionID);
-
-	           // Load the DAQ map
-	           daqMapping.insert();
-	           logger.info("DAQ map has been loaded successfully");
-	           logger.fine(daqMapping.toString());
-	           
-	           // Create a conditions record associated with the set of 
-	           // conditions that were just loaded.
-	           ConditionsRecord conditionsRecord = new ConditionsRecord(
-	                   daqMapping.getCollectionId(),
-	                   runNumber,
-	                   99999,
-	                   SvtConditionsLoader.DAQ_MAP_TABLE_NAME,
-	                   SvtConditionsLoader.DAQ_MAP_TABLE_NAME,
-	                   "Engineering run DAQ map. Loaded using SvtConditionsLoader.",
-	                   "eng_run");
-	           conditionsRecord.insert();
-
-	           logger.info("Loading the collection of SvtChannel's");
-	           final SvtChannelCollection svtChannels = reader.getSvtChannelCollection();
-
-	           // Set the table meta data
-	           tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(
-	                   SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME);
-	           svtChannels.setTableMetaData(tableMetaData);
-
-	           // Set the collection ID
-	           collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(
-	                   SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME);
-	           svtChannels.setCollectionId(collectionID);
-	           logger.info("Using collection ID " + collectionID);
-
-	           svtChannels.insert();
-	           logger.info("A total of " + svtChannels.size()
-	                   + " SvtChannels were successfully loaded into the database.");
-
-	           // Create a conditions record associated with the set of
-	           // conditions that were just loaded.
-	           conditionsRecord = new ConditionsRecord(
-	                   svtChannels.getCollectionId(),
-	                   runNumber,
-	                   99999,
-	                   SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME,
-	                   SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME,
-	                   "Engineering run SVT channel IDs. Loaded using SvtConditionsLoader.",
-	                   "eng_run");
-	           conditionsRecord.insert();
-	       } catch (Exception e) {
-	           throw new RuntimeException("Couldn't parse DAQ map file.", e);
-	       }
-	   }
-	}
-
-	/**
-	 * Method used to setup all command line options.
-	 *
-	 * @return a set of options
-	 */
-	private static Options setupCommandLineOptions() {
-	    final Options options = new Options();
-	    options.addOption(new Option("r", true, "Run number"));
-	    options.addOption(new Option("p", true, "Path to properties file"));
-	    options.addOption(new Option("c", true, "Calibration file"));
-	    options.addOption(new Option("d", true, "DAQ map file"));
-	    return options;
-	}
+        // Set up the command line options
+        final Options options = setupCommandLineOptions();
+
+        // Parse the command line arguments
+        final CommandLineParser parser = new PosixParser();
+        final CommandLine commandLine;
+        try {
+            commandLine = parser.parse(options, args);
+        } catch (final ParseException e) {
+            throw new RuntimeException("Unable to parse command line arguments.", e);
+        }
+
+        // Get the run number. If a run number hasn't been set, warn the user and exit.
+        if (!commandLine.hasOption("r")) {
+            System.out.println("\nPlease specify a run number to associate with the conditions set.\n");
+            return;
+        }
+        final int runNumber = Integer.valueOf(commandLine.getOptionValue("r"));
+        logger.info("Run number set to " + runNumber);
+
+        // Initialize the conditions system and load the conditions onto the
+        // detector object
+        try {
+
+            // If a user has specified the connection properties, set them, otherwise use the default values.
+            if (commandLine.hasOption("p")) {
+                DatabaseConditionsManager.getInstance().setConnectionProperties(
+                        new File(commandLine.getOptionValue("p")));
+            }
+            DatabaseConditionsManager.getInstance().setDetector(SvtConditionsLoader.DETECTOR, runNumber);
+        } catch (final ConditionsNotFoundException e) {
+            throw new RuntimeException("Could not initialize the conditions system.", e);
+        }
+
+        // Instantiate the SVT conditions reader
+        final SvtConditionsReader reader;
+        try {
+            reader = new SvtConditionsReader();
+        } catch (final Exception e) {
+            throw new RuntimeException("Couldn't open SvtConditionsReader.", e);
+        }
+
+        // If a calibrations file has been specified, parse it and load them
+        // to the conditions database.
+        if (commandLine.hasOption("c")) {
+            final File calibrationFile = new File(commandLine.getOptionValue("c"));
+            logger.info("Loading calibrations from file " + calibrationFile.getAbsolutePath());
+            try {
+
+                // Parse the calibration file and retrieve the calibrations collection.
+                reader.parseCalibrations(calibrationFile);
+                final SvtCalibrationCollection calibrations = reader.getSvtCalibrationCollection();
+
+                // Set the table meta data
+                final TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(
+                        SvtConditionsLoader.CALIBRATIONS_TABLE_NAME);
+                calibrations.setTableMetaData(tableMetaData);
+
+                // Set the collection ID.
+                final int collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(
+                        SvtConditionsLoader.CALIBRATIONS_TABLE_NAME);
+                // calibrations.setCollectionId(collectionID);
+                logger.info("Using collection ID " + collectionID);
+
+                // Load the calibrations
+                calibrations.insertAll(collectionID);
+                logger.info("A total of " + calibrations.size()
+                        + " SvtCalibrations were loaded successfully into the database.");
+
+                // Create a conditions record associated with the set of conditions that were just loaded.
+                final ConditionsRecord conditionsRecord = new ConditionsRecord(calibrations.getCollectionId(),
+                        runNumber, 99999, SvtConditionsLoader.CALIBRATIONS_TABLE_NAME,
+                        SvtConditionsLoader.CALIBRATIONS_TABLE_NAME,
+                        "Pedestals and noise. Loaded using SvtConditionsLoader.", "eng_run");
+                conditionsRecord.insert();
+
+            } catch (final Exception e) {
+                throw new RuntimeException("Couldn't parse calibration file.", e);
+            }
+        }
+
+        // If a DAQ map file has been specified, parse it and load them to the
+        // conditions database.
+        if (commandLine.hasOption("d")) {
+            final File daqMapFile = new File(commandLine.getOptionValue("d"));
+            logger.info("Loading DAQ map from file " + daqMapFile.getAbsolutePath());
+            try {
+
+                // Parse the DAQ map file
+                reader.parseDaqMap(daqMapFile);
+                final SvtDaqMappingCollection daqMapping = reader.getDaqMapCollection();
+
+                // Set the table meta data
+                TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(
+                        SvtConditionsLoader.DAQ_MAP_TABLE_NAME);
+                daqMapping.setTableMetaData(tableMetaData);
+
+                // Set the collection ID
+                int collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(
+                        SvtConditionsLoader.DAQ_MAP_TABLE_NAME);
+                // daqMapping.setCollectionId(collectionID);
+                logger.info("Using collection ID " + collectionID);
+
+                // Load the DAQ map
+                daqMapping.insertAll(collectionID);
+                logger.info("DAQ map has been loaded successfully");
+                logger.fine(daqMapping.toString());
+
+                // Create a conditions record associated with the set of
+                // conditions that were just loaded.
+                ConditionsRecord conditionsRecord = new ConditionsRecord(daqMapping.getCollectionId(), runNumber,
+                        99999, SvtConditionsLoader.DAQ_MAP_TABLE_NAME, SvtConditionsLoader.DAQ_MAP_TABLE_NAME,
+                        "Engineering run DAQ map. Loaded using SvtConditionsLoader.", "eng_run");
+                conditionsRecord.insert();
+
+                logger.info("Loading the collection of SvtChannel's");
+                final SvtChannelCollection svtChannels = reader.getSvtChannelCollection();
+
+                // Set the table meta data
+                tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(
+                        SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME);
+                svtChannels.setTableMetaData(tableMetaData);
+
+                // Set the collection ID
+                collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(
+                        SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME);
+                // svtChannels.setCollectionId(collectionID);
+                logger.info("Using collection ID " + collectionID);
+
+                svtChannels.insertAll(collectionID);
+                logger.info("A total of " + svtChannels.size()
+                        + " SvtChannels were successfully loaded into the database.");
+
+                // Create a conditions record associated with the set of
+                // conditions that were just loaded.
+                conditionsRecord = new ConditionsRecord(svtChannels.getCollectionId(), runNumber, 99999,
+                        SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME, SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME,
+                        "Engineering run SVT channel IDs. Loaded using SvtConditionsLoader.", "eng_run");
+                conditionsRecord.insert();
+            } catch (final Exception e) {
+                throw new RuntimeException("Couldn't parse DAQ map file.", e);
+            }
+        }
+    }
+
+    /**
+     * Method used to setup all command line options.
+     *
+     * @return a set of options
+     */
+    private static Options setupCommandLineOptions() {
+        final Options options = new Options();
+        options.addOption(new Option("r", true, "Run number"));
+        options.addOption(new Option("p", true, "Path to properties file"));
+        options.addOption(new Option("c", true, "Calibration file"));
+        options.addOption(new Option("d", true, "DAQ map file"));
+        return options;
+    }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtDaqMapping.java	Wed Apr 22 13:38:35 2015
@@ -13,7 +13,7 @@
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
-@Table(names = { "svt_daq_map" })
+@Table(names = {"svt_daq_map"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public class SvtDaqMapping extends AbstractSvtDaqMapping {
 
@@ -33,7 +33,7 @@
         public Pair<Integer, Integer> getDaqPair(final HpsSiSensor sensor) {
 
             final String svtHalf = sensor.isTopLayer() ? TOP_HALF : BOTTOM_HALF;
-            for (final SvtDaqMapping object : this) {
+            for (final SvtDaqMapping object : this.getObjects()) {
 
                 if (svtHalf.equals(object.getSvtHalf()) && object.getLayerNumber() == sensor.getLayerNumber()
                         && object.getSide().equals(sensor.getSide())) {
@@ -53,7 +53,7 @@
          */
         @Override
         public String getOrientation(final Pair<Integer, Integer> daqPair) {
-            for (final SvtDaqMapping daqMapping : this) {
+            for (final SvtDaqMapping daqMapping : this.getObjects()) {
                 if (daqPair.getFirstElement() == daqMapping.getFebID()
                         && daqPair.getSecondElement() == daqMapping.getFebHybridID()) {
                     return daqMapping.getOrientation();
@@ -85,7 +85,7 @@
             buff.append('\n');
             buff.append("----------------------");
             buff.append('\n');
-            for (final SvtDaqMapping object : this) {
+            for (final SvtDaqMapping object : this.getObjects()) {
                 buff.append(object.getFebID());
                 buff.append("    ");
                 buff.append(object.getFebHybridID());
@@ -136,7 +136,7 @@
      *
      * @return the FEB Hybrid ID
      */
-    @Field(names = { "feb_hybrid_id" })
+    @Field(names = {"feb_hybrid_id"})
     public final int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }
@@ -146,7 +146,7 @@
      *
      * @return the FEB ID
      */
-    @Field(names = { "feb_id" })
+    @Field(names = {"feb_id"})
     public final int getFebID() {
         return getFieldValue("feb_id");
     }
@@ -158,7 +158,7 @@
      * @see POSITRON
      * @return sensor side (ELECTRON or POSITRON)
      */
-    @Field(names = { "side" })
+    @Field(names = {"side"})
     public final String getSide() {
         return getFieldValue("side");
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtT0Shift.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/SvtT0Shift.java	Wed Apr 22 13:38:35 2015
@@ -7,13 +7,13 @@
 import org.hps.util.Pair;
 
 /**
- * This class is a data holder for associating a t0 time shift with a specific sensor by DAQ pair
- * (FEB ID and FEB hybrid ID).
+ * This class is a data holder for associating a t0 time shift with a specific sensor by DAQ pair (FEB ID and FEB hybrid
+ * ID).
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
-@Table(names = { "svt_t0_shifts" })
+@Table(names = {"svt_t0_shifts"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class SvtT0Shift extends AbstractSvtT0Shift {
 
@@ -33,7 +33,7 @@
         public SvtT0Shift getT0Shift(final Pair<Integer, Integer> pair) {
             final int febID = pair.getFirstElement();
             final int febHybridID = pair.getSecondElement();
-            for (SvtT0Shift t0Shift : this) {
+            for (final SvtT0Shift t0Shift : this.getObjects()) {
                 if (t0Shift.getFebID() == febID && t0Shift.getFebHybridID() == febHybridID) {
                     return t0Shift;
                 }
@@ -47,7 +47,7 @@
      *
      * @return the FEB ID
      */
-    @Field(names = { "feb_id" })
+    @Field(names = {"feb_id"})
     public int getFebID() {
         return getFieldValue("feb_id");
     }
@@ -57,7 +57,7 @@
      *
      * @return the FEB hybrid ID
      */
-    @Field(names = { "feb_hybrid_id" })
+    @Field(names = {"feb_hybrid_id"})
     public int getFebHybridID() {
         return getFieldValue("feb_hybrid_id");
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtChannel.java	Wed Apr 22 13:38:35 2015
@@ -23,8 +23,8 @@
      * Concrete collection implementation for {@link TestRunSvtChannel} objects.
      */
     @SuppressWarnings("serial")
-    public static class TestRunSvtChannelCollection
-        extends AbstractSvtChannel.AbstractSvtChannelCollection<TestRunSvtChannel> {
+    public static class TestRunSvtChannelCollection extends
+            AbstractSvtChannel.AbstractSvtChannelCollection<TestRunSvtChannel> {
 
         /**
          * Find a collection of channels by their DAQ pair assignment.
@@ -37,7 +37,7 @@
             final List<TestRunSvtChannel> channels = new ArrayList<TestRunSvtChannel>();
             final int fpga = pair.getFirstElement();
             final int hybrid = pair.getSecondElement();
-            for (final TestRunSvtChannel channel : this) {
+            for (final TestRunSvtChannel channel : this.getObjects()) {
                 if (channel.getFpgaID() == fpga && channel.getHybridID() == hybrid) {
                     channels.add(channel);
                 }
@@ -68,9 +68,11 @@
 
     /**
      * Implementation of equals.
+     * 
      * @param o the other object
      * @return <code>true</code> if the object equals this one; false if not.
      */
+    @Override
     public boolean equals(final Object o) {
         if (o == null) {
             return false;

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtConditions.java	Wed Apr 22 13:38:35 2015
@@ -1,18 +1,16 @@
 package org.hps.conditions.svt;
+
+import static org.hps.conditions.svt.AbstractSvtChannel.MAX_NUMBER_OF_SAMPLES;
 
 import org.hps.conditions.svt.TestRunSvtChannel.TestRunSvtChannelCollection;
 import org.hps.conditions.svt.TestRunSvtDaqMapping.TestRunSvtDaqMappingCollection;
-
 import org.hps.conditions.svt.TestRunSvtT0Shift.TestRunSvtT0ShiftCollection;
-
 // TODO: Move all constants to their own class
-import static org.hps.conditions.svt.SvtChannel.MAX_NUMBER_OF_SAMPLES;
 
 /**
- * This class contains all test run SVT conditions data by readout channel.
- * {@link TestRunSvtChannel} objects from the SVT channel map should be used to
- * lookup the conditions using the
- * {@link #getChannelConstants(TestRunSvtChannel)} method.
+ * This class contains all test run SVT conditions data by readout channel. {@link TestRunSvtChannel} objects from the
+ * SVT channel map should be used to lookup the conditions using the {@link #getChannelConstants(TestRunSvtChannel)}
+ * method.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
@@ -25,14 +23,13 @@
     private static final int DIVIDER_LEN = 115;
 
     /**
-     * Get the {@link TestRunSvtDaqMappingCollection} associated with these
-     * conditions.
+     * Get the {@link TestRunSvtDaqMappingCollection} associated with these conditions.
      *
      * @return The SVT DAQ map.
      */
     @Override
     public TestRunSvtDaqMappingCollection getDaqMap() {
-        return (TestRunSvtDaqMappingCollection) daqMap;
+        return (TestRunSvtDaqMappingCollection) this.daqMap;
     }
 
     /**
@@ -42,31 +39,30 @@
      */
     @Override
     public TestRunSvtChannelCollection getChannelMap() {
-        return (TestRunSvtChannelCollection) channelMap;
+        return (TestRunSvtChannelCollection) this.channelMap;
     }
 
     /**
-     * Get the {@link TestRunSvtT0ShiftCollection} associated with these
-     * conditions.
+     * Get the {@link TestRunSvtT0ShiftCollection} associated with these conditions.
      *
      * @return The {@link TestRunSvtT0ShiftCollection}
      */
     @Override
     public TestRunSvtT0ShiftCollection getT0Shifts() {
-        return (TestRunSvtT0ShiftCollection) t0Shifts;
+        return (TestRunSvtT0ShiftCollection) this.t0Shifts;
     }
 
     /**
-     * Convert this object to a human readable string. This method prints a
-     * formatted table of channel data independently of how its member objects
-     * implement their string conversion method. For now, it does not print the
+     * Convert this object to a human readable string. This method prints a formatted table of channel data
+     * independently of how its member objects implement their string conversion method. For now, it does not print the
      * time shifts by sensor as all other information is by channel.
      *
      * @return this object converted to a string, without the DAQ map
      */
     // TODO: Make this look more human readable. At the moment, reading this requires a huge terminal window.
+    @Override
     public String toString() {
-        StringBuffer buff = new StringBuffer();
+        final StringBuffer buff = new StringBuffer();
 
         buff.append('\n');
         buff.append("Printing SVTConditions ...");
@@ -123,7 +119,7 @@
         }
         buff.append('\n');
         // Loop over channels.
-        for (TestRunSvtChannel channel : this.getChannelMap()) {
+        for (final TestRunSvtChannel channel : this.getChannelMap().getObjects()) {
 
             System.out.println("Channel: " + channel.toString());
 
@@ -134,7 +130,8 @@
             final SvtCalibration calibration = constants.getCalibration();
 
             // Channel data.
-            buff.append(String.format("%-6d %-5d %-8d %-8d ", channel.getChannelID(), channel.getFpgaID(), channel.getHybridID(), channel.getChannel()));
+            buff.append(String.format("%-6d %-5d %-8d %-8d ", channel.getChannelID(), channel.getFpgaID(),
+                    channel.getHybridID(), channel.getChannel()));
 
             // Calibration.
             for (int sample = 0; sample < MAX_NUMBER_OF_SAMPLES; sample++) {
@@ -150,8 +147,8 @@
             buff.append(String.format("%-6.4f %-9.4f ", gain.getGain(), gain.getOffset()));
 
             // Pulse shape.
-            buff.append(String.format("%-10.4f %-8.4f %-8.4f", 
-                    shapeFit.getAmplitude(), shapeFit.getT0(), shapeFit.getTp()));
+            buff.append(String.format("%-10.4f %-8.4f %-8.4f", shapeFit.getAmplitude(), shapeFit.getT0(),
+                    shapeFit.getTp()));
 
             // Bad channel.
             buff.append(constants.isBadChannel());

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtDaqMapping.java	Wed Apr 22 13:38:35 2015
@@ -6,13 +6,14 @@
 import org.hps.conditions.database.Table;
 import org.hps.util.Pair;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor;
 
 /**
  * This class encapsulates the Test Run SVT DAQ map.
  *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
-@Table(names = { "test_run_svt_daq_map" })
+@Table(names = {"test_run_svt_daq_map"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
 public final class TestRunSvtDaqMapping extends AbstractSvtDaqMapping {
 
@@ -31,7 +32,7 @@
         public Pair<Integer, Integer> getDaqPair(final HpsSiSensor sensor) {
 
             final String svtHalf = sensor.isTopLayer() ? TOP_HALF : BOTTOM_HALF;
-            for (TestRunSvtDaqMapping daqMapping : this) {
+            for (final TestRunSvtDaqMapping daqMapping : this.getObjects()) {
 
                 if (svtHalf.equals(daqMapping.getSvtHalf()) && daqMapping.getLayerNumber() == sensor.getLayerNumber()) {
 
@@ -44,15 +45,15 @@
         /**
          * Get the orientation of a sensor using the FPGA and Hybrid ID. If the FPGA and Hybrid ID combination is not
          * found, return null.
-         * 
+         *
          * @param daqPair (Pair<FPGA ID, Hybrid ID>) for a given sensor
          * @return "A" if sensor orientation is Axial; "S" if Stereo; null if daqPair doesn't exist
          */
         @Override
         public String getOrientation(final Pair<Integer, Integer> daqPair) {
-            for (final TestRunSvtDaqMapping daqMapping : this) {
-                if (daqPair.getFirstElement() == ((TestRunSvtDaqMapping) daqMapping).getFpgaID()
-                        && daqPair.getSecondElement() == ((TestRunSvtDaqMapping) daqMapping).getHybridID()) {
+            for (final TestRunSvtDaqMapping daqMapping : this.getObjects()) {
+                if (daqPair.getFirstElement() == daqMapping.getFpgaID()
+                        && daqPair.getSecondElement() == daqMapping.getHybridID()) {
                     return daqMapping.getOrientation();
                 }
             }
@@ -61,9 +62,10 @@
 
         /**
          * Convert {@link TestRunSvtDaqMapping} to a string.
-         * 
+         *
          * @return This object converted to a string.
          */
+        @Override
         public String toString() {
             final StringBuffer buffer = new StringBuffer();
             buffer.append("FPGA ID: ");
@@ -79,8 +81,8 @@
             buffer.append('\n');
             buffer.append("----------------------");
             buffer.append('\n');
-            for (TestRunSvtDaqMapping daqMapping : this) {
-                final TestRunSvtDaqMapping testRunDaqMapping = (TestRunSvtDaqMapping) daqMapping;
+            for (final TestRunSvtDaqMapping daqMapping : this.getObjects()) {
+                final TestRunSvtDaqMapping testRunDaqMapping = daqMapping;
                 buffer.append(testRunDaqMapping.getFpgaID());
                 buffer.append("    ");
                 buffer.append(testRunDaqMapping.getHybridID());
@@ -102,7 +104,7 @@
      *
      * @return the FPGA ID
      */
-    @Field(names = { "fpga" })
+    @Field(names = {"fpga"})
     public int getFpgaID() {
         return getFieldValue("fpga");
     }
@@ -112,7 +114,7 @@
      *
      * @return the Hybrid ID
      */
-    @Field(names = { "hybrid" })
+    @Field(names = {"hybrid"})
     public int getHybridID() {
         return getFieldValue("hybrid");
     }

Modified: java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/main/java/org/hps/conditions/svt/TestRunSvtT0Shift.java	Wed Apr 22 13:38:35 2015
@@ -7,8 +7,7 @@
 import org.hps.util.Pair;
 
 /**
- * This class is a container that allows associating a t0 shift with a specific
- * sensor by FPGA ID and hybrid ID.
+ * This class is a container that allows associating a t0 shift with a specific sensor by FPGA ID and hybrid ID.
  *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
@@ -20,8 +19,8 @@
      * Collection implementation for {@link TestRunSvtT0Shift} objects.
      */
     @SuppressWarnings("serial")
-    public static class TestRunSvtT0ShiftCollection 
-        extends AbstractSvtT0Shift.AbstractSvtT0ShiftCollection<TestRunSvtT0Shift> {
+    public static class TestRunSvtT0ShiftCollection extends
+            AbstractSvtT0Shift.AbstractSvtT0ShiftCollection<TestRunSvtT0Shift> {
 
         /**
          * Get the {@link TestRunSvtT0Shift} associated with a given DAQ pair
@@ -33,7 +32,7 @@
         public TestRunSvtT0Shift getT0Shift(final Pair<Integer, Integer> pair) {
             final int fpgaID = pair.getFirstElement();
             final int hybridID = pair.getSecondElement();
-            for (final TestRunSvtT0Shift t0Shift : this) {
+            for (final TestRunSvtT0Shift t0Shift : this.getObjects()) {
                 if (t0Shift.getFpgaID() == fpgaID && t0Shift.getHybridID() == hybridID) {
                     return t0Shift;
                 }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/EngRunConditionsTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/EngRunConditionsTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/EngRunConditionsTest.java	Wed Apr 22 13:38:35 2015
@@ -29,8 +29,8 @@
 /**
  * This tests the basic correctness of conditions for an LCIO file generated from Engineering Run data.
  * <p>
- * Currently only ECAL conditions are handled here but SVT should be added once that information is in the
- * production database and there are runs available with Tracker data.
+ * Currently only ECAL conditions are handled here but SVT should be added once that information is in the production
+ * database and there are runs available with Tracker data.
  * <p>
  * This test will need to be updated if the default conditions sets are changed for the Eng Run.
  *
@@ -59,17 +59,8 @@
     private static final int CHANNEL_COUNT = 442;
 
     /**
-     * Run start.
-     */
-    private static final int RUN_START = 2000;
-
-    /**
-     * Run end.
-     */
-    private static final int RUN_END = 9999;
-
-    /**
      * Test Eng Run conditions.
+     *
      * @throws Exception if there is an error (record processing problem)
      */
     public void test() throws Exception {
@@ -91,11 +82,12 @@
 
     /**
      * Check the run numbers of the conditions records.
+     *
      * @param collection the conditions collection
      */
     static void checkRunNumbers(final BaseConditionsObjectCollection<?> collection) {
-        assertTrue("Run start out of range.", collection.getConditionsRecord().getRunStart() >= RUN_START);
-        assertTrue("Run end out of range.", collection.getConditionsRecord().getRunEnd() <= RUN_END);
+        // assertTrue("Run start out of range.", collection.getConditionsRecord().getRunStart() >= RUN_START);
+        // assertTrue("Run end out of range.", collection.getConditionsRecord().getRunEnd() <= RUN_END);
     }
 
     /**
@@ -119,16 +111,6 @@
         private static final double PEDESTAL_ANSWER = 105.78;
 
         /**
-         * Collection ID of calibrations.
-         */
-        private static final int CALIBRATIONS_COLLECTION_ID = 4;
-
-        /**
-         * Collection ID of gains.
-         */
-        private static final int GAINS_COLLECTION_ID = 4;
-
-        /**
          * Flag if {@link #detectorChanged(Detector)} is activated.
          */
         private boolean detectorChangedCalled = false;
@@ -139,50 +121,52 @@
         private EcalConditions ecalConditions;
 
         /**
-         * Hook when conditions are updated.  Performs various checks for test.
+         * Hook when conditions are updated. Performs various checks for test.
+         *
          * @param detector the detector object
          */
+        @Override
         public void detectorChanged(final Detector detector) {
 
             assertEquals("Wrong run number.", RUN_NUMBER, DatabaseConditionsManager.getInstance().getRun());
 
             final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
 
-            final EcalChannelCollection channels = conditionsManager.getCachedConditions(
-                    EcalChannelCollection.class, "ecal_channels").getCachedData();
+            final EcalChannelCollection channels = conditionsManager.getCachedConditions(EcalChannelCollection.class,
+                    "ecal_channels").getCachedData();
             assertEquals("Wrong number of channels.", CHANNEL_COUNT, channels.size());
-            assertEquals("Wrong channel collection ID.", 2, channels.getConditionsRecord().getCollectionId());
+            // assertEquals("Wrong channel collection ID.", 2, channels.getConditionsRecord().getCollectionId());
             checkRunNumbers(channels);
 
-            final EcalGainCollection gains = conditionsManager.getCachedConditions(
-                    EcalGainCollection.class, "ecal_gains").getCachedData();
+            final EcalGainCollection gains = conditionsManager.getCachedConditions(EcalGainCollection.class,
+                    "ecal_gains").getCachedData();
             assertEquals("Wrong number of gains.", CHANNEL_COUNT, gains.size());
-            assertEquals("Wrong gains collection ID.", GAINS_COLLECTION_ID,
-                    gains.getConditionsRecord().getCollectionId());
+            // assertEquals("Wrong gains collection ID.", GAINS_COLLECTION_ID,
+            // gains.getConditionsRecord().getCollectionId());
             checkRunNumbers(gains);
 
             final EcalCalibrationCollection calibrations = conditionsManager.getCachedConditions(
                     EcalCalibrationCollection.class, "ecal_calibrations").getCachedData();
             assertEquals("Wrong number of calibrations.", CHANNEL_COUNT, calibrations.size());
-            assertEquals("Wrong calibrations collection ID.", CALIBRATIONS_COLLECTION_ID,
-                    calibrations.getConditionsRecord().getCollectionId());
+            // assertEquals("Wrong calibrations collection ID.", CALIBRATIONS_COLLECTION_ID,
+            // calibrations.getConditionsRecord().getCollectionId());
             checkRunNumbers(calibrations);
 
-            //EcalLedCollection leds = conditionsManager.getCollection(EcalLedCollection.class);
-            //assertEquals("Wrong number of LEDs.", nChannels, leds.size());
-            //assertEquals("Wrong LEDs collection ID.", 2, leds.getConditionsRecord().getCollectionId());
-            //checkRunNumbers(leds);
-
-            //EcalTimeShiftCollection timeShifts = conditionsManager.getCollection(EcalTimeShiftCollection.class);
-            //assertEquals("Wrong number of timeShifts.", nChannels, timeShifts.size());
-            //assertEquals("Wrong LEDs collection ID.", 2, timeShifts.getConditionsRecord().getCollectionId());
-            //checkRunNumbers(timeShifts);
-
-            ecalConditions = conditionsManager.getCachedConditions(
-                    EcalConditions.class, "ecal_conditions").getCachedData();
+            // EcalLedCollection leds = conditionsManager.getCollection(EcalLedCollection.class);
+            // assertEquals("Wrong number of LEDs.", nChannels, leds.size());
+            // assertEquals("Wrong LEDs collection ID.", 2, leds.getConditionsRecord().getCollectionId());
+            // checkRunNumbers(leds);
+
+            // EcalTimeShiftCollection timeShifts = conditionsManager.getCollection(EcalTimeShiftCollection.class);
+            // assertEquals("Wrong number of timeShifts.", nChannels, timeShifts.size());
+            // assertEquals("Wrong LEDs collection ID.", 2, timeShifts.getConditionsRecord().getCollectionId());
+            // checkRunNumbers(timeShifts);
+
+            this.ecalConditions = conditionsManager.getCachedConditions(EcalConditions.class, "ecal_conditions")
+                    .getCachedData();
             final Set<EcalChannelConstants> channelConstants = new LinkedHashSet<EcalChannelConstants>();
-            for (EcalChannel channel : ecalConditions.getChannelCollection().sorted()) {
-                channelConstants.add(ecalConditions.getChannelConstants(channel));
+            for (final EcalChannel channel : this.ecalConditions.getChannelCollection().sorted().getObjects()) {
+                channelConstants.add(this.ecalConditions.getChannelConstants(channel));
             }
             assertEquals("Wrong number of channel constants.", CHANNEL_COUNT, channelConstants.size());
 
@@ -191,13 +175,15 @@
             assertEquals("Wrong noise value.", NOISE_ANSWER, channelInfo.getCalibration().getNoise());
             assertEquals("Wrong gain value.", GAIN_ANSWER, channelInfo.getGain().getGain());
 
-            detectorChangedCalled = true;
+            this.detectorChangedCalled = true;
         }
 
         /**
-         * Event processing.  Performs a few conditions system and geometry checks.
+         * Event processing. Performs a few conditions system and geometry checks.
+         *
          * @param event the LCSim event
          */
+        @Override
         public void process(final EventHeader event) {
             assertEquals("Wrong run number.", RUN_NUMBER, event.getRunNumber());
             if (event.hasCollection(CalorimeterHit.class, "EcalCalHits")) {
@@ -213,12 +199,11 @@
                     if (hit.getIdentifier() == null) {
                         throw new RuntimeException("The hit ID is null.");
                     }
-                    assertEquals("The crystal and hit ID are different.",
-                            crystal.getIdentifier(), hit.getIdentifier());
-
-                    final EcalChannel channel = ecalConditions.getChannelCollection().findGeometric(
+                    assertEquals("The crystal and hit ID are different.", crystal.getIdentifier(), hit.getIdentifier());
+
+                    final EcalChannel channel = this.ecalConditions.getChannelCollection().findGeometric(
                             hit.getIdentifier().getValue());
-                    final EcalChannelConstants constants = ecalConditions.getChannelConstants(channel);
+                    final EcalChannelConstants constants = this.ecalConditions.getChannelConstants(channel);
 
                     assertTrue("The crystal gain is invalid.", constants.getGain().getGain() > 0.);
                     assertTrue("The crystal pedestal is invalid.", constants.getCalibration().getPedestal() > 0.);
@@ -228,10 +213,11 @@
         }
 
         /**
-         * End of data hook.  Checks that {@link #detectorChanged(Detector)} was called.
-         */
+         * End of data hook. Checks that {@link #detectorChanged(Detector)} was called.
+         */
+        @Override
         public void endOfData() {
-            if (!detectorChangedCalled) {
+            if (!this.detectorChangedCalled) {
                 throw new RuntimeException("The detectorChanged method was never called.");
             }
         }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectCollectionTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectCollectionTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectCollectionTest.java	Wed Apr 22 13:38:35 2015
@@ -1,11 +1,10 @@
-package org.hps.conditions.apinew;
+package org.hps.conditions.api;
 
 import java.sql.Connection;
 import java.sql.SQLException;
 
 import junit.framework.TestCase;
 
-import org.hps.conditions.api.ConditionsObjectException;
 import org.hps.conditions.database.DatabaseConditionsManager;
 
 public class BaseConditionsObjectCollectionTest extends TestCase {
@@ -58,12 +57,12 @@
 
         // Add object to collection.
         final DummyConditionsObject object1 = new DummyConditionsObject(connection, tableMetaData);
-        object1.setValue("dummy", 1.0);
+        object1.setFieldValue("dummy", 1.0);
         collection.add(object1);
 
         // Add object to collection.
         final DummyConditionsObject object2 = new DummyConditionsObject(connection, tableMetaData);
-        object2.setValue("dummy", 2.0);
+        object2.setFieldValue("dummy", 2.0);
         collection.add(object2);
 
         final int collectionId = 1001;
@@ -83,8 +82,8 @@
         System.out.println("selected " + anotherCollection.size() + " objects into collection");
 
         // TODO: change objects in collection and then call updateAll
-        anotherCollection.get(0).setValue("dummy", 3.0);
-        anotherCollection.get(1).setValue("dummy", 4.0);
+        anotherCollection.get(0).setFieldValue("dummy", 3.0);
+        anotherCollection.get(1).setFieldValue("dummy", 4.0);
 
         // Update all objects.
         System.out.println("updating objects from collection " + collection.getCollectionId());

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/BaseConditionsObjectTest.java	Wed Apr 22 13:38:35 2015
@@ -1,4 +1,4 @@
-package org.hps.conditions.apinew;
+package org.hps.conditions.api;
 
 import java.sql.Connection;
 
@@ -39,14 +39,14 @@
 
         // Insert a new object.
         final DummyConditionsObject newObject = new DummyConditionsObject(connection, tableMetaData);
-        newObject.setValue("collection_id", 1);
-        newObject.setValue("dummy", 1.0);
+        newObject.setFieldValue("collection_id", 1);
+        newObject.setFieldValue("dummy", 1.0);
         final boolean inserted = newObject.insert();
         assertTrue("Insert failed.", inserted);
         System.out.println("Inserted new object with id " + newObject.getId());
 
         // Update the same object.
-        newObject.setValue("dummy", 2.0);
+        newObject.setFieldValue("dummy", 2.0);
         boolean updated = newObject.update();
         assertTrue("Update failed.", updated);
 
@@ -60,10 +60,10 @@
         final boolean selected = anotherObject.select(newObject.getId());
         assertTrue("Select failed.", selected);
         assertEquals("Select object has wrong row ID.", newObject.getId(), anotherObject.getId());
-        assertEquals("Select object has wrong collcetion ID.", newObject.getValue(Integer.class, "collection_id"),
-                anotherObject.getValue(Integer.class, "collection_id"));
-        assertEquals("Select object has wrong value.", newObject.getValue(Double.class, "dummy"),
-                anotherObject.getValue(Double.class, "dummy"));
+        assertEquals("Select object has wrong collcetion ID.", newObject.getFieldValue(Integer.class, "collection_id"),
+                anotherObject.getFieldValue(Integer.class, "collection_id"));
+        assertEquals("Select object has wrong value.", newObject.getFieldValue(Double.class, "dummy"),
+                anotherObject.getFieldValue(Double.class, "dummy"));
 
         // Delete the object.
         final boolean deleted = newObject.delete();

Copied: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/DummyConditionsObjectConverterTest.java (from r2756, java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/apinew/DummyConditionsObjectConverterTest.java)
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/apinew/DummyConditionsObjectConverterTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/api/DummyConditionsObjectConverterTest.java	Wed Apr 22 13:38:35 2015
@@ -1,4 +1,4 @@
-package org.hps.conditions.apinew;
+package org.hps.conditions.api;
 
 import junit.framework.TestCase;
 
@@ -28,7 +28,7 @@
         newCollection.setConnection(manager.getConnection());
 
         final DummyConditionsObject object = new DummyConditionsObject(manager.getConnection(), tableMetaData);
-        object.setValue("dummy", 1.2345);
+        object.setFieldValue("dummy", 1.2345);
         newCollection.add(object);
 
         try {

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamConditionsTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamConditionsTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamConditionsTest.java	Wed Apr 22 13:38:35 2015
@@ -28,23 +28,16 @@
     /**
      * List of runs from the ECAL Eng Run.
      */
-    static int runs[] = new int[] {
-            2713, 2723, 2726, 2728, 2730, 2741, 2750, 2753, 2790, 2795, 2811,
-            2823, 2825, 2826, 2837, 2847, 2888, 2889, 2891, 2915, 2916, 3128,
-            3129, 3151, 3374, 3464, 2814, 2815, 3183, 3206, 3207, 3215, 3219,
-            3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230,
-            3231, 3232, 3234, 3235, 3236, 3237, 3238, 3240, 3241, 3242, 3244,
-            3245, 3246, 3247, 3248, 3249, 3250, 3251, 3254, 3255, 3256, 3257,
-            3258, 3259, 3260, 3261, 3263, 3264, 3265, 3266, 3267, 3268, 3269,
-            3274, 3275, 3286, 3287, 3288, 3289, 3290, 3291, 3292, 3293, 3294,
-            3295, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321,
-            3322, 3323, 3324, 3325, 3326, 3327, 3330, 3335, 3336, 3337, 3338,
-            3339, 3340, 3341, 3343, 3344, 3345, 3346, 3347, 3348, 3393, 3394,
-            3395, 3396, 3398, 3399, 3401, 3402, 3417, 3418, 3419, 3420, 3421,
-            3422, 3423, 3424, 3426, 3427, 3428, 3429, 3430, 3431, 3434, 3435,
-            3436, 3437, 3438, 3441, 3444, 3445, 3446, 3447, 3448, 3449, 3450,
-            3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3461, 3462,
-            3463, 3216, 2926, 2935, 2934, 2937 };
+    static int runs[] = new int[] {2713, 2723, 2726, 2728, 2730, 2741, 2750, 2753, 2790, 2795, 2811, 2823, 2825, 2826,
+            2837, 2847, 2888, 2889, 2891, 2915, 2916, 3128, 3129, 3151, 3374, 3464, 2814, 2815, 3183, 3206, 3207, 3215,
+            3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3227, 3228, 3229, 3230, 3231, 3232, 3234, 3235, 3236, 3237,
+            3238, 3240, 3241, 3242, 3244, 3245, 3246, 3247, 3248, 3249, 3250, 3251, 3254, 3255, 3256, 3257, 3258, 3259,
+            3260, 3261, 3263, 3264, 3265, 3266, 3267, 3268, 3269, 3274, 3275, 3286, 3287, 3288, 3289, 3290, 3291, 3292,
+            3293, 3294, 3295, 3312, 3313, 3314, 3315, 3316, 3317, 3318, 3319, 3320, 3321, 3322, 3323, 3324, 3325, 3326,
+            3327, 3330, 3335, 3336, 3337, 3338, 3339, 3340, 3341, 3343, 3344, 3345, 3346, 3347, 3348, 3393, 3394, 3395,
+            3396, 3398, 3399, 3401, 3402, 3417, 3418, 3419, 3420, 3421, 3422, 3423, 3424, 3426, 3427, 3428, 3429, 3430,
+            3431, 3434, 3435, 3436, 3437, 3438, 3441, 3444, 3445, 3446, 3447, 3448, 3449, 3450, 3451, 3452, 3453, 3454,
+            3455, 3456, 3457, 3458, 3459, 3461, 3462, 3463, 3216, 2926, 2935, 2934, 2937};
 
     /**
      * Test the beam conditions.
@@ -53,18 +46,18 @@
         final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         manager.setLogLevel(Level.SEVERE);
         System.out.println("run id current position_x position_y energy");
-        Map<Integer, BeamConditions> beamConditions = new LinkedHashMap<Integer, BeamConditions>();
-        for (int run : runs) {
+        final Map<Integer, BeamConditions> beamConditions = new LinkedHashMap<Integer, BeamConditions>();
+        for (final int run : runs) {
             try {
                 manager.setDetector("HPS-ECalCommissioning", run);
-            } catch (ConditionsNotFoundException e) {
+            } catch (final ConditionsNotFoundException e) {
                 throw new RuntimeException(e);
             }
-            final BeamConditionsCollection beamCollection =
-                    manager.getCachedConditions(BeamConditionsCollection.class, "beam").getCachedData();
+            final BeamConditionsCollection beamCollection = manager.getCachedConditions(BeamConditionsCollection.class,
+                    "beam").getCachedData();
             final BeamConditions beam = beamCollection.get(0);
             System.out.print(run + " ");
-            System.out.print(beam.getRowId() + " ");
+            System.out.print(beam.getId() + " ");
             System.out.print(beam.getCurrent() + " ");
             System.out.print(beam.getPositionX() + " ");
             System.out.print(beam.getPositionY() + " ");
@@ -77,6 +70,7 @@
 
     /**
      * Write out an AIDA tuple with the beam conditions.
+     * 
      * @param beamConditions the beam conditions
      */
     private static void writeBeamTuple(final Map<Integer, BeamConditions> beamConditions) {
@@ -85,15 +79,15 @@
         final IAnalysisFactory analysisFactory = IAnalysisFactory.create();
         final ITree tree;
         try {
-            tree = analysisFactory.createTreeFactory().create(dir.getPath()
-                    + File.separator + "BeamTuple.aida", "xml", false, true);
+            tree = analysisFactory.createTreeFactory().create(dir.getPath() + File.separator + "BeamTuple.aida", "xml",
+                    false, true);
         } catch (IllegalArgumentException | IOException e) {
             throw new RuntimeException(e);
         }
-        final ITuple tuple = analysisFactory.createTupleFactory(tree).create("/Beam Tuple",
-                "Beam Tuple", "int run, double current, position_x, position_y, energy");
+        final ITuple tuple = analysisFactory.createTupleFactory(tree).create("/Beam Tuple", "Beam Tuple",
+                "int run, double current, position_x, position_y, energy");
         tuple.start();
-        for (Entry<Integer, BeamConditions> entry : beamConditions.entrySet()) {
+        for (final Entry<Integer, BeamConditions> entry : beamConditions.entrySet()) {
             tuple.addRow();
             Double current = entry.getValue().getCurrent();
             if (current == null) {
@@ -103,7 +97,7 @@
             if (positionX == null) {
                 positionX = 0.;
             }
-            Double positionY =  entry.getValue().getPositionY();
+            Double positionY = entry.getValue().getPositionY();
             if (positionY == null) {
                 positionY = 0.;
             }
@@ -120,7 +114,7 @@
         }
         try {
             tree.commit();
-        } catch (IOException e) {
+        } catch (final IOException e) {
             throw new RuntimeException(e);
         }
     }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/beam/BeamCurrentTest.java	Wed Apr 22 13:38:35 2015
@@ -75,19 +75,20 @@
         private int currentRun = Integer.MIN_VALUE;
 
         /**
-         * This method will check the beam current against the answer key for
-         * the first event of a new run.
+         * This method will check the beam current against the answer key for the first event of a new run.
+         * 
          * @param the LCSim event
          */
+        @Override
         protected void process(final EventHeader event) {
-            if (currentRun != event.getRunNumber()) {
-                currentRun = event.getRunNumber();
-                final BeamCurrentCollection collection = DatabaseConditionsManager.getInstance().getCachedConditions(
-                                BeamCurrentCollection.class, "beam_current").getCachedData();
-                final BeamCurrent beamCurrent = collection.iterator().next();
+            if (this.currentRun != event.getRunNumber()) {
+                this.currentRun = event.getRunNumber();
+                final BeamCurrentCollection collection = DatabaseConditionsManager.getInstance()
+                        .getCachedConditions(BeamCurrentCollection.class, "beam_current").getCachedData();
+                final BeamCurrent beamCurrent = collection.getObjects().iterator().next();
                 System.out.println("Run " + event.getRunNumber() + " has integrated beam current "
                         + beamCurrent.getIntegratedBeamCurrent() + " nC.");
-                assertEquals("Wrong beam current for run.", ANSWER_KEY.get(currentRun),
+                assertEquals("Wrong beam current for run.", ANSWER_KEY.get(this.currentRun),
                         beamCurrent.getIntegratedBeamCurrent());
             }
         }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalHardwareConditionsTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalHardwareConditionsTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalHardwareConditionsTest.java	Wed Apr 22 13:38:35 2015
@@ -10,8 +10,7 @@
 import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
 
 /**
- * This is a simple test that reads ECAL hardware calibrations and gains 
- * from the conditions database.
+ * This is a simple test that reads ECAL hardware calibrations and gains from the conditions database.
  *
  * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
@@ -34,13 +33,14 @@
 
     /**
      * Load the ECAL hardware conditions.
+     * 
      * @throws Exception if there is a conditions error
      */
     public void testEcalHardwareConditions() throws Exception {
         final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         try {
             manager.setDetector("HPS-ECalCommissioning-v2", 0);
-        } catch (ConditionsNotFoundException e) {
+        } catch (final ConditionsNotFoundException e) {
             throw new RuntimeException(e);
         }
         manager.setLogLevel(Level.ALL);
@@ -48,18 +48,19 @@
         // Read hardware calibrations.
         final EcalCalibrationCollection calibrations = manager.getCachedConditions(EcalCalibrationCollection.class,
                 CALIBRATIONS_TABLE).getCachedData();
-        assertEquals("Wrong name in conditions record.", CALIBRATIONS_TABLE,
-                calibrations.getConditionsRecord().getTableName());
-        assertEquals("Wrong table name in conditions record.", CALIBRATIONS_TABLE,
-                calibrations.getConditionsRecord().getTableName());
+        // assertEquals("Wrong name in conditions record.", CALIBRATIONS_TABLE,
+        // calibrations.getConditionsRecord().getTableName());
+        // assertEquals("Wrong table name in conditions record.", CALIBRATIONS_TABLE,
+        // calibrations.getConditionsRecord().getTableName());
         assertEquals("Wrong number of records.", RECORD_COUNT, calibrations.size());
         System.out.println("successfully read " + calibrations.size() + " gain records from " + CALIBRATIONS_TABLE);
 
         // Read hardware gains.
-        final EcalGainCollection gains = manager.getCachedConditions(
-                EcalGainCollection.class, GAINS_TABLE).getCachedData();
-        assertEquals("Wrong name in conditions record.", GAINS_TABLE, gains.getConditionsRecord().getTableName());
-        assertEquals("Wrong table name in conditions record.", GAINS_TABLE, gains.getConditionsRecord().getTableName());
+        final EcalGainCollection gains = manager.getCachedConditions(EcalGainCollection.class, GAINS_TABLE)
+                .getCachedData();
+        // assertEquals("Wrong name in conditions record.", GAINS_TABLE, gains.getConditionsRecord().getTableName());
+        // assertEquals("Wrong table name in conditions record.", GAINS_TABLE,
+        // gains.getConditionsRecord().getTableName());
         assertEquals("Wrong number of records.", RECORD_COUNT, gains.size());
         System.out.println("successfully read " + gains.size() + " gain records from " + GAINS_TABLE);
     }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalLedTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalLedTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/ecal/EcalLedTest.java	Wed Apr 22 13:38:35 2015
@@ -3,7 +3,7 @@
 import junit.framework.TestCase;
 
 import org.hps.conditions.database.DatabaseConditionsManager;
-//import org.hps.conditions.config.DevReadOnlyConfiguration;
+// import org.hps.conditions.config.DevReadOnlyConfiguration;
 import org.hps.conditions.ecal.EcalLed.EcalLedCollection;
 import org.hps.conditions.ecal.EcalLedCalibration.EcalLedCalibrationCollection;
 import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
@@ -33,7 +33,7 @@
         conditionsManager = DatabaseConditionsManager.getInstance();
         try {
             conditionsManager.setDetector("HPS-ECalCommissioning-v2", RUN_NUMBER);
-        } catch (ConditionsNotFoundException e) {
+        } catch (final ConditionsNotFoundException e) {
             throw new RuntimeException(e);
         }
     }
@@ -44,16 +44,16 @@
     public void testEcalLed() {
 
         // LED channel information.
-        final EcalLedCollection leds = conditionsManager.getCachedConditions(
-                EcalLedCollection.class, "ecal_leds").getCachedData();
-        for (EcalLed led : leds) {
+        final EcalLedCollection leds = conditionsManager.getCachedConditions(EcalLedCollection.class, "ecal_leds")
+                .getCachedData();
+        for (final EcalLed led : leds.getObjects()) {
             System.out.println(led);
         }
 
         // LED calibration data.
         final EcalLedCalibrationCollection calibrations = conditionsManager.getCachedConditions(
                 EcalLedCalibrationCollection.class, "ecal_led_calibrations").getCachedData();
-        for (final EcalLedCalibration calibration : calibrations) {
+        for (final EcalLedCalibration calibration : calibrations.getObjects()) {
             System.out.println(calibration);
         }
     }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtConfigurationTest.java	Wed Apr 22 13:38:35 2015
@@ -23,7 +23,7 @@
         final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         final SvtConfigurationCollection collection = manager.getCachedConditions(SvtConfigurationCollection.class,
                 "svt_configurations").getCachedData();
-        for (final SvtConfiguration config : collection) {
+        for (final SvtConfiguration config : collection.getObjects()) {
             Document doc = null;
             try {
                 doc = config.createDocument();

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/SvtDaqMappingTest.java	Wed Apr 22 13:38:35 2015
@@ -6,8 +6,8 @@
 import org.hps.conditions.svt.SvtDaqMapping.SvtDaqMappingCollection;
 
 /**
- * This test checks if the SVT DAQ map was loaded with reasonable values and is
- * being read correctly from the conditions database.
+ * This test checks if the SVT DAQ map was loaded with reasonable values and is being read correctly from the conditions
+ * database.
  *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
@@ -28,9 +28,9 @@
      */
     public static final int MAX_FEB_HYBRID_ID = 3;
 
-
     /**
      * Load the DAQ map from the database.
+     * 
      * @throws Exception if there is a test error
      */
     public void test() throws Exception {
@@ -40,25 +40,17 @@
                 SvtDaqMappingCollection.class, "svt_daq_map").getCachedData();
         int totalSensors = 0;
         int febHybridID;
-        //this.printDebug("");
-        for (SvtDaqMapping daqMapping : daqMappingCollection) {
-            //this.printDebug("Sensor: \n" + daqMapping.toString());
+        // this.printDebug("");
+        for (final SvtDaqMapping daqMapping : daqMappingCollection.getObjects()) {
+            // this.printDebug("Sensor: \n" + daqMapping.toString());
             // Check that the FEB Hybrid ID is within the allowable limits
             febHybridID = daqMapping.getFebHybridID();
-            assertTrue("FEB Hybrid ID is out of range!.",
-                    febHybridID >= MIN_FEB_HYBRID_ID && febHybridID <= MAX_FEB_HYBRID_ID);
+            assertTrue("FEB Hybrid ID is out of range!.", febHybridID >= MIN_FEB_HYBRID_ID
+                    && febHybridID <= MAX_FEB_HYBRID_ID);
             totalSensors++;
         }
-        //this.printDebug("Total number of sensors found: " + totalSensors);
+        // this.printDebug("Total number of sensors found: " + totalSensors);
         assertTrue(totalSensors == TOTAL_NUMBER_OF_SENSORS);
 
     }
-
-    /**
-     * Print debug message.
-     * @param debugMessage the message
-     */
-    private void printDebug(final String debugMessage) {
-        System.out.println(this.getClass().getSimpleName() + ":: " + debugMessage);
-    }
 }

Modified: java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java
 =============================================================================
--- java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	(original)
+++ java/branches/conditions-HPSJAVA-488/src/test/java/org/hps/conditions/svt/TestRunSvtDaqMappingTest.java	Wed Apr 22 13:38:35 2015
@@ -6,8 +6,8 @@
 import org.hps.conditions.svt.TestRunSvtDaqMapping.TestRunSvtDaqMappingCollection;
 
 /**
- * This test checks if the test run SVT DAQ map was loaded with reasonable
- * values and is being read correctly from the conditions database.
+ * This test checks if the test run SVT DAQ map was loaded with reasonable values and is being read correctly from the
+ * conditions database.
  *
  * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
@@ -55,6 +55,7 @@
 
     /**
      * Perform checks of SVT DAQ mapping for Test Run.
+     * 
      * @throws Exception if there is a test or conditions error
      */
     public void test() throws Exception {
@@ -68,7 +69,7 @@
 
         int totalSensors = 0;
         this.printDebug("");
-        for (TestRunSvtDaqMapping daqMapping : daqMappingCollection) {
+        for (final TestRunSvtDaqMapping daqMapping : daqMappingCollection.getObjects()) {
 
             this.printDebug("Sensor: \n" + daqMapping.toString());
 
@@ -78,13 +79,13 @@
 
             // Check that the Hybrid ID is within the allowable limits
             final int hybridID = daqMapping.getHybridID();
-            assertTrue("Hybrid ID " + hybridID + " is out of range!",
-                    hybridID >= MIN_HYBRID_ID && hybridID <= MAX_HYBRID_ID);
+            assertTrue("Hybrid ID " + hybridID + " is out of range!", hybridID >= MIN_HYBRID_ID
+                    && hybridID <= MAX_HYBRID_ID);
 
             // Check that the layer number is within the allowable limits
             final int layerNumber = daqMapping.getLayerNumber();
-            assertTrue("The layer number " + layerNumber + " is out of range!",
-                    layerNumber >= MIN_LAYER_NUMBER && layerNumber <= MAX_LAYER_NUMBER);
+            assertTrue("The layer number " + layerNumber + " is out of range!", layerNumber >= MIN_LAYER_NUMBER
+                    && layerNumber <= MAX_LAYER_NUMBER);
 
             totalSensors++;
         }
@@ -95,6 +96,7 @@
 
     /**
      * Print debug message.
+     * 
      * @param debugMessage the message
      */
     private void printDebug(final String debugMessage) {

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use