Print

Print


Author: [log in to unmask]
Date: Thu Apr  2 18:14:47 2015
New Revision: 2660

Log:
Apply changes from CheckStyle warnings.

Added:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java
      - copied, changed from r2659, java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObject.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java
      - copied, changed from r2653, java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/AbstractConditionsObjectConverter.java
      - copied, changed from r2659, java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/package-info.java
Removed:
    java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObject.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java
Modified:
    java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractIdentifier.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObject.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java
    java/trunk/conditions/src/main/java/org/hps/conditions/api/FieldValueMap.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
    java/trunk/conditions/src/main/java/org/hps/conditions/beam/ImportBeamConditionsEngRun.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
    java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannelConstants.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsUtil.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLedCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java
    java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/package-info.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
    java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
    java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	Thu Apr  2 18:14:47 2015
@@ -6,13 +6,11 @@
 
 /**
  * <p>
- * This {@link org.lcsim.util.Driver} can be used to customize the behavior
- * of the {@link DatabaseConditionsManager}.  It allows the setting of a 
- * detector name and run number, as well as other parameters, if the user 
- * wishes to override the default behavior of the conditions system, which
- * is generally activated from LCSim events.  It is not necessary to run this 
- * Driver in order to activate the default database conditions system.  Only 
- * one instance of this Driver should ever be included in a steering file.
+ * This {@link org.lcsim.util.Driver} can be used to customize the behavior of the {@link DatabaseConditionsManager}. It
+ * allows the setting of a detector name and run number, as well as other parameters, if the user wishes to override the
+ * default behavior of the conditions system, which is generally activated from LCSim events. It is not necessary to run
+ * this Driver in order to activate the default database conditions system. Only one instance of this Driver should ever
+ * be included in a steering file.
  * <p>
  * This is an example of using the Driver in an XML steering file:
  * <pre>
@@ -25,89 +23,97 @@
  *     <freeze>true</freeze>
  * </driver>
  * }
- * </pre> 
+ * </pre>
  * <p>
- * This is a "special" Driver which must have its initialization occur at the right time.
- * It has a custom initialization method {@link #initialize()} which should be called after 
- * all Driver setup has occurred, but before the job actually begins.  This is so the conditions 
- * system functions properly, including the activation of registered listeners.  The setup is 
- * performed by in the class {@link org.hps.job.JobManager}, which is used in the 
- * default command line front end of the hps-distribution.  If that class is not being used, then
- * the method must be executed manually at the right time to achieve the proper behavior.
+ * This is a "special" Driver which must have its initialization occur at the right time. It has a custom initialization
+ * method {@link #initialize()} which should be called after all Driver setup has occurred, but before the job actually
+ * begins. This is so the conditions system functions properly, including the activation of registered listeners. The
+ * setup is performed by in the class {@link org.hps.job.JobManager}, which is used in the default command line front
+ * end of the hps-distribution. If that class is not being used, then the method must be executed manually at the right
+ * time to achieve the proper behavior.
  *
- * @author Jeremy McCormick <[log in to unmask]>
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public class ConditionsDriver extends Driver {
 
-    String detectorName = null;
-    String tag = null;
-    String xmlConfigResource = null;
-    int runNumber = 0;
-    boolean freeze;    
-    
+    /** The name of the detector model. */
+    private String detectorName;
+
+    /** The conditions system tag. */
+    private String tag;
+
+    /** The XML config resource. */
+    private String xmlConfigResource;
+
+    /** The user run number. */
+    private int runNumber = 0;
+
+    /**
+     * True to freeze the conditions system after activation (requires valid detector name and run number).
+     */
+    private boolean freeze;
+
     /**
      * Default constructor.
      */
     public ConditionsDriver() {
     }
-    
+
     /**
      * Set the name of the detector to use.
      * @param detectorName The name of the detector.
      */
-    public void setDetectorName(String detectorName) {
+    public final void setDetectorName(final String detectorName) {
         this.detectorName = detectorName;
     }
-        
+
     /**
-     * Set whether or not the conditions system should be "frozen" after the 
-     * detector name and run number are set.  When frozen, the conditions system
-     * will ignore subsequent calls to {@link org.lcsim.conditions.ConditionsManager#setDetector(String, int)}
-     * and instead use the user supplied detector and run for the whole job.
+     * Set whether or not the conditions system should be "frozen" after the detector name and run number are set. When
+     * frozen, the conditions system will ignore subsequent calls to
+     * {@link org.lcsim.conditions.ConditionsManager#setDetector(String, int)} and instead use the user supplied
+     * detector and run for the whole job.
      * @param freeze True to freeze the conditions system after it is setup.
      */
-    public void setFreeze(boolean freeze) {
+    public final void setFreeze(final boolean freeze) {
         this.freeze = freeze;
     }
-        
+
     /**
-     * Set a custom run number to setup the conditions system.
-     * In the case where the actual event stream has run numbers that differ from this one,
-     * most likely the Driver should be configured to be frozen after setup using
-     * {@link #setFreeze(boolean)}.  
-     * 
-     * The method {@link #setDetectorName(String)} needs to be called before this one
-     * or an exception will be thrown.
+     * Set a custom run number to setup the conditions system. In the case where the actual event stream has run numbers
+     * that differ from this one, most likely the Driver should be configured to be frozen after setup using
+     * {@link #setFreeze(boolean)}.
+     *
+     * The method {@link #setDetectorName(String)} needs to be called before this one or an exception will be thrown.
      * @param runNumber The user supplied run number for the job.
      */
-    public void setRunNumber(int runNumber) {
+    public final void setRunNumber(final int runNumber) {
         this.runNumber = runNumber;
-    }            
-    
+    }
+
     /**
      * Set a tag used to filter ConditionsRecords.
      * @param tag The tag value e.g. "eng_run" etc.
      */
-    public void setTag(String tag) {
+    public final void setTag(final String tag) {
         this.tag = tag;
     }
-    
+
     /**
      * Set an XML configuration resource.
      * @param xmlConfigResource The XML configuration resource.
      */
-    public void setXmlConfigResource(String xmlConfigResource) {
+    public final void setXmlConfigResource(final String xmlConfigResource) {
         this.xmlConfigResource = xmlConfigResource;
     }
-    
+
     /**
      * Setup the conditions system based on the Driver parameters.
      * @throws RuntimeException If there is a problem setting up the conditions system.
      */
-    public void initialize() {
-        
-        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
-        
+    public final void initialize() {
+
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+
         if (xmlConfigResource != null) {
             // Set a custom XML configuration resource.
             conditionsManager.setXmlConfig(xmlConfigResource);

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractIdentifier.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractIdentifier.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractIdentifier.java	Thu Apr  2 18:14:47 2015
@@ -3,20 +3,21 @@
 /**
  * This class is a simplistic representation of a packaged identifier for use in
  * the conditions system.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
- * 
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public abstract class AbstractIdentifier {
 
     /**
      * Encode the ID into a long.
+     *
      * @return The ID encoded into a long.
      */
     public abstract long encode();
 
     /**
      * Check if the ID is valid.
+     *
      * @return True if valid.
      */
     public abstract boolean isValid();

Copied: java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java (from r2659, java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObject.java)
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObject.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java	Thu Apr  2 18:14:47 2015
@@ -3,60 +3,138 @@
 import java.util.Map.Entry;
 
 /**
- * The abstract implementation of {@link ConditionsObject}.
- * @author Jeremy McCormick <[log in to unmask]>
+ * The basic implementation of {@link ConditionsObject}.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-public abstract class AbstractConditionsObject implements ConditionsObject {
+public class BaseConditionsObject implements ConditionsObject {
 
-    protected int rowId = -1;
-    protected FieldValueMap fieldValues;
+    /**
+     * The database row ID.
+     */
+    private int rowID = -1;
 
-    /** 
+    /**
+     * The map of field-value pairs.
+     */
+    private FieldValueMap fieldValues;
+
+    /**
      * Constructor for sub-classing.
      */
-    protected AbstractConditionsObject() {
+    protected BaseConditionsObject() {
         fieldValues = new FieldValueMap();
     }
 
-    public int getRowId() {
-        return rowId;
+    /**
+     * Get the row ID of this object.
+     * <p>
+     * Implements {@link ConditionsObject#getRowId()}.
+     *
+     * @return The row ID.
+     */
+    @Override
+    public final int getRowId() {
+        return rowID;
     }
 
-    public boolean isNew() {
-        return rowId == -1;
+    /**
+     * True if object is new e.g. not in the database.
+     * <p>
+     * Implements {@link ConditionsObject#isNew()}.
+     *
+     * @return True if object is new.
+     */
+    @Override
+    public final boolean isNew() {
+        return rowID == -1;
     }
 
-   
-    public void setFieldValue(String key, Object value) {
+    /**
+     * 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);
     }
 
-    public void setFieldValues(FieldValueMap fieldValues) {
+    /**
+     * 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) {
         this.fieldValues = fieldValues;
     }
 
-    public <T> T getFieldValue(Class<T> klass, String field) {
+    /**
+     * 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 generic type for inferrence 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));
     }
-    
-    public FieldValueMap getFieldValues() {
+
+    /**
+     * 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 <T> T getFieldValue(String field) {
+    public final <T> T getFieldValue(final String field) {
         return (T) fieldValues.get(field);
     }
 
-    public void setRowId(int rowId) throws ConditionsObjectException {
+    /**
+     * 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;
+        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.
+     */
     public String toString() {
-        StringBuffer sb = new StringBuffer();
+        final StringBuffer sb = new StringBuffer();
         sb.append(this.getRowId());
         sb.append('\t');
         for (Entry<String, Object> entries : this.getFieldValues().entrySet()) {
@@ -65,4 +143,4 @@
         }
         return sb.toString();
     }
-}
+}

Copied: java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java (from r2653, java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java)
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/AbstractConditionsObjectCollection.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java	Thu Apr  2 18:14:47 2015
@@ -14,76 +14,98 @@
 
 /**
  * This class implements a collection API for ConditionsObjects, using a <code>LinkedHashSet</code>.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  * @param <ObjectType> The concrete type of the collection class.
  */
 @SuppressWarnings("serial")
-public abstract class AbstractConditionsObjectCollection<ObjectType extends ConditionsObject> extends LinkedHashSet<ObjectType> implements ConditionsObjectCollection<ObjectType> {
-
-    protected TableMetaData tableMetaData = null;
-    protected int collectionId = -1;
-    protected 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 AbstractConditionsObjectCollection() {
-    }
-    
-    /**
-     * This constructor uses the given conditions record and table meta data objects and will assign
-     * the collection ID from the conditions record.
-     * @param conditionsRecord
-     * @param tableMetaData
-     */
-    public AbstractConditionsObjectCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) {
+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.collectionID = conditionsRecord.getCollectionId();
+    }
+
     /**
      * This constructor is used to explicitly assign all class variable values.
-     * @param conditionsRecord
-     * @param tableMetaData
-     * @param collectionID
-     */
-    public AbstractConditionsObjectCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData, int collectionID) {
+     *
+     * @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
-     */
-    public void setTableMetaData(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
-     */
-    public void setConditionsRecord(ConditionsRecord conditionsRecord) {
+
+    /**
+     * 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.
-     */
-    public boolean add(ObjectType object) {
+     * <p>
+     * Implements {@link ConditionsObjectCollection#add(Object)}.
+     *
+     * @param object The object do add to the collection.
+     * @return True if the add operation succeeded.
+     */
+    public boolean add(final ObjectType object) {
         if (contains(object)) {
             throw new IllegalArgumentException("Cannot add duplicate object " + object + " to collection.");
         }
@@ -92,92 +114,136 @@
 
     /**
      * Get the table meta data.
-     * @return
-     */
-    public TableMetaData getTableMetaData() {
+     * <p>
+     * Implements {@link ConditionsObjectCollection#getTableMetaData()}.
+     *
+     * @return The table meta data for the collection.
+     */
+    @Override
+    public final TableMetaData getTableMetaData() {
         return tableMetaData;
     }
 
     /**
      * Get the collection ID.
-     * @return 
-     */
-    public int getCollectionId() {
+     * <p>
+     * Implements {@link ConditionsObjectCollection#getCollectionId()}.
+     *
+     * @return The collection ID.
+     */
+    @Override
+    public final int getCollectionId() {
         if (conditionsRecord != null) {
-            return conditionsRecord.getCollectionId(); 
+            return conditionsRecord.getCollectionId();
         } else {
-            return collectionId;
-        }
-    }
-    
+            return collectionID;
+        }
+    }
+
     /**
      * Get the conditions record.
-     * @return
-     */
-    public ConditionsRecord getConditionsRecord() {
+     * <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 assign again, which will cause an exception.
-     * @param collectionId
-     * @throws ConditionsObjectException
-     */
-    public void setCollectionId(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;
-    }
-        
-    public void insert() throws ConditionsObjectException, SQLException {        
-        // TODO: First check here if conditions record and/or collection ID is assigned already, 
-        //       in which case an error should be thrown as this is not a new collection.        
+
+    /**
+     * 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);
     }
-    
-    // Should select records into this collection by collection ID.
-    public int select() {
+
+    /**
+     * Select objects into this collection from the database.
+     * <p>
+     * Implements {@link ConditionsObjectCollection#select()}.
+     *
+     * @return The number of records selected.
+     */
+    @Override
+    public final int select() {
         throw new UnsupportedOperationException("The select operation is not implemented yet.");
     }
-    
-    // Should delete all records by collection ID in the database and then clear the local objects. 
+
+    /**
+     * Delete the collection's object's from the database.
+     * <p>
+     * Implements {@link ConditionsObjectCollection#delete()}.
+     *
+     * @return The number of objects deleted.
+     */
+    @Override
     public int delete() {
         throw new UnsupportedOperationException("The delete operation is not implemented yet.");
     }
-    
-    // Should update objects in the database with their values from this collection.
-    // All objects would need to have valid row IDs for this to work.
-    public int update() {
+
+    /**
+     * Update the collection's objects in the database.
+     * <p>
+     * Implements {@link ConditionsObjectCollection#update()}.
+     *
+     * @return The number of records updated.
+     */
+    @Override
+    public final int update() {
         throw new UnsupportedOperationException("The update operation is not implemented yet.");
     }
-    
-    /**
-     * Convert object to string.
+
+    /**
+     * Convert this object to a string.
+     * @return The object converted to a string.
      */
     public String toString() {
-        // TODO: Should print out column headers here if available from meta data.
-        StringBuffer buffer = new StringBuffer();
+        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 value is invalid.
      */
-    public ObjectType get(int index) {
+    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;
-        Iterator<ObjectType> iterator = this.iterator();
+        final Iterator<ObjectType> iterator = this.iterator();
         ObjectType object = iterator.next();
         while (current != index && iterator.hasNext()) {
             object = iterator.next();
@@ -185,50 +251,61 @@
         }
         return object;
     }
-    
+
     /**
      * Sort the collection in place.
+     *
      * @param comparator The comparator to use for sorting.
      */
-    public void sort(Comparator<ObjectType> comparator) {
-        List<ObjectType> objects = new ArrayList<ObjectType>(this);
+    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 AbstractConditionsObjectCollection<ObjectType> sorted(Comparator<ObjectType> comparator) {
-        List<ObjectType> objects = new ArrayList<ObjectType>(this);
+    public BaseConditionsObjectCollection<ObjectType> sorted(final Comparator<ObjectType> comparator) {
+        final List<ObjectType> objects = new ArrayList<ObjectType>(this);
         Collections.sort(objects, comparator);
-        AbstractConditionsObjectCollection<ObjectType> collection = null;
+        BaseConditionsObjectCollection<ObjectType> collection = null;
         try {
-            collection = (AbstractConditionsObjectCollection<ObjectType>) getClass().newInstance();
+            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() {
-        AbstractConditionsObjectCollection<ObjectType> sortedCollection = sorted();
+        final BaseConditionsObjectCollection<ObjectType> sortedCollection = sorted();
         this.clear();
         this.addAll(sortedCollection);
     }
-    
-    public AbstractConditionsObjectCollection<ObjectType> sorted() {
-        List<ObjectType> objects = new ArrayList<ObjectType>(this);
+
+    /**
+     * Create and return a sorted collection, leaving the original collection unsorted.
+     * @return The sorted collection.
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public BaseConditionsObjectCollection<ObjectType> sorted() {
+        final List<ObjectType> objects = new ArrayList<ObjectType>(this);
         Collections.sort(objects, new DefaultConditionsObjectComparator());
-        AbstractConditionsObjectCollection<ObjectType> collection = null;
+        BaseConditionsObjectCollection<ObjectType> collection = null;
         try {
-            // FIXME: This is kind of ugly.
-            collection = (AbstractConditionsObjectCollection<ObjectType>) getClass().newInstance();
+            collection = ((BaseConditionsObjectCollection<ObjectType>) getClass().newInstance());
         } catch (InstantiationException | IllegalAccessException e) {
             throw new RuntimeException(e);
         }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObject.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObject.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObject.java	Thu Apr  2 18:14:47 2015
@@ -3,71 +3,89 @@
 import java.util.Comparator;
 
 /**
- * This is an ORM interface for accessing conditions database information by
- * row. It can handle new or existing records. The row ID values for new records are
- * -1 which indicates they are not in the database yet.
- * @author Jeremy McCormick <[log in to unmask]>
+ * 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.
+     * Get the row ID of this object, which will be -1 for records not in the database.
+     *
      * @return The database row ID.
      */
     int getRowId();
 
     /**
-     * Generic set method for field values. This will set the object to the
-     * 'dirty' state.
-     * @param fieldName The name of the field.
-     * @param fieldValue The field value.
+     * Set the value of a field.
+     *
+     * @param field The name of the field.
+     * @param value The field value.
      */
     void setFieldValue(String field, Object value);
 
     /**
      * Set all of the field values on this object.
-     * @param fieldValues The FieldValueMap containing pairs of names and
-     *            values.
+     *
+     * @param fieldValues The map containing pairs of field names and values.
      */
     void setFieldValues(FieldValueMap fieldValues);
-    
+
     /**
      * Get the map of field values.
+     *
      * @return The <code>FieldValueMap</code>.
      */
     FieldValueMap getFieldValues();
 
     /**
      * Get a field value, cast to the given class.
+     *
      * @param field The field value.
+     * @param type The class of the field.
+     * @param <T> The inferred type of the field.
      * @return The field value casted to type T.
      */
-    public <T> T getFieldValue(Class<T> type, String field);
+    <T> T getFieldValue(Class<T> type, String field);
 
     /**
      * 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.
      */
-    public <T> T getFieldValue(String field);
+    <T> T getFieldValue(String field);
 
     /**
-     * Set the row ID of this object. This cannot be reset once set to a valid
-     * ID (e.g. not -1).
+     * Set the row ID of this object. This cannot be reset once set to a valid ID (e.g. not -1).
+     *
      * @param rowId The object's row ID.
      * @throws ConditionsObjectException if already set
      */
-    public void setRowId(int rowId) throws ConditionsObjectException;
-    
+    void setRowID(int rowId) throws ConditionsObjectException;
+
     /**
-     * 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 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 True if record is new.
      */
-    public boolean isNew();
-    
+    boolean isNew();
+
+    /**
+     * Default comparator for this interface which uses row ID.
+     */
     static class DefaultConditionsObjectComparator implements Comparator<ConditionsObject> {
-        public int compare(ConditionsObject o1, ConditionsObject o2) {
+
+        /**
+         * 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()) {
@@ -75,6 +93,6 @@
             } else {
                 return 0;
             }
-        }        
+        }
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	Thu Apr  2 18:14:47 2015
@@ -1,6 +1,3 @@
-/**
- * 
- */
 package org.hps.conditions.api;
 
 import java.sql.SQLException;
@@ -10,66 +7,105 @@
 import org.hps.conditions.database.TableMetaData;
 
 /**
- * @author Jeremy McCormick <[log in to unmask]>
+ * 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.
  */
+// TODO: Rename to ConditionsObjectSet.
 public interface ConditionsObjectCollection<ObjectType extends ConditionsObject> extends Set<ObjectType> {
 
     /**
      * Get the table meta data.
-     * @return
+     *
+     * @return The table meta data.
      */
-    public TableMetaData getTableMetaData();
+    TableMetaData getTableMetaData();
 
     /**
      * Get the collection ID.
-     * @return
+     *
+     * @return The collection ID.
      */
-    public int getCollectionId();
-    
+    int getCollectionId();
+
     /**
      * Get the conditions record.
-     * @return
+     *
+     * @return The conditions record.
      */
-    public ConditionsRecord getConditionsRecord();
-        
+    ConditionsRecord getConditionsRecord();
+
     /**
-     * Set the collection ID.  
-     * Once set it cannot be assign again, which will cause an exception.
-     * @param collectionId
-     * @throws ConditionsObjectException
+     * 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 is attempted.
      */
-    public void setCollectionId(int collectionId) throws ConditionsObjectException;
-        
-    public void insert() throws ConditionsObjectException, SQLException;
-    
-    public int select();
-    
-    public int delete();
-    
-    public int update();
-    
+    void setCollectionID(int collectionId) throws ConditionsObjectException;
+
     /**
-     * Get an object by index.
+     * 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;
+
+    /**
+     * Select objects into this collection by collection ID.
+     *
+     * @return The number of rows selected.
+     */
+    int select();
+
+    /**
+     * Delete objects in this from the database.
+     *
+     * @return The number of rows deleted.
+     */
+    int delete();
+
+    /**
+     * Update rows in the database from these objects.
+     *
+     * @return The number of rows updated.
+     */
+    int update();
+
+    /**
+     * 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 invalid.
      */
-    public ObjectType get(int index);
-    
+    ObjectType get(int index);
+
     /**
      * Sort the collection in place.
+     *
      * @param comparator The comparator to use for sorting.
      */
-    public void sort(Comparator<ObjectType> comparator);
-    
+    void sort(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.
      */
-    public AbstractConditionsObjectCollection<ObjectType> sorted(Comparator<ObjectType> comparator);
-    
-    public void sort();
-    
-    public AbstractConditionsObjectCollection<ObjectType> sorted();
+    BaseConditionsObjectCollection<ObjectType> sorted(Comparator<ObjectType> comparator);
+
+    /**
+     * Sort the collection in place.
+     */
+    void sort();
+
+    /**
+     * Get a new sorted collection.
+     *
+     * @return The new sorted collection.
+     */
+    BaseConditionsObjectCollection<ObjectType> sorted();
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectException.java	Thu Apr  2 18:14:47 2015
@@ -2,28 +2,52 @@
 
 
 /**
- * Generic Exception type throw by methods of {@link ConditionsObject} or other
- * associated classes such as converters and collections.
+ * Thrown by methods of {@link ConditionsObject} or other associated classes
+ * such as converters and collections.
  */
 @SuppressWarnings("serial")
 public final class ConditionsObjectException extends Exception {
 
-    ConditionsObject object;
+    /**
+     * The associated conditions object to the error.
+     */
+    private ConditionsObject object;
 
-    public ConditionsObjectException(String message) {
+    /**
+     * Error with a message.
+     *
+     * @param message The error message.
+     */
+    public ConditionsObjectException(final String message) {
         super(message);
     }
-    
-    public ConditionsObjectException(String message, Throwable cause) {
+
+    /**
+     * Error with an associated throwable.
+     *
+     * @param message The error message.
+     * @param cause The error's cause.
+     */
+    public ConditionsObjectException(final String message, final Throwable cause) {
         super(message, cause);
     }
 
-    public ConditionsObjectException(String message, ConditionsObject object) {
+    /**
+     * Error with a message and object.
+     *
+     * @param message The error message.
+     * @param object The associated conditions object.
+     */
+    public ConditionsObjectException(final String message, final ConditionsObject object) {
         super(message);
         this.object = object;
     }
 
+    /**
+     * Get the associated conditions object to the error.
+     * @return The object associated with the error.
+     */
     public ConditionsObject getConditionsObject() {
         return object;
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	Thu Apr  2 18:14:47 2015
@@ -13,44 +13,51 @@
 
 /**
  * This is a collection of utility methods for {@link ConditionsObject}.
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class ConditionsObjectUtilities {
-    
-    private ConditionsObjectUtilities() {       
+
+    /**
+     * Do not allow class to be instantiated.
+     */
+    private ConditionsObjectUtilities() {
     }
-    
+
     /**
      * Get the list of table names for the class.
+     *
      * @param type The class.
      * @return The list of table names.
      */
-    public static String[] getTableNames(Class<? extends ConditionsObject> type) {
-        Table tableAnnotation = type.getAnnotation(Table.class);
+    public static String[] getTableNames(final Class<? extends ConditionsObject> type) {
+        final Table tableAnnotation = type.getAnnotation(Table.class);
         if (tableAnnotation != null) {
-            return tableAnnotation.names(); 
+            return tableAnnotation.names();
         } else {
-            return new String[]{};
+            return new String[] {};
         }
     }
-    
+
     /**
      * 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(Class<? extends ConditionsObject> type) {
-        Set<String> fieldNames = new HashSet<String>();
+    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.");
+                            throw new RuntimeException("The method " + type.getName() + "." + method.getName()
+                                    + " has a Field annotation but is not public.");
                         }
-                        Field field = (Field) annotation;
+                        final Field field = (Field) annotation;
                         for (String fieldName : field.names()) {
-                            if (fieldName != null && !fieldName.equals("")) {
+                            if (fieldName != null && !("".equals(fieldName))) {
                                 fieldNames.add(fieldName);
                             }
                         }
@@ -60,33 +67,38 @@
         }
         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 AbstractConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(Class<? extends ConditionsObject> type) {
-        String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
+    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 (!AbstractConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass))
-            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName() + " does not extend ConditionsObjectCollection.");
-        return (Class<? extends AbstractConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
+        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() {
-        Reflections reflections = new Reflections("org.hps.conditions");    
-        Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
+        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;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsRecord.java	Thu Apr  2 18:14:47 2015
@@ -17,134 +17,222 @@
 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 specific collection of conditions
- * objects.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This class represents a single record from the primary conditions data table, which defines the validity range for a
+ * specific collection of conditions objects.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-@Table(names = {"conditions"})
+@Table(names = { "conditions" })
 @Converter(converter = ConditionsRecordConverter.class)
-public final class ConditionsRecord extends AbstractConditionsObject {
-    
+public final class ConditionsRecord extends BaseConditionsObject {
+
     /**
      * The concrete collection implementation, including sorting utilities.
      */
-    public static class ConditionsRecordCollection extends AbstractConditionsObjectCollection<ConditionsRecord> {
-        
+    @SuppressWarnings("serial")
+    public static class ConditionsRecordCollection extends BaseConditionsObjectCollection<ConditionsRecord> {
+
         /**
          * Sort using a comparator and leave the original collection unchanged.
-         * @param comparator
-         * @return
-         */
-        public ConditionsRecordCollection sorted(Comparator<ConditionsRecord> comparator) {
-            List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
+         *
+         * @param comparator The comparison to use for sorting.
+         * @return The sorted collection.
+         */
+        public final ConditionsRecordCollection sorted(final Comparator<ConditionsRecord> comparator) {
+            final List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
             Collections.sort(list, comparator);
-            ConditionsRecordCollection collection = new ConditionsRecordCollection();
+            final ConditionsRecordCollection collection = new ConditionsRecordCollection();
             collection.addAll(list);
             return collection;
         }
-        
-        public ConditionsRecordCollection sortedByUpdated() {
+
+        /**
+         * Sort and return collection by updated date.
+         *
+         * @return The sorted collection.
+         */
+        public final ConditionsRecordCollection sortedByUpdated() {
             return sorted(new UpdatedComparator());
         }
-        
-        public ConditionsRecordCollection sortedByCreated() {
+
+        /**
+         * Sort and return collection by creation date.
+         *
+         * @return The sorted collection.
+         */
+        public final ConditionsRecordCollection sortedByCreated() {
             return sorted(new CreatedComparator());
         }
-        
-        public ConditionsRecordCollection sortedByRunStart() {
+
+        /**
+         * Sort and return by run start number.
+         *
+         * @return The sorted collection.
+         */
+        public final ConditionsRecordCollection sortedByRunStart() {
             return sorted(new RunStartComparator());
         }
-        
-        public ConditionsRecordCollection sortedByKey() {
+
+        /**
+         * Sort and return by key (table name).
+         *
+         * @return The sorted collection.
+         */
+        public final ConditionsRecordCollection sortedByKey() {
             return sorted(new KeyComparator());
         }
-        
+
         /**
          * Sort the collection in place.
-         * @param comparator
-         */
-        public void sort(Comparator<ConditionsRecord> comparator) {
-            List<ConditionsRecord> list = new ArrayList<ConditionsRecord>(this);
+         *
+         * @param comparator The comparison to use for sorting.
+         */
+        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);
         }
-        
-        public void sortByUpdated() {
+
+        /**
+         * Sort in place by updated date.
+         */
+        public final void sortByUpdated() {
             this.sort(new UpdatedComparator());
         }
-        
-        public void sortByCreated() {
+
+        /**
+         * Sort in place by creation date.
+         */
+        public final void sortByCreated() {
             sort(new CreatedComparator());
         }
-        
-        public void sortByRunStart() {
+
+        /**
+         * Sort in place by run start.
+         */
+        public final void sortByRunStart() {
             sort(new RunStartComparator());
         }
-        
-        public void sortByKey() {
+
+        /**
+         * Sort in place by key.
+         */
+        public final void sortByKey() {
             sort(new KeyComparator());
-        }               
-        
-        public Set<String> getConditionsKeys() {
-            Set<String> conditionsKeys = new HashSet<String>();
+        }
+
+        /**
+         * Get the unique conditions keys from the records in this collection.
+         *
+         * @return The set of unique conditions keys.
+         */
+        public final Set<String> getConditionsKeys() {
+            final Set<String> conditionsKeys = new HashSet<String>();
             for (ConditionsRecord record : this) {
                 conditionsKeys.add(record.getName());
             }
             return conditionsKeys;
         }
-        
+
+        /**
+         * Compare conditions records by run start.
+         */
         private static class RunStartComparator implements Comparator<ConditionsRecord> {
+            /**
+             * Compare the run start numbers of two conditions records.
+             * @param c1 The first conditions record.
+             * @param c2 The second conditions record.
+             * @return -1, 0, or 1 if first run number is less than, equal to, or greater than the second.
+             */
             @Override
-            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
+            public int compare(final ConditionsRecord c1, final ConditionsRecord c2) {
                 if (c1.getRunStart() < c2.getRunStart()) {
                     return -1;
                 } else if (c1.getRunStart() > c2.getRunStart()) {
                     return 1;
-                } 
+                }
                 return 0;
             }
         }
-        
+
+        /**
+         * Compare conditions records by updated date.
+         */
         private static class UpdatedComparator implements Comparator<ConditionsRecord> {
+            /**
+             * Compare the updated dates of two conditions records.
+             * @param c1 The first conditions record.
+             * @param c2 The second conditions record.
+             * @return -1, 0, or 1 if first date is less than, equal to, or greater than the second date.
+             */
             @Override
-            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
-                Date date1 = c1.getUpdated();
-                Date date2 = c2.getUpdated();                
+            public int compare(final ConditionsRecord c1, final ConditionsRecord c2) {
+                final Date date1 = c1.getUpdated();
+                final Date date2 = c2.getUpdated();
                 if (date1.before(date2)) {
                     return -1;
                 } else if (date1.after(date2)) {
                     return 1;
                 }
-                return 0;                
-            }            
-        }
-        
+                return 0;
+            }
+        }
+
+        /**
+         * Compare conditions records by creation date.
+         */
         private static class CreatedComparator implements Comparator<ConditionsRecord> {
+            /**
+             * Compare the creation dates of two conditions records.
+             * @param c1 The first conditions record.
+             * @param c2 The second conditions record.
+             * @return -1, 0, or 1 if first date is less than, equal to, or greater than the second date.
+             */
             @Override
-            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
-                Date date1 = c1.getCreated();
-                Date date2 = c2.getCreated();                
+            public int compare(final ConditionsRecord c1, final ConditionsRecord c2) {
+                final Date date1 = c1.getCreated();
+                final Date date2 = c2.getCreated();
                 if (date1.before(date2)) {
                     return -1;
                 } else if (date1.after(date2)) {
                     return 1;
                 }
-                return 0;                
-            }            
-        }
-        
+                return 0;
+            }
+        }
+
+        /**
+         * Compare conditions records by their key (table name).
+         */
         private static class KeyComparator implements Comparator<ConditionsRecord> {
+            /**
+             * Compare the keys (names) of two conditions records.
+             * @param c1 The first conditions record.
+             * @param c2 The second conditions record.
+             * @return -1, 0, or 1 if first name is less than, equal to, or greater than the second 
+             *         (using alphabetic comparison).
+             */
             @Override
-            public int compare(ConditionsRecord c1, ConditionsRecord c2) {
+            public int compare(final ConditionsRecord c1, final ConditionsRecord c2) {
                 return c1.getName().compareTo(c2.getName());
             }
         }
     }
-    
-    public ConditionsRecord(int collectionId, int runStart, int runEnd, String name, String tableName, String notes, String tag) {
+
+    /**
+     * Create a conditions record with fully qualified constructor.
+     *
+     * @param collectionId The ID of the associated conditions collection.
+     * @param runStart The starting run number.
+     * @param runEnd The ending run number.
+     * @param name The name of the conditions set (usually same as table name).
+     * @param tableName The name of the conditions data table.
+     * @param notes Text notes about this record.
+     * @param tag The conditions tag for grouping this record with others.
+     */
+    public ConditionsRecord(final int collectionId, final int runStart, final int runEnd, final String name,
+            final String tableName, final String notes, final String tag) {
         this.setFieldValue("collection_id", collectionId);
         this.setFieldValue("run_start", runStart);
         this.setFieldValue("run_end", runEnd);
@@ -156,135 +244,153 @@
         this.setFieldValue("created_by", System.getProperty("user.name"));
     }
 
+    /**
+     * Create a "blank" conditions record.
+     */
     public ConditionsRecord() {
     }
-    
-    // TODO: This should eventually be replaced by the generic insert method from the manager (if possible).
+
+    /**
+     * Insert the conditions record into the database.
+     * @throws ConditionsObjectException If there are errors inserting the record.
+     */
     public void insert() throws ConditionsObjectException {
-        if (fieldValues.size() == 0)
+        if (getFieldValues().size() == 0) {
             throw new ConditionsObjectException("There are no field values to insert.");
-        TableMetaData tableMetaData = DatabaseConditionsManager.getInstance().findTableMetaData(ConditionsRecordCollection.class).get(0);
+        }
+        final TableMetaData tableMetaData = DatabaseConditionsManager.getInstance()
+                .findTableMetaData(ConditionsRecordCollection.class).get(0);
         if (tableMetaData == null) {
             throw new ConditionsObjectException("Failed to get meta data for ConditionsRecord.");
         }
-        String query = QueryBuilder.buildInsert(tableMetaData.getTableName(), this.getFieldValues());
-        //System.out.println(query);
-        List<Integer> keys = DatabaseConditionsManager.getInstance().updateQuery(query);
+        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());
         }
-        rowId = keys.get(0);
+        setRowID(keys.get(0));
     }
 
     /**
      * Get the starting run number.
+     *
      * @return The starting run number.
      */
-    @Field(names = {"run_start"})
+    @Field(names = { "run_start" })
     public int getRunStart() {
         return getFieldValue("run_start");
     }
 
     /**
      * Get the ending run number.
+     *
      * @return The ending run number.
      */
-    @Field(names = {"run_end"})
+    @Field(names = { "run_end" })
     public int getRunEnd() {
         return getFieldValue("run_end");
     }
 
     /**
      * Get the date this record was last updated.
+     *
      * @return The date this record was updated.
      */
-    @Field(names = {"updated"})
+    @Field(names = { "updated" })
     public Date getUpdated() {
         return getFieldValue("updated");
     }
 
     /**
      * Get the date this record was created.
+     *
      * @return The date this record was created.
      */
-    @Field(names = {"created"})
+    @Field(names = { "created" })
     public Date getCreated() {
         return getFieldValue("created");
     }
 
     /**
      * Get the name of the user who created this record.
+     *
      * @return The name of the person who created the record.
      */
-    @Field(names = {"created_by"})
+    @Field(names = { "created_by" })
     public String getCreatedBy() {
         return getFieldValue("created_by");
     }
 
     /**
      * Get the notes.
+     *
      * @return The notes about this condition.
      */
-    @Field(names = {"notes"})
+    @Field(names = { "notes" })
     public String getNotes() {
         return getFieldValue("notes");
     }
 
     /**
-     * Get the name of these conditions, which should be unique by run number.
-     * This is called the "key" in the table meta data to distinguish it from
-     * "table name".
+     * Get the name of these conditions, which should be unique by run number. This is called the "key" in the table
+     * meta data to distinguish it from "table name".
+     *
      * @return The name of the conditions.
      */
-    @Field(names = {"name"})
+    @Field(names = { "name" })
     public String getName() {
         return getFieldValue("name");
     }
 
     /**
      * Get the name of the table containing the actual raw conditions data.
+     *
      * @return The name of the table with the conditions data.
      */
-    @Field(names = {"table_name"})
+    @Field(names = { "table_name" })
     public String getTableName() {
         return getFieldValue("table_name");
     }
 
     /**
      * Get the collection ID, overriding this method from the parent class.
+     *
      * @return The collection ID.
      */
-    @Field(names = {"collection_id"})
+    @Field(names = { "collection_id" })
     public int getCollectionId() {
         return getFieldValue("collection_id");
     }
 
     /**
      * Get the string tag associated with these conditions.
+     *
      * @return The string tag.
      */
-    @Field(names = {"tag"})
+    @Field(names = { "tag" })
     public String getTag() {
         return getFieldValue("tag");
     }
 
     /**
      * Convert this record to a human readable string, one field per line.
+     *
      * @return This object represented as a string.
      */
     public String toString() {
-        StringBuffer buff = new StringBuffer();
-        buff.append("id: " + getRowId() + '\n');
-        buff.append("name: " + getName() + '\n');
-        buff.append("runStart: " + getRunStart() + '\n');
-        buff.append("runEnd: " + getRunEnd() + '\n');
-        buff.append("tableName: " + getTableName() + '\n');
-        buff.append("collectionId: " + getCollectionId() + '\n');
-        buff.append("updated: " + getUpdated() + '\n');
-        buff.append("created: " + getCreated() + '\n');
-        buff.append("tag: " + getTag() + '\n');
-        buff.append("createdBy: " + getCreatedBy() + '\n');
-        buff.append("notes: " + getNotes() + '\n');
-        return buff.toString();
-    }
-}
+        final StringBuffer sb = new StringBuffer();
+        sb.append("id: " + getRowId() + '\n');
+        sb.append("name: " + getName() + '\n');
+        sb.append("runStart: " + getRunStart() + '\n');
+        sb.append("runEnd: " + getRunEnd() + '\n');
+        sb.append("tableName: " + getTableName() + '\n');
+        sb.append("collectionId: " + getCollectionId() + '\n');
+        sb.append("updated: " + getUpdated() + '\n');
+        sb.append("created: " + getCreated() + '\n');
+        sb.append("tag: " + getTag() + '\n');
+        sb.append("createdBy: " + getCreatedBy() + '\n');
+        sb.append("notes: " + getNotes() + '\n');
+        return sb.toString();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/ConditionsSeries.java	Thu Apr  2 18:14:47 2015
@@ -2,22 +2,15 @@
 
 import java.util.ArrayList;
 
-
 /**
- * This class represents a series of collections containing
- * <tt>ConditionsObjects</tt>. It is used to conditions collections when there
- * are multiple ones with the same key that are valid for the current run.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This class represents a series of collections containing <tt>ConditionsObjects</tt>. It is used to conditions
+ * collections when there are multiple ones with the same key that are valid for the current run.
+ *
+ * @param <ObjectType> The type of the conditions object.
+ * @param <CollectionType> The type of the conditions collection.
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @SuppressWarnings({ "serial" })
-public class ConditionsSeries<ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>> extends ArrayList<ConditionsObjectCollection<ObjectType>> {
-
-    Class<CollectionType> collectionType;
-    Class<ObjectType> objectType;
-    
-    public ConditionsSeries(Class<ObjectType> objectType, Class<CollectionType> collectionType) {
-        this.collectionType = collectionType;
-        this.objectType = objectType;
-    }
-}
+public class ConditionsSeries<ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>>
+        extends ArrayList<ConditionsObjectCollection<ObjectType>> {
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/api/FieldValueMap.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/FieldValueMap.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/FieldValueMap.java	Thu Apr  2 18:14:47 2015
@@ -4,7 +4,8 @@
 
 /**
  * Simple class extending <code>java.lang.Map</code> that maps field names
- * to values.
+ * to values for conditions objects.
  */
+@SuppressWarnings("serial")
 public final class FieldValueMap extends LinkedHashMap<String, Object> {
 }

Added: java/trunk/conditions/src/main/java/org/hps/conditions/api/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/api/package-info.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/api/package-info.java	Thu Apr  2 18:14:47 2015
@@ -0,0 +1,13 @@
+/**
+ * This package contains interfaces and abstract classes, along with some
+ * implementations, of the database conditions API for HPS.  These classes
+ * include simple ORM between conditions objects and the database.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @see ConditionsObject
+ * @see ConditionsObjectCollection
+ * @see ConditionsSeries
+ * @see ConditionsRecord
+ */
+package org.hps.conditions.api;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamConditions.java	Thu Apr  2 18:14:47 2015
@@ -1,35 +1,38 @@
 package org.hps.conditions.beam;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
 
 /**
- * <p>
  * Beam-related detector conditions, including current, position
  * in X and Y, and energy.
- * <p>  
- * Unless otherwise stated, these are assumed to be average values 
+ * <p>
+ * Unless otherwise stated, these are assumed to be average values
  * for an entire run.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = {"beam"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.ERROR)
-public final class BeamConditions extends AbstractConditionsObject {
-    
+public final class BeamConditions extends BaseConditionsObject {
+
     /**
      * Collection implementation for this class.
      */
-    public final static class BeamConditionsCollection extends AbstractConditionsObjectCollection<BeamConditions> {
+    @SuppressWarnings("serial")
+    public static final class BeamConditionsCollection extends BaseConditionsObjectCollection<BeamConditions> {
     }
-    
+
+    /**
+     * No arg constructor.
+     */
     public BeamConditions() {
     }
-    
+
     /**
      * Get the average beam current (nA).
      * A value of 0 indicates there was no beam.
@@ -40,7 +43,7 @@
     public Double getCurrent() {
         return getFieldValue("current");
     }
-    
+
     /**
      * Get the average beam position in X (mm).
      * @return The beam position (mm).
@@ -49,7 +52,7 @@
     public Double getPositionX() {
         return getFieldValue("position_x");
     }
-    
+
     /**
      * Get the average beam position in Y (mm).
      * @return The beam position (mm).
@@ -58,7 +61,7 @@
     public Double getPositionY() {
         return getFieldValue("position_y");
     }
-    
+
     /**
      * Get the beam energy (GeV).
      * A value of 0 indicates there was no beam.
@@ -68,5 +71,5 @@
     @Field(names = {"energy"})
     public Double getEnergy() {
         return getFieldValue("energy");
-    }        
+    }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/BeamCurrent.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.beam;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -9,13 +9,18 @@
 
 /**
  * This class is a conditions object for integrated beam current values.
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = {"beam_current"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class BeamCurrent extends AbstractConditionsObject {
+public final class BeamCurrent extends BaseConditionsObject {
 
-    public static class BeamCurrentCollection extends AbstractConditionsObjectCollection<BeamCurrent> {
+    /**
+     * Collection implementation for this class.
+     */
+    @SuppressWarnings("serial")
+    public static class BeamCurrentCollection extends BaseConditionsObjectCollection<BeamCurrent> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/beam/ImportBeamConditionsEngRun.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/ImportBeamConditionsEngRun.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/ImportBeamConditionsEngRun.java	Thu Apr  2 18:14:47 2015
@@ -17,93 +17,114 @@
  * <p>
  * Import beam measurements into the database from a text file.
  * <p>
- * This has the format:<br/> 
+ * This has the format:<br/>
  * run current x y
  * <p>
  * The beam energy is hard-coded to 1.92 GeV for now, pending updates with better information.
- *  
+ *
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public final class ImportBeamConditionsEngRun {
 
-    static double beamEnergy = 1.92;
-    static double nullValue = -999.0;
-    
+    /**
+     * Nominal beam energy for Eng Run.
+     */
+    private static final double BEAM_ENERGY = 1.92;
+
+    /**
+     * Null value from the input text file.
+     */
+    private static final double NULL_VALUE = -999.0;
+
+    /**
+     * Class should not be instantiated.
+     */
     private ImportBeamConditionsEngRun() {
     }
-    
-    public static void main(String[] args) throws Exception {
-        
+
+    /**
+     * Import the Eng Run beam conditions from a text file.
+     * @param args The argument list.
+     * @throws Exception If there is an error importing the text file.
+     */
+    public static void main(final String[] args) throws Exception {
+
         if (args.length == 0) {
             throw new RuntimeException("missing file list argument");
         }
-        
-        String fileName = args[0];
+
+        final String fileName = args[0];
         if (!new File(fileName).exists()) {
             throw new IOException("The file " + fileName + " does not exist.");
         }
-        
-        Map<Integer, BeamConditions> beamMap = new LinkedHashMap<Integer, BeamConditions>();
-                
-        BufferedReader reader = new BufferedReader(new FileReader(fileName));
+
+        final Map<Integer, BeamConditions> beamMap = new LinkedHashMap<Integer, BeamConditions>();
+
+        final BufferedReader reader = new BufferedReader(new FileReader(fileName));
         String line;
         while ((line = reader.readLine()) != null) {
-            
-            String[] values = line.split(" "); 
-            
-            BeamConditions beam = new BeamConditions();
-            
+
+            final String[] values = line.split(" ");
+
+            final BeamConditions beam = new BeamConditions();
+
             setValue(beam, "current", values[1]);
             setValue(beam, "position_x", values[2]);
             setValue(beam, "position_y", values[3]);
-                        
+
             if (beam.getFieldValue("current") == null) {
                 // Use null value to indicate beam was not measured.
                 beam.setFieldValue("energy", null);
-            } else if (((Double)beam.getFieldValue("current")) == 0) {
+            } else if (((Double) beam.getFieldValue("current")) == 0) {
                 // Use zero for no beam.
                 beam.setFieldValue("energy", 0);
             } else {
                 // Use nominal beam energy from ECAL commissioning.
-                beam.setFieldValue("energy", beamEnergy);
+                beam.setFieldValue("energy", BEAM_ENERGY);
             }
-                       
+
             beamMap.put(Integer.parseInt(values[0]), beam);
         }
         reader.close();
-        
+
         System.out.println("printing beam conditions parsed from " + fileName + " ...");
         System.out.println("run id current x y energy");
         for (Entry<Integer, BeamConditions> entry : beamMap.entrySet()) {
             System.out.print(entry.getKey() + " ");
             System.out.println(entry.getValue() + " ");
         }
-        
-        DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
+
+        final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
         manager.setLogLevel(Level.ALL);
-        
+
         for (Entry<Integer, BeamConditions> entry : beamMap.entrySet()) {
-            int run = entry.getKey();
-            BeamConditions beam = entry.getValue();
-            int collectionId = manager.getNextCollectionID("beam");
-            ConditionsRecord record = 
+            final int run = entry.getKey();
+            final BeamConditions beam = entry.getValue();
+            final int collectionId = manager.getNextCollectionID("beam");
+            final ConditionsRecord record = 
                     new ConditionsRecord(collectionId, run, run, "beam", "beam", "imported from HPS_Runs.pdf", "eng_run");
             System.out.println(record);
             System.out.println(beam);
-            BeamConditionsCollection collection = new BeamConditionsCollection();
+            final BeamConditionsCollection collection = new BeamConditionsCollection();
             collection.add(beam);
             manager.insertCollection(collection);
             record.insert();
-        }        
+        }
         manager.closeConnection();
-    }    
-    
-    static void setValue(BeamConditions beam, String fieldName, String rawValue) {
-        double value = Double.parseDouble(rawValue);
-        if (value != nullValue) {                
+    }
+
+    /**
+     * Set the value of the beam current.
+     * @param beam The beam conditions object.
+     * @param fieldName The name of the field.
+     * @param rawValue The raw value from the text file.
+     */
+    static void setValue(final BeamConditions beam, final String fieldName, final String rawValue) {
+        final double value = Double.parseDouble(rawValue);
+        if (value != NULL_VALUE) {
             beam.setFieldValue(fieldName, value);
         } else {
             beam.setFieldValue(fieldName, null);
         }
-    }    
-}
+    }
+}

Added: java/trunk/conditions/src/main/java/org/hps/conditions/beam/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/beam/package-info.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/beam/package-info.java	Thu Apr  2 18:14:47 2015
@@ -0,0 +1,6 @@
+/**
+ * Provides access to beam parameters through the conditions system.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+package org.hps.conditions.beam;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/AbstractCommand.java	Thu Apr  2 18:14:47 2015
@@ -8,36 +8,55 @@
 import org.apache.commons.cli.PosixParser;
 
 /**
- * This is the API that sub-commands must implement in the conditions command
- * line interface.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is the API that sub-commands such as 'load' or 'print' must implement
+ * in the conditions command line interface.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 abstract class AbstractCommand {
 
-    String name;
-    String description;
-    Options options = new Options();
-    Parser parser = new PosixParser();
-    CommandLine commandLine;
-    boolean verbose = false;
+    /**
+     * The name of the (sub)command.
+     */
+    private String name;
+
+    /**
+     * The description of the command.
+     */
+    private String description;
+
+    /**
+     * The options this command takes on the command line (Apache CLI).
+     */
+    private final Options options;
+
+    /**
+     * The parser for the options.
+     */
+    private final Parser parser = new PosixParser();
+
+    /**
+     * Verbose setting.
+     */
+    private boolean verbose = false;
 
     /**
      * Class constructor.
      * @param name The string that invokes this command.
      * @param description The description of this command.
+     * @param options The command's options (Apache CLI).
      */
-    AbstractCommand(String name, String description) {
+    AbstractCommand(final String name, final String description, final Options options) {
         this.name = name;
         this.description = description;
-        options.addOption("h", false, "Print help for this command");
+        this.options = options;
     }
 
     /**
      * Get the name of this command.
      * @return A String of the name of this command.
      */
-    String getName() {
+    final String getName() {
         return this.name;
     }
 
@@ -45,7 +64,7 @@
      * Get the description of this command.
      * @return A String of the description of this command.
      */
-    String getDescription() {
+    protected final String getDescription() {
         return this.description;
     }
 
@@ -53,16 +72,15 @@
      * Options for this command.
      * @return Options object for this command.
      */
-    Options getOptions() {
+    protected final Options getOptions() {
         return options;
     }
 
     /**
      * Print the usage of this sub-command.
-     * @param doExit Whether or not to exit after printing usage.
      */
-    void printUsage() {
-        HelpFormatter help = new HelpFormatter();
+    protected final void printUsage() {
+        final HelpFormatter help = new HelpFormatter();
         help.printHelp(getName(), getOptions());
     }
 
@@ -70,16 +88,25 @@
      * Set whether verbose output is enabled.
      * @param verbose True to enable verbose output.
      */
-    void setVerbose(boolean verbose) {
+    final void setVerbose(final boolean verbose) {
         this.verbose = verbose;
     }
 
     /**
-     * Execute the command with the arguments. This is the only method that
-     * sub-classes must implement.
+     * Get verbose flag.
+     * @return The verbose flag.
+     */
+    protected boolean getVerbose() {
+        return verbose;
+    }
+
+    /**
+     * Parse the sub-command's options.
      * @param arguments The sub-command's arguments.
+     * @return The parsed command line.
      */
-    void execute(String[] arguments) {
+    protected final CommandLine parse(final String[] arguments) {
+        CommandLine commandLine = null;
         try {
             commandLine = parser.parse(options, arguments);
         } catch (ParseException e) {
@@ -89,5 +116,12 @@
             this.printUsage();
             System.exit(0);
         }
+        return commandLine;
     }
+
+    /**
+     * The sub-command execution method that should be implemented by sub-classes.
+     * @param arguments The command's argument list.
+     */
+    abstract void execute(final String[] arguments);
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/AddCommand.java	Thu Apr  2 18:14:47 2015
@@ -3,39 +3,61 @@
 import java.io.PrintStream;
 import java.util.Date;
 
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.Option;
+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.database.DatabaseConditionsManager;
 
 /**
- * This is a command for the conditions CLI that will add a conditions record,
- * making a conditions set with a particular collection ID available by 
- * run number via the {@link org.hps.conditions.database.DatabaseConditionsManager}.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is a command for the conditions CLI that will add a conditions record, making a conditions set with a particular
+ * collection ID available by run number via the {@link org.hps.conditions.database.DatabaseConditionsManager}.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public class AddCommand extends AbstractCommand {
-    
-    PrintStream ps = System.out;
-    
+
+    /**
+     * For printing out messages.
+     */
+    private final PrintStream ps = System.out;
+
+    /**
+     * Define command line options.
+     */
+    private static final Options OPTIONS = new Options();
+    static {
+        OPTIONS.addOption(new Option("h", false, "Show help for add command"));
+        OPTIONS.addOption("r", true, "The starting run number (required)");
+        OPTIONS.getOption("r").setRequired(true);
+        OPTIONS.addOption("e", true, "The ending run number (default is starting run number)");
+        OPTIONS.addOption("t", true, "The table name (required)");
+        OPTIONS.getOption("t").setRequired(true);
+        OPTIONS.addOption("c", true, "The collection ID (required)");
+        OPTIONS.getOption("c").setRequired(true);
+        OPTIONS.addOption("T", true, "A tag value (optional)");
+        OPTIONS.addOption("u", true, "Your user name (optional)");
+        OPTIONS.addOption("m", true, "The notes about this conditions set (optional)");
+    }
+
+    /**
+     * Class constructor.
+     */
     AddCommand() {
-        super("add", "Add a conditions record to associate a collection to a run range");
-        options.addOption("r", true, "The starting run number (required)");
-        options.getOption("r").setRequired(true);
-        options.addOption("e", true, "The ending run number (default is starting run number)");
-        options.addOption("t", true, "The table name (required)");
-        options.getOption("t").setRequired(true);
-        options.addOption("c", true, "The collection ID (required)");
-        options.getOption("c").setRequired(true);
-        options.addOption("T", true, "A tag value (optional)");
-        options.addOption("u", true, "Your user name (optional)");
-        options.addOption("m", true, "The notes about this conditions set (optional)");
+        super("add", "Add a conditions record to associate a collection to a run range", OPTIONS);
     }
-       
-    void execute(String[] arguments) {
-        super.execute(arguments);
-        
+
+    /**
+     * Execute the command with the given arguments.
+     *
+     * @param arguments The command line arguments.
+     */
+    final void execute(final String[] arguments) {
+
+        final CommandLine commandLine = parse(arguments);
+
         // This command has 3 required options.
         if (commandLine.getOptions().length == 0) {
             this.printUsage();
@@ -43,13 +65,13 @@
         }
 
         // Run start (required).
-        int runStart;        
+        final int runStart;
         if (commandLine.hasOption("r")) {
             runStart = Integer.parseInt(commandLine.getOptionValue("r"));
         } else {
             throw new RuntimeException("Missing required -r option with run number.");
         }
-        
+
         // Run end.
         int runEnd = runStart;
         if (commandLine.hasOption("e")) {
@@ -62,8 +84,8 @@
             tableName = commandLine.getOptionValue("t");
         } else {
             throw new RuntimeException("Missing required -t argument with table name");
-        }        
-        String name = tableName;
+        }
+        final String name = tableName;
 
         // Collection ID (required).
         int collectionId;
@@ -72,38 +94,31 @@
         } else {
             throw new RuntimeException("Missing required -c argument with collection ID");
         }
-        
+
         // User name.
         String createdBy = System.getProperty("user.name");
         if (commandLine.hasOption("u")) {
             createdBy = commandLine.getOptionValue("u");
         }
-        
+
         // Tag to assign (optional).
         String tag = null;
         if (commandLine.hasOption("T")) {
             tag = commandLine.getOptionValue("T");
         }
-        
+
         // Notes (optional).
         String notes = null;
         if (commandLine.hasOption("m")) {
             notes = commandLine.getOptionValue("m");
         }
-        
+
         // Create the conditions record to insert.
-        ConditionsRecord conditionsRecord = createConditionsRecord(
-                runStart, 
-                runEnd, 
-                tableName, 
-                name, 
-                collectionId, 
-                createdBy, 
-                tag, 
-                notes);       
+        final ConditionsRecord conditionsRecord = createConditionsRecord(runStart, runEnd, tableName, name,
+                collectionId, createdBy, tag, notes);
         try {
             boolean createdConnection = false;
-            DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
+            final DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
             if (!DatabaseConditionsManager.getInstance().isConnected()) {
                 createdConnection = manager.openConnection();
             }
@@ -117,19 +132,23 @@
     }
 
     /**
-     * @param runStart
-     * @param runEnd
-     * @param tableName
-     * @param name
-     * @param collectionId
-     * @param createdBy
-     * @param tag
-     * @param notes
-     * @return
+     * Create a conditions record.
+     *
+     * @param runStart The run start.
+     * @param runEnd The run end.
+     * @param tableName The table name.
+     * @param name The key name.
+     * @param collectionId The collection ID.
+     * @param createdBy The user name.
+     * @param tag The conditions tag.
+     * @param notes The text notes.
+     * @return The new conditions record.
      */
-    private ConditionsRecord createConditionsRecord(int runStart, int runEnd, String tableName, String name, int collectionId, String createdBy, String tag, String notes) {
-        ConditionsRecord conditionsRecord = new ConditionsRecord();
-        FieldValueMap fieldValues = new FieldValueMap();
+    // FIXME: Too many method parameters (max 7 is recommended).
+    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);
@@ -146,4 +165,4 @@
         fieldValues.put("created", new Date());
         return conditionsRecord;
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/CommandLineTool.java	Thu Apr  2 18:14:47 2015
@@ -18,41 +18,74 @@
 import org.lcsim.util.log.LogUtil;
 
 /**
+ * This class is a command-line tool for performing commands on the conditions database using sub-commands for
+ * operations such as 'add' and 'print'.
  * <p>
- * This class is a command-line tool for performing commands on the conditions
- * database. It has sub-commands much like the cvs or svn clients. 
- * <p>
- * Command line options allow a custom connection properties file or XML
- * configuration to be supplied by the user which will override the default.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * Command line options can be used to supply a custom connection properties file or XML which will override the
+ * default.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
+// FIXME: Print outs should use conditions manager's log settings and not boolean verbose flag.
 public class CommandLineTool {
-    
-    static Logger logger = LogUtil.create(CommandLineTool.class.getSimpleName(), new DefaultLogFormatter(), Level.WARNING);
-
-    Options options = new Options();
-    Map<String, AbstractCommand> commands = new HashMap<String, AbstractCommand>();
-    PosixParser parser = new PosixParser();
-    DatabaseConditionsManager conditionsManager;
-    boolean verbose = false;
-
-    public static void main(String[] arguments) {
+
+    /**
+     * Setup logging.
+     */
+    private static final Logger LOGGER = 
+            LogUtil.create(CommandLineTool.class.getSimpleName(), new DefaultLogFormatter(), Level.WARNING);
+
+    /**
+     * The top level options (does not include sub-command options).
+     */
+    private Options options = new Options();
+
+    /**
+     * The map of named command handlers.
+     */
+    private Map<String, AbstractCommand> commands = new HashMap<String, AbstractCommand>();
+
+    /**
+     * The options parser.
+     */
+    private PosixParser parser = new PosixParser();
+
+    /**
+     * The database conditions system manager.
+     */
+    private DatabaseConditionsManager conditionsManager;
+
+    /**
+     * The verbose setting.
+     */
+    private boolean verbose = false;
+
+    /**
+     * The main method for the class.
+     *
+     * @param arguments The command line arguments.
+     */
+    public static void main(final String[] arguments) {
         CommandLineTool.create().run(arguments);
     }
 
-    void run(String[] arguments) {
+    /**
+     * Run the command line tool, parsing the command line and sending arguments to sub-command handlers.
+     *
+     * @param arguments The command line arguments passed directly from {@link #main(String[])}.
+     */
+    private void run(final String[] arguments) {
         try {
             if (arguments.length == 0) {
                 printUsage();
                 exit(0);
             }
-            
+
             CommandLine commandLine = null;
             try {
                 commandLine = parser.parse(options, arguments, true);
             } catch (ParseException e) {
-                logger.log(Level.SEVERE, "error parsing the options", e);
+                LOGGER.log(Level.SEVERE, "error parsing the options", e);
                 printUsage();
                 exit(1);
             }
@@ -64,24 +97,24 @@
 
             // Set verbosity.
             if (commandLine.hasOption("v")) {
-                logger.setLevel(Level.ALL);
-                logger.getHandlers()[0].setLevel(Level.ALL);
+                LOGGER.setLevel(Level.ALL);
+                LOGGER.getHandlers()[0].setLevel(Level.ALL);
                 verbose = true;
-                logger.config("verbose mode enabled");
+                LOGGER.config("verbose mode enabled");
             }
 
             // Setup conditions manager from command line options.
             setupConditionsManager(commandLine);
 
             // Get the sub-command to use.
-            String commandName = commandLine.getArgs()[0];
-            AbstractCommand command = commands.get(commandName);
+            final String commandName = commandLine.getArgs()[0];
+            final AbstractCommand command = commands.get(commandName);
             if (command == null) {
                 throw new IllegalArgumentException("Unknown command " + commandName);
             }
 
             // Copy remaining arguments for sub-command.
-            String[] commandArguments = new String[commandLine.getArgs().length - 1];
+            final String[] commandArguments = new String[commandLine.getArgs().length - 1];
             System.arraycopy(commandLine.getArgs(), 1, commandArguments, 0, commandArguments.length);
 
             // Excecute the sub-command.
@@ -95,89 +128,110 @@
         }
     }
 
-    void setupConditionsManager(CommandLine commandLine) {
-
-        logger.info("setting up conditions manager");
-        
+    /**
+     * Setup the conditions system based on command line arguments.
+     *
+     * @param commandLine The parsed command line arguments.
+     */
+    private void setupConditionsManager(final CommandLine commandLine) {
+
+        LOGGER.info("setting up conditions manager");
+
         // Create new manager.
         conditionsManager = DatabaseConditionsManager.getInstance();
 
         // Set log level.
-        conditionsManager.setLogLevel(logger.getLevel());
+        conditionsManager.setLogLevel(LOGGER.getLevel());
 
         // Connection properties.
         if (commandLine.hasOption("p")) {
-            File connectionPropertiesFile = new File(commandLine.getOptionValue("p"));
+            final File connectionPropertiesFile = new File(commandLine.getOptionValue("p"));
             conditionsManager.setConnectionProperties(connectionPropertiesFile);
-            logger.config("connection properties -p " + connectionPropertiesFile);
-        } 
-        
+            LOGGER.config("connection properties -p " + connectionPropertiesFile);
+        }
+
         // XML config.
         if (commandLine.hasOption("x")) {
-            File xmlConfigFile = new File(commandLine.getOptionValue("x"));
+            final File xmlConfigFile = new File(commandLine.getOptionValue("x"));
             conditionsManager.setXmlConfig(xmlConfigFile);
-            logger.config("XML config -x " + xmlConfigFile);
-        }
-        
+            LOGGER.config("XML config -x " + xmlConfigFile);
+        }
+
         // If there is a run number or detector number then attempt to initialize the conditions system.
         if (commandLine.hasOption("r") || commandLine.hasOption("d")) {
-            
-            logger.config("detector name or run number supplied so manager will be initialized");
+
+            LOGGER.config("detector name or run number supplied so manager will be initialized");
 
             // Set detector name.
             String detectorName = null;
             if (commandLine.hasOption("d")) {
                 detectorName = commandLine.getOptionValue("d");
-                logger.config("detector -d " + detectorName);
+                LOGGER.config("detector -d " + detectorName);
             } else {
                 detectorName = "HPS-ECalCommissioning-v2";
-                logger.config("default detector " + detectorName + " is being used");
+                LOGGER.config("default detector " + detectorName + " is being used");
             }
 
             // Get run number.
             Integer run = null;
             if (commandLine.hasOption("r")) {
                 run = Integer.parseInt(commandLine.getOptionValue("r"));
-                logger.config("run -r " + run);
+                LOGGER.config("run -r " + run);
             } else {
                 run = 0;
-                logger.config("default run number " + run + " is being used");
+                LOGGER.config("default run number " + run + " is being used");
             }
 
             // Setup the conditions manager with user detector name and run number.
             try {
-                logger.config("initializing conditions manager with detector " + detectorName + " and run " + run);
+                LOGGER.config("initializing conditions manager with detector " + detectorName + " and run " + run);
                 DatabaseConditionsManager.getInstance().setDetector(detectorName, run);
-                logger.config("conditions manager initialized successfully");
-                logger.getHandlers()[0].flush();
+                LOGGER.config("conditions manager initialized successfully");
+                LOGGER.getHandlers()[0].flush();
             } catch (ConditionsNotFoundException e) {
                 throw new RuntimeException(e);
             }
         }
     }
 
-    void printUsage() {
-        HelpFormatter help = new HelpFormatter();
-        StringBuffer s = new StringBuffer();
+    /**
+     * Print the usage statement for this tool to the console.
+     */
+    final void printUsage() {
+        final HelpFormatter help = new HelpFormatter();
+        final StringBuffer s = new StringBuffer();
         for (String command : commands.keySet()) {
             s.append(command + '\n');
         }
         help.printHelp("CommandLineTool", "Commands:\n" + s.toString(), options, "");
     }
 
-    void exit(int status) {
+    /**
+     * Exit with the given status.
+     *
+     * @param status The exit status.
+     */
+    private void exit(final int status) {
         System.exit(status);
     }
 
-    void registerCommand(AbstractCommand command) {
+    /**
+     * Register a sub-command handler.
+     * @param command The sub-command handler.
+     */
+    private void registerCommand(final AbstractCommand command) {
         if (commands.containsKey(command.getName())) {
             throw new IllegalArgumentException("There is already a command called " + command.getName());
         }
         commands.put(command.getName(), command);
     }
 
-    static CommandLineTool create() {
-        CommandLineTool cli = new CommandLineTool();
+    /**
+     * Create a basic instance of this class.
+     * @return The instance of this class.
+     */
+    private static CommandLineTool create() {
+        final CommandLineTool cli = new CommandLineTool();
         cli.options.addOption(new Option("h", false, "Print help and exit"));
         cli.options.addOption(new Option("d", true, "Set the detector name"));
         cli.options.addOption(new Option("r", true, "Set the run number"));
@@ -189,4 +243,4 @@
         cli.registerCommand(new AddCommand());
         return cli;
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	Thu Apr  2 18:14:47 2015
@@ -8,42 +8,57 @@
 import java.util.List;
 import java.util.StringTokenizer;
 
+import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.database.QueryBuilder;
 
 /**
+ * This is a sub-command to add conditions data using an input text file. The file should be ASCII text that is tab or
+ * space delimited and includes headers with the names of the database columns. (These must match exactly!) The user
+ * must supply a table name as the target for the SQL insert. An optional collection ID can be supplied, which may not
+ * exist already in the table. Otherwise, the command will fail. By default, the next collection ID will be found by the
+ * conditions manager.
  * <p>
- * This is a sub-command to add conditions data using an input text file. The
- * file should be ASCII text that is tab or space delimited and includes headers
- * with the names of the database columns. (These must match exactly!) The user
- * must supply a table name as the target for the SQL insert. An optional
- * collection ID can be supplied, which may not exist already in the table.
- * Otherwise, the command will fail. By default, the next collection ID will be
- * found by the conditions manager.
- * <p>
- * 
  * <pre>
- * java -cp hps-distribution-bin.jar org.hps.conditions.cli.CommandLineTool -p conditions_dev_local.properties \
- *     load -t scratch_svt_gains -f ./scratch_svt_gains.txt -c 1
+ * java -cp hps-distribution-bin.jar org.hps.conditions.cli.CommandLineTool \
+ *     -p conditions_dev_local.properties load -t scratch_svt_gains -f ./scratch_svt_gains.txt -c 1
  * </pre>
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 class LoadCommand extends AbstractCommand {
 
-    LoadCommand() {
-        super("load", "Load a set of conditions into the database from a text file");
-        this.options.addOption(new Option("t", true, "Set the name of the target table in the database"));
-        this.options.addOption(new Option("c", true, "Set the collection ID of this conditions set"));
-        this.options.addOption(new Option("f", true, "Set the input data file"));
+    /**
+     * Define command options.
+     */
+    private static final Options OPTIONS = new Options();
+    static {
+        OPTIONS.addOption(new Option("h", false, "Show help for load command"));
+        OPTIONS.addOption(new Option("t", true, "Set the name of the target table in the database"));
+        OPTIONS.addOption(new Option("c", true, "Set the collection ID of this conditions set"));
+        OPTIONS.addOption(new Option("f", true, "Set the input data file"));
     }
 
+    /**
+     * Class constructor.
+     */
+    LoadCommand() {
+        super("load", "Load a set of conditions into the database from a text file", OPTIONS);
+    }
+
+    /**
+     * Execute the 'load' command with the given arguments.
+     *
+     * @param arguments The command arguments.
+     */
     @Override
-    public void execute(String[] arguments) {
-        super.execute(arguments);
-               
-        String fileName = commandLine.getOptionValue("f");
+    public void execute(final String[] arguments) {
+
+        final CommandLine commandLine = parse(arguments);
+
+        final String fileName = commandLine.getOptionValue("f");
         if (fileName == null) {
             throw new IllegalArgumentException("Missing file argument.");
         }
@@ -51,47 +66,58 @@
             throw new IllegalArgumentException("Input file does not exist: " + fileName);
         }
 
-        String tableName = commandLine.getOptionValue("t");
+        final String tableName = commandLine.getOptionValue("t");
         if (tableName == null) {
             throw new IllegalArgumentException("Missing table name.");
         }
 
-        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
 
         boolean openedConnection = false;
         if (!conditionsManager.isConnected()) {
             openedConnection = conditionsManager.openConnection();
         }
-        
+
         int collectionID;
         if (commandLine.getOptionValue("c") != null) {
             collectionID = Integer.parseInt(commandLine.getOptionValue("c"));
             if (conditionsManager.collectionExists(tableName, collectionID)) {
-                throw new IllegalArgumentException("The user supplied collection ID " + collectionID + " already exists in this table.");
+                throw new IllegalArgumentException("The user supplied collection ID " + collectionID
+                        + " already exists in this table.");
             }
         } else {
             collectionID = conditionsManager.getNextCollectionID(tableName);
         }
 
-        List<String> columnNames = new ArrayList<String>();
-        List<List<String>> rows = new ArrayList<List<String>>();
+        final List<String> columnNames = new ArrayList<String>();
+        final List<List<String>> rows = new ArrayList<List<String>>();
         parseFile(fileName, columnNames, rows);
 
-        String insertSql = QueryBuilder.buildInsert(tableName, collectionID, columnNames, rows);
-        if (verbose)
+        final String insertSql = QueryBuilder.buildInsert(tableName, collectionID, columnNames, rows);
+        if (getVerbose()) {
             System.out.println(insertSql);
-        // FIXME: This call should go through an object API like ConditionsObjectCollection.insert rather than the manager directly.
-        List<Integer> IDs = conditionsManager.updateQuery(insertSql);
-        System.out.println("Inserted " + IDs.size() + " new rows into table " + tableName + " with collection_id " + collectionID);
+        }
+        // FIXME: This call should go through an object API like ConditionsObjectCollection.insert rather than the
+        // manager directly.
+        final List<Integer> ids = conditionsManager.updateQuery(insertSql);
+        System.out.println("Inserted " + ids.size() + " new rows into table " + tableName + " with collection_id "
+                + collectionID);
         conditionsManager.closeConnection(openedConnection);
     }
 
-    void parseFile(String fileName, List<String> columnNames, List<List<String>> rows) {
-        File inputFile = new File(fileName);
+    /**
+     * Parse an input text file and add column names and row data to the input lists.
+     * @param fileName The name of the text file.
+     * @param columnNames The list of columns (modified by this method).
+     * @param rows The list of rows (modified by this method).
+     */
+    private final void parseFile(final String fileName, final List<String> columnNames, 
+            final List<List<String>> rows) {
+        final File inputFile = new File(fileName);
         BufferedReader reader = null;
         try {
             reader = new BufferedReader(new FileReader(inputFile));
-            String headerLine = reader.readLine();
+            final String headerLine = reader.readLine();
             if (headerLine == null) {
                 throw new IllegalArgumentException("The file is empty.");
             }
@@ -102,7 +128,7 @@
             String line = null;
             while ((line = reader.readLine()) != null) {
                 tokenizer = new StringTokenizer(line, " \t");
-                List<String> row = new ArrayList<String>();
+                final List<String> row = new ArrayList<String>();
                 while (tokenizer.hasMoreTokens()) {
                     row.add(tokenizer.nextToken().trim());
                 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/PrintCommand.java	Thu Apr  2 18:14:47 2015
@@ -9,7 +9,9 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
@@ -17,69 +19,91 @@
 import org.hps.conditions.database.TableMetaData;
 
 /**
- * This sub-command of the conditions CLI prints conditions conditions table data by run number
- * to the console or optionally writes it to an output file.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This sub-command of the conditions CLI prints conditions conditions table data by run number to the console or
+ * optionally writes it to an output file.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 class PrintCommand extends AbstractCommand {
+
+    /**
+     * Print stream for output.
+     */
+    private PrintStream ps = System.out;
+
+    /**
+     * Flag to print row IDs.
+     */
+    private boolean printIDs = false;
+
+    /**
+     * Flag to print out column headers.
+     */
+    private boolean printHeaders = true;
+
+    /**
+     * The field delimiter for print output.
+     */
+    private char fieldDelimiter = ' ';
+
+    /**
+     * Output file if printing to a file.
+     */
+    private File outputFile;
     
-    // By default print to the console.
-    PrintStream ps = System.out;
-    
-    // Print IDs along with field values. 
-    boolean printIDs = false;
-    
-    // Print conditions record and table info (default is yes).
-    boolean printHeaders = true;
-
-    // Field delimited for print out.
-    char fieldDelimiter = ' ';
-    
-    // Output file.
-    File outputFile;
-    
-    DatabaseConditionsManager conditionsManager;
-    
+    /**
+     * Defines command options.
+     */
+    static Options options = new Options();
+    static {
+        options.addOption(new Option("h", false, "Show help for print command"));
+        options.addOption(new Option("t", true, "Set the table name"));
+        options.addOption(new Option("i", false, "Print the ID for the records (off by default)"));
+        options.addOption(new Option("f", true, "Write print output to a file (must be used with -t option)"));
+        options.addOption(new Option("H", false, "Suppress printing of conditions record and table info"));
+        options.addOption(new Option("d", false, "Use tabs for field delimiter instead of spaces"));
+        options.addOption(new Option("T", true, "Specify a conditions tag to use for filtering records"));
+    }
+
+    /**
+     * Class constructor.
+     */
     PrintCommand() {
-        super("print", "Print the table data for a conditions set");
-        this.options.addOption(new Option("t", true, "Set the table name"));
-        this.options.addOption(new Option("i", false, "Print the ID for the records (off by default)"));
-        this.options.addOption(new Option("f", true, "Write print output to a file (must be used with -t option)"));
-        this.options.addOption(new Option("H", false, "Suppress printing of conditions record and table info"));
-        this.options.addOption(new Option("d", false, "Use tabs for field delimiter instead of spaces"));
-        this.options.addOption(new Option("T", true, "Specify a conditions tag to use for filtering records"));
-    }
-    
+        super("print", "Print the table data for a conditions set", options);
+    }
+
     /**
      * Print out the conditions sets selected by the user's command line arguments.
-     */
-    void execute(String[] arguments) {
-        super.execute(arguments);
-        
-        conditionsManager = DatabaseConditionsManager.getInstance();
-        
+     *
+     * @param arguments The command line arguments.
+     */
+    final void execute(final String[] arguments) {
+
+        final CommandLine commandLine = parse(arguments);
+
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+
         if (!conditionsManager.isInitialized()) {
             throw new RuntimeException("conditions system is not initialized");
         }
-        
+
         // User specified tag of conditions records.
-        if (this.commandLine.hasOption("T")) {            
+        if (commandLine.hasOption("T")) {
             conditionsManager.setTag(commandLine.getOptionValue("T"));
         }
-               
+
         // Print conditions sets matching a specific conditions key.
         String userConditionsKey = null;
-        if (this.commandLine.hasOption("t")) {
-            userConditionsKey = this.commandLine.getOptionValue("t");
-        }                
-        
+        if (commandLine.hasOption("t")) {
+            userConditionsKey = commandLine.getOptionValue("t");
+        }
+
         // Setup an output file for the print out if requested.
-        if (this.commandLine.hasOption("f")) {
-            if (!this.commandLine.hasOption("t")) {
+        if (commandLine.hasOption("f")) {
+            if (!commandLine.hasOption("t")) {
                 throw new IllegalArgumentException("An output file may only be specified when using the -t option.");
             }
-            String path = commandLine.getOptionValue("f");
+            final String path = commandLine.getOptionValue("f");
             if (new File(path).exists()) {
                 throw new IllegalArgumentException("File already exists: " + path);
             }
@@ -89,54 +113,62 @@
             } catch (FileNotFoundException e) {
                 throw new IllegalArgumentException(e);
             }
-        }              
-        
+        }
+
         // Print IDs in the output.
-        if (this.commandLine.hasOption("i")) {
+        if (commandLine.hasOption("i")) {
             printIDs = true;
         }
 
-        // Print header info.  Option turns this off.
-        if (this.commandLine.hasOption("h")) {
+        // Print header info. Option turns this off.
+        if (commandLine.hasOption("h")) {
             printHeaders = false;
         }
 
         // Use tabs instead of spaces for field delimiter.
-        if (this.commandLine.hasOption("d")) {
+        if (commandLine.hasOption("d")) {
             fieldDelimiter = '\t';
         }
-                         
-        // List of conditions records to print. 
-        ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
-        
+
+        // List of conditions records to print.
+        final ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
+
         // Did the user specify a table to use?
         if (userConditionsKey == null) {
             System.out.println("printing all conditions");
             // Use all table names if there was not one specified.
             conditionsRecords.addAll(conditionsManager.getConditionsRecords());
-        } else {            
+        } else {
             System.out.println("printing conditions with name: " + userConditionsKey);
             // Get records only for the user specified table name.
             conditionsRecords.addAll(conditionsManager.findConditionsRecords(userConditionsKey));
         }
-        
+
         // Sort the records by key (table name).
         conditionsRecords.sortByKey();
-        
+
         // Get a unique list of keys from the returned conditions records.
-        Set<String> conditionsKeys = conditionsRecords.getConditionsKeys();
-            
+        final Set<String> conditionsKeys = conditionsRecords.getConditionsKeys();
+
         // Print the records and the data.
-        printConditionsRecords(conditionsKeys);   
-        ps.flush();           
+        printConditionsRecords(conditionsKeys);
+        ps.flush();
         ps.close();
-        
+
         if (outputFile != null) {
             System.out.println("wrote collection data to file " + outputFile.getPath());
         }
     }
 
-    private void printConditionsRecords(Set<String> conditionsKeys) {
+    /**
+     * Print out the conditions records either to the console or a file (if that option is enabled).
+     *
+     * @param conditionsKeys The list of conditions keys (usually same as table names).
+     */
+    private void printConditionsRecords(final Set<String> conditionsKeys) {
+
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+
         System.out.print("printing conditions sets: ");
         for (String conditionsKey : conditionsKeys) {
             System.out.print(conditionsKey + " ");
@@ -144,31 +176,35 @@
         System.out.println();
         // Loop over the conditions keys from the conditions records.
         for (String conditionsKey : conditionsKeys) {
-                                   
+
             // The list of collections to print.
-            List<ConditionsObjectCollection<?>> collectionList = new ArrayList<ConditionsObjectCollection<?>>();
-        
+            final List<ConditionsObjectCollection<?>> collectionList = new ArrayList<ConditionsObjectCollection<?>>();
+
             // Get the table meta data for the conditions key.
-            TableMetaData tableMetaData = conditionsManager.findTableMetaData(conditionsKey);
-            
+            final TableMetaData tableMetaData = conditionsManager.findTableMetaData(conditionsKey);
+
             // This shouldn't ever happen but check anyways.
-            if (tableMetaData == null) {            
-                throw new RuntimeException("The table meta data for " + conditionsKey + " does not exist.  The key might be invalid.");
-            }
-                               
+            if (tableMetaData == null) {
+                throw new RuntimeException("The table meta data for " + conditionsKey
+                        + " does not exist.  The key might be invalid.");
+            }
+
             // Use only the single collection which would be seen by a user job for this run number and key.
-            ConditionsObjectCollection<?> collection = conditionsManager.getCachedConditions(
-                    tableMetaData.getCollectionClass(), 
-                    tableMetaData.getTableName()).getCachedData();
-             
+            final ConditionsObjectCollection<?> collection = conditionsManager.getCachedConditions(
+                    tableMetaData.getCollectionClass(), tableMetaData.getTableName()).getCachedData();
+
             collectionList.add(collection);
-        
+
             // Print out all the collection data to console or file.
             printCollections(collectionList);
         }
     }
 
-    private void printCollections(List<ConditionsObjectCollection<?>> collectionList) {
+    /**
+     * Print the list of collections.
+     * @param collectionList The list of collections.
+     */
+    private void printCollections(final List<ConditionsObjectCollection<?>> collectionList) {
         // Loop over all the collections and print them.
         for (ConditionsObjectCollection<?> collection : collectionList) {
             if (printHeaders) {
@@ -177,15 +213,19 @@
             printColumnNames(collection.getTableMetaData());
             printCollection(collection);
             System.out.println();
-        }        
+        }
         ps.flush();
     }
 
-    private void printCollection(ConditionsObjectCollection<?> collection) {
-        StringBuffer buffer = new StringBuffer();
+    /**
+     * Print a single collection.
+     * @param collection The collection.
+     */
+    private void printCollection(final ConditionsObjectCollection<?> collection) {
+        final StringBuffer buffer = new StringBuffer();
         for (Object object : collection) {
             for (String columnName : collection.getTableMetaData().getFieldNames()) {
-                buffer.append(((ConditionsObject)object).getFieldValue(columnName));
+                buffer.append(((ConditionsObject) object).getFieldValue(columnName));
                 buffer.append(fieldDelimiter);
             }
             buffer.setLength(buffer.length() - 1);
@@ -196,7 +236,11 @@
         ps.flush();
     }
 
-    private void printCollectionHeader(ConditionsObjectCollection<?> collection) {        
+    /**
+     * Print the header for a collection.
+     * @param collection The collection.
+     */
+    private void printCollectionHeader(final ConditionsObjectCollection<?> collection) {
         System.out.println("--------------------------------------");
         System.out.print(collection.getConditionsRecord());
         System.out.println("--------------------------------------");
@@ -204,11 +248,15 @@
         System.out.flush();
     }
 
-    private void printColumnNames(TableMetaData tableMetaData) {
+    /**
+     * Print the column names.
+     * @param tableMetaData The table meta data.
+     */
+    private void printColumnNames(final TableMetaData tableMetaData) {
         if (printIDs) {
             ps.print("id");
             ps.print(fieldDelimiter);
-        }                    
+        }
         for (String columnName : tableMetaData.getFieldNames()) {
             ps.print(columnName);
             ps.print(fieldDelimiter);

Added: java/trunk/conditions/src/main/java/org/hps/conditions/cli/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/cli/package-info.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/cli/package-info.java	Thu Apr  2 18:14:47 2015
@@ -0,0 +1,6 @@
+/**
+ * Command line interface to the conditions system.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+package org.hps.conditions.cli;

Copied: java/trunk/conditions/src/main/java/org/hps/conditions/database/AbstractConditionsObjectConverter.java (from r2659, java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java)
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsObjectConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/AbstractConditionsObjectConverter.java	Thu Apr  2 18:14:47 2015
@@ -4,7 +4,7 @@
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
@@ -16,56 +16,66 @@
 
 /**
  * <p>
- * Implementation of default conversion from database tables to a
- * {@link ConditionsObject} class.
+ * Implementation of default conversion from database tables to a {@link ConditionsObject} class.
  * <p>
  * This class actually returns collections and not individual objects.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
- * 
- * @param <T> The type of the returned data which should be a class extending {@link AbstractConditionsObjectCollection}.
+ *
+ * @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 ConditionsObjectConverter<T> implements ConditionsConverter<T> {
-
-    MultipleCollectionsAction multipleCollections;
-    
-    public ConditionsObjectConverter() {
-    }
-    
-    /**
-     * Set the action that the converter will use to disambiguate when multiple 
-     * conditions sets are found.
+public abstract class AbstractConditionsObjectConverter<T> implements ConditionsConverter<T> {
+
+    /**
+     * 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() {
+    }
+
+    /**
+     * Set the action that the converter will use to disambiguate when multiple conditions sets are found.
+     * 
      * @param multipleCollections The multiple collections action.
      */
-    void setMultipleCollectionsAction(MultipleCollectionsAction multipleCollections) {
+    final void setMultipleCollectionsAction(MultipleCollectionsAction multipleCollections) {
         this.multipleCollections = multipleCollections;
     }
-    
-    /** 
+
+    /**
      * Get the multiple collections action.
+     * 
      * @return The multiple collections action.
      */
-    public MultipleCollectionsAction getMultipleCollectionsAction() {
+    public final MultipleCollectionsAction getMultipleCollectionsAction() {
         return this.multipleCollections;
     }
-    
+
     /**
      * Get the specific type converted by this class.
+     * 
      * @return The class that this converter handles.
      */
     public abstract Class<T> getType();
 
     /**
-     * Get the conditions data based on the name, e.g. "ecal_channels".
-     * The table information is found using the type handled by the Converter.
+     * 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.
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public T getData(ConditionsManager conditionsManager, String name) {
-                
+    public T getData(final ConditionsManager conditionsManager, final String name) {
+
         // Get the DatabaseConditionsManager which is required for using this converter.
-        DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) conditionsManager;
-        
+        final DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) conditionsManager;
+
         // Setup connection if necessary.
         boolean reopenedConnection = false;
         if (!databaseConditionsManager.isConnected()) {
@@ -73,21 +83,21 @@
             databaseConditionsManager.openConnection();
             reopenedConnection = true;
         }
-        
+
         // Get the TableMetaData from the table name.
-        TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(name);    
-        
+        final TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(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.
-        ConditionsRecordCollection conditionsRecords = databaseConditionsManager.findConditionsRecords(name);
-                        
+        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.
@@ -96,22 +106,22 @@
         } else if (conditionsRecords.size() == 1) {
             // Use the single conditions set that was found.
             conditionsRecord = conditionsRecords.get(0);
-        } else if (conditionsRecords.size() > 1) {           
+        } else if (conditionsRecords.size() > 1) {
             if (multipleCollections.equals(MultipleCollectionsAction.LAST_UPDATED)) {
                 // Use the conditions set with the latest updated date.
                 conditionsRecord = conditionsRecords.sortedByUpdated().get(conditionsRecords.size() - 1);
-            } else if (multipleCollections.equals(MultipleCollectionsAction.LAST_CREATED)){
+            } else if (multipleCollections.equals(MultipleCollectionsAction.LAST_CREATED)) {
                 // Use the conditions set with the latest created date.
                 conditionsRecord = conditionsRecords.sortedByCreated().get(conditionsRecords.size() - 1);
             } else if (multipleCollections.equals(MultipleCollectionsAction.LATEST_RUN_START)) {
                 // Use the conditions set with the greatest run start value.
                 conditionsRecord = conditionsRecords.sortedByRunStart().get(conditionsRecords.size() - 1);
-            } else if (multipleCollections.equals(MultipleCollectionsAction.ERROR)) {            
+            } else if (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 {
@@ -121,24 +131,24 @@
         }
 
         DatabaseConditionsManager.getLogger().info("loading conditions set..." + '\n' + conditionsRecord);
-                               
+
         // Get the table name.
-        String tableName = conditionsRecord.getTableName();
+        final String tableName = conditionsRecord.getTableName();
 
         // Get the collection ID.
-        int collectionId = conditionsRecord.getCollectionId();
+        final int collectionId = conditionsRecord.getCollectionId();
 
         // Build a select query.
-        String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
+        final String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
 
         // Query the database to get the collection's rows.
-        ResultSet resultSet = databaseConditionsManager.selectQuery(query);
+        final ResultSet resultSet = databaseConditionsManager.selectQuery(query);
 
         try {
             // Loop over the rows.
             while (resultSet.next()) {
                 // Create a new ConditionsObject from this row.
-                ConditionsObject newObject = createConditionsObject(resultSet, tableMetaData);
+                final ConditionsObject newObject = createConditionsObject(resultSet, tableMetaData);
 
                 // Add the object to the collection.
                 collection.add(newObject);
@@ -150,28 +160,30 @@
 
         // Close the Statement and the ResultSet.
         DatabaseUtilities.cleanup(resultSet);
-        
+
         if (reopenedConnection) {
             // Close connection if one was opened.
             databaseConditionsManager.closeConnection();
         }
-        
+
         return (T) collection;
     }
-    
+
     /**
      * Create a conditions object.
+     * 
      * @param resultSet The database record.
      * @param tableMetaData The table data for the object.
      * @return The conditions object.
      * @throws SQLException If there is a problem using the database.
      */
-    static final ConditionsObject createConditionsObject(ResultSet resultSet, TableMetaData tableMetaData) throws SQLException {
-        ResultSetMetaData metaData = resultSet.getMetaData();
-        int rowId = resultSet.getInt(1);
-        int ncols = metaData.getColumnCount();
+    static final ConditionsObject createConditionsObject(final ResultSet resultSet, final TableMetaData tableMetaData)
+            throws SQLException {
+        final ResultSetMetaData metaData = resultSet.getMetaData();
+        final int rowId = resultSet.getInt(1);
+        final int nCols = metaData.getColumnCount();
         FieldValueMap fieldValues = new FieldValueMap();
-        for (int i = 2; i <= ncols; i++) {
+        for (int i = 2; i <= nCols; i++) {
             fieldValues.put(metaData.getColumnName(i), resultSet.getObject(i));
         }
         ConditionsObject newObject = null;
@@ -181,38 +193,44 @@
             throw new RuntimeException(e);
         }
         try {
-            newObject.setRowId(rowId);
+            newObject.setRowID(rowId);
         } catch (ConditionsObjectException e) {
             throw new RuntimeException(e);
         }
         newObject.setFieldValues(fieldValues);
         return newObject;
     }
-    
+
     /**
      * Create a conditions object collection.
-     * @param conditionsRecord The conditions record. 
+     * 
+     * @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 AbstractConditionsObjectCollection<?> createCollection(ConditionsRecord conditionsRecord, TableMetaData tableMetaData) throws ConditionsObjectException {
-        AbstractConditionsObjectCollection<?> collection;
+    static final BaseConditionsObjectCollection<?> createCollection(final ConditionsRecord conditionsRecord,
+            final TableMetaData tableMetaData) throws ConditionsObjectException {
+        BaseConditionsObjectCollection<?> collection;
         try {
             collection = tableMetaData.getCollectionClass().newInstance();
             if (conditionsRecord != null) {
                 collection.setConditionsRecord(conditionsRecord);
                 collection.setTableMetaData(tableMetaData);
-                collection.setCollectionId(conditionsRecord.getCollectionId());
+                collection.setCollectionID(conditionsRecord.getCollectionId());
             }
         } catch (InstantiationException | IllegalAccessException e) {
             throw new ConditionsObjectException("Error creating conditions object collection.", e);
         }
         return collection;
-    }  
-    
+    }
+
+    /**
+     * Convert to string.
+     * @return The string.
+     */
     public String toString() {
-        return "ConditionsObjectConverter: type = " + this.getType() + 
-                ", multipleCollectionsAction = " + this.getMultipleCollectionsAction().toString();
+        return "ConditionsObjectConverter: type = " + this.getType() + ", multipleCollectionsAction = "
+                + this.getMultipleCollectionsAction().toString();
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsRecordConverter.java	Thu Apr  2 18:14:47 2015
@@ -3,47 +3,50 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsRecord.ConditionsRecordCollection;
 import org.lcsim.conditions.ConditionsManager;
 
 /**
- * Read ConditionsRecord objects from the conditions database and cache the conditions set.
- * @author Jeremy McCormick <[log in to unmask]>
+ * Read {@link org.hps.conditions.api.ConditionsRecord} objects from the conditions database.
+ * 
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-public class ConditionsRecordConverter extends ConditionsObjectConverter<ConditionsRecordCollection> {
+public final class ConditionsRecordConverter extends AbstractConditionsObjectConverter<ConditionsRecordCollection> {
 
     /**
-     * Get the ConditionsRecords for a run based on current configuration of the
-     * <code>DatabaseConditionsManager</code>.
+     * Get the ConditionsRecords for a run based on current configuration of the conditions system.
+     * 
      * @param manager The current conditions manager.
      * @param name The name of the conditions set.
      * @return The matching ConditionsRecords.
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    public ConditionsRecordCollection getData(ConditionsManager manager, String name) {
+    public ConditionsRecordCollection getData(final ConditionsManager manager, final String name) {
 
-        DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
-        
+        final DatabaseConditionsManager databaseConditionsManager = DatabaseConditionsManager.getInstance();
+
         // Setup connection if necessary.
         boolean reopenedConnection = false;
         if (!databaseConditionsManager.isConnected()) {
             databaseConditionsManager.openConnection();
             reopenedConnection = true;
         }
-        
-        TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(name);
 
-        if (tableMetaData == null)
+        final TableMetaData tableMetaData = databaseConditionsManager.findTableMetaData(name);
+
+        if (tableMetaData == null) {
             throw new RuntimeException("Failed to find meta data with key " + name);
+        }
 
-        String query = "SELECT * from " + tableMetaData.getTableName() + " WHERE " + "run_start <= " + manager.getRun() + " AND run_end >= " + manager.getRun();
+        final String query = "SELECT * from " + tableMetaData.getTableName() + " WHERE " + "run_start <= "
+                + manager.getRun() + " AND run_end >= " + manager.getRun();
 
-        ResultSet resultSet = databaseConditionsManager.selectQuery(query);
+        final ResultSet resultSet = databaseConditionsManager.selectQuery(query);
 
         // Create a collection to return.
-        AbstractConditionsObjectCollection collection;
+        BaseConditionsObjectCollection collection;
         try {
             collection = tableMetaData.getCollectionClass().newInstance();
         } catch (InstantiationException | IllegalAccessException e) {
@@ -52,29 +55,30 @@
 
         try {
             while (resultSet.next()) {
-                ConditionsObject conditionsRecord = ConditionsObjectConverter.createConditionsObject(resultSet, tableMetaData);
+                final ConditionsObject conditionsRecord = AbstractConditionsObjectConverter.createConditionsObject(resultSet,
+                        tableMetaData);
                 collection.add(conditionsRecord);
             }
         } catch (SQLException x) {
             throw new RuntimeException("Database error", x);
         }
-        
+
         // Close the ResultSet and Statement.
         DatabaseUtilities.cleanup(resultSet);
-        
+
         if (reopenedConnection) {
             databaseConditionsManager.closeConnection();
         }
-        
+
         return getType().cast(collection);
     }
 
     /**
      * Get the type handled by this converter.
-     * @return The type handled by this converter, which is
-     *         <code>ConditionsRecordCollection</code>.
+     * 
+     * @return The type handled by this converter, which is <code>ConditionsRecordCollection</code>.
      */
     public Class<ConditionsRecordCollection> getType() {
         return ConditionsRecordCollection.class;
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConditionsSeriesConverter.java	Thu Apr  2 18:14:47 2015
@@ -12,27 +12,39 @@
 
 /**
  * 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. 
+ * {@link org.hps.conditions.api.ConditionsObjectCollection} objects having the same type.
  * This can be used to retrieve sets of conditions that may overlap in time validity.  The user
  * may then use whichever collections are of interest to them.
- * 
+ *
  * @see org.hps.conditions.api.ConditionsSeries
  * @see org.hps.conditions.api.ConditionsObjectCollection
  * @see org.hps.conditions.api.ConditionsObject
  * @see DatabaseConditionsManager
- * 
+ *
  * @param <ObjectType> The type of the ConditionsObject.
  * @param <CollectionType> The type of the collection.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-// FIXME: The ObjectType and CollectionType should probably not extend in order to simplify the types.
-class ConditionsSeriesConverter<ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>> {
+final class ConditionsSeriesConverter<ObjectType extends ConditionsObject, 
+    CollectionType extends ConditionsObjectCollection<ObjectType>> {
 
-    Class<ObjectType> objectType;
-    Class<CollectionType> collectionType;
-     
-    ConditionsSeriesConverter(Class<ObjectType> objectType, Class<CollectionType> collectionType) {
+    /**
+     * The type of the object.
+     */
+    final Class<ObjectType> objectType;
+
+    /**
+     * The type of the collection.
+     */
+    final Class<CollectionType> collectionType;
+
+    /**
+     * Class constructor.
+     * @param objectType The type of the object.
+     * @param collectionType The type of the collection.
+     */
+    ConditionsSeriesConverter(final Class<ObjectType> objectType, final Class<CollectionType> collectionType) {
         this.collectionType = collectionType;
         this.objectType = objectType;
     }
@@ -41,59 +53,62 @@
      * Create a new conditions series.
      * @param tableName The name of the data table.
      * @return The conditions series.
-     */ 
+     */
     @SuppressWarnings({ "unchecked" })
-    ConditionsSeries<ObjectType, CollectionType> createSeries(String tableName) {
+    final ConditionsSeries<ObjectType, CollectionType> createSeries(final String tableName) {
 
         if (tableName == null) {
             throw new IllegalArgumentException("The tableName argument is null.");
         }
-        
-        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
-        
+
+        final DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+
         // Setup connection if necessary.
         boolean reopenedConnection = false;
         if (!conditionsManager.isConnected()) {
             conditionsManager.openConnection();
             reopenedConnection = true;
         }
-        
+
         // Get the table meta data for the collection type.
-        TableMetaData tableMetaData = conditionsManager.findTableMetaData(tableName);
+        final TableMetaData tableMetaData = conditionsManager.findTableMetaData(tableName);
         if (tableMetaData == null) {
             throw new RuntimeException("Table meta data for " + collectionType + " was not found.");
         }
 
         // Create a new conditions series.
-        ConditionsSeries<ObjectType, CollectionType> series = new ConditionsSeries<ObjectType, CollectionType>(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.
-        ConditionsRecordCollection conditionsRecords = conditionsManager.findConditionsRecords(tableName);
+        final ConditionsRecordCollection conditionsRecords = conditionsManager.findConditionsRecords(tableName);
 
         for (ConditionsRecord conditionsRecord : conditionsRecords) {
 
             ConditionsObjectCollection<ObjectType> collection;
             try {
-                collection = (ConditionsObjectCollection<ObjectType>) 
+                collection = (ConditionsObjectCollection<ObjectType>)
                         ConditionsRecordConverter.createCollection(conditionsRecord, tableMetaData);
             } catch (ConditionsObjectException e) {
                 throw new RuntimeException(e);
             }
 
             // Get the collection ID.
-            int collectionId = conditionsRecord.getCollectionId();
+            final int collectionId = conditionsRecord.getCollectionId();
 
             // Build a select query.
-            String query = QueryBuilder.buildSelect(tableName, collectionId, tableMetaData.getFieldNames(), "id ASC");
+            final String query = QueryBuilder.buildSelect(tableName, collectionId,
+                    tableMetaData.getFieldNames(), "id ASC");
 
             // Query the database.
-            ResultSet resultSet = conditionsManager.selectQuery(query);
+            final ResultSet resultSet = conditionsManager.selectQuery(query);
 
             try {
                 // Loop over rows.
                 while (resultSet.next()) {
                     // Create new ConditionsObject.
-                    ConditionsObject newObject = ConditionsRecordConverter.createConditionsObject(resultSet, tableMetaData);
+                    final ConditionsObject newObject = 
+                            ConditionsRecordConverter.createConditionsObject(resultSet, tableMetaData);
 
                     // Add new object to collection.
                     collection.add((ObjectType) newObject);
@@ -103,14 +118,14 @@
             }
 
             DatabaseUtilities.cleanup(resultSet);
-            
+
             series.add((CollectionType) collection);
         }
-        
+
         if (reopenedConnection) {
             conditionsManager.closeConnection();
         }
-        
+
         // Return new collection.
         return series;
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java	Thu Apr  2 18:14:47 2015
@@ -11,20 +11,41 @@
 import java.util.Properties;
 
 /**
- * This class encapsulates the parameters for connecting to a database,
- * including hostname, port, user and password. It can also create and return a
- * Connection object based on these parameters.
- * @author Jeremy McCormick <[log in to unmask]>
+ * This class encapsulates the parameters for connecting to a database, including host name, port, user and password.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-public class ConnectionParameters {
-
+public final class ConnectionParameters {
+
+    /**
+     * The default port number.
+     */
     public static final int DEFAULT_PORT = 3306;
-    
-    protected String user;
-    protected String password;
-    protected int port;
-    protected String hostname;
-    protected String database;
+
+    /**
+     * The user name.
+     */
+    private String user;
+
+    /**
+     * The user's password.
+     */
+    private String password;
+
+    /**
+     * The port.
+     */
+    private int port;
+
+    /**
+     * The host name.
+     */
+    private String hostname;
+
+    /**
+     * The database name.
+     */
+    private String database;
 
     /**
      * Protected constructor for sub-classes.
@@ -34,13 +55,15 @@
 
     /**
      * Fully qualified constructor.
+     *
      * @param user The user name.
      * @param password The password.
      * @param hostname The hostname.
      * @param port The port number.
      * @param conditionsTable The table containing conditions validity data.
      */
-    public ConnectionParameters(String user, String password, String database, String hostname, int port) {
+    public ConnectionParameters(final String user, final String password, final String database, final String hostname,
+            final int port) {
         this.user = user;
         this.password = password;
         this.database = database;
@@ -50,10 +73,11 @@
 
     /**
      * Get Properties object for this connection.
+     *
      * @return The Properties for this connection.
      */
     public Properties getConnectionProperties() {
-        Properties p = new Properties();
+        final Properties p = new Properties();
         p.put("user", user);
         p.put("password", password);
         return p;
@@ -61,14 +85,16 @@
 
     /**
      * Get the hostname.
+     *
      * @return The hostname.
      */
-    String getHostname() {
+    final String getHostname() {
         return hostname;
     }
 
     /**
      * Get the port number.
+     *
      * @return The port number.
      */
     int getPort() {
@@ -77,6 +103,7 @@
 
     /**
      * Get the name of the database.
+     *
      * @return The name of the database.
      */
     String getDatabase() {
@@ -85,6 +112,8 @@
 
     /**
      * Get the user name.
+     * 
+     * @return The user name.
      */
     String getUser() {
         return user;
@@ -92,6 +121,8 @@
 
     /**
      * Get the password.
+     * 
+     * @return The password.
      */
     String getPassword() {
         return password;
@@ -99,19 +130,21 @@
 
     /**
      * Get the connection string for these parameters.
+     * 
      * @return The connection string.
      */
-    public String getConnectionString() {
+    String getConnectionString() {
         return "jdbc:mysql://" + hostname + ":" + port + "/";
     }
 
     /**
-     * Create a database connection from these parameters. The caller becomes
-     * the "owner" and is responsible for closing it when finished.
+     * Create a database connection from these parameters. The caller becomes the "owner" and is responsible for closing
+     * it when finished.
+     * 
      * @return The Connection object.
      */
     public Connection createConnection() {
-        Properties connectionProperties = getConnectionProperties();
+        final Properties connectionProperties = getConnectionProperties();
         Connection connection = null;
         try {
             connection = DriverManager.getConnection(getConnectionString(), connectionProperties);
@@ -124,10 +157,11 @@
 
     /**
      * Configure the connection parameters from a properties file.
+     *
      * @param file The properties file.
      * @return The connection parameters.
      */
-    public static final ConnectionParameters fromProperties(File file) {
+    public static final ConnectionParameters fromProperties(final File file) {
         FileInputStream fin = null;
         try {
             fin = new FileInputStream(file);
@@ -138,33 +172,33 @@
     }
 
     /**
-     * Configure the connection parameters from an embedded classpath resource
-     * which should be a properties file.
-     * @param String The resource path.
+     * Configure the connection parameters from an embedded classpath resource which should be a properties file.
+     *
+     * @param resource The resource path.
      * @return The connection parameters.
      */
-    public static final ConnectionParameters fromResource(String resource) {
+    public static ConnectionParameters fromResource(final String resource) {
         return fromProperties(ConnectionParameters.class.getResourceAsStream(resource));
     }
 
     /**
-     * Configure the connection parameters from an <code>InputStream</code> of
-     * properties.
+     * Configure the connection parameters from an <code>InputStream</code> of properties.
+     *
      * @param in The InputStream of the properties.
      * @return The connection parameters.
      * @throws RuntimeException if the InputStream is invalid
      */
-    private static final ConnectionParameters fromProperties(InputStream in) {
-        Properties properties = new Properties();
+    private static ConnectionParameters fromProperties(final InputStream in) {
+        final Properties properties = new Properties();
         try {
             properties.load(in);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
-        String user = properties.getProperty("user");
-        String password = properties.getProperty("password");
-        String database = properties.getProperty("database");
-        String hostname = properties.getProperty("hostname");
+        final String user = properties.getProperty("user");
+        final String password = properties.getProperty("password");
+        final String database = properties.getProperty("database");
+        final String hostname = properties.getProperty("hostname");
         int port = DEFAULT_PORT;
         if (properties.containsKey("port")) {
             port = Integer.parseInt(properties.getProperty("port"));

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Converter.java	Thu Apr  2 18:14:47 2015
@@ -6,25 +6,27 @@
 import java.lang.annotation.Target;
 
 /**
- * Annotation for providing converter configuration for {@link org.hps.conditions.api.ConditionsObject} classes.
- * 
- * @see ConditionsObjectConverter
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an annotation for providing converter configuration for {@link org.hps.conditions.api.ConditionsObject}
+ * classes.
+ *
+ * @see AbstractConditionsObjectConverter
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE) 
+@Target(ElementType.TYPE)
 public @interface Converter {
     /**
-     * Get the action to perform in the converter when multiple conditions are found for the current configuration
-     * of run number, detector and tag in the manager.
+     * Get the action to perform in the converter when multiple conditions are found for the current configuration of
+     * run number, detector and tag in the manager.
+     *
      * @return The multiple collections action.
      */
     MultipleCollectionsAction multipleCollectionsAction() default MultipleCollectionsAction.ERROR;
-    
+
     /**
-     * Get a custom converter class for the type.  (Optional)
+     * Get a custom converter class for the type. (Optional)
+     *
      * @return The custom converter for the type.
      */
-    Class<?> converter() default ConditionsObjectConverter.class;
+    Class<?> converter() default AbstractConditionsObjectConverter.class;
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	Thu Apr  2 18:14:47 2015
@@ -1,42 +1,45 @@
 package org.hps.conditions.database;
 
 import java.util.HashMap;
+import java.util.Map.Entry;
 import java.util.Set;
-import java.util.Map.Entry;
 
 import javassist.Modifier;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectUtilities;
 import org.reflections.Reflections;
 
 /**
- * This is a registry of all available conditions converters.
- * These classes are found using reflection.  An anonymous converter
- * is created on the fly for {@link org.hps.conditions.api.ConditionsObject} 
- * classes with a {@link Table}, and the class itself must not be abstract.
- * If the {@link Converter} annotation is set on the class, then this
- * is used to instantiate the specific converter class instead.
- * 
- * @see ConditionsObjectConverter
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is a registry of all available conditions converters. These classes are found using reflection. An anonymous
+ * converter is created on the fly for {@link org.hps.conditions.api.ConditionsObject} classes with a {@link Table}, and
+ * the class itself must not be abstract. If the {@link Converter} annotation is set on the class, then this is used to
+ * instantiate the specific converter class instead.
+ *
+ * @see AbstractConditionsObjectConverter
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-public class ConverterRegistry extends HashMap<Class<? extends ConditionsObject>, ConditionsObjectConverter> {
-    
+@SuppressWarnings("serial")
+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.
+     */
     private ConverterRegistry() {
     }
-    
+
     /**
-     * Automatically create converters for all conditions object classes.
+     * Automatically create converters for all {@link org.hps.conditions.api.ConditionsObject} classes.
+     * 
      * @return The registry of converters.
      */
     @SuppressWarnings({ "unchecked", "rawtypes" })
     static ConverterRegistry create() {
-        ConverterRegistry registry = new ConverterRegistry();
-        Reflections reflections = new Reflections("org.hps.conditions");
-        Set<Class<? extends ConditionsObject>> objectTypes = reflections.getSubTypesOf(ConditionsObject.class);
+        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) {
             if (Modifier.isAbstract(objectType.getModifiers())) {
                 continue;
@@ -46,20 +49,20 @@
             }
             MultipleCollectionsAction multipleCollectionsAction = MultipleCollectionsAction.ERROR;
             Class<?> converterClass = null;
-            Converter converterAnnotation = objectType.getAnnotation(Converter.class);
+            final Converter converterAnnotation = objectType.getAnnotation(Converter.class);
             if (converterAnnotation != null) {
                 multipleCollectionsAction = converterAnnotation.multipleCollectionsAction();
-                if (!converterAnnotation.converter().equals(ConditionsObjectConverter.class)) {
+                if (!converterAnnotation.converter().equals(AbstractConditionsObjectConverter.class)) {
                     converterClass = converterAnnotation.converter();
                 }
             }
-            
-            final Class<? extends AbstractConditionsObjectCollection<? extends ConditionsObject>> collectionType = 
-                    ConditionsObjectUtilities.getCollectionType(objectType);
-            
-            ConditionsObjectConverter converter = null;
+
+            final Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> 
+                collectionType = ConditionsObjectUtilities.getCollectionType(objectType);
+
+            AbstractConditionsObjectConverter converter = null;
             if (converterClass == null) {
-                converter = new ConditionsObjectConverter() {
+                converter = new AbstractConditionsObjectConverter() {
                     @Override
                     public Class getType() {
                         return collectionType;
@@ -68,23 +71,29 @@
             } else {
                 try {
                     Object object = converterClass.newInstance();
-                    if (!(object instanceof ConditionsObjectConverter)) {
-                        throw new RuntimeException("The Converter has the wrong type: " + object.getClass().getCanonicalName());
+                    if (!(object instanceof AbstractConditionsObjectConverter)) {
+                        throw new RuntimeException("The Converter has the wrong type: "
+                                + object.getClass().getCanonicalName());
                     }
-                    converter = (ConditionsObjectConverter) object;
+                    converter = (AbstractConditionsObjectConverter) object;
                 } catch (InstantiationException | IllegalAccessException e) {
                     throw new RuntimeException(e);
                 }
             }
             converter.setMultipleCollectionsAction(multipleCollectionsAction);
             registry.put(converter.getType(), converter);
-        }        
+        }
         return registry;
     }
-    
-    public String toString() {
-        StringBuffer buff = new StringBuffer();
-        for (Entry<Class<? extends ConditionsObject>, ConditionsObjectConverter> entry : entrySet()) {
+
+    /**
+     * Convert the object to a string.
+     * @return The object converted to a string.
+     */
+    @SuppressWarnings("rawtypes")
+    public final String toString() {
+        final StringBuffer buff = new StringBuffer();
+        for (Entry<Class<? extends ConditionsObject>, AbstractConditionsObjectConverter> entry : entrySet()) {
             buff.append(entry.getValue().toString());
         }
         return buff.toString();

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseConditionsManager.java	Thu Apr  2 18:14:47 2015
@@ -47,142 +47,232 @@
 
 /**
  * <p>
- * This class provides the top-level API for accessing database conditions,
- * as well as configuring the database connection, initializing all
- * required components, and loading required converters and table meta data.
- * It is registered as the global <code>ConditionsManager</code> in the 
- * constructor.
+ * This class provides the top-level API for accessing database conditions, as well as configuring the database
+ * connection, initializing all required components, and loading required converters and table meta data. It is
+ * registered as the global <code>ConditionsManager</code> in the constructor.
  * <p>
- * Differences between Test Run and Engineering Run configurations are handled
- * automatically.
- * 
+ * Differences between Test Run and Engineering Run configurations are handled automatically.
+ *
  * @see org.lcsim.conditions.ConditionsManager
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @SuppressWarnings("rawtypes")
 public final class DatabaseConditionsManager extends ConditionsManagerImplementation {
 
-    // Initialize logger.
-    private static Logger logger = LogUtil.create(DatabaseConditionsManager.class.getName(), new DefaultLogFormatter(), Level.FINE);
-
-    // Global registry of conditions converters.
+    /**
+     * Initialize the logger.
+     */
+    private static Logger logger = LogUtil.create(DatabaseConditionsManager.class.getName(), new DefaultLogFormatter(),
+            Level.FINE);
+
+    /**
+     * Create the global registry of conditions object converters.
+     */
     private ConverterRegistry converters = ConverterRegistry.create();
-    
-    // Global registry of table meta data.
+
+    /**
+     * Create the global registry of table meta data.
+     */
     private TableRegistry tableRegistry = TableRegistry.create();
-    
-    // Connection configuration.
+
+    /**
+     * Name of system property that can be used to specify custom database connection parameters.
+     */
     private static final String CONNECTION_PROPERTY = "org.hps.conditions.connection.file";
+
+    /**
+     * The connection properties file, if one is being used from the command line.
+     */
     private File connectionPropertiesFile;
+
+    /**
+     * The current connection parameters.
+     */
     private ConnectionParameters connectionParameters;
+
+    /**
+     * The current database connection.
+     */
     private Connection connection;
+
+    /**
+     * True if manager is connected to the database.
+     */
     private boolean isConnected = false;
+
+    /**
+     * Flag used to print connection parameters one time.
+     */
     private boolean loggedConnectionParameters = false;
-    
-    // Default configuration resources.
+
+    /**
+     * The default XML config.
+     */
     private static final String DEFAULT_CONFIG = "/org/hps/conditions/config/conditions_database_prod.xml";
+
+    /**
+     * The Test Run XML config.
+     */
     private static final String TEST_RUN_CONFIG = "/org/hps/conditions/config/conditions_database_testrun_2012.xml";
+
+    /**
+     * The Eng Run XML config.
+     */
     private static final String ENGRUN_CONFIG = "/org/hps/conditions/config/conditions_database_engrun.xml";
-    
-    // Default connection properties resource.
+
+    /**
+     * The connection properties resource for connecting to the default JLAB database.
+     */
     private static final String DEFAULT_CONNECTION_PROPERTIES_RESOURCE = "/org/hps/conditions/config/jlab_connection.prop";
-    
-    // Max run number for the Test Run.
+
+    /**
+     * The max value for a run to be considered Test Run.
+     */
     private static final int TEST_RUN_MAX_RUN = 1365;
-        
-    // Detector setup.
+
+    /**
+     * The default ECAL detector name in the detector geometry.
+     */
     private String ecalName = "Ecal";
+
+    /**
+     * The default SVT name in the detector geometry.
+     */
     private String svtName = "Tracker";
+
+    /**
+     * The converter for creating the combined SVT conditions object.
+     */
     private ConditionsConverter svtConverter;
+
+    /**
+     * The converter for creating the combined ECAL conditions object.
+     */
     private ConditionsConverter ecalConverter;
+
+    /**
+     * The helper for setting up the SVT detector with its conditions information.
+     */
     private SvtDetectorSetup svtSetup = new SvtDetectorSetup(svtName);
-    
-    // Active conditions tag.
+
+    /**
+     * The currently active conditions tag.
+     */
     private String tag = null;
 
-    // State of manager.
+    /**
+     * True if the manager has been initialized, e.g. the {@link #setDetector(String, int)} method was called.
+     */
     private boolean isInitialized = false;
+
+    /**
+     * True if the conditions system has been frozen and will ignore updates after it is initialized.
+     */
     private boolean isFrozen = false;
+
+    /**
+     * True if the conditions manager was configured from an XML configuration resource or file.
+     */
     private boolean isConfigured = false;
-    
-    // Configuration from XML settings.  These are the defaults.
+
+    /**
+     * True to setup the SVT detector model with conditions.
+     */
     private boolean setupSvtDetector = true;
+
+    /**
+     * True to freeze the system after initialization.
+     */
     private boolean freezeAfterInitialize = false;
+
+    /**
+     * True to close the connection after initialization.
+     */
     private boolean closeConnectionAfterInitialize = true;
+
+    /**
+     * True to cache all known conditions sets (from keys) during initialization.
+     */
     private boolean cacheAllConditions = false;
+
+    /**
+     * True if current run number is from Test Run.
+     */
     private boolean isTestRun = false;
-    
+
     static {
-        // Default login timeout of 5 seconds.
+        // Set default login timeout of 5 seconds.
         DriverManager.setLoginTimeout(5);
     }
-    
-    /**
-     * Class constructor.
-     * Calling this will automatically register this
-     * manager as the global default.
+
+    /**
+     * Class constructor. Calling this will automatically register this manager as the global default.
      */
     private DatabaseConditionsManager() {
         registerConditionsConverter(new DetectorConditionsConverter());
         setupConnectionFromSystemProperty();
         ConditionsManager.setDefaultConditionsManager(this);
         setRun(-1);
-        for (ConditionsObjectConverter converter : converters.values()) {
-            //logger.fine("registering converter for " + converter.getType());
+        for (AbstractConditionsObjectConverter converter : converters.values()) {
+            // logger.fine("registering converter for " + converter.getType());
             registerConditionsConverter(converter);
         }
         addConditionsListener(svtSetup);
-    }    
-       
+    }
+
     /**
      * Get the static instance of this class.
+     *
      * @return The static instance of the manager.
      */
-    public synchronized static DatabaseConditionsManager getInstance() {
+    public static synchronized DatabaseConditionsManager getInstance() {
 
         logger.finest("getting conditions manager instance");
-        
+
         // Is there no manager installed yet?
-        if (!ConditionsManager.isSetup() || !(ConditionsManager.defaultInstance() instanceof DatabaseConditionsManager)) {
+        if (!ConditionsManager.isSetup() ||
+                !(ConditionsManager.defaultInstance() instanceof DatabaseConditionsManager)) {
             logger.finest("creating new DatabaseConditionsManager");
             // Create a new instance if necessary, which will install it globally as the default.
             new DatabaseConditionsManager();
         }
 
         // Get the instance back from the default conditions system and check that the type is correct now.
-        ConditionsManager manager = ConditionsManager.defaultInstance();
+        final ConditionsManager manager = ConditionsManager.defaultInstance();
         if (!(manager instanceof DatabaseConditionsManager)) {
             logger.severe("default conditions manager has wrong type");
-            throw new RuntimeException("Default conditions manager has the wrong type: " + ConditionsManager.defaultInstance().getClass().getName());
-        }
-        
+            throw new RuntimeException("Default conditions manager has the wrong type: "
+                    + ConditionsManager.defaultInstance().getClass().getName());
+        }
+
         logger.finest("returning conditions manager instance");
 
         return (DatabaseConditionsManager) manager;
     }
-    
+
     /**
      * Reset the global static instance of the conditions manager to a new object.
      */
-    public synchronized static void resetInstance() {
+    public static synchronized void resetInstance() {
         logger.finest("DatabaseConditionsManager instance is being reset");
         new DatabaseConditionsManager();
     }
-    
+
     /**
      * Set the log level.
+     *
      * @param level The log level.
      */
-    public void setLogLevel(Level level) {        
-        logger.config("setting log level to " + level); 
+    public void setLogLevel(final Level level) {
+        logger.config("setting log level to " + level);
         logger.setLevel(level);
         logger.getHandlers()[0].setLevel(level);
         svtSetup.setLogLevel(level);
     }
-    
+
     /**
      * Open the database connection.
+     *
      * @return True if a connection was opened; false if using an existing connection.
      */
     public synchronized boolean openConnection() {
@@ -193,25 +283,24 @@
                 // Setup the default read-only connection, which will choose a SLAC or JLab database.
                 connectionParameters = ConnectionParameters.fromResource(DEFAULT_CONNECTION_PROPERTIES_RESOURCE);
             }
-            
+
             if (!loggedConnectionParameters) {
                 // Print out detailed info to the log on first connection within the job.
-                logger.info("opening connection ... " + '\n' 
-                        + "connection: " + connectionParameters.getConnectionString() + '\n'
-                        + "host: " + connectionParameters.getHostname() + '\n'
-                        + "port: " + connectionParameters.getPort() + '\n'
-                        + "user: " + connectionParameters.getUser() + '\n'
-                        + "database: " + connectionParameters.getDatabase());
+                logger.info("opening connection ... " + '\n' + "connection: "
+                        + connectionParameters.getConnectionString() + '\n' + "host: "
+                        + connectionParameters.getHostname() + '\n' + "port: " + connectionParameters.getPort() + '\n'
+                        + "user: " + connectionParameters.getUser() + '\n' + "database: "
+                        + connectionParameters.getDatabase());
                 loggedConnectionParameters = true;
             }
 
             // Create the connection using the parameters.
             connection = connectionParameters.createConnection();
-            isConnected = true;                        
+            isConnected = true;
             openedConnection = true;
-        } 
+        }
         logger.info("connection opened successfully");
-        
+
         // Flag to indicate whether an existing connection was used or not.
         return openedConnection;
     }
@@ -225,7 +314,7 @@
             try {
                 if (!connection.isClosed()) {
                     connection.close();
-                } 
+                }
             } catch (SQLException e) {
                 throw new RuntimeException(e);
             }
@@ -234,13 +323,14 @@
         isConnected = false;
         logger.info("connection closed");
     }
-    
-    /**
-     * Close the database connection but only if there was a connection opened
-     * based on the flag.  Otherwise, it should be left open.
+
+    /**
+     * Close the database connection but only if there was a connection opened based on the flag. Otherwise, it should
+     * be left open.
+     *
      * @param connectionOpened True to close the connection; false to leave it open.
      */
-    public synchronized void closeConnection(boolean connectionOpened) {
+    public synchronized void closeConnection(final boolean connectionOpened) {
         if (connectionOpened) {
             closeConnection();
         }
@@ -248,43 +338,47 @@
 
     /**
      * Get a conditions series with one or more collections.
+     *
      * @param collectionType The type of the collection.
      * @param tableName The name of the data table.
+     * @param <ObjectType> The type of the conditions object.
+     * @param <CollectionType> The type of the conditions collection.
      * @return The conditions series.
      */
-    public 
+    @SuppressWarnings("unchecked")
+    public
     <ObjectType extends ConditionsObject, CollectionType extends ConditionsObjectCollection<ObjectType>> 
-    ConditionsSeries<ObjectType, CollectionType> 
-    getConditionsSeries(Class<CollectionType> collectionType, String tableName) {
-        
-        TableMetaData metaData = tableRegistry.get(tableName);
+        ConditionsSeries<ObjectType, CollectionType> getConditionsSeries(
+                final Class<CollectionType> collectionType, final String tableName) {
+
+        final TableMetaData metaData = tableRegistry.get(tableName);
         if (metaData == null) {
             throw new IllegalArgumentException("No table metadata found for type " + collectionType.getName());
         }
         if (!metaData.getCollectionClass().equals(collectionType)) {
-            throw new IllegalArgumentException("The type " + collectionType.getName() 
-                    + " does not match the class " + metaData.getCollectionClass().getName() + " from the meta data");
-        }               
-        Class<? extends ConditionsObject> objectType = metaData.getObjectClass();        
-        ConditionsSeriesConverter<ObjectType, CollectionType> converter = new ConditionsSeriesConverter(objectType, collectionType);
+            throw new IllegalArgumentException("The type " + collectionType.getName() + " does not match the class "
+                    + metaData.getCollectionClass().getName() + " from the meta data");
+        }
+        final Class<? extends ConditionsObject> objectType = metaData.getObjectClass();
+        final ConditionsSeriesConverter<ObjectType, CollectionType> converter =
+                new ConditionsSeriesConverter(objectType, collectionType);
         return converter.createSeries(tableName);
     }
-                
-    /**
-     * This method handles changes to the detector name and run number.
-     * It is called every time an LCSim event is created, and so it has 
-     * internal logic to figure out if the conditions system actually
-     * needs to be updated.
+
+    /**
+     * This method handles changes to the detector name and run number. It is called every time an LCSim event is
+     * created, and so it has internal logic to figure out if the conditions system actually needs to be updated.
      */
     @Override
-    public synchronized void setDetector(String detectorName, int runNumber) throws ConditionsNotFoundException {
+    public synchronized void setDetector(final String detectorName, final int runNumber) 
+            throws ConditionsNotFoundException {
 
         logger.finest("setDetector " + detectorName + " with run number " + runNumber);
-        
+
         if (detectorName == null) {
             throw new IllegalArgumentException("The detectorName argument is null.");
         }
-                
+
         if (!isInitialized || !detectorName.equals(getDetector()) || runNumber != getRun()) {
             if (!isFrozen) {
                 logger.info("new detector " + detectorName + " and run #" + runNumber);
@@ -294,26 +388,29 @@
             }
         }
     }
-    
+
     /**
      * Utility method to determine if a run number is from the 2012 Test Run.
+     *
      * @param runNumber The run number.
      * @return True if run number is from the Test Run.
      */
-    public static boolean isTestRun(int runNumber) {
+    public static boolean isTestRun(final int runNumber) {
         return runNumber > 0 && runNumber <= TEST_RUN_MAX_RUN;
     }
-    
+
     /**
      * True if Test Run configuration is selected.
+     *
      * @return True if current run is from the Test Run.
      */
     public boolean isTestRun() {
         return isTestRun;
     }
-    
+
     /**
      * Get the current LCSim compact <code>Detector</code> object.
+     *
      * @return The detector object.
      */
     public Detector getDetectorObject() {
@@ -322,15 +419,16 @@
 
     /**
      * Configure this object from an XML file.
+     *
      * @param file The XML file.
      */
-    public void setXmlConfig(File fileConfig) {       
-        logger.config("setting XML config from file " + fileConfig.getPath());
-        if (!fileConfig.exists()) {
-            throw new IllegalArgumentException("The config file does not exist: " + fileConfig.getPath());
+    public void setXmlConfig(final File file) {
+        logger.config("setting XML config from file " + file.getPath());
+        if (!file.exists()) {
+            throw new IllegalArgumentException("The config file does not exist: " + file.getPath());
         }
         try {
-            configure(new FileInputStream(fileConfig));
+            configure(new FileInputStream(file));
         } catch (FileNotFoundException e) {
             throw new RuntimeException(e);
         }
@@ -338,50 +436,57 @@
 
     /**
      * Configure this object from an embedded XML resource.
+     *
      * @param resource The embedded XML resource.
      */
-    public void setXmlConfig(String resourceConfig) {
-        logger.config("setting XML config from resource " + resourceConfig);
-        InputStream is = getClass().getResourceAsStream(resourceConfig);
+    public void setXmlConfig(final String resource) {
+        logger.config("setting XML config from resource " + resource);
+        final InputStream is = getClass().getResourceAsStream(resource);
         configure(is);
     }
 
     /**
      * Set the path to a properties file containing connection settings.
+     *
      * @param file The properties file
      */
-    public void setConnectionProperties(File file) {
+    public void setConnectionProperties(final File file) {
         logger.config("setting connection properties file " + file.getPath());
-        if (!file.exists())
-            throw new IllegalArgumentException("The connection properties file does not exist: " + connectionPropertiesFile.getPath());
+        if (!file.exists()) {
+            throw new IllegalArgumentException("The connection properties file does not exist: "
+                    + connectionPropertiesFile.getPath());
+        }
         connectionParameters = ConnectionParameters.fromProperties(file);
     }
-    
+
     /**
      * Set the connection parameters of the conditions database.
+     *
      * @param connectionParameters The connection parameters.
      */
-    public void setConnectionParameters(ConnectionParameters connectionParameters) {
+    public void setConnectionParameters(final ConnectionParameters connectionParameters) {
         this.connectionParameters = connectionParameters;
     }
 
     /**
      * Set the connection parameters from an embedded resource location.
+     *
      * @param resource The classpath resource location.
      */
-    public void setConnectionResource(String resource) {
+    public void setConnectionResource(final String resource) {
         logger.config("setting connection resource " + resource);
         connectionParameters = ConnectionParameters.fromResource(resource);
     }
 
     /**
      * Get the next collection ID for a database conditions table.
+     *
      * @param tableName The name of the table.
      * @return The next collection ID.
      */
-    public synchronized int getNextCollectionID(String tableName) {
-        boolean openedConnection = openConnection();
-        ResultSet resultSet = selectQuery("SELECT MAX(collection_id)+1 FROM " + tableName);
+    public synchronized int getNextCollectionID(final String tableName) {
+        final boolean openedConnection = openConnection();
+        final ResultSet resultSet = selectQuery("SELECT MAX(collection_id)+1 FROM " + tableName);
         int collectionId = 1;
         try {
             resultSet.next();
@@ -396,15 +501,15 @@
     }
 
     /**
-     * This method will return true if the given collection ID already exists in
-     * the table.
+     * This method will return true if the given collection ID already exists in the table.
+     *
      * @param tableName The name of the table.
      * @param collectionID The collection ID value.
      * @return True if collection exists.
      */
-    public boolean collectionExists(String tableName, int collectionID) {
-        String sql = "SELECT * FROM " + tableName + " where collection_id = " + collectionID;
-        ResultSet resultSet = selectQuery(sql);
+    public boolean collectionExists(final String tableName, final int collectionID) {
+        final String sql = "SELECT * FROM " + tableName + " where collection_id = " + collectionID;
+        final ResultSet resultSet = selectQuery(sql);
         try {
             resultSet.last();
         } catch (SQLException e) {
@@ -416,19 +521,16 @@
         } catch (SQLException e) {
             e.printStackTrace();
         }
-        if (rowCount != 0) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-   
+        return rowCount != 0;
+    }
+
     /**
      * This method can be used to perform a database SELECT query.
+     *
      * @param query The SQL query string.
      * @return The ResultSet from the query or null.
      */
-    ResultSet selectQuery(String query) {
+    ResultSet selectQuery(final String query) {
         logger.fine("executing SQL select query ..." + '\n' + query);
         ResultSet result = null;
         Statement statement = null;
@@ -443,13 +545,14 @@
 
     /**
      * Perform a SQL query with an update command like INSERT, DELETE or UPDATE.
+     *
      * @param query The SQL query string.
      * @return The keys of the rows affected.
      */
-    public List<Integer> updateQuery(String query) {
-        boolean openedConnection = openConnection();
+    public List<Integer> updateQuery(final String query) {
+        final boolean openedConnection = openConnection();
         logger.fine("executing SQL update query ..." + '\n' + query);
-        List<Integer> keys = new ArrayList<Integer>();
+        final List<Integer> keys = new ArrayList<Integer>();
         Statement statement = null;
         ResultSet resultSet = null;
         try {
@@ -457,93 +560,101 @@
             statement.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
             resultSet = statement.getGeneratedKeys();
             while (resultSet.next()) {
-                int key = resultSet.getInt(1);
+                final int key = resultSet.getInt(1);
                 keys.add(key);
             }
         } catch (SQLException x) {
             throw new RuntimeException("Error in SQL query: " + query, x);
-        } 
+        }
         DatabaseUtilities.cleanup(resultSet);
-        closeConnection(openedConnection);        
+        closeConnection(openedConnection);
         return keys;
     }
-  
-    /**
-     * Find a collection of conditions validity records by key name. The key
-     * name is distinct from the table name, but they are usually set to the
-     * same value.
+
+    /**
+     * Find a collection of conditions validity records by key name. The key name is distinct from the table name, but
+     * they are usually set to the same value.
+     *
      * @param name The conditions key name.
      * @return The set of matching conditions records.
      */
-    public ConditionsRecordCollection findConditionsRecords(String name) {
-        ConditionsRecordCollection runConditionsRecords = getCachedConditions(ConditionsRecordCollection.class, "conditions").getCachedData();
+    public ConditionsRecordCollection findConditionsRecords(final String name) {
+        final ConditionsRecordCollection runConditionsRecords = getCachedConditions(ConditionsRecordCollection.class,
+                "conditions").getCachedData();
         logger.fine("searching for conditions with name " + name + " in " + runConditionsRecords.size() + " records");
-        ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();        
+        final ConditionsRecordCollection foundConditionsRecords = new ConditionsRecordCollection();
         for (ConditionsRecord record : runConditionsRecords) {
             if (record.getName().equals(name)) {
                 if (matchesTag(record)) {
                     foundConditionsRecords.add(record);
                     logger.finer("found matching conditions record " + record.getRowId());
                 } else {
-                    logger.finer("conditions record " + record.getRowId() + " rejected from non-matching tag " + record.getTag());
+                    logger.finer("conditions record " + record.getRowId() + " rejected from non-matching tag "
+                            + record.getTag());
                 }
             }
         }
         logger.fine("found " + foundConditionsRecords.size() + " conditions records matching tag " + tag);
         return foundConditionsRecords;
     }
-           
+
     /**
      * True if there is a conditions record with the given name.
+     *
      * @param name The conditions name.
      * @return True if a conditions record exists with the given name.
      */
-    public boolean hasConditionsRecord(String name) {
+    public boolean hasConditionsRecord(final String name) {
         return !findConditionsRecords(name).isEmpty();
     }
 
     /**
      * Get a list of all the ConditionsRecord objects.
+     *
      * @return The list of all the ConditionsRecord objects.
      */
     // FIXME: This should use a cache that is created during initialization, rather than look these up every time.
     public ConditionsRecordCollection getConditionsRecords() {
         logger.finer("getting conditions records ...");
-        ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
+        final ConditionsRecordCollection conditionsRecords = new ConditionsRecordCollection();
         for (TableMetaData tableMetaData : tableRegistry.values()) {
             try {
-                ConditionsRecordCollection foundConditionsRecords = findConditionsRecords(tableMetaData.getKey());
-                logger.finer("found " + foundConditionsRecords.size() + " collections with name " + tableMetaData.getKey());
-                conditionsRecords.addAll(foundConditionsRecords); 
+                final ConditionsRecordCollection foundConditionsRecords =
+                        findConditionsRecords(tableMetaData.getKey());
+                logger.finer("found " + foundConditionsRecords.size() + " collections with name "
+                        + tableMetaData.getKey());
+                conditionsRecords.addAll(foundConditionsRecords);
             } catch (Exception e) {
                 e.printStackTrace();
                 logger.warning(e.getMessage());
             }
-        }        
+        }
         logger.finer("found " + conditionsRecords + " conditions records");
         logger.getHandlers()[0].flush();
         return conditionsRecords;
     }
-    
+
     /**
      * Get the combined ECAL conditions for this run.
+     *
      * @return The combined ECAL conditions.
      */
     public EcalConditions getEcalConditions() {
         return this.getCachedConditions(EcalConditions.class, "ecal_conditions").getCachedData();
     }
-    
+
     /**
      * Get the combined SVT conditions for this run.
+     *
      * @return The combined SVT conditions.
      */
     public SvtConditions getSvtConditions() {
         return this.getCachedConditions(SvtConditions.class, "svt_conditions").getCachedData();
     }
-    
-    /**
-     * This method can be called to "freeze" the conditions system so that
-     * any subsequent updates to run number or detector name will be ignored.
+
+    /**
+     * This method can be called to "freeze" the conditions system so that any subsequent updates to run number or
+     * detector name will be ignored.
      */
     public synchronized void freeze() {
         if (getDetector() != null && getRun() != -1) {
@@ -553,7 +664,7 @@
             logger.warning("conditions system cannot be frozen because it is not initialized yet");
         }
     }
-    
+
     /**
      * Un-freeze the conditions system so that updates will be received again.
      */
@@ -561,33 +672,38 @@
         isFrozen = false;
         logger.info("conditions system unfrozen");
     }
-    
+
     /**
      * True if conditions system is frozen.
+     *
      * @return True if conditions system is frozen.
      */
     public boolean isFrozen() {
         return isFrozen;
     }
-            
+
     /**
      * Set a tag used to filter ConditionsRecords.
+     *
      * @param tag The tag value used to filter ConditionsRecords.
      */
-    public void setTag(String tag) {
+    public void setTag(final String tag) {
         this.tag = tag;
         logger.info("using conditions tag: " + tag);
     }
 
     /**
      * Insert a collection of ConditionsObjects into the database.
+     *
      * @param collection The collection to insert.
+     * @param <ObjectType> The type of the conditions object.
      * @throws SQLException If there is a database error.
      * @throws ConditionsObjectException If there is a problem with the ConditionsObjects.
      */
-    public <ObjectType extends ConditionsObject> 
-    void insertCollection(ConditionsObjectCollection<ObjectType> collection) throws SQLException, ConditionsObjectException {
-                
+    public <ObjectType extends ConditionsObject> void insertCollection(
+            final ConditionsObjectCollection<ObjectType> collection)
+            throws SQLException, ConditionsObjectException {
+
         if (collection == null) {
             throw new IllegalArgumentException("The collection is null.");
         }
@@ -595,42 +711,42 @@
             throw new IllegalArgumentException("The collection is empty.");
         }
 
-        TableMetaData tableMetaData = collection.getTableMetaData();
+        final TableMetaData tableMetaData = collection.getTableMetaData();
         if (tableMetaData == null) {
-            List<TableMetaData> metaDataList = tableRegistry.findByCollectionType(collection.getClass());             
+            final List<TableMetaData> metaDataList = tableRegistry.findByCollectionType(collection.getClass());
             if (metaDataList == null) {
                 // This is a fatal error because no meta data is available for the type.
                 throw new ConditionsObjectException("Failed to find meta data for type: " + collection.getClass());
-            }
-            logger.fine("using default table meta data " + tableMetaData.getTableName() + " for type " + collection.getClass());            
+            } 
         }
         if (collection.getCollectionId() == -1) {
             try {
-                collection.setCollectionId(getNextCollectionID(tableMetaData.getTableName()));
+                collection.setCollectionID(getNextCollectionID(tableMetaData.getTableName()));
             } catch (ConditionsObjectException e) {
                 throw new RuntimeException(e);
             }
         }
         // FIXME: If collection ID is already set this should be an error!
-        
-        logger.info("inserting collection with ID " + collection.getCollectionId() 
-                + " and key " + tableMetaData.getKey() + " into table " + tableMetaData.getTableName());
-
-        boolean openedConnection = openConnection();
-        
+
+        logger.info("inserting collection with ID " + collection.getCollectionId() + " and key "
+                + tableMetaData.getKey() + " into table " + tableMetaData.getTableName());
+
+        final boolean openedConnection = openConnection();
+
         PreparedStatement preparedStatement = null;
-        
+
         try {
             connection.setAutoCommit(false);
             logger.fine("starting insert transaction");
-            String sql = QueryBuilder.buildPreparedInsert(tableMetaData.getTableName(), collection.iterator().next());
+            final String sql = QueryBuilder.buildPreparedInsert(
+                    tableMetaData.getTableName(), collection.iterator().next());
             preparedStatement = connection.prepareStatement(sql);
             logger.fine("using prepared statement: " + sql);
-            int collectionId = collection.getCollectionId();
+            final int collectionId = collection.getCollectionId();
             for (ConditionsObject object : collection) {
                 preparedStatement.setObject(1, collectionId);
                 int parameterIndex = 2;
-                for (Entry<String,Object> entry : object.getFieldValues().entrySet()) {
+                for (Entry<String, Object> entry : object.getFieldValues().entrySet()) {
                     preparedStatement.setObject(parameterIndex, entry.getValue());
                     ++parameterIndex;
                 }
@@ -647,82 +763,90 @@
         } finally {
             connection.setAutoCommit(true);
         }
-        
+
         try {
             preparedStatement.close();
         } catch (Exception e) {
         }
-               
+
         closeConnection(openedConnection);
     }
-    
+
     /**
      * Check if connected to the database.
+     *
      * @return true if connected
      */
     public boolean isConnected() {
         return isConnected;
     }
-              
-    /**
-     * Get the Logger for this class, which can be used by related sub-classes
-     * if they do not have their own logger.
+
+    /**
+     * Get the Logger for this class, which can be used by related sub-classes if they do not have their own logger.
+     *
      * @return The Logger for this class.
      */
     public static Logger getLogger() {
         return logger;
     }
-    
+
     /**
      * Find table information from the name.
+     *
      * @param name The name of the table.
      * @return The table information or null if does not exist.
      */
-    public TableMetaData findTableMetaData(String name) {
+    public TableMetaData findTableMetaData(final String name) {
         return tableRegistry.findByTableName(name);
     }
-    
+
     /**
      * Find table information from the collection type.
+     *
      * @param type The collection type.
      * @return The table information or null if does not exist.
      */
-    public List<TableMetaData> findTableMetaData(Class<?> type) {
+    public List<TableMetaData> findTableMetaData(final Class<?> type) {
         return tableRegistry.findByCollectionType(type);
     }
-    
+
     /**
      * Get the name of the ECAL in the detector geometry.
+     *
      * @return The name of the ECAL.
      */
     public String getEcalName() {
         return ecalName;
     }
-    
+
     /**
      * Get the subdetector object of the ECAL.
+     *
      * @return The ECAL subdetector.
      */
     public Subdetector getEcalSubdetector() {
         return this.getDetectorObject().getSubdetector(ecalName);
     }
-    
+
     /**
      * True if conditions manager is properly initialized.
+     *
+     * @return True if the manager is initialized.
      */
     public boolean isInitialized() {
         return isInitialized;
     }
-    
+
     /**
      * Get the set of unique conditions tags from the conditions table.
+     *
      * @return The list of unique conditions tags.
      */
     public Set<String> getTags() {
         logger.fine("getting list of available conditions tags");
-        boolean openedConnection = openConnection();
-        Set<String> tags = new LinkedHashSet<String>();
-        ResultSet rs = selectQuery("select distinct(tag) from conditions where tag is not null order by tag");
+        final boolean openedConnection = openConnection();
+        final Set<String> tags = new LinkedHashSet<String>();
+        final ResultSet rs = selectQuery("select distinct(tag) from conditions where tag is not null order by tag");
         try {
             while (rs.next()) {
                 tags.add(rs.getString(1));
@@ -735,32 +859,29 @@
         } catch (SQLException e) {
             logger.log(Level.WARNING, "error closing ResultSet", e);
         }
-        StringBuffer buffer = new StringBuffer();
-        buffer.append("found unique conditions tags: ");
+        final StringBuffer sb = new StringBuffer();
+        sb.append("found unique conditions tags: ");
         for (String tag : tags) {
-            buffer.append(tag + " ");
-        }
-        buffer.setLength(buffer.length() - 1);
-        buffer.append('\n');
-        logger.fine(buffer.toString());        
+            sb.append(tag + " ");
+        }
+        sb.setLength(sb.length() - 1);
+        logger.fine(sb.toString());
         closeConnection(openedConnection);
         return tags;
     }
 
-    /*
-     *******************************
-     * Private methods below here. *
-     *******************************
-     */
-    
-    /**
-     * Perform all necessary initialization, including setup of the XML
-     * configuration and loading of conditions onto the Detector.
-     */
-    private void initialize(String detectorName, int runNumber) throws ConditionsNotFoundException {
-                
+    /**
+     * Perform all necessary initialization, including setup of the XML configuration and loading of conditions
+     * onto the Detector.
+     *
+     * @param detectorName The name of the detector model.
+     * @param runNumber The run number.
+     * @throws ConditionsNotFoundException If there is a conditions system error.
+     */
+    private void initialize(final String detectorName, final int runNumber) throws ConditionsNotFoundException {
+
         logger.config("initializing with detector " + detectorName + " and run " + runNumber);
-        
+
         // Is not configured yet?
         if (!isConfigured) {
             if (isTestRun(runNumber)) {
@@ -778,42 +899,42 @@
         // Register the converters for this initialization.
         logger.fine("registering converters");
         registerConverters();
-    
+
         // Enable or disable the setup of the SVT detector.
         logger.fine("enabling SVT setup: " + setupSvtDetector);
         svtSetup.setEnabled(setupSvtDetector);
 
         // Open the database connection.
         openConnection();
-        
+
         // Call the super class's setDetector method to construct the detector object and activate conditions listeners.
         logger.fine("activating default conditions manager");
         super.setDetector(detectorName, runNumber);
-                        
+
         // Should all conditions sets be cached?
         if (cacheAllConditions) {
             // Cache the conditions sets of all registered converters.
             logger.fine("caching all conditions sets ...");
             cacheConditionsSets();
         }
-                
+
         if (closeConnectionAfterInitialize) {
             logger.fine("closing connection after initialization");
-            // Close the connection. 
+            // Close the connection.
             closeConnection();
         }
-        
+
         // Should the conditions system be frozen now?
         if (freezeAfterInitialize) {
             // Freeze the conditions system so subsequent updates will be ignored.
             freeze();
             logger.config("system was frozen after initialization");
         }
-        
+
         isInitialized = true;
-        
+
         logger.info("conditions system initialized successfully");
-        
+
         // Flush logger after initialization.
         logger.getHandlers()[0].flush();
     }
@@ -826,12 +947,12 @@
             // Remove old SVT converter.
             removeConditionsConverter(svtConverter);
         }
-        
+
         if (ecalConverter != null) {
             // Remove old ECAL converter.
             registerConditionsConverter(ecalConverter);
         }
-        
+
         // Is configured for TestRun?
         if (isTestRun()) {
             // Load Test Run specific converters.
@@ -847,76 +968,74 @@
         registerConditionsConverter(svtConverter);
         registerConditionsConverter(ecalConverter);
     }
-    
+
     /**
      * Set the name of the ECAL sub-detector.
+     *
      * @param ecalName The name of the ECAL.
      */
-    private void setEcalName(String ecalName) {
+    private void setEcalName(final String ecalName) {
         if (ecalName == null) {
             throw new IllegalArgumentException("The ecalName is null");
         }
         this.ecalName = ecalName;
         logger.info("ECAL name set to " + ecalName);
     }
-    
+
     /**
      * Set the name of the SVT sub-detector.
+     *
      * @param svtName The name of the SVT.
      */
-    private void setSvtName(String svtName) {
+    private void setSvtName(final String svtName) {
         if (svtName == null) {
             throw new IllegalArgumentException("The svtName is null");
         }
         this.svtName = svtName;
         logger.info("SVT name set to " + ecalName);
     }
-    
+
     /**
      * True if the conditions record matches the current tag.
+     *
      * @param record The conditions record.
      * @return True if conditions record matches the currently used tag.
      */
-    private boolean matchesTag(ConditionsRecord record) {
+    private boolean matchesTag(final ConditionsRecord record) {
         if (this.tag == null) {
             // If there is no tag set then all records pass.
             return true;
         }
-        String recordTag = record.getTag();
+        final String recordTag = record.getTag();
         if (recordTag == null) {
             // If there is a tag set but the record has no tag, it is rejected.
             return false;
         }
-        if (tag.equals(recordTag)) {
-            // If the tags match, the record is accepted.
-            return true;
-        } else {
-            // Tags do not match so record is rejected.
-            return false;
-        }
-    }
-                              
+        return tag.equals(recordTag);
+    }
+
     /**
      * Cache conditions sets for all known tables.
      */
     private void cacheConditionsSets() {
         for (TableMetaData meta : tableRegistry.values()) {
             try {
-                logger.fine("caching conditions " + meta.key + " with type "+ meta.collectionClass.getCanonicalName());
+                logger.fine("caching conditions " + meta.key + " with type " + meta.collectionClass.getCanonicalName());
                 getCachedConditions(meta.collectionClass, meta.key);
             } catch (Exception e) {
                 logger.warning("could not cache conditions " + meta.key);
             }
         }
-     }
-           
+    }
+
     /**
      * Configure this class from an <code>InputStream</code> which should point to an XML document.
+     *
      * @param in the InputStream which should be in XML format
      */
-    private void configure(InputStream in) {
+    private void configure(final InputStream in) {
         if (!isConfigured) {
-            SAXBuilder builder = new SAXBuilder();
+            final SAXBuilder builder = new SAXBuilder();
             Document config = null;
             try {
                 config = builder.build(in);
@@ -934,83 +1053,86 @@
             logger.warning("System is already configured, so call to configure is ignored!");
         }
     }
-    
-    /**
-     * Setup the database connection from a file specified by a Java system
-     * property setting. This could be overridden by subsequent API calls to
-     * {@link #setConnectionProperties(File)} or {@link #setConnectionResource(String)}.
+
+    /**
+     * Setup the database connection from a file specified by a Java system property setting. This could be overridden
+     * by subsequent API calls to {@link #setConnectionProperties(File)} or {@link #setConnectionResource(String)}.
      */
     private void setupConnectionFromSystemProperty() {
-        String systemPropertiesConnectionPath = (String) System.getProperties().get(CONNECTION_PROPERTY);
+        final String systemPropertiesConnectionPath = (String) System.getProperties().get(CONNECTION_PROPERTY);
         if (systemPropertiesConnectionPath != null) {
-            File f = new File(systemPropertiesConnectionPath);
+            final File f = new File(systemPropertiesConnectionPath);
             if (!f.exists()) {
-                throw new RuntimeException("Connection properties file from " + CONNECTION_PROPERTY + " does not exist.");
+                throw new RuntimeException("Connection properties file from " + CONNECTION_PROPERTY
+                        + " does not exist.");
             }
             setConnectionProperties(f);
-            logger.info("connection setup from system property " + CONNECTION_PROPERTY + " = " + systemPropertiesConnectionPath);
-        }        
+            logger.info("connection setup from system property " + CONNECTION_PROPERTY + " = "
+                    + systemPropertiesConnectionPath);
+        }
     }
 
     /**
      * Load configuration information from an XML document.
+     *
      * @param document The XML document.
      */
-    private void loadConfiguration(Document document) {
-        
-        Element node = document.getRootElement().getChild("configuration");
-        
-        if (node == null)
+    private void loadConfiguration(final Document document) {
+
+        final Element node = document.getRootElement().getChild("configuration");
+
+        if (node == null) {
             return;
-        
+        }
+
         Element element = node.getChild("setupSvtDetector");
         if (element != null) {
             setupSvtDetector = Boolean.parseBoolean(element.getText());
             logger.config("setupSvtDetector = " + setupSvtDetector);
         }
-                
+
         element = node.getChild("ecalName");
         if (element != null) {
             setEcalName(element.getText());
         }
-        
+
         element = node.getChild("svtName");
         if (element != null) {
             setSvtName(element.getText());
         }
-        
+
         element = node.getChild("freezeAfterInitialize");
         if (element != null) {
             freezeAfterInitialize = Boolean.parseBoolean(element.getText());
             logger.config("freezeAfterInitialize = " + freezeAfterInitialize);
         }
-        
+
         element = node.getChild("cacheAllCondition");
         if (element != null) {
             cacheAllConditions = Boolean.parseBoolean(element.getText());
             logger.config("cacheAllConditions = " + cacheAllConditions);
         }
-        
+
         element = node.getChild("isTestRun");
         if (element != null) {
             isTestRun = Boolean.parseBoolean(element.getText());
             logger.config("isTestRun = " + isTestRun);
         }
-        
+
         element = node.getChild("logLevel");
         if (element != null) {
             setLogLevel(Level.parse(element.getText()));
         }
-        
+
         element = node.getChild("closeConnectionAfterInitialize");
         if (element != null) {
             closeConnectionAfterInitialize = Boolean.parseBoolean(element.getText());
             logger.config("closeConnectionAfterInitialize = " + closeConnectionAfterInitialize);
         }
-        
+
         element = node.getChild("loginTimeout");
         if (element != null) {
-            Integer timeout = Integer.parseInt(element.getText());
+            final Integer timeout = Integer.parseInt(element.getText());
             DriverManager.setLoginTimeout(timeout);
             logger.config("loginTimeout = " + timeout);
         }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/DatabaseUtilities.java	Thu Apr  2 18:14:47 2015
@@ -5,19 +5,24 @@
 
 /**
  * Database utility methods.
- * @author Jeremy McCormick <[log in to unmask]>
  *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
+// TODO: Merge this single method into the manager class or a connection utilities class.
 public final class DatabaseUtilities {
-    
-    private DatabaseUtilities() {        
+
+    /**
+     * Do not allow instantiation.
+     */
+    private DatabaseUtilities() {
     }
-        
+
     /**
      * Cleanup a JDBC <code>ResultSet</code> by closing it and its <code>Statement</code>
+     *
      * @param resultSet The database ResultSet.
      */
-    static void cleanup(ResultSet resultSet) {
+    static void cleanup(final ResultSet resultSet) {
         Statement statement = null;
         try {
             statement = resultSet.getStatement();
@@ -28,13 +33,15 @@
                 resultSet.close();
             }
         } catch (Exception e) {
+            e.printStackTrace();
         }
         try {
             if (statement != null) {
                 statement.close();
-            } 
+            }
         } catch (Exception e) {
-        }        
+            e.printStackTrace();
+        }
     }
 
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Field.java	Thu Apr  2 18:14:47 2015
@@ -6,16 +6,17 @@
 import java.lang.annotation.Target;
 
 /**
- * This is a java <code>Annotation</code> for assigning a "get" method 
+ * This is a java <code>Annotation</code> for assigning a "get" method
  * to one or more database table columns.
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.METHOD) 
 public @interface Field {
-    
+
     /**
      * The names of the table columns associated with this method.
+     * 
      * @return The names of the table column associated with this method.
      */
     String[] names() default "";
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/MultipleCollectionsAction.java	Thu Apr  2 18:14:47 2015
@@ -1,13 +1,27 @@
 package org.hps.conditions.database;
 
 /**
- * This is the action that should be taken if there are multiple conditions sets
- * returned from a query on type and name.
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is the action that should be used to pick a conditions set
+ * if there are multiple conditions sets returned from a query on
+ * type and name.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public enum MultipleCollectionsAction {
+    /**
+     * Use the updated date.
+     */
     LAST_UPDATED,
+    /**
+     * Use the creation date.
+     */
     LAST_CREATED,
+    /**
+     * Use the largest run start number.
+     */
     LATEST_RUN_START,
+    /**
+     * Throw an error.
+     */
     ERROR
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/QueryBuilder.java	Thu Apr  2 18:14:47 2015
@@ -9,16 +9,27 @@
 
 /**
  * This is a static utility class for building SQL queries for the conditions system.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-// TODO: Most methods should be converted to use prepared statements, which is more flexible.
 public final class QueryBuilder {
 
+    /**
+     * Dot not allow instantiation.
+     */
     private QueryBuilder() {
     }
-        
-    static String buildSelect(String tableName, int collectionId, String[] fields, String order) {
+
+    /**
+     * Build a SQL select query string.
+     * @param tableName The name of the table.
+     * @param collectionId The collection ID.
+     * @param fields The list of fields.
+     * @param orderBy The field to order by.
+     * @return The SQL query string.
+     */
+    static String buildSelect(final String tableName, final int collectionId, final String[] fields,
+            final String orderBy) {
         StringBuffer buff = new StringBuffer();
         buff.append("SELECT ");
         if (fields == null) {
@@ -32,10 +43,11 @@
             buff.delete(buff.length() - 2, buff.length() - 1);
         }
         buff.append(" FROM " + tableName);
-        if (collectionId != -1)
+        if (collectionId != -1) {
             buff.append(" WHERE collection_id = " + collectionId);
-        if (order != null) {
-            buff.append(" ORDER BY " + order);
+        }
+        if (orderBy != null) {
+            buff.append(" ORDER BY " + orderBy);
         }
         return buff.toString();
     }
@@ -70,14 +82,20 @@
         return buff.toString();
     }
     */
-    
-    static String buildPreparedInsert(String tableName, ConditionsObject object) {
+
+    /**
+     * Build a prepared insert statement for a conditions object.
+     * @param tableName The name of the table.
+     * @param object The conditions object.
+     * @return The prepared insert statement.
+     */
+    static String buildPreparedInsert(final String tableName, final ConditionsObject object) {
         if (object.getFieldValues().size() == 0) {
             throw new IllegalArgumentException("The ConditionsObject has no values set.");
         }
-        StringBuffer buffer = new StringBuffer();
+        final StringBuffer buffer = new StringBuffer();
         buffer.append("INSERT INTO " + tableName + "( collection_id, ");
-        for (String fieldName : object.getFieldValues().keySet()) {            
+        for (String fieldName : object.getFieldValues().keySet()) {
             buffer.append(" " + fieldName + ",");
         }
         buffer.setLength(buffer.length() - 1);
@@ -90,34 +108,52 @@
         return buffer.toString();
     }
 
-    static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
-    
-    public static String buildInsert(String tableName, FieldValueMap fieldValues) {
+    /**
+     * Date formatting for insert statement.
+     */
+    final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss");
+
+    /**
+     * Build an insert statement.
+     * @param tableName The table name.
+     * @param fieldValues The field values.
+     * @return The insert statement.
+     */
+    public static String buildInsert(final String tableName, final FieldValueMap fieldValues) {
         if (fieldValues.size() == 0) {
             throw new IllegalArgumentException("The FieldValueMap has no values.");
         }
-        StringBuffer buff = new StringBuffer();
-        buff.append("INSERT INTO " + tableName + " (");
+        final StringBuffer sb = new StringBuffer();
+        sb.append("INSERT INTO " + tableName + " (");
         for (String fieldName : fieldValues.keySet()) {
-            buff.append(" " + fieldName + ",");
+            sb.append(" " + fieldName + ",");
         }
-        buff.setLength(buff.length() - 1);
-        buff.append(" ) VALUES (");
+        sb.setLength(sb.length() - 1);
+        sb.append(" ) VALUES (");
         for (Object value : fieldValues.values()) {
-            String insertValue = value.toString();
+            final String insertValue = value.toString();
             if (value instanceof Date) {
-                buff.append(" STR_TO_DATE( '" + dateFormat.format((Date) value) + "', '%Y-%m-%d %H:%i:%S' ),");
+                sb.append(" STR_TO_DATE( '" + DATE_FORMAT.format((Date) value) + "', '%Y-%m-%d %H:%i:%S' ),");
             } else {
-                buff.append(" '" + insertValue + "',");
+                sb.append(" '" + insertValue + "',");
             }
         }
-        buff.setLength(buff.length() - 1);
-        buff.append(")");
-        return buff.toString();
+        sb.setLength(sb.length() - 1);
+        sb.append(")");
+        return sb.toString();
     }
 
-    public static String buildInsert(String tableName, int collectionID, List<String> columnNames, List<List<String>> rows) {
-        StringBuffer buff = new StringBuffer();
+    /**
+     * Build a SQL insert statement.
+     * @param tableName The table name.
+     * @param collectionID The collection ID.
+     * @param columnNames The column names.
+     * @param rows The row data.
+     * @return The SQL insert statement.
+     */
+    public static String buildInsert(final String tableName, final int collectionID,
+            final List<String> columnNames, final List<List<String>> rows) {
+        final StringBuffer buff = new StringBuffer();
         buff.append("INSERT INTO " + tableName + " ( collection_id");
         for (String column : columnNames) {
             buff.append(", " + column);
@@ -143,8 +179,13 @@
         return query;
     }
     */
-    
-    static String formatDate(Date date) {
-        return dateFormat.format(date);
+
+    /**
+     * Format the date for insert statement.
+     * @param date The input date.
+     * @return The formatted date string.
+     */
+    static String formatDate(final Date date) {
+        return DATE_FORMAT.format(date);
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/Table.java	Thu Apr  2 18:14:47 2015
@@ -8,16 +8,16 @@
 /**
  * This annotation can be used to assign a class to one
  * or more database tables.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target(ElementType.TYPE) 
 public @interface Table {
-    
+
     /**
      * Get the names of the tables.
      * @return The names of the tables.
      */
-    public String[] names() default "";
+    String[] names() default "";
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableMetaData.java	Thu Apr  2 18:14:47 2015
@@ -7,7 +7,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
 
@@ -19,51 +19,59 @@
  * <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.AbstractConditionsObjectCollection
- * 
- * @author Jeremy McCormick <[log in to unmask]>
- * 
+ * @see org.hps.conditions.api.BaseConditionsObjectCollection
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class TableMetaData {
 
+    /**
+     * The table name.
+     */
     protected String tableName;
+    
+    /**
+     * The conditions key named (unused???).
+     */
     protected String key;
+    
+    /**
+     * The object class.
+     */
     protected Class<? extends ConditionsObject> objectClass;
-    protected Class<? extends AbstractConditionsObjectCollection<?>> collectionClass;
+    
+    /**
+     * The collection class.
+     */
+    protected Class<? extends BaseConditionsObjectCollection<?>> collectionClass;
+    
+    /**
+     * The set of field names.
+     */
     protected Set<String> fieldNames = new LinkedHashSet<String>();
+    
+    /**
+     * The map of field names to their types.
+     */
     protected Map<String, Class<?>> fieldTypes;
 
     /**
-     * The fully qualified constructor.
-     * @param tableName The name of the table in the conditions database.
-     * @param objectClass The type of object for the data mapping.
-     * @param collectionClass The type of collection for the data mapping.
+     * 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(
-            String key, 
-            String tableName, 
-            Class<? extends ConditionsObject> objectClass, 
-            Class<? extends AbstractConditionsObjectCollection<?>> collectionClass,
-            Map<String, Class<?>> fieldTypes) {
-       
-        this.key = key;
-        this.tableName = tableName;
-        this.objectClass = objectClass;
-        this.collectionClass = collectionClass;
-        this.fieldTypes = fieldTypes;
-    }
-    */
-    
-    public TableMetaData(
-            String key, 
-            String tableName, 
-            Class<? extends ConditionsObject> objectClass, 
-            Class<? extends AbstractConditionsObjectCollection<?>> collectionClass, 
-            Set<String> fieldNames,
-            Map<String, Class<?>> fieldTypes) {
+            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");
         }
@@ -89,7 +97,7 @@
         this.fieldNames = fieldNames;
         this.fieldTypes = fieldTypes;
     }
-    
+
     /**
      * Get the type of object this table maps onto.
      * @return The type of object.
@@ -100,9 +108,9 @@
 
     /**
      * Get the type of collection this table maps onto.
-     * @return
+     * @return The collection class.
      */
-    public Class<? extends AbstractConditionsObjectCollection<?>> getCollectionClass() {
+    public Class<? extends BaseConditionsObjectCollection<?>> getCollectionClass() {
         return collectionClass;
     }
 
@@ -118,7 +126,7 @@
      * Get the type of the field called <code>fieldName</code>.
      * @return The type of the field.
      */
-    public Class<?> getFieldType(String fieldName) {
+    public Class<?> getFieldType(final String fieldName) {
         return fieldTypes.get(fieldName);
     }
 
@@ -129,7 +137,7 @@
     public String getTableName() {
         return tableName;
     }
-    
+
     /**
      * Get the key of this conditions type. May be different from table name but
      * is usually the same.
@@ -138,8 +146,14 @@
     public String getKey() {
         return key;
     }
-    
-    static public List<TableMetaData> findByObjectType(List<TableMetaData> tableMetaDataList, Class<? extends ConditionsObject> objectType) {
+
+    /**
+     * 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(List<TableMetaData> tableMetaDataList, Class<? extends ConditionsObject> objectType) {
         List<TableMetaData> list = new ArrayList<TableMetaData>();
         for (TableMetaData tableMetaData : tableMetaDataList) {
             if (tableMetaData.getObjectClass().equals(objectType)) {
@@ -150,6 +164,10 @@
         return list;
     }
     
+    /**
+     * Convert to a string.
+     * @return This object converted to a string.
+     */
     public String toString() {
         StringBuffer buff = new StringBuffer();
         buff.append("tableMetaData: tableName = " + this.getTableName());  

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/TableRegistry.java	Thu Apr  2 18:14:47 2015
@@ -8,17 +8,25 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectUtilities;
 
 /**
  * This is a registry providing a map between tables and their meta-data.
- * @author Jeremy McCormick <[log in to unmask]>
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class TableRegistry extends HashMap<String, TableMetaData> {
-    
+
+    /**
+     * 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(Class<? extends ConditionsObject> type, TableMetaData metaData) {
             if (this.get(type) == null) {
                 this.put(type, new ArrayList<TableMetaData>());
@@ -26,39 +34,63 @@
             this.get(type).add(metaData);
         }
     }
-    
-    static class CollectionTypeMap extends HashMap<Class<? extends AbstractConditionsObjectCollection<?>>, List<TableMetaData>> {
-        void add(Class<? extends AbstractConditionsObjectCollection<?>> type, TableMetaData metaData) {
+
+    /**
+     * Maps collection types to table meta data.
+     */    
+    static class CollectionTypeMap extends HashMap<Class<? extends BaseConditionsObjectCollection<?>>, List<TableMetaData>> {
+        /**
+         * Add a connection between a collection type and table meta data.
+         * @param type The collection type.
+         * @param metaData The table meta data.
+         */
+        void add(Class<? extends BaseConditionsObjectCollection<?>> type, TableMetaData metaData) {
             if (this.get(type) == null) {
                 this.put(type, new ArrayList<TableMetaData>());                                    
             }
             this.get(type).add(metaData);
-        }        
+        }
     }
+
+    /**
+     * Map between object types and meta data.
+     */
+    private ObjectTypeMap objectTypeMap = new ObjectTypeMap();
     
-    ObjectTypeMap objectTypeMap = new ObjectTypeMap();
-    CollectionTypeMap collectionTypeMap = new CollectionTypeMap();
-        
+    /**
+     * Map between collection types and meta data.
+     */
+    private CollectionTypeMap collectionTypeMap = new CollectionTypeMap();
+
+    /**
+     * Class should not be directly instantiated.
+     * <p>
+     * Use the {@link #create()} method instead.
+     */
     private TableRegistry() {
     }
-    
+
+    /**
+     * Create a new table meta data registry.
+     * @return The meta data registry.
+     */
     static TableRegistry create() {
         TableRegistry registry = new TableRegistry();
         for (Class<? extends ConditionsObject> objectType : ConditionsObjectUtilities.findConditionsObjectTypes()) {
-            
+
             // Get the collection type.
-            Class<? extends AbstractConditionsObjectCollection<?>> collectionType = 
+            Class<? extends BaseConditionsObjectCollection<?>> collectionType =
                     ConditionsObjectUtilities.getCollectionType(objectType);
-            
+
             // Get the list of field names.
-            Set<String> fieldNames = ConditionsObjectUtilities.getFieldNames(objectType);            
-            
+            Set<String> fieldNames = ConditionsObjectUtilities.getFieldNames(objectType);
+
             // Create map of fields to their types.
             Map<String, Class<?>> fieldTypes = new HashMap<String, Class<?>>();
             for (Method method : objectType.getMethods()) {
                 if (!method.getReturnType().equals(Void.TYPE)) {
                     for (Annotation annotation : method.getAnnotations()) {
-                        if (annotation.annotationType().equals(Field.class)) {                            
+                        if (annotation.annotationType().equals(Field.class)) {
                             Field field = (Field) annotation;
                             for (String fieldName : field.names()) {
                                 fieldTypes.put(fieldName, method.getReturnType());
@@ -67,30 +99,49 @@
                     }
                 }
             }
-                        
-            for (String name : ConditionsObjectUtilities.getTableNames(objectType)) {                    
+
+            for (String name : ConditionsObjectUtilities.getTableNames(objectType)) {
                 // Create a meta data mapping for each table name in the class description.
                 TableMetaData data = new TableMetaData(name, name, objectType, collectionType, fieldNames, fieldTypes);
-                registry.put(name, data);                               
+                registry.put(name, data);
                 registry.objectTypeMap.add(objectType, data);
-                registry.collectionTypeMap.add(collectionType, data);                  
+                registry.collectionTypeMap.add(collectionType, data);
             }            
         }
         return registry;
     }
-          
+
+    /**
+     * Find meta data by object type.
+     * @param objectType The object type.
+     * @return The meta data or null if none exists.
+     */
     List<TableMetaData> findByObjectType(Class<? extends ConditionsObject> objectType) {
         return objectTypeMap.get(objectType);
     }
-    
+
+    /**
+     * Find meta data by collection type.
+     * @param collectionType The collection type.
+     * @return The meta data or null if none exists.
+     */
     List<TableMetaData> findByCollectionType(Class<?> collectionType) {
         return collectionTypeMap.get(collectionType);
     }
-    
+
+    /**
+     * Find meta data by table name.
+     * @param name The table name.
+     * @return The meta data or null if none exists.
+     */
     TableMetaData findByTableName(String name) {
         return this.get(name);
     }
-    
+
+    /**
+     * Convert this object to a string.
+     * @return This object converted to a string.
+     */
     public String toString() {  
         StringBuffer buff = new StringBuffer();
         for (TableMetaData tableMetaData : this.values()) {

Added: java/trunk/conditions/src/main/java/org/hps/conditions/database/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/database/package-info.java	(added)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/database/package-info.java	Thu Apr  2 18:14:47 2015
@@ -0,0 +1,12 @@
+/**
+ * This package contains classes for converting database information
+ * into conditions classes as well as updating the records from the
+ * objects.
+ * 
+ * @see DatabaseConditionsManager
+ * @see TableMetaData
+ * @see AbstractConditionsObjectConverter
+ * @see ConditionsSeriesConverter
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+package org.hps.conditions.database;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalBadChannel.java	Thu Apr  2 18:14:47 2015
@@ -2,8 +2,8 @@
 
 import java.util.Comparator;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -15,15 +15,32 @@
  */
 @Table(names = {"ecal_bad_channels", "test_run_ecal_bad_channels"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
-public final class EcalBadChannel extends AbstractConditionsObject {
+public final class EcalBadChannel extends BaseConditionsObject {
 
-    public static class EcalBadChannelCollection extends AbstractConditionsObjectCollection<EcalBadChannel> {
+    /**
+     * The collection class for this object.
+     */
+    @SuppressWarnings("serial")
+    public static class EcalBadChannelCollection extends BaseConditionsObjectCollection<EcalBadChannel> {
         
-        public AbstractConditionsObjectCollection<EcalBadChannel> sorted() {
+        /**
+         * Sort and return the collection without modifying in place.
+         * @return The sorted collection.
+         */
+        public BaseConditionsObjectCollection<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) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
@@ -33,15 +50,15 @@
                     return 0;
                 }
             }
-        }        
+        }
     }
-    
+
     /**
      * Get the ECAL channel ID.
      * @return The ECAL channel ID.
      */
     @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
-        return getFieldValue("ecal_channel_id");    
+        return getFieldValue("ecal_channel_id");
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCalibration.java	Thu Apr  2 18:14:47 2015
@@ -2,8 +2,8 @@
 
 import java.util.Comparator;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -12,24 +12,41 @@
 /**
  * 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 Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = {"ecal_calibrations", "test_run_ecal_calibrations", "ecal_hardware_calibrations"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class EcalCalibration extends AbstractConditionsObject {
+public final class EcalCalibration extends BaseConditionsObject {
 
-    public static class EcalCalibrationCollection extends AbstractConditionsObjectCollection<EcalCalibration> {
-        
-        public AbstractConditionsObjectCollection<EcalCalibration> sorted() {
+    /**
+     * The collection implementation for the object class.
+     */
+    @SuppressWarnings("serial")
+    public static class EcalCalibrationCollection extends BaseConditionsObjectCollection<EcalCalibration> {
+
+        /**
+         * Sort and return the collection but do no modify in place.
+         * @return The sorted collection.
+         */
+        public BaseConditionsObjectCollection<EcalCalibration> sorted() {
             return sorted(new ChannelIdComparator());
         }
-                
+
+        /**
+         * Comparison using channel ID.
+         */
         class ChannelIdComparator implements Comparator<EcalCalibration> {
-            public int compare(EcalCalibration o1, EcalCalibration o2) {
+            /**
+             * 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.
+             */
+            public int compare(final EcalCalibration o1, final EcalCalibration o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
                 } else if (o1.getChannelId() > o2.getChannelId()) {
@@ -40,11 +57,20 @@
             }
         }
     }
-               
+
+    /**
+     * No argument constructor.
+     */
     public EcalCalibration() {
     }
-    
-    public EcalCalibration(int channelId, double pedestal, double noise) {
+
+    /**
+     * Full qualified constructor.
+     * @param channelId The channel ID.
+     * @param pedestal The pedestal measurement (ADC counts).
+     * @param noise The noise measured as RMS.
+     */
+    public EcalCalibration(final int channelId, final double pedestal, final double noise) {
         this.setFieldValue("ecal_channel_id", channelId);
         this.setFieldValue("pedestal", pedestal);
         this.setFieldValue("noise", noise);
@@ -56,12 +82,12 @@
      */
     @Field(names = {"ecal_channel_id"})
     public int getChannelId() {
-        return getFieldValue("ecal_channel_id");    
+        return getFieldValue("ecal_channel_id");
     }
 
     /**
      * Get the pedestal value in units of ADC counts, which is the mean of the
-     * digitized pre-amp output.
+     * digitized preamplifier output.
      * @return The gain value.
      */
     @Field(names = {"pedestal"})
@@ -71,7 +97,7 @@
 
     /**
      * Get the noise value in units of ADC counts, which is the standard
-     * deviation of the digitized pre-amp output.
+     * deviation of the digitized preamplifier output.
      * @return The noise value.
      */
     @Field(names = {"noise"})

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannel.java	Thu Apr  2 18:14:47 2015
@@ -4,10 +4,10 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
 import org.hps.conditions.api.AbstractIdentifier;
-import org.hps.conditions.database.ConditionsObjectConverter;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
+import org.hps.conditions.database.AbstractConditionsObjectConverter;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.database.Field;
@@ -22,27 +22,40 @@
 /**
  * This class encapsulates all the information about a single ECal channel,
  * corresponding to one physical crystal in the detector.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = {"ecal_channels", "test_run_ecal_channels"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED, converter = EcalChannel.EcalChannelConverter.class)
-public final class EcalChannel extends AbstractConditionsObject {
-    
-    public static final class EcalChannelConverter extends ConditionsObjectConverter<EcalChannelCollection> {
-               
+public final class EcalChannel extends BaseConditionsObject {
+
+    /**
+     * Customized converter for this object.
+     */
+    public static final class EcalChannelConverter extends AbstractConditionsObjectConverter<EcalChannelCollection> {
+
+        /**
+         * Create an {@link EcalChannel} collection.
+         * @param conditionsManager The conditions manager.
+         * @param name The name of the conditions data table.
+         * @return The collection of ECAL channel objects.
+         */
         @Override
         public EcalChannelCollection getData(ConditionsManager conditionsManager, String name) {
-            EcalChannelCollection collection = super.getData(conditionsManager, name);
-            Subdetector ecal = DatabaseConditionsManager.getInstance().getEcalSubdetector();
+            final EcalChannelCollection collection = super.getData(conditionsManager, name);
+            final Subdetector ecal = DatabaseConditionsManager.getInstance().getEcalSubdetector();
             collection.buildGeometryMap(ecal.getDetectorElement().getIdentifierHelper(), ecal.getSystemID());
             return collection;
         }
 
+        /**
+         * Get the type this converter handles.
+         * @return The type this converter handles.
+         */
         @Override
         public Class<EcalChannelCollection> getType() {
             return EcalChannelCollection.class;
-        }        
+        }
     }
     
     /**
@@ -51,22 +64,45 @@
      */
     public static final class DaqId extends AbstractIdentifier {
 
+        /**
+         * The DAQ crate number.
+         */
         private int crate = -1;
+        
+        /**
+         * The DAQ slot number. 
+         */
         private int slot = -1;
+        
+        /**
+         * The DAQ channel number.
+         */
         private int channel = -1;
 
-        public DaqId(int values[]) {
+        /**
+         * Create a DAQ ID from an array of values.
+         * @param values The list of values (crate, slot, channel).
+         */
+        public DaqId(final int values[]) {
             crate = values[0];
             slot = values[1];
             channel = values[2];
         }
 
+        /**
+         * Encode this ID into a long value.
+         * @return The encoded long value.
+         */
         @Override
         public long encode() {
             // from Sho's code
             return (((long) crate) << 32) | ((long) slot << 16) | (long) channel;
         }
 
+        /**
+         * Check if the values look valid.
+         * @return True if ID's values are valid.
+         */
         @Override
         public boolean isValid() {
             return crate != -1 && slot != -1 && channel != -1;
@@ -79,19 +115,42 @@
      */
     public static final class GeometryId extends AbstractIdentifier {
 
+        /**
+         * The subdetector system ID.
+         */
         private int system = -1;
+        
+        /**
+         * The crystal's X index.
+         */
         private int x = Integer.MAX_VALUE;
+        
+        /**
+         * The crystal's Y index.
+         */
         private int y = Integer.MAX_VALUE;
 
+        /**
+         * The helper for using identifiers.
+         */
         private IIdentifierHelper helper;
 
-        public GeometryId(IIdentifierHelper helper, int[] values) {
+        /**
+         * Create a geometry ID.
+         * @param helper The ID helper.
+         * @param values The list of values (system, x, y).
+         */
+        public GeometryId(final IIdentifierHelper helper, final int[] values) {
             this.helper = helper;
             system = values[0];
             x = values[1];
             y = values[2];
         }
 
+        /**
+         * Encode this ID as a long using the ID helper.
+         * @return The encoded long value.
+         */
         @Override
         public long encode() {
             IExpandedIdentifier expId = new ExpandedIdentifier(helper.getIdentifierDictionary().getNumberOfFields());
@@ -101,6 +160,10 @@
             return helper.pack(expId).getValue();
         }
 
+        /**
+         * True if ID's values look valid.
+         * @return True if ID is valid.
+         */
         @Override
         public boolean isValid() {
             return system != -1 && x != Integer.MAX_VALUE && y != Integer.MAX_VALUE;
@@ -117,31 +180,60 @@
      */
     public static final class ChannelId extends AbstractIdentifier {
 
+        /**
+         * The channel ID value.
+         */
         private int id = -1;
 
+        /**
+         * Create a channel ID.
+         * @param values The values (size 0 with single int value).
+         */
         public ChannelId(int[] values) {
             id = values[0];
         }
 
+        /**
+         * Encode as long value (just returns the int value).
+         * @return The ID's value.
+         */
         @Override
         public long encode() {
             return id;
         }
 
+        /**
+         * True if ID looks valid.
+         * @return True if ID looks valid.
+         */
         @Override
         public boolean isValid() {
             return id != -1;
         }
     }
-    
+
+    /**
+     * Create a {@link DaqId} for this ECAL channel. 
+     * @return The DAQ Id for this ECAL channel.
+     */
     DaqId createDaqId() {
         return new DaqId(new int[] { getCrate(), getSlot(), getChannel() });
     }
 
+    /**
+     * Create a {@link GeometryId} for this ECAL channel.
+     * @param helper The ID helper.
+     * @param system The subdetector system ID.
+     * @return The geometry ID.
+     */
     GeometryId createGeometryId(IIdentifierHelper helper, int system) {
         return new GeometryId(helper, new int[] { system, getX(), getY() });
     }
 
+    /**
+     * Create a channel ID for this ECAL channel.
+     * @return The channel ID.
+     */
     ChannelId createChannelId() {
         return new ChannelId(new int[] { this.getChannelId() });
     }
@@ -149,36 +241,51 @@
     /**
      * A collection of {@link EcalChannel} objects.
      */
-    public static class EcalChannelCollection extends AbstractConditionsObjectCollection<EcalChannel> {
-
-        // Identifier maps for fast lookup.
-        Map<Long, EcalChannel> daqMap = new HashMap<Long, EcalChannel>();
-        Map<Long, EcalChannel> geometryMap = new HashMap<Long, EcalChannel>();
+    public static class EcalChannelCollection extends BaseConditionsObjectCollection<EcalChannel> {
+
+        /**
+         * Map of {@link DaqId} to channel object.
+         */
+        private Map<Long, EcalChannel> daqMap = new HashMap<Long, EcalChannel>();
+        
+        /**
+         * Map of {@link GeometryId} to channel object.
+         */
+        private Map<Long, EcalChannel> geometryMap = new HashMap<Long, EcalChannel>();
+        
+        /**
+         * Map of {@link ChannelId} to channel object.
+         */
         Map<Long, EcalChannel> channelMap = new HashMap<Long, EcalChannel>();
 
         /**
          * Add an <code>EcalChannel</code> to the collection and cache its ID
          * information. The GeometryId must be created later as it requires
          * access to the Detector API.
-         */
-        @Override
-        public boolean add(EcalChannel channel)  {
+         * 
+         * @param channel The ECAL channel object.
+         * @return True if object was added successfully.
+         */
+        @Override
+        public boolean add(final EcalChannel channel)  {
             super.add(channel);
-            DaqId daqId = channel.createDaqId();
-            if (daqId.isValid())
+            final DaqId daqId = channel.createDaqId();
+            if (daqId.isValid()) {
                 daqMap.put(daqId.encode(), channel);
-            ChannelId channelId = channel.createChannelId();
-            if (channelId.isValid())
+            }
+            final ChannelId channelId = channel.createChannelId();
+            if (channelId.isValid()) {
                 channelMap.put(channelId.encode(), channel);
+            }
             return true;
         }
 
         /**
-         * Build the map of geometry IDs.
+         * Build the map of {@link GeometryId} objects.
          * @param helper The identifier helper of the subdetector.
          * @param system The system ID of the subdetector.
          */
-        void buildGeometryMap(IIdentifierHelper helper, int system) {
+        void buildGeometryMap(final IIdentifierHelper helper, final int system) {
             for (EcalChannel channel : this) {
                 GeometryId geometryId = channel.createGeometryId(helper, system);
                 geometryMap.put(geometryId.encode(), channel);
@@ -190,7 +297,7 @@
          * @param daqId The DAQ ID object.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findChannel(DaqId daqId) {
+        public EcalChannel findChannel(final DaqId daqId) {
             return daqMap.get(daqId.encode());
         }
 
@@ -199,7 +306,7 @@
          * @param geometryId The geometric ID object.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findChannel(GeometryId geometryId) {
+        public EcalChannel findChannel(final GeometryId geometryId) {
             return geometryMap.get(geometryId.encode());
         }
 
@@ -208,7 +315,7 @@
          * @param channelId The channel ID object.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findChannel(ChannelId channelId) {
+        public EcalChannel findChannel(final ChannelId channelId) {
             return channelMap.get(channelId.encode());
         }
 
@@ -217,7 +324,7 @@
          * @param id The encoded geometric ID.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findGeometric(long id) {
+        public EcalChannel findGeometric(final long id) {
             return geometryMap.get(id);
         }
 
@@ -226,7 +333,7 @@
          * @param id The encoded channel ID.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findChannel(long id) {
+        public EcalChannel findChannel(final long id) {
             return channelMap.get(id);
         }
 
@@ -235,15 +342,28 @@
          * @param id The encoded DAQ ID.
          * @return The matching channel or null if does not exist.
          */
-        public EcalChannel findDaq(long id) {
+        public EcalChannel findDaq(final long id) {
             return daqMap.get(id);
         }        
-                   
-        public AbstractConditionsObjectCollection<EcalChannel> sorted() {
+
+        /**
+         * Sort collection and return but do not sort in place.
+         * @return The sorted copy of the collection.
+         */
+        public BaseConditionsObjectCollection<EcalChannel> sorted() {
             return sorted(new ChannelIdComparator());
         }
-            
-        class ChannelIdComparator implements Comparator<EcalChannel> {        
+
+        /**
+         * Comparison of ECAL channel objects.
+         */
+        class ChannelIdComparator implements Comparator<EcalChannel> {
+            /**
+             * Compare two ECAL channel objects using their channel ID.
+             * @param c1 The first object.
+             * @param c2 The second object.
+             * @return -1, 0, or 1 if first channel is less than, equal to or greater than second.
+             */
             public int compare(EcalChannel c1, EcalChannel c2) {
                 if (c1.getChannelId() < c2.getChannelId()) {
                     return -1;
@@ -252,14 +372,14 @@
                 } else {
                     return 0;
                 }
-            }            
+            }
         }
     }
 
     /**
      * Get the crate number of the channel.
      * @return The crate number.
-     * 
+     *
      */
     @Field(names = {"crate"})
     public int getCrate() {
@@ -313,9 +433,10 @@
 
     /**
      * Implementation of equals.
+     * @param o The object to compare equality to.
      * @return True if objects are equal.
      */
-    public boolean equals(Object o) {
+    public boolean equals(final Object o) {
         if (o == null) {
             return false;
         }
@@ -325,7 +446,8 @@
         if (o == this) {
             return true;
         }
-        EcalChannel c = (EcalChannel) o;
-        return c.getChannelId() == getChannelId() && c.getCrate() == getCrate() && c.getSlot() == getSlot() && c.getChannel() == getChannel() && c.getX() == getX() && c.getY() == getY();
-    }
-}
+        final EcalChannel c = (EcalChannel) o;
+        return c.getChannelId() == getChannelId() && c.getCrate() == getCrate() && c.getSlot() == getSlot() 
+                && c.getChannel() == getChannel() && c.getX() == getX() && c.getY() == getY();
+    }
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannelConstants.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannelConstants.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalChannelConstants.java	Thu Apr  2 18:14:47 2015
@@ -2,14 +2,38 @@
 
 /**
  * This class represents ECAL conditions per channel.
- * @author Jeremy McCormick <[log in to unmask]>
+ * <p>
+ * It is an aggregation of various ECAL conditions objects 
+ * that are associated to a single channel.
+ * 
+ * @see EcalGain
+ * @see EcalCalibration
+ * @see EcalTimeShift
+ * @see EcalBadChannel
+ * 
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class EcalChannelConstants {
 
-    EcalGain gain = null;
-    EcalCalibration calibration = null;
-    EcalTimeShift timeShift = null;
-    boolean badChannel = false;
+    /**
+     * The channel {@link EcalGain} conditions.
+     */
+    private EcalGain gain = null;
+    
+    /**
+     * The channel {@link EcalCalibration} conditions.
+     */
+    private EcalCalibration calibration = null;
+    
+    /**
+     * The channel {@link EcalTimeShift} conditions.
+     */
+    private EcalTimeShift timeShift = null;
+    
+    /**
+     * True if channel is bad and should not be used for reconstruction.
+     */
+    private boolean badChannel = false;
 
     /**
      * Class constructor, which is package protected.
@@ -21,7 +45,7 @@
      * Set the gain.
      * @param gain The gain object.
      */
-    void setGain(EcalGain gain) {
+    void setGain(final EcalGain gain) {
         this.gain = gain;
     }
 
@@ -29,7 +53,7 @@
      * Set the calibration.
      * @param calibration The calibration object.
      */
-    void setCalibration(EcalCalibration calibration) {
+    void setCalibration(final EcalCalibration calibration) {
         this.calibration = calibration;
     }
 
@@ -37,7 +61,7 @@
      * Set the time shift.
      * @param timeShift the time shift
      */
-    void setTimeShift(EcalTimeShift timeShift) {
+    void setTimeShift(final EcalTimeShift timeShift) {
         this.timeShift = timeShift;
     }
 
@@ -45,7 +69,7 @@
      * Set whether this is a bad channel.
      * @param badChannel set to true to flag channel as bad
      */
-    void setBadChannel(boolean badChannel) {
+    void setBadChannel(final boolean badChannel) {
         this.badChannel = badChannel;
     }
 
@@ -67,18 +91,17 @@
 
     /**
      * Get the time shift.
-     * @return the time shift
+     * @return The time shift.
      */
     public EcalTimeShift getTimeShift() {
         return timeShift;
     }
 
     /**
-     * Get whether this channel is bad or not.
-     * @return True if channel is bad; false if not.
+     * True if this is a bad channel.
+     * @return True if channel is bad.
      */
     public boolean isBadChannel() {
         return badChannel;
     }
-
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditions.java	Thu Apr  2 18:14:47 2015
@@ -11,47 +11,57 @@
 /**
  * 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}.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * 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>
  */
 public final class EcalConditions {
 
-    // Channel collection.
-    EcalChannelCollection channelCollection = new EcalChannelCollection();
+    /**
+     * The collection of {@link EcalChannel} objects.
+     */
+    private EcalChannelCollection channelCollection = new EcalChannelCollection();
 
-    // Map between channels and their conditions data.
-    Map<EcalChannel, EcalChannelConstants> channelConstants = new HashMap<EcalChannel, EcalChannelConstants>();
+    /**
+     * Map between channels and their conditions constants.
+     */
+    private final Map<EcalChannel, EcalChannelConstants> channelConstants = 
+            new HashMap<EcalChannel, EcalChannelConstants>();
 
-    // Map between geometry stations and channel.
-    EcalCrystalChannelMap crystalMap;
-    
-    // Reference to the current ECAL subdetector in the geometry.
-    Subdetector subdetector;
-    
     /**
-     * Class constructor, which is package protected.
+     * Map between channels and geometric crystals.
      */
-    EcalConditions(Subdetector subdetector) {
+    private EcalCrystalChannelMap crystalMap;
+
+    /**
+     * The current ECAL subdetector in the geometry.
+     */
+    private final Subdetector subdetector;
+
+    /**
+     * Class constructor.
+     * @param subdetector The ECAL subdetector object.
+     */
+    EcalConditions(final Subdetector subdetector) {
         if (subdetector == null) {
             throw new IllegalArgumentException("The subdetector argument is null.");
         }
-        this.subdetector = subdetector;        
+        this.subdetector = subdetector;
     }
 
     /**
      * Set the channel map.
-     * @param channels The channel map.
+     * @param channelCollection The channel map.
      */
-    void setChannelCollection(EcalChannelCollection channelCollection) {
+    void setChannelCollection(final EcalChannelCollection channelCollection) {
         this.channelCollection = channelCollection;
-        
+
         // Build the map between crystals and channels.
-        crystalMap = new EcalCrystalChannelMap((HPSEcalAPI)subdetector.getDetectorElement(), channelCollection);
+        crystalMap = new EcalCrystalChannelMap((HPSEcalAPI) subdetector.getDetectorElement(), channelCollection);
     }
 
     /**
@@ -61,99 +71,106 @@
     public EcalChannelCollection getChannelCollection() {
         return 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(EcalCrystal crystal) {
+    public EcalChannel getChannel(final EcalCrystal crystal) {
         return 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.
      * @param channel The ECAL channel.
      * @return The conditions constants for the channel.
-     * @throws IllegalArgumentException if channel does not exist in the channel
-     *             map.
+     * @throws IllegalArgumentException if channel does not exist in the channel map.
      */
-    public EcalChannelConstants getChannelConstants(EcalChannel channel) {
+    public EcalChannelConstants getChannelConstants(final EcalChannel channel) {
         // This channel must come from the map.
         if (!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))
+        if (!channelConstants.containsKey(channel)) {
             channelConstants.put(channel, new EcalChannelConstants());
+        }
         return 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.
     public String toString() {
-        StringBuffer buff = new StringBuffer();
+        final StringBuffer sb = new StringBuffer();
 
-        buff.append('\n');
-        buff.append("Printing ECAL conditions ...");
-        buff.append('\n');
-        buff.append('\n');
+        sb.append('\n');
+        sb.append("Printing ECAL conditions ...");
+        sb.append('\n');
+        sb.append('\n');
 
         // Table header:
-        buff.append("id");
-        buff.append("    ");
-        buff.append("crate");
-        buff.append("  ");
-        buff.append("slot");
-        buff.append("   ");
-        buff.append("channel");
-        buff.append("  ");
-        buff.append("x");
-        buff.append("      ");
-        buff.append("y");
-        buff.append("     ");
-        buff.append("gain");
-        buff.append("       ");
-        buff.append("pedestal");
-        buff.append("   ");
-        buff.append("noise");
-        buff.append("      ");
-        buff.append("time_shift");
-        buff.append(" ");
-        buff.append("bad");
-        buff.append('\n');
-        for (int i = 0; i < 91; i++) {
-            buff.append("-");
+        sb.append("id");
+        sb.append("    ");
+        sb.append("crate");
+        sb.append("  ");
+        sb.append("slot");
+        sb.append("   ");
+        sb.append("channel");
+        sb.append("  ");
+        sb.append("x");
+        sb.append("      ");
+        sb.append("y");
+        sb.append("     ");
+        sb.append("gain");
+        sb.append("       ");
+        sb.append("pedestal");
+        sb.append("   ");
+        sb.append("noise");
+        sb.append("      ");
+        sb.append("time_shift");
+        sb.append(" ");
+        sb.append("bad");
+        sb.append('\n');
+        for (int i = 0; i < DIVIDER_SIZE; i++) {
+            sb.append("-");
         }
-        buff.append('\n');
+        sb.append('\n');
 
         // Loop over all channels.
         for (EcalChannel channel : channelCollection) {
 
-            EcalChannelConstants constants = getChannelConstants(channel);
+            final EcalChannelConstants constants = getChannelConstants(channel);
 
-            double gain = constants.getGain().getGain();
-            double pedestal = constants.getCalibration().getPedestal();
-            double noise = constants.getCalibration().getNoise();
-            double timeShift = constants.getTimeShift().getTimeShift();
-            boolean bad = constants.isBadChannel();
+            final double gain = constants.getGain().getGain();
+            final double pedestal = constants.getCalibration().getPedestal();
+            final double noise = constants.getCalibration().getNoise();
+            final double timeShift = constants.getTimeShift().getTimeShift();
+            final boolean bad = constants.isBadChannel();
 
             // Channel data.
-            buff.append(String.format("%-5d %-6d %-6d %-8d %-6d %-6d", channel.getChannelId(), channel.getCrate(), channel.getSlot(), channel.getChannel(), channel.getX(), channel.getY()));
+            sb.append(String.format("%-5d %-6d %-6d %-8d %-6d %-6d", channel.getChannelId(), channel.getCrate(),
+                    channel.getSlot(), channel.getChannel(), channel.getX(), channel.getY()));
 
             // Constants.
-            buff.append(String.format("%-10.4f %-10.4f %-10.4f %-11.4f", gain, pedestal, noise, timeShift));
+            sb.append(String.format("%-10.4f %-10.4f %-10.4f %-11.4f", gain, pedestal, noise, timeShift));
 
             // Bad channel.
-            buff.append(bad);
+            sb.append(bad);
 
-            buff.append('\n');
+            sb.append('\n');
         }
-        return buff.toString();
+        return sb.toString();
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsConverter.java	Thu Apr  2 18:14:47 2015
@@ -1,6 +1,4 @@
 package org.hps.conditions.ecal;
-
-import java.util.logging.Logger;
 
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsSeries;
@@ -11,89 +9,118 @@
 import org.hps.conditions.ecal.EcalChannel.EcalChannelCollection;
 import org.hps.conditions.ecal.EcalGain.EcalGainCollection;
 import org.hps.conditions.ecal.EcalTimeShift.EcalTimeShiftCollection;
-import org.hps.conditions.svt.AbstractSvtConditionsConverter;
 import org.lcsim.conditions.ConditionsConverter;
 import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.geometry.Detector;
-import org.lcsim.util.log.LogUtil;
 
 /**
- * This class loads all ECal conditions into an {@link EcalConditions} object
+ * 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 Jeremy McCormick <[log in to unmask]>
- * @author Omar Moreno <[log in to unmask]>
+ *
+ * @see EcalConditions
+ * @see EcalChannel
+ * @see EcalGain
+ * @see EcalCalibration
+ * @see EcalBadChannel
+ * @see EcalTimeShift
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
 public class EcalConditionsConverter implements ConditionsConverter<EcalConditions> {
 
-    static Logger logger = LogUtil.create(AbstractSvtConditionsConverter.class);
-    
-    protected EcalChannelCollection getEcalChannelCollection(DatabaseConditionsManager manager) {
+    /**
+     * Get the default {@link EcalChannel} collection.
+     * @param manager The conditions manager.
+     * @return The default ECAL channel object collection.
+     */
+    protected EcalChannelCollection getEcalChannelCollection(final DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalChannelCollection.class, "ecal_channels").getCachedData();
     }
-    
-    protected EcalGainCollection getEcalGainCollection(DatabaseConditionsManager manager) {
+
+    /**
+     * Get the default {@link EcalGain} collection.
+     * @param manager The conditions manager.
+     * @return The ECAL channel gain collection.
+     */
+    protected EcalGainCollection getEcalGainCollection(final DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalGainCollection.class, "ecal_gains").getCachedData();
     }
-        
-    protected ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> getEcalBadChannelSeries(DatabaseConditionsManager manager) {
+
+    /**
+     * 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) {
         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) {
         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) {
         return manager.getCachedConditions(EcalTimeShiftCollection.class, "ecal_time_shifts").getCachedData();
     }
         
     /**
-     * Create ECAL conditions object containing all data for the current run.
+     * 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 EcalConditions getData(ConditionsManager manager, String name) {
+    public final EcalConditions getData(ConditionsManager manager, String name) {
 
-        DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) manager;
+        final DatabaseConditionsManager databaseConditionsManager = (DatabaseConditionsManager) manager;
 
         // Get the ECal channel map from the conditions database
-        EcalChannelCollection channels = getEcalChannelCollection(databaseConditionsManager);
+        final EcalChannelCollection channels = getEcalChannelCollection(databaseConditionsManager);
 
         // Create the ECal conditions object that will be used to encapsulate
         // ECal conditions collections
-        Detector detector = databaseConditionsManager.getDetectorObject();
-        EcalConditions conditions = new EcalConditions(detector.getSubdetector(databaseConditionsManager.getEcalName()));
+        final Detector detector = databaseConditionsManager.getDetectorObject();
+        final EcalConditions conditions = new EcalConditions(detector.getSubdetector(databaseConditionsManager.getEcalName()));
 
         // Set the channel map.
         conditions.setChannelCollection(channels);
 
         // Get the ECal gains from the conditions database and add them to the
         // conditions set
-        EcalGainCollection gains = getEcalGainCollection(databaseConditionsManager);
+        final EcalGainCollection gains = getEcalGainCollection(databaseConditionsManager);
         for (EcalGain gain : gains) {
-            ChannelId channelId = new ChannelId(new int[] { gain.getChannelId() });
-            EcalChannel channel = channels.findChannel(channelId);
+            final ChannelId channelId = new ChannelId(new int[] { gain.getChannelId() });
+            final EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setGain(gain);
         }
 
-        ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> badChannelSeries = 
+        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) {
-                ChannelId channelId = new ChannelId(new int[] { badChannel.getChannelId() });
-                EcalChannel channel = channels.findChannel(channelId);
+                final ChannelId channelId = new ChannelId(new int[] { badChannel.getChannelId() });
+                final EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setBadChannel(true);
             }
         }
 
         // Get the ECal calibrations from the conditions database and add them
         // to the conditions set.
-        EcalCalibrationCollection calibrations = getEcalCalibrationCollection(databaseConditionsManager);
+        final EcalCalibrationCollection calibrations = getEcalCalibrationCollection(databaseConditionsManager);
         for (EcalCalibration calibration : calibrations) {
-            ChannelId channelId = new ChannelId(new int[] { calibration.getChannelId() });
-            EcalChannel channel = channels.findChannel(channelId);
+            final ChannelId channelId = new ChannelId(new int[] { calibration.getChannelId() });
+            final EcalChannel channel = channels.findChannel(channelId);
             conditions.getChannelConstants(channel).setCalibration(calibration);
         }
 
@@ -102,10 +129,10 @@
         if (databaseConditionsManager.hasConditionsRecord("ecal_time_shifts")) {
             EcalTimeShiftCollection timeShifts = getEcalTimeShiftCollection(databaseConditionsManager);
             for (EcalTimeShift timeShift : timeShifts) {
-                ChannelId channelId = new ChannelId(new int[] {timeShift.getChannelId()});
-                EcalChannel channel = channels.findChannel(channelId);
+                final ChannelId channelId = new ChannelId(new int[] {timeShift.getChannelId()});
+                final EcalChannel channel = channels.findChannel(channelId);
                 conditions.getChannelConstants(channel).setTimeShift(timeShift);
-            }   
+            }
         } else {
             DatabaseConditionsManager.getLogger().warning("no ecal_time_shifts collection found");
         }
@@ -118,7 +145,7 @@
      * Get the type handled by this converter.
      * @return The type handled by this converter.
      */
-    public Class<EcalConditions> getType() {
+    public final Class<EcalConditions> getType() {
         return EcalConditions.class;
     }
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsUtil.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsUtil.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalConditionsUtil.java	Thu Apr  2 18:14:47 2015
@@ -9,18 +9,21 @@
 /**
  * This is a set of utility methods for the ECAL that use the database
  * conditions system.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 public final class EcalConditionsUtil {
 
+    /**
+     * The combined ECAL conditions object.
+     */
     private EcalConditions conditions;
 
     /**
      * Constructor which uses external reference to conditions object.
      * @param conditions The ECAL conditions object.
      */
-    public EcalConditionsUtil(EcalConditions conditions) {
+    public EcalConditionsUtil(final EcalConditions conditions) {
         this.conditions = conditions;
     }
 
@@ -36,21 +39,20 @@
      * Find a channel object from a cell ID, e.g. from Monte Carlo data.
      * @param helper The identifier helper of the hit.
      * @param cellId The cell ID of the hit.
-     * @return The corresponding ECAL channel found from the physical ID
-     *         information.
+     * @return The corresponding ECAL channel found from the physical ID information.
      */
-    public EcalChannel findChannel(IIdentifierHelper helper, long cellId) {
+    public EcalChannel findChannel(final IIdentifierHelper helper, final long cellId) {
 
         // Make an ID object from hit ID.
-        IIdentifier id = new Identifier(cellId);
+        final IIdentifier id = new Identifier(cellId);
 
         // Get physical field values.
-        int system = helper.getValue(id, "system");
-        int x = helper.getValue(id, "ix");
-        int y = helper.getValue(id, "iy");
+        final int system = helper.getValue(id, "system");
+        final int x = helper.getValue(id, "ix");
+        final int y = helper.getValue(id, "iy");
 
         // Create an ID to search for in channel collection.
-        GeometryId geometryId = new GeometryId(helper, new int[] { system, x, y });
+        final GeometryId geometryId = new GeometryId(helper, new int[] { system, x, y });
 
         // Find the ECAL channel and return the crate number.
         return conditions.getChannelCollection().findChannel(geometryId);
@@ -62,7 +64,7 @@
      * @param cellId The cell ID of the hit.
      * @return The crate number of the channel.
      */
-    public int getCrate(IIdentifierHelper helper, long cellId) {
+    public int getCrate(final IIdentifierHelper helper, final long cellId) {
         return findChannel(helper, cellId).getCrate();
     }
 
@@ -72,7 +74,7 @@
      * @param cellId The cell ID of the hit.
      * @return The slot number of the channel.
      */
-    public int getSlot(IIdentifierHelper helper, long cellId) {
+    public int getSlot(final IIdentifierHelper helper, final long cellId) {
         return findChannel(helper, cellId).getSlot();
     }
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	Thu Apr  2 18:14:47 2015
@@ -10,56 +10,64 @@
 
 /**
  * This is a convenience utility for associating the geometric crystal
- * objects with the conditions system channel information and vice versa.  
+ * objects with the conditions system channel information and vice versa. 
  * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 final class EcalCrystalChannelMap {
+
+    /**
+     * Map of crystal to channel.
+     */
+    Map<EcalCrystal, EcalChannel> crystalMap = new HashMap<EcalCrystal, EcalChannel>();
     
-    Map<EcalCrystal, EcalChannel> crystalMap = new HashMap<EcalCrystal, EcalChannel>();
+    /**
+     * Map of channel to crystal.
+     */
     Map<EcalChannel, EcalCrystal> channelMap = new HashMap<EcalChannel, EcalCrystal>();
-    
+
     /**
      * Creates the map between crystals and channels.
      * @param api The ECAL API.
      * @param channels The list of channels.
      */
-    EcalCrystalChannelMap(HPSEcalAPI api, EcalChannelCollection channels) {
-                        
+    EcalCrystalChannelMap(final HPSEcalAPI api, final EcalChannelCollection channels) {
+
         // Map crystals to channels.
         for (EcalCrystal crystal : api.getCrystals()) {
-            EcalChannel channel = channels.findGeometric(crystal.getIdentifier().getValue());
+            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);
         }
-        
+
         // Map channels to crystals.
         for (EcalChannel channel : channels) {
-            EcalCrystal crystal = api.getCrystal(channel.getX(), channel.getY());
+            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);
         }
     }
-    
+
     /**
      * Get a channel from a crystal.
      * @param crystal The geometry object.
      * @return The channel information or null if does not exist.
      */
-    EcalChannel getEcalChannel(EcalCrystal crystal) {
+    EcalChannel getEcalChannel(final EcalCrystal crystal) {
         return crystalMap.get(crystal);
     }    
-    
+
     /**
      * Get a channel from a crystal.
      * @param crystal The geometry object.
      * @return The channel information or null if does not exist.
      */
-    EcalCrystal getEcalCrystal(EcalChannel channel) {
+    EcalCrystal getEcalCrystal(final EcalChannel channel) {
         return channelMap.get(channel);
     } 
 }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalGain.java	Thu Apr  2 18:14:47 2015
@@ -2,30 +2,47 @@
 
 import java.util.Comparator;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
 
 /**
- * A simplistic representation of gain values from the ECal conditions database.
+ * A per channel ECAL gain value.
  * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * @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 AbstractConditionsObject {
+public final class EcalGain extends BaseConditionsObject {
 
-    public static class EcalGainCollection extends AbstractConditionsObjectCollection<EcalGain> {
-        
-        public AbstractConditionsObjectCollection<EcalGain> sorted() {
+    /**
+     * The collection implementation for this class.
+     */
+    @SuppressWarnings("serial")
+    public static final class EcalGainCollection extends BaseConditionsObjectCollection<EcalGain> {
+
+        /**
+         * Sort and return a copy of the collection.
+         * @return A sorted copy of the collection.
+         */
+        public BaseConditionsObjectCollection<EcalGain> sorted() {
             return sorted(new ChannelIdComparator());
         }
-                
+
+        /**
+         * Comparison implementation by channel ID.
+         */
         class ChannelIdComparator implements Comparator<EcalGain> {
-            public int compare(EcalGain o1, EcalGain o2) {
+            /**
+             * 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.
+             */
+            public int compare(final EcalGain o1, final EcalGain o2) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;
                 } else if (o1.getChannelId() > o2.getChannelId()) {
@@ -34,26 +51,27 @@
                     return 0;
                 }
             }
-            
+
         }
     }
-    
-    
+
     /**
      * Get the gain value in units of MeV/ADC count.
+     *
      * @return The gain value.
      */
-    @Field(names = {"gain"})
+    @Field(names = { "gain" })
     public double getGain() {
         return getFieldValue("gain");
     }
 
     /**
      * Get the ECal channel ID.
+     *
      * @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/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLed.java	Thu Apr  2 18:14:47 2015
@@ -2,8 +2,8 @@
 
 import java.util.Comparator;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -13,21 +13,33 @@
 /**
  * A conditions class for representing the setup of the LED system in the ECAL
  * for one channel.
- * @author Jeremy McCormick <[log in to unmask]>
+ * 
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = "ecal_leds")
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public class EcalLed extends AbstractConditionsObject {
+public final class EcalLed extends BaseConditionsObject {
 
     /**
      * Generic collection class for these objects.
      */
-    public static class EcalLedCollection extends AbstractConditionsObjectCollection<EcalLed> {
-        public AbstractConditionsObjectCollection<EcalLed> sorted() {
+    public static class EcalLedCollection extends BaseConditionsObjectCollection<EcalLed> {
+        
+        /**
+         * Sort and return a copy of this collection.
+         * @return The sorted copy.
+         */
+        public BaseConditionsObjectCollection<EcalLed> sorted() {
             return sorted(new ChannelIdComparator());
         }
                 
+        /**
+         * Comparison implementation by channel ID.
+         */
         class ChannelIdComparator implements Comparator<EcalLed> {
+            /**
+             * Compare two objects by channel ID.
+             */
             public int compare(EcalLed o1, EcalLed o2) {
                 if (o1.getEcalChannelId() < o2.getEcalChannelId()) {
                     return -1;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLedCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLedCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalLedCalibration.java	Thu Apr  2 18:14:47 2015
@@ -1,28 +1,43 @@
 package org.hps.conditions.ecal;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
 import org.hps.conditions.database.Table;
 
+/**
+ * ECAL LED calibration information per channel.
+ * 
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
 @Table(names = "ecal_led_calibrations")
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public class EcalLedCalibration extends AbstractConditionsObject {
-    
+public final class EcalLedCalibration extends BaseConditionsObject {
+
     /**
      * Generic collection class for these objects.
      */
-    public static class EcalLedCalibrationCollection extends AbstractConditionsObjectCollection<EcalLedCalibration> {
+    @SuppressWarnings("serial")
+    public static class EcalLedCalibrationCollection extends BaseConditionsObjectCollection<EcalLedCalibration> {
     }
-    
-    public EcalLedCalibration() {        
+
+    /**
+     * Class constructor.
+     */
+    public EcalLedCalibration() {
     }
-    
-    public EcalLedCalibration(int channelId, double mean, double rms) {
+
+    /**
+     * Fully qualified constructor.
+     * @param channelId The ECAL channel ID (not the LED channel ID).
+     * @param ledResponse The mean of the LED response.
+     * @param rms The RMS of the LED response.
+     */
+    public EcalLedCalibration(int channelId, double ledResponse, double rms) {
         this.setFieldValue("ecal_channel_id", channelId);
-        this.setFieldValue("led_response", mean);
+        this.setFieldValue("led_response", ledResponse);
         this.setFieldValue("rms", rms);
     }
     /**
@@ -44,11 +59,11 @@
     }
 
     /**
-     * Get the RMS of the LED response
+     * Get the RMS of the LED response.
      * @return The RMS of the LED response.
      */
     @Field(names = {"rms"})
     public int getRms() {
         return getFieldValue("rms");
     }
-}
+}

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/EcalTimeShift.java	Thu Apr  2 18:14:47 2015
@@ -2,31 +2,45 @@
 
 import java.util.Comparator;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 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.EcalCalibration.EcalCalibrationCollection.ChannelIdComparator;
 
 /**
  * This class represents a time shift calibration value for an ECAL channel.
- * @author Jeremy McCormick <[log in to unmask]>
+ * 
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
 @Table(names = {"ecal_time_shifts", "test_run_ecal_time_shifts"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class EcalTimeShift extends AbstractConditionsObject {
+public final class EcalTimeShift extends BaseConditionsObject {
 
     /**
      * A collection of {@link EcalTimeShift} objects.
      */
-    public static class EcalTimeShiftCollection extends AbstractConditionsObjectCollection<EcalTimeShift> {
-        public AbstractConditionsObjectCollection<EcalTimeShift> sorted() {
+    public static class EcalTimeShiftCollection extends BaseConditionsObjectCollection<EcalTimeShift> {
+        
+        /**
+         * Sort and return a copy of the collection.
+         * @return The sorted copy of the collection.
+         */
+        public BaseConditionsObjectCollection<EcalTimeShift> sorted() {
             return sorted(new ChannelIdComparator());
         }
-                
+
+        /**
+         * Compare two objects by their channel ID.
+         */
         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) {
                 if (o1.getChannelId() < o2.getChannelId()) {
                     return -1;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/TestRunEcalConditionsConverter.java	Thu Apr  2 18:14:47 2015
@@ -11,28 +11,49 @@
 /**
  * This class loads all Test Run ECAL conditions into an {@link EcalConditions} object
  * from the database.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
- * @author Omar Moreno <[log in to unmask]>
+ * <p>
+ * The default names are overridden to use tables that contain Test Run data, only. 
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
  */
 public final class TestRunEcalConditionsConverter extends EcalConditionsConverter {
-    
+
+    /**
+     * Get the {@link EcalChannel} collection for Test Run.
+     * @return The Test Run ECAL channel collection.
+     */
     protected EcalChannelCollection getEcalChannelCollection(DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalChannelCollection.class, "test_run_ecal_channels").getCachedData();
     }
-    
+    /**
+     * Get the {@link EcalGain} collection for Test Run.
+     * @return The Test Run ECAL gain collection.
+     */     
     protected EcalGainCollection getEcalGainCollection(DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalGainCollection.class, "test_run_ecal_gains").getCachedData();
     }
     
+    /**
+     * Get the collections of {@link EcalBadChannel} objects for Test Run.
+     * @return The Test Run bad channel collections.
+     */
     protected ConditionsSeries<EcalBadChannel, EcalBadChannelCollection> getEcalBadChannelSeries(DatabaseConditionsManager manager) {
         return manager.getConditionsSeries(EcalBadChannelCollection.class, "test_run_ecal_bad_channels");
     }
-    
+
+    /**
+     * Get the {@link EcalCalibration} collection for Test Run.
+     * @return The Test Run ECAL calibration collection. 
+     */
     protected EcalCalibrationCollection getEcalCalibrationCollection(DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalCalibrationCollection.class, "test_run_ecal_calibrations").getCachedData();
     }
-    
+
+    /**
+     * Get the {@link EcalTimeShift} collection for Test Run.
+     * @return The Test Run ECAL time shift collection.
+     */
     protected EcalTimeShiftCollection getEcalTimeShiftCollection(DatabaseConditionsManager manager) {
         return manager.getCachedConditions(EcalTimeShiftCollection.class, "test_run_ecal_time_shifts").getCachedData();
     }

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/ecal/package-info.java	Thu Apr  2 18:14:47 2015
@@ -9,13 +9,18 @@
  * these channels.
  * <p>
  * The {@link EcalCalibration} contains the pedestal and noise values for a channel, 
- * which are the mean and the standard deviation of the digitized pre-amp output.
+ * which are the mean and the standard deviation of the digitized preamplifier output.
  * <p>
  * The {@link EcalGain} is the channel gain in units of MeV/ADC counts.
  * <p>
+ * The {@link EcalTimeShift} is a time shift in the electronics response.
+ * <p>
+ * The {@link EcalLedCalibration} is calibration information for the LED attached to
+ * an ECAL channel.
+ * <p>
  * The energy of a hit is reconstructed by multiplying the gain by the pedestal-subtracted
- * ADC integral (e.g. in Test Run 2012 data). 
+ * ADC integral (e.g. in Test Run 2012 data).
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-package org.hps.conditions.ecal;
+package org.hps.conditions.ecal;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/package-info.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/package-info.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/package-info.java	Thu Apr  2 18:14:47 2015
@@ -1,9 +1,11 @@
 /**
- * The HPS conditions module provides facilities for accessing time dependent conditions
- * for a detector at runtime using a framework built on the LCSim conditions system.
- * The {@link DatabaseConditionsReader} has a set of converters for reading data from
- * tables using SQL queries and creating appropriate, typed objects for them.
- * 
- * @author Jeremy McCormick <[log in to unmask]>
+ * The HPS conditions module provides facilities for accessing time dependent conditions for a detector at runtime
+ * using a framework built on the LCSim conditions system.  The {@link DatabaseConditionsReader} has a set of
+ * converters for reading data from tables using SQL queries and creating appropriate, typed objects for them.
+ *
+ * @see org.hps.conditions.api
+ * @see org.hps.conditions.database
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
  */
-package org.hps.conditions;
+package org.hps.conditions;

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtChannel.java	Thu Apr  2 18:14:47 2015
@@ -4,8 +4,8 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
 
@@ -14,12 +14,12 @@
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
-public class AbstractSvtChannel extends AbstractConditionsObject {
+public class AbstractSvtChannel extends BaseConditionsObject {
 
     // TODO: Put constants into their own class
     public static final int MAX_NUMBER_OF_SAMPLES = 6;
 
-    public static abstract class AbstractSvtChannelCollection<T extends AbstractSvtChannel> extends AbstractConditionsObjectCollection<T> {
+    public static abstract class AbstractSvtChannelCollection<T extends AbstractSvtChannel> extends BaseConditionsObjectCollection<T> {
 
         Map<Integer, T> channelMap = new HashMap<Integer, T>();
 

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtConditions.java	Thu Apr  2 18:14:47 2015
@@ -10,7 +10,7 @@
 /**
  * Abstract class providing some of the common functionality used to define an
  * SVT conditions object
- * 
+ *
  * @author Omar Moreno <[log in to unmask]>
  *
  */

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtDaqMapping.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
 import org.lcsim.detector.tracker.silicon.HpsSiSensor;
@@ -12,7 +12,7 @@
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
-public abstract class AbstractSvtDaqMapping extends AbstractConditionsObject {
+public abstract class AbstractSvtDaqMapping extends BaseConditionsObject {
 
         /**
          * Flag values for top or bottom half.
@@ -26,7 +26,7 @@
         public static final String AXIAL = "A";
         public static final String STEREO = "S";
 
-        public static abstract class AbstractSvtDaqMappingCollection<T extends AbstractSvtDaqMapping> extends AbstractConditionsObjectCollection<T> {
+        public static abstract class AbstractSvtDaqMappingCollection<T extends AbstractSvtDaqMapping> extends BaseConditionsObjectCollection<T> {
 
 
         /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/AbstractSvtT0Shift.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Field;
 import org.hps.util.Pair;
 
@@ -11,9 +11,9 @@
  * 
  * @author Omar Moreno <[log in to unmask]>
  */
-public class AbstractSvtT0Shift extends AbstractConditionsObject {
+public class AbstractSvtT0Shift extends BaseConditionsObject {
 
-    public static abstract class AbstractSvtT0ShiftCollection<T extends AbstractSvtT0Shift> extends AbstractConditionsObjectCollection<T> {
+    public static abstract class AbstractSvtT0ShiftCollection<T extends AbstractSvtT0Shift> extends BaseConditionsObjectCollection<T> {
 
         /**
          * Get the t0 shift associated with a given DAQ pair

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtAlignmentConstant.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -22,9 +22,9 @@
  */
 @Table(names = "svt_alignments")
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
-public final class SvtAlignmentConstant extends AbstractConditionsObject {
+public final class SvtAlignmentConstant extends BaseConditionsObject {
 
-    public static class SvtAlignmentConstantCollection extends AbstractConditionsObjectCollection<SvtAlignmentConstant> {
+    public static class SvtAlignmentConstantCollection extends BaseConditionsObjectCollection<SvtAlignmentConstant> {
     }
 
     /** Top or bottom half. */

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtBadChannel.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -9,9 +9,9 @@
 
 @Table(names = {/*"svt_bad_channels",*/ "test_run_svt_bad_channels"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class SvtBadChannel extends AbstractConditionsObject {
+public final class SvtBadChannel extends BaseConditionsObject {
 
-    public static class SvtBadChannelCollection extends AbstractConditionsObjectCollection<SvtBadChannel> {
+    public static class SvtBadChannelCollection extends BaseConditionsObjectCollection<SvtBadChannel> {
     }
 
     @Field(names = {"svt_channel_id"})

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtCalibration.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -17,9 +17,9 @@
  */
 @Table(names = {"svt_calibrations", "test_run_svt_calibrations"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
-public final class SvtCalibration extends AbstractConditionsObject {
+public final class SvtCalibration extends BaseConditionsObject {
 
-    public static class SvtCalibrationCollection extends AbstractConditionsObjectCollection<SvtCalibration> {
+    public static class SvtCalibrationCollection extends BaseConditionsObjectCollection<SvtCalibration> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConditionsLoader.java	Thu Apr  2 18:14:47 2015
@@ -114,7 +114,7 @@
 	           
 	           // Set the collection ID 
 	           int collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(SvtConditionsLoader.CALIBRATIONS_TABLE_NAME);
-	           calibrations.setCollectionId(collectionID);
+	           calibrations.setCollectionID(collectionID);
 	           logger.info("Using collection ID " + collectionID);
 	          
 	           // Load the calibrations
@@ -155,7 +155,7 @@
 	          
 	           // Set the collection ID
 	           int collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(SvtConditionsLoader.DAQ_MAP_TABLE_NAME);
-	           daqMapping.setCollectionId(collectionID);
+	           daqMapping.setCollectionID(collectionID);
 	           logger.info("Using collection ID " + collectionID);
 	           
 	           // Load the DAQ map
@@ -184,7 +184,7 @@
 
 	           // Set the collection ID
 	           collectionID = DatabaseConditionsManager.getInstance().getNextCollectionID(SvtConditionsLoader.SVT_CHANNELS_TABLE_NAME);
-	           svtChannels.setCollectionId(collectionID);
+	           svtChannels.setCollectionID(collectionID);
 	           logger.info("Using collection ID " + collectionID);
 	           
 	           svtChannels.insert();

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtConfiguration.java	Thu Apr  2 18:14:47 2015
@@ -5,8 +5,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -22,9 +22,9 @@
  */
 @Table(names = {"svt_configurations"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_UPDATED)
-public class SvtConfiguration extends AbstractConditionsObject {
+public class SvtConfiguration extends BaseConditionsObject {
 
-    public static class SvtConfigurationCollection extends AbstractConditionsObjectCollection<SvtConfiguration> {
+    public static class SvtConfigurationCollection extends BaseConditionsObjectCollection<SvtConfiguration> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtGain.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -13,9 +13,9 @@
  */
 @Table(names = {"svt_gains", "test_run_svt_gains"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class SvtGain extends AbstractConditionsObject {
+public final class SvtGain extends BaseConditionsObject {
 
-    public static class SvtGainCollection extends AbstractConditionsObjectCollection<SvtGain> {
+    public static class SvtGainCollection extends BaseConditionsObjectCollection<SvtGain> {
     }
 
     /**

Modified: java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java
 =============================================================================
--- java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	(original)
+++ java/trunk/conditions/src/main/java/org/hps/conditions/svt/SvtShapeFitParameters.java	Thu Apr  2 18:14:47 2015
@@ -1,7 +1,7 @@
 package org.hps.conditions.svt;
 
-import org.hps.conditions.api.AbstractConditionsObject;
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObject;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.Converter;
 import org.hps.conditions.database.Field;
 import org.hps.conditions.database.MultipleCollectionsAction;
@@ -15,9 +15,9 @@
  */
 @Table(names = {"svt_shape_fit_parameters", "test_run_svt_shape_fit_parameters"})
 @Converter(multipleCollectionsAction = MultipleCollectionsAction.LAST_CREATED)
-public final class SvtShapeFitParameters extends AbstractConditionsObject {
+public final class SvtShapeFitParameters extends BaseConditionsObject {
 
-    public static class SvtShapeFitParametersCollection extends AbstractConditionsObjectCollection<SvtShapeFitParameters> {
+    public static class SvtShapeFitParametersCollection extends BaseConditionsObjectCollection<SvtShapeFitParameters> {
     }
 
     /**

Modified: java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java
 =============================================================================
--- java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	(original)
+++ java/trunk/conditions/src/test/java/org/hps/conditions/EngRunConditionsTest.java	Thu Apr  2 18:14:47 2015
@@ -9,7 +9,7 @@
 
 import junit.framework.TestCase;
 
-import org.hps.conditions.api.AbstractConditionsObjectCollection;
+import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.conditions.ecal.EcalCalibration.EcalCalibrationCollection;
 import org.hps.conditions.ecal.EcalChannel;
@@ -63,7 +63,7 @@
         loop.loop(100);
     }
     
-    static void checkRunNumbers(AbstractConditionsObjectCollection<?> collection) {
+    static void checkRunNumbers(BaseConditionsObjectCollection<?> collection) {
         assertTrue("Run start out of range.", collection.getConditionsRecord().getRunStart() >= runStart);
         assertTrue("Run end out of range.", collection.getConditionsRecord().getRunEnd() <= runEnd);
     }