You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2013/08/29 20:05:26 UTC

[2/2] git commit: Applying patch for getting rid of deprecated "_items" field in DefaultRow

Applying patch for getting rid of deprecated "_items" field in
DefaultRow


Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/15de9fac
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/15de9fac
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/15de9fac

Branch: refs/heads/master
Commit: 15de9fac72463badb316dedc5254c93137b5246a
Parents: 9e59c8d
Author: Kasper Sørensen <i....@gmail.com>
Authored: Thu Aug 29 20:05:11 2013 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Thu Aug 29 20:05:11 2013 +0200

----------------------------------------------------------------------
 .../org/apache/metamodel/data/DefaultRow.java   | 56 +++++++++++++++-----
 .../apache/metamodel/data/DefaultRowTest.java   | 18 +++++++
 2 files changed, 60 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/15de9fac/core/src/main/java/org/apache/metamodel/data/DefaultRow.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/data/DefaultRow.java b/core/src/main/java/org/apache/metamodel/data/DefaultRow.java
index 64703d4..9d86fe2 100644
--- a/core/src/main/java/org/apache/metamodel/data/DefaultRow.java
+++ b/core/src/main/java/org/apache/metamodel/data/DefaultRow.java
@@ -18,6 +18,9 @@
  */
 package org.apache.metamodel.data;
 
+import java.io.ObjectInputStream;
+import java.io.ObjectInputStream.GetField;
+import java.lang.reflect.Field;
 import java.util.Arrays;
 import java.util.List;
 
@@ -35,14 +38,6 @@ public final class DefaultRow extends AbstractRow implements Row {
     private final DataSetHeader _header;
     private final Object[] _values;
     private final Style[] _styles;
-    
-    /**
-     * This field was replaced by the DataSetHeader field above.
-     * 
-     * @deprecated no longer used, except for in deserialized objects
-     */
-    @Deprecated
-    private List<SelectItem> _items;
 
     /**
      * Constructs a row.
@@ -187,7 +182,7 @@ public final class DefaultRow extends AbstractRow implements Row {
         }
         return _styles[index];
     }
-    
+
     @Override
     public Style[] getStyles() {
         return _styles;
@@ -195,11 +190,44 @@ public final class DefaultRow extends AbstractRow implements Row {
 
     @Override
     protected DataSetHeader getHeader() {
-        if (_header == null && _items != null) {
-            // this only happens for deserialized objects which where serialized
-            // prior to the introduction of DataSetHeader.
-            return new SimpleDataSetHeader(_items);
-        }
         return _header;
     }
+
+    /**
+     * Method invoked by the Java serialization framework while deserializing
+     * Row instances. Since previous versions of MetaModel did not use a
+     * DataSetHeader, but had a reference to a List<SelectItem>, this
+     * deserialization is particularly tricky. We check if the items variable is
+     * there, and if it is, we convert it to a header instead.
+     * 
+     * @param stream
+     * @throws Exception
+     */
+    private void readObject(ObjectInputStream stream) throws Exception {
+        GetField fields = stream.readFields();
+
+        try {
+            // backwards compatible deserialization, convert items to header
+            Object items = fields.get("_items", null);
+            @SuppressWarnings("unchecked")
+            List<SelectItem> itemsList = (List<SelectItem>) items;
+            SimpleDataSetHeader header = new SimpleDataSetHeader(itemsList);
+            Field field = getClass().getDeclaredField("_header");
+            field.setAccessible(true);
+            field.set(this, header);
+        } catch (IllegalArgumentException e) {
+            // no backwards compatible deserialization needed.
+            setWhileDeserializing(fields, "_header");
+        }
+
+        setWhileDeserializing(fields, "_values");
+        setWhileDeserializing(fields, "_styles");
+    }
+
+    private void setWhileDeserializing(GetField fields, String fieldName) throws Exception {
+        Object value = fields.get(fieldName, null);
+        Field field = getClass().getDeclaredField(fieldName);
+        field.setAccessible(true);
+        field.set(this, value);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/15de9fac/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java b/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
index 45ff980..a3a45f6 100644
--- a/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
+++ b/core/src/test/java/org/apache/metamodel/data/DefaultRowTest.java
@@ -18,8 +18,11 @@
  */
 package org.apache.metamodel.data;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.FileInputStream;
 import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.lang.reflect.Field;
 
 import org.apache.metamodel.query.SelectItem;
@@ -34,6 +37,21 @@ public class DefaultRowTest extends TestCase {
     private SelectItem[] items = new SelectItem[] { new SelectItem(new MutableColumn("foo")),
             new SelectItem(new MutableColumn("bar")) };
     private Object[] values = new Object[] { "foo", "bar" };
+    
+    public void testSerializeAndDeserialize() throws Exception {
+        DefaultRow row = new DefaultRow(new SimpleDataSetHeader(items), values);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(row);
+        oos.close();
+        
+        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+        ObjectInputStream ois = new ObjectInputStream(bais);
+        Object deserialized = ois.readObject();
+        
+        assertEquals("Row[values=[foo, bar]]", deserialized.toString());
+        assertEquals(row, deserialized);
+    }
 
     public void testDeserializeBackwardsCompatible() throws Exception {
         Object obj;