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;