]> source.dussan.org Git - jackcess.git/commitdiff
implement unsupported complex value support; add some javadocs
authorJames Ahlborn <jtahlborn@yahoo.com>
Sun, 6 Nov 2011 21:49:57 +0000 (21:49 +0000)
committerJames Ahlborn <jtahlborn@yahoo.com>
Sun, 6 Nov 2011 21:49:57 +0000 (21:49 +0000)
git-svn-id: https://svn.code.sf.net/p/jackcess/code/jackcess/trunk@586 f203690c-595d-4dc9-a70b-905162fa7fd2

12 files changed:
TODO.txt
src/java/com/healthmarketscience/jackcess/complex/Attachment.java
src/java/com/healthmarketscience/jackcess/complex/AttachmentColumnInfo.java
src/java/com/healthmarketscience/jackcess/complex/ComplexColumnInfo.java
src/java/com/healthmarketscience/jackcess/complex/ComplexDataType.java
src/java/com/healthmarketscience/jackcess/complex/ComplexValue.java
src/java/com/healthmarketscience/jackcess/complex/ComplexValueForeignKey.java
src/java/com/healthmarketscience/jackcess/complex/MultiValueColumnInfo.java
src/java/com/healthmarketscience/jackcess/complex/SingleValue.java
src/java/com/healthmarketscience/jackcess/complex/UnsupportedColumnInfo.java
src/java/com/healthmarketscience/jackcess/complex/Version.java
src/java/com/healthmarketscience/jackcess/complex/VersionHistoryColumnInfo.java

index af1cefa8a1543466299af08cf641ca012fc8271f..7c9802e545155098d106b2c775ea7b48a4368148 100644 (file)
--- a/TODO.txt
+++ b/TODO.txt
@@ -10,6 +10,8 @@ Missing pieces:
   * MEDIUM
 - implement (optional) foreign key enforcement
   * MEDIUM
+- implement write support for properties
+  * EASY
 - implement table, column, index renaming
   * EASY
 - implement table, column, index deletion
index af33544034ec8143105de80154ee9397a9406b68..2f4b0461cf5dedfeff4c46b609e9dc8aed8dce3e 100644 (file)
@@ -22,6 +22,7 @@ package com.healthmarketscience.jackcess.complex;
 import java.util.Date;
 
 /**
+ * Complex value corresponding to an attachment.
  *
  * @author James Ahlborn
  */
index f258ca007297dc92c1622467061694217013aec5..b86b9d16c8dbe304bcd3abdcb7739e31035487bb 100644 (file)
@@ -20,7 +20,6 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +30,7 @@ import com.healthmarketscience.jackcess.Table;
 
 
 /**
+ * Complex column info for a column holding 0 or more attachments per row.
  *
  * @author James Ahlborn
  */
@@ -131,19 +131,8 @@ public class AttachmentColumnInfo extends ComplexColumnInfo<Attachment>
   }
 
   @Override
-  protected List<Attachment> toValues(ComplexValueForeignKey complexValueFk,
-                                   List<Map<String,Object>> rawValues)
-    throws IOException
-  {
-    List<Attachment> attachments = new ArrayList<Attachment>();
-    for(Map<String,Object> rawValue : rawValues) {
-      attachments.add(toAttachment(complexValueFk, rawValue));
-    }
-    return attachments;
-  }
-
-  protected AttachmentImpl toAttachment(ComplexValueForeignKey complexValueFk,
-                                        Map<String,Object> rawValue) {
+  protected AttachmentImpl toValue(ComplexValueForeignKey complexValueFk,
+                                   Map<String,Object> rawValue) {
     int id = (Integer)getPrimaryKeyColumn().getRowValue(rawValue);
     String url = (String)getFileUrlColumn().getRowValue(rawValue);
     String name = (String)getFileNameColumn().getRowValue(rawValue);
index 523263771c2de46bedff43b58c91f4c6a3c87148..bcdaf9fd2d21a11870104542e29f3c6faafbb828 100644 (file)
@@ -76,9 +76,11 @@ public abstract class ComplexColumnInfo<V extends ComplexValue>
     // the flat table has all the "value" columns and 2 extra columns, a
     // primary key for each row, and a LONG value which is essentially a
     // foreign key to the main table.
-    _typeCols = new ArrayList<Column>();
+    List<Column> typeCols = new ArrayList<Column>();
     List<Column> otherCols = new ArrayList<Column>();
-    diffFlatColumns(typeObjTable, flatTable, _typeCols, otherCols);
+    diffFlatColumns(typeObjTable, flatTable, typeCols, otherCols);
+
+    _typeCols = Collections.unmodifiableList(typeCols);
 
     Column pkCol = null;
     Column complexValFkCol = null;
@@ -234,6 +236,18 @@ public abstract class ComplexColumnInfo<V extends ComplexValue>
     return toValues(complexValueFk, rawValues);
   }
   
+  protected List<V> toValues(ComplexValueForeignKey complexValueFk,
+                             List<Map<String,Object>> rawValues)
+    throws IOException
+  {
+    List<V> values = new ArrayList<V>();
+    for(Map<String,Object> rawValue : rawValues) {
+      values.add(toValue(complexValueFk, rawValue));
+    }
+
+    return values;
+  }
+
   public int addRawValue(Map<String,Object> rawValue) throws IOException {
     Object[] row = _flatTable.asRow(rawValue);
     _flatTable.addRow(row);
@@ -336,9 +350,9 @@ public abstract class ComplexColumnInfo<V extends ComplexValue>
   
   public abstract ComplexDataType getType();
 
-  protected abstract List<V> toValues(
+  protected abstract V toValue(
       ComplexValueForeignKey complexValueFk,
-      List<Map<String,Object>> rawValues)
+      Map<String,Object> rawValues)
     throws IOException;
   
   protected static class ComplexValueImpl implements ComplexValue
index 1c5e699abd4c4287a0c7c68c816a35bd450a92c7..c0ae49532ba0fcbc32c16643322dcee3f81647bb 100644 (file)
@@ -20,6 +20,7 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 /**
+ * Secondary type classification for the data in a complex column.
  *
  * @author James Ahlborn
  */
index e65a09cf098b6ed577cede053fdb2e3b4cca8239..b2f7d8c04e4831ca38972022a1c2e702d9a3e04b 100644 (file)
@@ -24,20 +24,43 @@ import java.io.IOException;
 import com.healthmarketscience.jackcess.Column;
 
 /**
+ * Base class for a value in a complex column (where there may be multiple
+ * values for a single row in the main table).
  *
  * @author James Ahlborn
  */
 public interface ComplexValue 
 {
+  /**
+   * Returns the unique identifier of this complex value (this value is unique
+   * among all values in all rows of the main table).
+   * 
+   * @return the current id or {@link ComplexColumnInfo#INVALID_ID} for a new,
+   *         unsaved value.
+   */
   public int getId();
 
   public void setId(int newId);
   
+  /**
+   * Returns the foreign key identifier for this complex value (this value is
+   * the same for all values in the same row of the main table).
+   * 
+   * @return the current id or {@link ComplexColumnInfo#INVALID_COMPLEX_VALUE_ID}
+   *         for a new, unsaved value.
+   */
   public ComplexValueForeignKey getComplexValueForeignKey();
 
   public void setComplexValueForeignKey(ComplexValueForeignKey complexValueFk);
 
+  /**
+   * @return the column in the main table with which this complex value is
+   *         associated
+   */
   public Column getColumn();
 
+  /**
+   * Writes any updated data for this complex value to the database.
+   */
   public void update() throws IOException;
 }
index 294958f5b1952b287733a3f94b1c1fd3a6492461..843cc5ed1794a274d9ad779c6c83f0863d5b215a 100644 (file)
@@ -28,6 +28,16 @@ import java.util.Map;
 import com.healthmarketscience.jackcess.Column;
 
 /**
+ * Value which is returned for a complex column.  This value corresponds to a
+ * foreign key in a secondary table which contains the actual complex data for
+ * this row (which could be 0 or more complex values for a given row).  This
+ * class contains various convenience methods for interacting with the actual
+ * complex values.
+ * <p>
+ * This class will cache the associated complex values returned from one of
+ * the lookup methods.  The various modification methods will clear this cache
+ * automatically.  The {@link #reset} method may be called manually to clear
+ * this internal cache.
  *
  * @author James Ahlborn
  */
@@ -37,10 +47,9 @@ public class ComplexValueForeignKey extends Number
   
   private final Column _column;
   private final int _value;
-  private List<? extends ComplexValue> _values;
+  private transient List<? extends ComplexValue> _values;
   
-  public ComplexValueForeignKey(Column column, int value) 
-  {
+  public ComplexValueForeignKey(Column column, int value) {
     _column = column;
     _value = value;
   }
@@ -103,6 +112,10 @@ public class ComplexValueForeignKey extends Number
     return (MultiValueColumnInfo)getComplexInfo();
   }
     
+  protected UnsupportedColumnInfo getUnsupportedInfo() {
+    return (UnsupportedColumnInfo)getComplexInfo();
+  }
+    
   public int countValues()
     throws IOException
   {
@@ -217,6 +230,23 @@ public class ComplexValueForeignKey extends Number
     return value;
   }
   
+  public UnsupportedValue addUnsupportedValue(Map<String,Object> values)
+    throws IOException
+  {
+    reset();
+    UnsupportedValue v = UnsupportedColumnInfo.newValue(this, values);
+    getUnsupportedInfo().addValue(v);
+    return v;
+  }
+  
+  public UnsupportedValue updateUnsupportedValue(UnsupportedValue value)
+    throws IOException
+  {
+    reset();
+    getUnsupportedInfo().updateValue(value);
+    return value;
+  }
+  
   private Object writeReplace() throws ObjectStreamException {
     // if we are going to serialize this ComplexValueForeignKey, convert it
     // back to a normal Integer (in case it is restored outside of the context
index 1b117c67465628423b3d6833e3c0a421decaa209..61488c1039e7f534217129fd39be32c215a86e96 100644 (file)
@@ -20,7 +20,6 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +30,7 @@ import com.healthmarketscience.jackcess.DataType;
 import com.healthmarketscience.jackcess.Table;
 
 /**
+ * Complex column info for a column holding multiple values per row.
  *
  * @author James Ahlborn
  */
@@ -60,21 +60,9 @@ public class MultiValueColumnInfo extends ComplexColumnInfo<SingleValue>
   public Column getValueColumn() {
     return _valueCol;
   }
-  
-  @Override
-  protected List<SingleValue> toValues(ComplexValueForeignKey complexValueFk,
-                                       List<Map<String,Object>> rawValues)
-    throws IOException
-  {
-    List<SingleValue> values = new ArrayList<SingleValue>();
-    for(Map<String,Object> rawValue : rawValues) {
-      values.add(toSingleValue(complexValueFk, rawValue));
-    }
-
-    return values;
-  }
 
-  protected SingleValueImpl toSingleValue(
+  @Override
+  protected SingleValueImpl toValue(
       ComplexValueForeignKey complexValueFk,
       Map<String,Object> rawValue)
   {
index d8f652773ef5a3f95ce097a60881c525d4637aeb..2e4c509a46010df40930691a83a6ec662ab379f6 100644 (file)
@@ -20,6 +20,7 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 /**
+ * Complex value corresponding to an single value in a multi-value column.
  *
  * @author James Ahlborn
  */
index fd2a0fccf9df0420c6f1b28f870009fce9a0542c..d362aa7374f6fac4cc1d6b050ed2ea33b76fb7f3 100644 (file)
@@ -20,6 +20,7 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 import java.io.IOException;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -27,10 +28,11 @@ import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.Table;
 
 /**
+ * Complex column info for an unsupported complex type.
  *
  * @author James Ahlborn
  */
-public class UnsupportedColumnInfo extends ComplexColumnInfo<ComplexValue>
+public class UnsupportedColumnInfo extends ComplexColumnInfo<UnsupportedValue>
 {
 
   public UnsupportedColumnInfo(Column column, int complexId, Table typeObjTable,
@@ -40,6 +42,10 @@ public class UnsupportedColumnInfo extends ComplexColumnInfo<ComplexValue>
     super(column, complexId, typeObjTable, flatTable);
   }
 
+  public List<Column> getValueColumns() {
+    return getTypeColumns();
+  }
+
   @Override
   public ComplexDataType getType()
   {
@@ -47,17 +53,73 @@ public class UnsupportedColumnInfo extends ComplexColumnInfo<ComplexValue>
   }
 
   @Override
-  protected List<ComplexValue> toValues(ComplexValueForeignKey complexValueFk,
-                                        List<Map<String,Object>> rawValues)
-    throws IOException
+  protected UnsupportedValueImpl toValue(
+      ComplexValueForeignKey complexValueFk,
+      Map<String,Object> rawValue)
   {
-    // FIXME
-    return null;
+    int id = (Integer)getPrimaryKeyColumn().getRowValue(rawValue);
+
+    Map<String,Object> values = new LinkedHashMap<String,Object>(rawValue);
+    values.remove(getPrimaryKeyColumn().getName());
+
+    return new UnsupportedValueImpl(id, complexValueFk, values);
+  }
+
+  @Override
+  protected Object[] asRow(Object[] row, UnsupportedValue value) {
+    super.asRow(row, value);
+
+    Map<String,Object> values = value.getValues();
+    for(Column col : getValueColumns()) {
+      col.setRowValue(row, col.getRowValue(values));
+    }
+
+    return row;
+  }
+
+  public static UnsupportedValue newValue(Map<String,Object> values) {
+    return newValue(INVALID_COMPLEX_VALUE_ID, values);
   }
 
-  public ComplexValue newValue() {
-    // FIXME
-    return null;
+  public static UnsupportedValue newValue(
+      ComplexValueForeignKey complexValueFk, Map<String,Object> values) {
+    return new UnsupportedValueImpl(INVALID_ID, complexValueFk, values);
   }
   
+  private static class UnsupportedValueImpl extends ComplexValueImpl
+    implements UnsupportedValue
+  {
+    private Map<String,Object> _values;
+
+    private UnsupportedValueImpl(int id, ComplexValueForeignKey complexValueFk,
+                                 Map<String,Object> values)
+    {
+      super(id, complexValueFk);
+      _values = values;
+    }
+
+    public Map<String,Object> getValues() {
+      return _values;
+    }
+    
+    public Object get(String columnName) {
+      return getValues().get(columnName);
+    }
+
+    public void set(String columnName, Object value) {
+      getValues().put(columnName, value);
+    }
+
+    @Override
+    public void update() throws IOException {
+      getComplexValueForeignKey().updateUnsupportedValue(this);
+    }
+    
+    @Override
+    public String toString()
+    {
+      return "UnsupportedValue(" + getComplexValueForeignKey() + "," + getId() +
+        ") " + getValues();
+    } 
+  }
 }
index 70477f809142e9adee631f329fc82841435f7ca8..376eb32446ea5ecdede3c32c96f969525423f495 100644 (file)
@@ -22,6 +22,7 @@ package com.healthmarketscience.jackcess.complex;
 import java.util.Date;
 
 /**
+ * Complex value corresponding to a version of a memo column.
  *
  * @author James Ahlborn
  */
index 0cf2fe70aa12cc0d494c3719b858cb74a8bd38b9..ba987089b6e298f2106c0dc5eec32f0e678d8971 100644 (file)
@@ -20,7 +20,6 @@ USA
 package com.healthmarketscience.jackcess.complex;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -30,6 +29,8 @@ import com.healthmarketscience.jackcess.Column;
 import com.healthmarketscience.jackcess.Table;
 
 /**
+ * Complex column info for a column which tracking the version history of an
+ * "append only" memo column.
  *
  * @author James Ahlborn
  */
@@ -92,10 +93,7 @@ public class VersionHistoryColumnInfo extends ComplexColumnInfo<Version>
                                    List<Map<String,Object>> rawValues)
     throws IOException
   {
-    List<Version> versions = new ArrayList<Version>();
-    for(Map<String,Object> rawValue : rawValues) {
-      versions.add(toVersion(complexValueFk, rawValue));
-    }
+    List<Version> versions = super.toValues(complexValueFk, rawValues);
 
     // order versions newest to oldest
     Collections.sort(versions);
@@ -103,8 +101,9 @@ public class VersionHistoryColumnInfo extends ComplexColumnInfo<Version>
     return versions;
   }
 
-  protected VersionImpl toVersion(ComplexValueForeignKey complexValueFk,
-                                  Map<String,Object> rawValue) {
+  @Override
+  protected VersionImpl toValue(ComplexValueForeignKey complexValueFk,
+                                Map<String,Object> rawValue) {
     int id = (Integer)getPrimaryKeyColumn().getRowValue(rawValue);
     String value = (String)getValueColumn().getRowValue(rawValue);
     Date modifiedDate = (Date)getModifiedDateColumn().getRowValue(rawValue);