Print

Print


Author: [log in to unmask]
Date: Mon Jun 22 14:11:27 2015
New Revision: 3180

Log:
Add CSV import interface and other improvements.  HPSJAVA-550

Modified:
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableRegistry.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
    java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
    java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/dummy/DummyConditionsObjectCollectionTest.java

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObject.java	Mon Jun 22 14:11:27 2015
@@ -326,9 +326,10 @@
             resultSet = statement.executeQuery(sql);
             selected = resultSet.next();
             if (selected) {
-                for (int columnIndex = 1; columnIndex <= this.tableMetaData.getFieldNames().length; columnIndex++) {
-                    this.setFieldValue(this.tableMetaData.getFieldNames()[columnIndex - 1],
-                            resultSet.getObject(columnIndex));
+                int columnIndex = 1;
+                for (String fieldName : this.tableMetaData.getFieldNames()) {
+                    this.setFieldValue(fieldName, resultSet.getObject(columnIndex));
+                    ++columnIndex;
                 }
             }
         } finally {

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/BaseConditionsObjectCollection.java	Mon Jun 22 14:11:27 2015
@@ -1,5 +1,9 @@
 package org.hps.conditions.api;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -11,7 +15,12 @@
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVParser;
+import org.apache.commons.csv.CSVRecord;
 
 /**
  * Implementation of the {@link ConditionsObjectCollection} interface.
@@ -326,7 +335,7 @@
         }
         sb.setLength(sb.length() - 2);
         sb.append(") VALUES (");
-        for (int fieldIndex = 0; fieldIndex < this.getTableMetaData().getFieldNames().length; fieldIndex++) {
+        for (String fieldName : this.getTableMetaData().getFieldNames()) {
             sb.append("?, ");
         }
         sb.setLength(sb.length() - 2);
@@ -335,10 +344,11 @@
         try {
             insertObjects = this.connection.prepareStatement(updateStatement, Statement.RETURN_GENERATED_KEYS);
             for (final ObjectType object : this) {
-                for (int fieldIndex = 0; fieldIndex < this.getTableMetaData().getFieldNames().length; fieldIndex++) {
-                    final String fieldName = this.getTableMetaData().getFieldNames()[fieldIndex];
-                    insertObjects.setObject(fieldIndex + 1,
+                int fieldIndex = 1;
+                for (String fieldName : this.getTableMetaData().getFieldNames()) {
+                    insertObjects.setObject(fieldIndex,
                             object.getFieldValue(this.getTableMetaData().getFieldType(fieldName), fieldName));
+                    fieldIndex++;
                 }
                 insertObjects.executeUpdate();
                 final ResultSet resultSet = insertObjects.getGeneratedKeys();
@@ -403,6 +413,84 @@
     @Override
     public final Iterator<ObjectType> iterator() {
         return this.objects.iterator();
+    }
+
+    /**
+     * Load data from a CSV file.
+     *
+     * @param file the CSV file
+     */
+    @Override
+    public void loadCsv(final File file) throws IOException, FileNotFoundException, ConditionsObjectException {
+
+        // Clear the objects from the collection.
+        this.objects.clear();
+        
+        // Unset the collection ID.
+        this.collectionId = BaseConditionsObject.UNSET_COLLECTION_ID;
+                
+        // Check if the table info exists.
+        if (this.getTableMetaData() == null) {
+            // Table name is invalid.
+            throw new RuntimeException("The table meta data is not set.");
+        }
+
+        // Read in the CSV records.
+        final FileReader reader = new FileReader(file);
+        final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader());
+        final List<CSVRecord> records = parser.getRecords();
+
+        // Get the database field names from the table info.
+        final Set<String> fields = this.getTableMetaData().getFieldNames();
+
+        // Get the text file column headers from the parser.
+        final Map<String, Integer> headerMap = parser.getHeaderMap();
+        
+        // Get the headers that were read in from CSV.
+        final Set<String> headers = headerMap.keySet();
+        
+        // Make sure the headers are actually valid column names in the database.
+        for (final String header : headerMap.keySet()) {
+            if (!fields.contains(header)) {
+                // The field name does not match a table column.
+                throw new RuntimeException("Header " + header + " from CSV is not a column in the "
+                        + this.getTableMetaData().getTableName() + " table.");
+            }
+        }
+
+        // Get the class of the objects contained in this collection.
+        final Class<? extends ConditionsObject> objectClass = this.getTableMetaData().getObjectClass();
+
+        // Iterate over the CSV records.
+        for (final CSVRecord record : records) {
+            
+            // Create a new conditions object.
+            final ObjectType object;
+            try {
+                // Create a new conditions object and cast to correct type for adding to collection.
+                object = (ObjectType) objectClass.newInstance();
+            } catch (InstantiationException | IllegalAccessException e) {
+                throw new RuntimeException("Error creating conditions object.", e);
+            }
+            
+            // Set the field values on the object.
+            for (final String header : headers) {
+                // Set the value of a field in the object based on the header name, converting to the correct type.
+                object.setFieldValue(
+                        header,
+                        ConditionsObjectUtilities.convertValue(this.getTableMetaData().getFieldType(header), record.get(header)));
+            }
+            
+            // Add the object to the collection.
+            this.add(object);
+        }
+        
+        // Close the CSV parser and reader.
+        parser.close();
+        reader.close();
+        
+        // Flag collection as dirty (since it is read from text it is not explicitly in the database).
+        this.isDirty = true;
     }
 
     /**
@@ -434,9 +522,10 @@
                     newObject.setTableMetaData(this.tableMetaData);
                     final int id = resultSet.getInt(1);
                     ((BaseConditionsObject) newObject).setRowId(id);
-                    for (int fieldIndex = 0; fieldIndex < this.tableMetaData.getFieldNames().length; fieldIndex++) {
-                        final String fieldName = this.tableMetaData.getFieldNames()[fieldIndex];
-                        newObject.setFieldValue(fieldName, resultSet.getObject(fieldIndex + 2));
+                    int fieldIndex = 2;
+                    for (String fieldName : this.tableMetaData.getFieldNames()) {
+                        newObject.setFieldValue(fieldName, resultSet.getObject(fieldIndex));
+                        ++fieldIndex;
                     }
                     try {
                         this.add(newObject);
@@ -585,4 +674,18 @@
         }
         return updated;
     }
+    
+    /**
+     * Convert object to string.
+     * 
+     * @return this object converted to a string
+     */
+    public String toString() {
+        StringBuffer buff = new StringBuffer();
+        for (ConditionsObject object : this.getObjects()) {
+            buff.append(object);
+            buff.append('\n');
+        }
+        return buff.toString();
+    }
 }

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectCollection.java	Mon Jun 22 14:11:27 2015
@@ -1,5 +1,8 @@
 package org.hps.conditions.api;
 
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.Comparator;
 
 /**
@@ -51,6 +54,16 @@
     int getCollectionId();
 
     /**
+     * Load collection from a CSV file.
+     *
+     * @param file the input CSV file
+     * @throws IOException if there is an error closing the reader
+     * @throws FileNotFoundException if the input file does not exist
+     * @throws ConditionsObjectException if there is an error creating a conditions object
+     */
+    void loadCsv(File file) throws IOException, FileNotFoundException, ConditionsObjectException;
+
+    /**
      * Set the collection ID.
      *
      * @param collectionId the new collection ID

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/ConditionsObjectUtilities.java	Mon Jun 22 14:11:27 2015
@@ -1,15 +1,10 @@
 package org.hps.conditions.api;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.util.HashSet;
-import java.util.Set;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
-import javassist.Modifier;
-
-import org.hps.conditions.database.Field;
-import org.hps.conditions.database.Table;
-import org.reflections.Reflections;
+import org.hps.conditions.database.DatabaseConditionsManager;
 
 /**
  * This is a collection of utility methods for {@link ConditionsObject}.
@@ -17,94 +12,72 @@
  * @author Jeremy McCormick, SLAC
  */
 public final class ConditionsObjectUtilities {
+    
+    /**
+     * Static instance of conditions manager.
+     */
+    private static final DatabaseConditionsManager MANAGER = DatabaseConditionsManager.getInstance();
 
     /**
-     * Find all available classes that extend ConditionsObject.
+     * Default input date format from text data.
+     */
+    private static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    
+    /**
+     * Convert from a raw string into a specific type.
      *
-     * @return The set of all available classes that extend ConditionsObject.
+     * @param type the target type
+     * @param value the raw value
+     * @return the value converter to the given type
      */
-    public static Set<Class<? extends ConditionsObject>> findConditionsObjectTypes() {
-        final Reflections reflections = new Reflections("org.hps.conditions");
-        final Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
-        for (final Class<? extends ConditionsObject> objectType : reflections.getSubTypesOf(ConditionsObject.class)) {
-            if (Modifier.isAbstract(objectType.getModifiers())) {
-                continue;
+    public static Object convertValue(final Class<?> type, final String value) throws ConditionsObjectException {
+        if (Integer.class.equals(type)) {
+            return Integer.parseInt(value);
+        } else if (Double.class.equals(type)) {
+            return Double.parseDouble(value);
+        } else if (Float.class.equals(type)) {
+            return Float.parseFloat(value);
+        } else if (Boolean.class.equals(type)) {
+            return Boolean.parseBoolean(value);
+        } else if (Date.class.equals(type)) {
+            try {
+                return DEFAULT_DATE_FORMAT.parse(value);
+            } catch (ParseException e) {
+                throw new ConditionsObjectException("Error parsing date.", e);
             }
-            if (objectType.getAnnotation(Table.class) == null) {
-                continue;
-            }
-            objectTypes.add(objectType);
-        }
-        return objectTypes;
-    }
-
-    /**
-     * Get the class for the collection of the ConditionsObject type.
-     *
-     * @param type the class of the ConditionsObject
-     * @return the class of the collection
-     */
-    @SuppressWarnings("unchecked")
-    public static Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(
-            final Class<? extends ConditionsObject> type) {
-        final String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
-        Class<?> rawCollectionClass;
-        try {
-            rawCollectionClass = Class.forName(collectionClassName);
-        } catch (final ClassNotFoundException e) {
-            throw new RuntimeException("The type does not define a nested collection class.", e);
-        }
-        if (!BaseConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass)) {
-            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName()
-                    + " does not extend ConditionsObjectCollection.");
-        }
-        return (Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
-    }
-
-    /**
-     * Get the list of database field names for the class.
-     *
-     * @param type the class
-     * @return the list of field names
-     */
-    public static Set<String> getFieldNames(final Class<? extends ConditionsObject> type) {
-        final Set<String> fieldNames = new HashSet<String>();
-        for (final Method method : type.getMethods()) {
-            if (!method.getReturnType().equals(Void.TYPE)) {
-                for (final Annotation annotation : method.getAnnotations()) {
-                    if (annotation.annotationType().equals(Field.class)) {
-                        if (!Modifier.isPublic(method.getModifiers())) {
-                            throw new RuntimeException("The method " + type.getName() + "." + method.getName()
-                                    + " has a Field annotation, but it is not public.");
-                        }
-                        final Field field = (Field) annotation;
-                        for (final String fieldName : field.names()) {
-                            if (fieldName != null && !"".equals(fieldName)) {
-                                fieldNames.add(fieldName);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return fieldNames;
-    }
-
-    /**
-     * Get the list of table names for the class.
-     *
-     * @param type the class
-     * @return the list of table names
-     */
-    public static String[] getTableNames(final Class<? extends ConditionsObject> type) {
-        final Table tableAnnotation = type.getAnnotation(Table.class);
-        if (tableAnnotation != null) {
-            return tableAnnotation.names();
         } else {
-            return new String[] {};
+            return value;
         }
     }
-
+                
+    /**
+     * Create a new conditions collection from the table name.
+     * 
+     * @param tableName the name of the table
+     * @return the new conditions collection
+     * @throws ConditionsObjectException if there is an error creating the collection
+     */
+    public static ConditionsObjectCollection<?> newCollection(String tableName) throws ConditionsObjectException {
+        TableMetaData tableInfo = TableRegistry.getTableRegistry().findByTableName(tableName);
+        ConditionsObjectCollection<?> collection = tableInfo.newCollection();
+        collection.setConnection(MANAGER.getConnection());
+        return collection; 
+    }
+    
+    /**
+     * Create a new conditions object from the table name.
+     * 
+     * @param tableName the name of the table
+     * @return the new conditions object
+     * @throws ConditionsObjectException if there is an error creating the object
+     */
+    public static ConditionsObject newObject(String tableName) throws ConditionsObjectException {
+        TableMetaData tableInfo = TableRegistry.getTableRegistry().findByTableName(tableName);
+        ConditionsObject object = tableInfo.newObject();
+        object.setConnection(MANAGER.getConnection());
+        return object;
+    }
+    
     /**
      * Do not allow class to be instantiated.
      */

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableMetaData.java	Mon Jun 22 14:11:27 2015
@@ -127,12 +127,12 @@
     }
 
     /**
-     * Get the names of the fields. Types are implied from the database tables.
-     *
-     * @return the names of the fields
-     */
-    public String[] getFieldNames() {
-        return this.fieldNames.toArray(new String[] {});
+     * Get the field names.
+     *
+     * @return the set of field names
+     */
+    public Set<String> getFieldNames() {
+        return this.fieldNames;
     }
 
     /**
@@ -230,4 +230,36 @@
         buff.append('\n');
         return buff.toString();
     }
+    
+    /**
+     * Create a new collection instance from the table meta data's collection type.
+     * 
+     * @return the new object collection
+     * @throws ConditionsObjectException if there is an error creating a new collection
+     */
+    ConditionsObjectCollection<?> newCollection() throws ConditionsObjectException {
+        try {
+            ConditionsObjectCollection<?> collection = this.getCollectionClass().newInstance();
+            collection.setTableMetaData(this);
+            return collection;
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new ConditionsObjectException("Error creating new conditions object collection.", e);
+        }
+    }
+    
+    /**
+     * Create a new object instance from the table meta data's object type.
+     * 
+     * @return the new conditions object
+     * @throws ConditionsObjectException if there is an error creating a new object
+     */
+    ConditionsObject newObject() throws ConditionsObjectException  {
+        try {
+            ConditionsObject object = this.getObjectClass().newInstance();
+            object.setTableMetaData(this);
+            return object;
+        } catch (InstantiationException | IllegalAccessException e) {
+            throw new ConditionsObjectException("Error creating new conditions object collection.", e);
+        }        
+    }
 }

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableRegistry.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableRegistry.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/api/TableRegistry.java	Mon Jun 22 14:11:27 2015
@@ -4,11 +4,16 @@
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javassist.Modifier;
+
 import org.hps.conditions.database.Field;
+import org.hps.conditions.database.Table;
+import org.reflections.Reflections;
 
 /**
  * This is a registry providing a map between tables and their meta-data.
@@ -68,14 +73,13 @@
      */
     private static TableRegistry create() {
         final TableRegistry registry = new TableRegistry();
-        for (final Class<? extends ConditionsObject> objectType : ConditionsObjectUtilities.findConditionsObjectTypes()) {
+        for (final Class<? extends ConditionsObject> objectType : findConditionsObjectTypes()) {
 
             // Get the collection type.
-            final Class<? extends BaseConditionsObjectCollection<?>> collectionType = ConditionsObjectUtilities
-                    .getCollectionType(objectType);
+            final Class<? extends BaseConditionsObjectCollection<?>> collectionType = getCollectionType(objectType);
 
             // Get the list of field names.
-            final Set<String> fieldNames = ConditionsObjectUtilities.getFieldNames(objectType);
+            final Set<String> fieldNames = getFieldNames(objectType);
 
             // Create map of fields to their types.
             final Map<String, Class<?>> fieldTypes = new HashMap<String, Class<?>>();
@@ -92,7 +96,7 @@
                 }
             }
 
-            for (final String name : ConditionsObjectUtilities.getTableNames(objectType)) {
+            for (final String name : getTableNames(objectType)) {
                 // Create a meta data mapping for each table name in the class description.
                 final TableMetaData data = new TableMetaData(name, name, objectType, collectionType, fieldNames,
                         fieldTypes);
@@ -103,6 +107,30 @@
         }
         return registry;
     }
+    
+    /**
+     * Get the class for the collection of the ConditionsObject type.
+     *
+     * @param type the class of the ConditionsObject
+     * @return the class of the collection
+     */
+    @SuppressWarnings("unchecked")
+    public static Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> getCollectionType(
+            final Class<? extends ConditionsObject> type) {
+        final String collectionClassName = type.getCanonicalName() + "$" + type.getSimpleName() + "Collection";
+        Class<?> rawCollectionClass;
+        try {
+            rawCollectionClass = Class.forName(collectionClassName);
+        } catch (final ClassNotFoundException e) {
+            throw new RuntimeException("The type does not define a nested collection class.", e);
+        }
+        if (!BaseConditionsObjectCollection.class.isAssignableFrom(rawCollectionClass)) {
+            throw new RuntimeException("The class " + rawCollectionClass.getSimpleName()
+                    + " does not extend ConditionsObjectCollection.");
+        }
+        return (Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>>) rawCollectionClass;
+    }
+    
 
     /**
      * Get the global static instance of the registry.
@@ -134,6 +162,50 @@
      */
     private TableRegistry() {
     }
+    
+    /**
+     * Get the list of database field names for the class.
+     *
+     * @param type the class
+     * @return the list of field names
+     */
+    private static Set<String> getFieldNames(final Class<? extends ConditionsObject> type) {
+        final Set<String> fieldNames = new HashSet<String>();
+        for (final Method method : type.getMethods()) {
+            if (!method.getReturnType().equals(Void.TYPE)) {
+                for (final Annotation annotation : method.getAnnotations()) {
+                    if (annotation.annotationType().equals(Field.class)) {
+                        if (!Modifier.isPublic(method.getModifiers())) {
+                            throw new RuntimeException("The method " + type.getName() + "." + method.getName()
+                                    + " has a Field annotation, but it is not public.");
+                        }
+                        final Field field = (Field) annotation;
+                        for (final String fieldName : field.names()) {
+                            if (fieldName != null && !"".equals(fieldName)) {
+                                fieldNames.add(fieldName);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return fieldNames;
+    }
+    
+    /**
+     * Get the list of table names for the class.
+     *
+     * @param type the class
+     * @return the list of table names
+     */
+    private static String[] getTableNames(final Class<? extends ConditionsObject> type) {
+        final Table tableAnnotation = type.getAnnotation(Table.class);
+        if (tableAnnotation != null) {
+            return tableAnnotation.names();
+        } else {
+            return new String[] {};
+        }
+    }
 
     /**
      * Find meta data by collection type.
@@ -164,6 +236,26 @@
     public TableMetaData findByTableName(final String name) {
         return this.get(name);
     }
+    
+    /**
+     * Find all available classes that extend ConditionsObject.
+     *
+     * @return The set of all available classes that extend ConditionsObject.
+     */
+    public static Set<Class<? extends ConditionsObject>> findConditionsObjectTypes() {
+        final Reflections reflections = new Reflections("org.hps.conditions");
+        final Set<Class<? extends ConditionsObject>> objectTypes = new HashSet<Class<? extends ConditionsObject>>();
+        for (final Class<? extends ConditionsObject> objectType : reflections.getSubTypesOf(ConditionsObject.class)) {
+            if (Modifier.isAbstract(objectType.getModifiers())) {
+                continue;
+            }
+            if (objectType.getAnnotation(Table.class) == null) {
+                continue;
+            }
+            objectTypes.add(objectType);
+        }
+        return objectTypes;
+    }    
 
     /**
      * Convert this object to a string.

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/cli/LoadCommand.java	Mon Jun 22 14:11:27 2015
@@ -7,8 +7,8 @@
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -20,6 +20,7 @@
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObjectException;
+import org.hps.conditions.api.ConditionsObjectUtilities;
 import org.hps.conditions.api.DatabaseObjectException;
 import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.database.DatabaseConditionsManager;
@@ -75,27 +76,6 @@
     }
 
     /**
-     * Convert from a raw string into a specific type.
-     *
-     * @param type the target type
-     * @param value the raw value
-     * @return the value converter to the given type
-     */
-    Object convertValue(final Class<?> type, final String value) {
-        if (Integer.class.equals(type)) {
-            return Integer.parseInt(value);
-        } else if (Double.class.equals(type)) {
-            return Double.parseDouble(value);
-        } else if (Float.class.equals(type)) {
-            return Float.parseFloat(value);
-        } else if (Boolean.class.equals(type)) {
-            return Boolean.parseBoolean(value);
-        } else {
-            return value;
-        }
-    }
-
-    /**
      * Execute the <i>load</i> command with the given arguments.
      *
      * @param arguments the command arguments
@@ -205,7 +185,7 @@
             final Class<? extends ConditionsObject> objectClass = tableMetaData.getObjectClass();
 
             // Get the field names from the table info.
-            final List<String> fieldNames = new ArrayList<String>(Arrays.asList(tableMetaData.getFieldNames()));
+            final Set<String> fieldNames = tableMetaData.getFieldNames();
             fieldNames.remove("collection_id");
 
             // Check that the column names which were read in from the header row are valid.
@@ -259,7 +239,7 @@
                     LOGGER.info("value: " + value);
 
                     // Convert the value to a specific type and set the value on the object.
-                    object.setFieldValue(columnNames.get(i), this.convertValue(columnType, value));
+                    object.setFieldValue(columnNames.get(i), ConditionsObjectUtilities.convertValue(columnType, value));
 
                     // Add the object to the collection.
                     LOGGER.info("adding conditions object: " + object);

Modified: java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/main/java/org/hps/conditions/database/ConverterRegistry.java	Mon Jun 22 14:11:27 2015
@@ -9,7 +9,7 @@
 import org.hps.conditions.api.AbstractConditionsObjectConverter;
 import org.hps.conditions.api.BaseConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsObject;
-import org.hps.conditions.api.ConditionsObjectUtilities;
+import org.hps.conditions.api.TableRegistry;
 import org.reflections.Reflections;
 
 /**
@@ -58,8 +58,7 @@
                 }
             }
 
-            final Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> collectionType = ConditionsObjectUtilities
-                    .getCollectionType(objectType);
+            final Class<? extends BaseConditionsObjectCollection<? extends ConditionsObject>> collectionType = TableRegistry.getCollectionType(objectType);
 
             AbstractConditionsObjectConverter converter = null;
             if (converterClass == null) {

Modified: java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/dummy/DummyConditionsObjectCollectionTest.java
 =============================================================================
--- java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/dummy/DummyConditionsObjectCollectionTest.java	(original)
+++ java/branches/HPSJAVA-488/conditions/src/test/java/org/hps/conditions/dummy/DummyConditionsObjectCollectionTest.java	Mon Jun 22 14:11:27 2015
@@ -1,9 +1,12 @@
 package org.hps.conditions.dummy;
 
+import java.io.File;
 import java.sql.Connection;
 
 import junit.framework.TestCase;
 
+import org.hps.conditions.api.ConditionsObjectCollection;
+import org.hps.conditions.api.ConditionsObjectUtilities;
 import org.hps.conditions.api.TableMetaData;
 import org.hps.conditions.api.TableRegistry;
 import org.hps.conditions.database.DatabaseConditionsManager;
@@ -63,4 +66,16 @@
         System.out.println("deleting objects from collection " + collection.getCollectionId());
         collection.delete();
     }
+
+    public void testCsv() throws Exception {        
+
+        // Create an object collection.
+        final ConditionsObjectCollection<?> collection = ConditionsObjectUtilities.newCollection("dummy");
+        
+        // Load CSV data.
+        collection.loadCsv(new File("dummy.txt"));
+        
+        System.out.println("loaded dummy collection ...");
+        System.out.println(collection.toString());
+    }
 }