adding avro serialization insted pure java and unit tests

Project: http://git-wip-us.apache.org/repos/asf/gora/repo
Commit: http://git-wip-us.apache.org/repos/asf/gora/commit/a05928a7
Tree: http://git-wip-us.apache.org/repos/asf/gora/tree/a05928a7
Diff: http://git-wip-us.apache.org/repos/asf/gora/diff/a05928a7

Branch: refs/heads/master
Commit: a05928a7e347e841ed0bb4359908b5feca390fb2
Parents: fd80478
Author: Kevin Ratnasekera <djkevi...@yahoo.com>
Authored: Mon Aug 1 02:27:40 2016 +0530
Committer: Kevin Ratnasekera <djkevi...@yahoo.com>
Committed: Mon Aug 1 02:27:40 2016 +0530

----------------------------------------------------------------------
 .../org/apache/gora/compiler/GoraCompiler.java  |   5 +
 .../apache/gora/compiler/templates/record.vm    |  29 ++-
 .../gora/examples/generated/Employee.java       |  29 ++-
 .../examples/generated/ImmutableFields.java     |  31 ++-
 .../gora/examples/generated/Metadata.java       |  31 ++-
 .../gora/examples/generated/TokenDatum.java     |  29 ++-
 .../org/apache/gora/examples/generated/V2.java  |  31 ++-
 .../apache/gora/examples/generated/WebPage.java |  31 ++-
 .../impl/DirtyCollectionWrapper.java            |  20 +-
 .../apache/gora/persistency/impl/DirtyFlag.java |   2 +-
 .../persistency/impl/DirtyIteratorWrapper.java  |  20 +-
 .../persistency/impl/DirtyListIterator.java     |  18 ++
 .../gora/persistency/impl/DirtyListWrapper.java |  18 ++
 .../gora/persistency/impl/DirtyMapWrapper.java  |  20 +-
 .../gora/persistency/impl/DirtySetWrapper.java  |  18 ++
 .../gora/persistency/impl/PersistentBase.java   |  15 +-
 .../mapreduce/TestPersistentSerialization.java  |  42 ++--
 .../gora/mock/persistency/MockPersistent.java   |  27 +++
 .../apache/gora/jcache/store/JCacheStore.java   |  39 +++-
 .../jcache/store/JCacheGoraDataStoreTest.java   | 194 +++++++++++++++++++
 gora-jcache/src/test/resources/gora.properties  |   3 +-
 gora-jcache/src/test/resources/hazelcast.xml    |   2 +-
 .../tutorial/log/generated/MetricDatum.java     |  29 ++-
 .../gora/tutorial/log/generated/Pageview.java   |  34 +++-
 24 files changed, 656 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-compiler/src/main/java/org/apache/gora/compiler/GoraCompiler.java
----------------------------------------------------------------------
diff --git 
a/gora-compiler/src/main/java/org/apache/gora/compiler/GoraCompiler.java 
b/gora-compiler/src/main/java/org/apache/gora/compiler/GoraCompiler.java
index 529f1ef..6716e3c 100644
--- a/gora-compiler/src/main/java/org/apache/gora/compiler/GoraCompiler.java
+++ b/gora-compiler/src/main/java/org/apache/gora/compiler/GoraCompiler.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.Schema.Type;
+import org.apache.avro.SchemaNormalization;
 import org.apache.avro.compiler.specific.SpecificCompiler;
 import org.codehaus.jackson.JsonNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
@@ -273,4 +274,8 @@ public class GoraCompiler extends SpecificCompiler {
     return newSchema;
   }
 
+  public static long fingerprint64(Schema schema) {
+    return SchemaNormalization.parsingFingerprint64(schema);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-compiler/src/main/velocity/org/apache/gora/compiler/templates/record.vm
----------------------------------------------------------------------
diff --git 
a/gora-compiler/src/main/velocity/org/apache/gora/compiler/templates/record.vm 
b/gora-compiler/src/main/velocity/org/apache/gora/compiler/templates/record.vm
index daf5095..aa1844d 100644
--- 
a/gora-compiler/src/main/velocity/org/apache/gora/compiler/templates/record.vm
+++ 
b/gora-compiler/src/main/velocity/org/apache/gora/compiler/templates/record.vm
@@ -24,7 +24,7 @@ package $schema.getNamespace();
 #end
 public class ${this.mangle($schema.getName())}#if ($schema.isError()) extends 
org.apache.avro.specific.SpecificExceptionBase#else extends 
org.apache.gora.persistency.impl.PersistentBase#end implements 
org.apache.avro.specific.SpecificRecord, org.apache.gora.persistency.Persistent 
{
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("${this.javaEscape($schema.toString())}");
-
+  private static final long serialVersionUID = ${this.fingerprint64($schema)}L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
 #set ($i = 0)
@@ -353,6 +353,33 @@ public class ${this.mangle($schema.getName())}#if 
($schema.isError()) extends or
        #end
   
   }
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
   
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/Employee.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/Employee.java 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/Employee.java
index e6e1c4c..253f7b2 100644
--- 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/Employee.java
+++ 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/Employee.java
@@ -17,7 +17,7 @@
 package org.apache.gora.examples.generated;  
 public class Employee extends org.apache.gora.persistency.impl.PersistentBase 
implements org.apache.avro.specific.SpecificRecord, 
org.apache.gora.persistency.Persistent {
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Employee\",\"namespace\":\"org.apache.gora.examples.generated\",\"fields\":[{\"name\":\"name\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"dateOfBirth\",\"type\":\"long\",\"default\":0},{\"name\":\"ssn\",\"type\":\"string\",\"default\":\"\"},{\"name\":\"salary\",\"type\":\"int\",\"default\":0},{\"name\":\"boss\",\"type\":[\"null\",\"Employee\",\"string\"],\"default\":null},{\"name\":\"webpage\",\"type\":[\"null\",{\"type\":\"record\",\"name\":\"WebPage\",\"fields\":[{\"name\":\"url\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"content\",\"type\":[\"null\",\"bytes\"],\"default\":null},{\"name\":\"parsedContent\",\"type\":{\"type\":\"array\",\"items\":\"string\"},\"default\":{}},{\"name\":\"outlinks\",\"type\":{\"type\":\"map\",\"values\":[\"null\",\"string\"]},\"default\":{}},{\"name\":\"headers\",\"type\":[\"null\",{\"typ
 
e\":\"map\",\"values\":[\"null\",\"string\"]}],\"default\":null},{\"name\":\"metadata\",\"type\":{\"type\":\"record\",\"name\":\"Metadata\",\"fields\":[{\"name\":\"version\",\"type\":\"int\",\"default\":0},{\"name\":\"data\",\"type\":{\"type\":\"map\",\"values\":\"string\"},\"default\":{}}]},\"default\":null}]}],\"default\":null}],\"default\":null}");
-
+  private static final long serialVersionUID = -6468893522296148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     NAME(0, "name"),
@@ -667,6 +667,33 @@ public class Employee extends 
org.apache.gora.persistency.impl.PersistentBase im
        
                  
   }
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
   
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/ImmutableFields.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/ImmutableFields.java
 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/ImmutableFields.java
index b0e4609..edb91d0 100644
--- 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/ImmutableFields.java
+++ 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/ImmutableFields.java
@@ -19,7 +19,7 @@ package org.apache.gora.examples.generated;
 /** Record with only immutable or dirtyable fields, used for testing */
 public class ImmutableFields extends 
org.apache.gora.persistency.impl.PersistentBase implements 
org.apache.avro.specific.SpecificRecord, org.apache.gora.persistency.Persistent 
{
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ImmutableFields\",\"namespace\":\"org.apache.gora.examples.generated\",\"doc\":\"Record
 with only immutable or dirtyable fields, used for 
testing\",\"fields\":[{\"name\":\"v1\",\"type\":\"int\",\"default\":0},{\"name\":\"v2\",\"type\":[{\"type\":\"record\",\"name\":\"V2\",\"fields\":[{\"name\":\"v3\",\"type\":\"int\",\"default\":0}]},\"null\"],\"default\":null}]}");
-
+  private static final long serialVersionUID = -6468893522296148698L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     V1(0, "v1"),
@@ -338,6 +338,33 @@ public class ImmutableFields extends 
org.apache.gora.persistency.impl.Persistent
        
                  
   }
-  
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/Metadata.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/Metadata.java 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/Metadata.java
index a09f16a..66d1f2c 100644
--- 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/Metadata.java
+++ 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/Metadata.java
@@ -7,7 +7,7 @@ package org.apache.gora.examples.generated;
 @SuppressWarnings("all")
 public class Metadata extends org.apache.gora.persistency.impl.PersistentBase 
implements org.apache.avro.specific.SpecificRecord, 
org.apache.gora.persistency.Persistent {
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Metadata\",\"namespace\":\"org.apache.gora.examples.generated\",\"fields\":[{\"name\":\"version\",\"type\":\"int\",\"default\":0},{\"name\":\"data\",\"type\":{\"type\":\"map\",\"values\":\"string\"},\"default\":null}]}");
-
+  private static final long serialVersionUID = -6468893522296178608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     VERSION(0, "version"),
@@ -326,6 +326,33 @@ public class Metadata extends 
org.apache.gora.persistency.impl.PersistentBase im
        
                  
   }
-  
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/TokenDatum.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/TokenDatum.java
 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/TokenDatum.java
index 53de084..391c912 100644
--- 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/TokenDatum.java
+++ 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/TokenDatum.java
@@ -18,7 +18,7 @@ package org.apache.gora.examples.generated;
 @SuppressWarnings("all")
 public class TokenDatum extends 
org.apache.gora.persistency.impl.PersistentBase implements 
org.apache.avro.specific.SpecificRecord, org.apache.gora.persistency.Persistent 
{
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"TokenDatum\",\"namespace\":\"org.apache.gora.examples.generated\",\"fields\":[{\"name\":\"count\",\"type\":\"int\",\"default\":0}]}");
-
+  private static final long serialVersionUID = -6468894522296148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     COUNT(0, "count"),
@@ -254,6 +254,33 @@ public class TokenDatum extends 
org.apache.gora.persistency.impl.PersistentBase
        
                  
   }
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
   
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/V2.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/V2.java 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/V2.java
index 7cb9c5f..2092e1b 100644
--- a/gora-core/src/examples/java/org/apache/gora/examples/generated/V2.java
+++ b/gora-core/src/examples/java/org/apache/gora/examples/generated/V2.java
@@ -18,7 +18,7 @@ package org.apache.gora.examples.generated;
 @SuppressWarnings("all")
 public class V2 extends org.apache.gora.persistency.impl.PersistentBase 
implements org.apache.avro.specific.SpecificRecord, 
org.apache.gora.persistency.Persistent {
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"V2\",\"namespace\":\"org.apache.gora.examples.generated\",\"fields\":[{\"name\":\"v3\",\"type\":\"int\",\"default\":0}]}");
-
+  private static final long serialVersionUID = -6468893522496148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     V3(0, "v3"),
@@ -254,6 +254,33 @@ public class V2 extends 
org.apache.gora.persistency.impl.PersistentBase implemen
        
                  
   }
-  
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/examples/java/org/apache/gora/examples/generated/WebPage.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/WebPage.java 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/WebPage.java
index dd74df6..0a7b7ea 100644
--- 
a/gora-core/src/examples/java/org/apache/gora/examples/generated/WebPage.java
+++ 
b/gora-core/src/examples/java/org/apache/gora/examples/generated/WebPage.java
@@ -7,7 +7,7 @@ package org.apache.gora.examples.generated;
 @SuppressWarnings("all")
 public class WebPage extends org.apache.gora.persistency.impl.PersistentBase 
implements org.apache.avro.specific.SpecificRecord, 
org.apache.gora.persistency.Persistent {
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"WebPage\",\"namespace\":\"org.apache.gora.examples.generated\",\"fields\":[{\"name\":\"url\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"content\",\"type\":[\"null\",\"bytes\"],\"default\":null},{\"name\":\"parsedContent\",\"type\":{\"type\":\"array\",\"items\":\"string\"},\"default\":null},{\"name\":\"outlinks\",\"type\":{\"type\":\"map\",\"values\":\"string\"},\"default\":{}},{\"name\":\"headers\",\"type\":[\"null\",{\"type\":\"map\",\"values\":[\"null\",\"string\"]}],\"default\":null},{\"name\":\"metadata\",\"type\":{\"type\":\"record\",\"name\":\"Metadata\",\"fields\":[{\"name\":\"version\",\"type\":\"int\",\"default\":0},{\"name\":\"data\",\"type\":{\"type\":\"map\",\"values\":\"string\"},\"default\":null}]},\"default\":null},{\"name\":\"byteData\",\"type\":{\"type\":\"map\",\"values\":\"bytes\"},\"default\":{}},{\"name\":\"stringDat
 
a\",\"type\":{\"type\":\"map\",\"values\":\"string\"},\"default\":{}}],\"default\":null}");
-
+  private static final long serialVersionUID = -6468893522236148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     URL(0, "url"),
@@ -825,6 +825,33 @@ public class WebPage extends 
org.apache.gora.persistency.impl.PersistentBase imp
        
                  
   }
-  
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyCollectionWrapper.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyCollectionWrapper.java
 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyCollectionWrapper.java
index b75dbea..e082d03 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyCollectionWrapper.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyCollectionWrapper.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.Collection;
@@ -15,7 +33,7 @@ import org.apache.gora.persistency.Dirtyable;
  *          The type of the list that this wrapper wraps.
  */
 public class DirtyCollectionWrapper<T> implements Dirtyable,
-    Collection<T>, java.io.Serializable {
+        Collection<T> {
 
   /** The delegate list that the wrapper wraps */
   private final Collection<T> delegate;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyFlag.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyFlag.java 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyFlag.java
index 852c98f..33fd21e 100644
--- a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyFlag.java
+++ b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyFlag.java
@@ -19,7 +19,7 @@ package org.apache.gora.persistency.impl;
 
 import org.apache.gora.persistency.Dirtyable;
 
-final class DirtyFlag implements Dirtyable, java.io.Serializable {
+final class DirtyFlag implements Dirtyable {
 
   private boolean dirty;
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyIteratorWrapper.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyIteratorWrapper.java
 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyIteratorWrapper.java
index dbb2e21..f7963c1 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyIteratorWrapper.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyIteratorWrapper.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.Iterator;
@@ -5,7 +23,7 @@ import java.util.Iterator;
 /**
  * Sets the dirty flag if the iterator's remove method is called.
  */
-final class DirtyIteratorWrapper<T> implements Iterator<T>, 
java.io.Serializable {
+final class DirtyIteratorWrapper<T> implements Iterator<T> {
 
   private final DirtyFlag dirtyFlag;
   private Iterator<T> delegateIterator;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListIterator.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListIterator.java
 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListIterator.java
index c378cf3..2d4f58e 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListIterator.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListIterator.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.ListIterator;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListWrapper.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListWrapper.java
 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListWrapper.java
index 3b09310..3113ac6 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListWrapper.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyListWrapper.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.Collection;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyMapWrapper.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyMapWrapper.java 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyMapWrapper.java
index f1f0440..1311685 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyMapWrapper.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtyMapWrapper.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.Collection;
@@ -9,7 +27,7 @@ import org.apache.gora.persistency.Dirtyable;
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 
-public class DirtyMapWrapper<K, V> implements Map<K, V>, Dirtyable, 
java.io.Serializable {
+public class DirtyMapWrapper<K, V> implements Map<K, V>, Dirtyable {
 
   public static class DirtyEntryWrapper<K, V> implements Entry<K, V>, 
Dirtyable {
     private final Entry<K, V> entryDelegate;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtySetWrapper.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtySetWrapper.java 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtySetWrapper.java
index 67db07a..b691044 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtySetWrapper.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/DirtySetWrapper.java
@@ -1,3 +1,21 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package org.apache.gora.persistency.impl;
 
 import java.util.Collection;

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/main/java/org/apache/gora/persistency/impl/PersistentBase.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/PersistentBase.java 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/PersistentBase.java
index 691684e..4f8cb83 100644
--- 
a/gora-core/src/main/java/org/apache/gora/persistency/impl/PersistentBase.java
+++ 
b/gora-core/src/main/java/org/apache/gora/persistency/impl/PersistentBase.java
@@ -17,7 +17,6 @@
 */
 package org.apache.gora.persistency.impl;
 
-import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.List;
@@ -33,13 +32,13 @@ import org.apache.gora.persistency.Persistent;
 * Base classs implementing common functionality for Persistent classes.
 */
 public abstract class PersistentBase extends SpecificRecordBase implements
-    Persistent, java.io.Serializable {
+    Persistent, java.io.Externalizable {
 
   /** Bytes used to represent weather or not a field is dirty. */
-  private byte[] __g__dirty;
+  private ByteBuffer __g__dirty;
 
   public PersistentBase() {
-    __g__dirty = new byte[getFieldsCount()];
+    __g__dirty = ByteBuffer.wrap(new byte[getFieldsCount()]);
   }
 
   public abstract int getFieldsCount();
@@ -182,8 +181,12 @@ public abstract class PersistentBase extends 
SpecificRecordBase implements
     setDirty(getSchema().getField(field).pos());
   }
 
-  private ByteBuffer getDirtyBytes() {
-    return java.nio.ByteBuffer.wrap(__g__dirty);
+  public ByteBuffer getDirtyBytes() {
+    return __g__dirty;
+  }
+
+  public void setDirtyBytes(ByteBuffer __g__dirty) {
+    this.__g__dirty = __g__dirty;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/test/java/org/apache/gora/mapreduce/TestPersistentSerialization.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/test/java/org/apache/gora/mapreduce/TestPersistentSerialization.java
 
b/gora-core/src/test/java/org/apache/gora/mapreduce/TestPersistentSerialization.java
index 141e9cf..b2b66ab 100644
--- 
a/gora-core/src/test/java/org/apache/gora/mapreduce/TestPersistentSerialization.java
+++ 
b/gora-core/src/test/java/org/apache/gora/mapreduce/TestPersistentSerialization.java
@@ -31,7 +31,6 @@ import org.apache.gora.store.DataStoreFactory;
 import org.apache.gora.store.DataStoreTestUtil;
 import org.apache.gora.util.TestIOUtils;
 import org.apache.hadoop.conf.Configuration;
-import org.junit.Ignore;
 import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 
@@ -48,13 +47,12 @@ public class TestPersistentSerialization {
    * what we get 'before' and 'after' (de)serialization processes.
    * @throws Exception
    */
-  @Ignore
   @SuppressWarnings("unchecked")
   @Test
   public void testSerdeEmployee() throws Exception {
 
     MemStore<String, Employee> store = DataStoreFactory.getDataStore(
-        MemStore.class, String.class, Employee.class, new Configuration());
+            MemStore.class, String.class, Employee.class, new Configuration());
 
     Employee employee = DataStoreTestUtil.createEmployee();
 
@@ -64,14 +62,13 @@ public class TestPersistentSerialization {
   /**
    * Creates an Employee object but only sets one field as dirty.
    * We then do (de)serialization and check 'before' and 'after'
-   * states. 
+   * states.
    * @throws Exception
    */
-  @Ignore
   @Test
   public void testSerdeEmployeeOneField() throws Exception {
     Employee employee = Employee.newBuilder().build();
-    employee.setSsn(new StringBuffer("11111"));
+    employee.setSsn(new Utf8("11111"));
 
     TestIOUtils.testSerializeDeserialize(employee);
   }
@@ -79,36 +76,34 @@ public class TestPersistentSerialization {
   /**
    * Creates an Employee object setting only two fields as dirty.
    * We then do (de)serialization and check 'before' and 'after'
-   * states. 
+   * states.
    * @throws Exception
    */
-  @Ignore
   @Test
   public void testSerdeEmployeeTwoFields() throws Exception {
     Employee employee = Employee.newBuilder().build();
-    employee.setSsn(new StringBuffer("11111"));
+    employee.setSsn(new Utf8("11111"));
     employee.setSalary(100);
 
     TestIOUtils.testSerializeDeserialize(employee);
   }
 
   /**
-   * Creates an WebPage object in-memory setting several fields to dirty. 
+   * Creates an WebPage object in-memory setting several fields to dirty.
    * Run a query over the persistent data.
-   * Asserts that the results can be serialized and 
+   * Asserts that the results can be serialized and
    * deserialzed without loosing data. We do this by asserting
    * what we get 'before' and 'after' (de)serialization processes.
-   * Also simple assertion for equal number of URL's in WebPage 
+   * Also simple assertion for equal number of URL's in WebPage
    * and results.
    * @throws Exception
    */
-  @Ignore
   @SuppressWarnings("unchecked")
   @Test
   public void testSerdeWebPage() throws Exception {
 
     MemStore<String, WebPage> store = DataStoreFactory.getDataStore(
-        MemStore.class, String.class, WebPage.class, new Configuration());
+            MemStore.class, String.class, WebPage.class, new Configuration());
     WebPageDataCreator.createWebPageData(store);
 
     Result<String, WebPage> result = store.newQuery().execute();
@@ -123,8 +118,8 @@ public class TestPersistentSerialization {
   }
 
   /**
-   * Creates multiple WebPage objects setting several fields to dirty. 
-   * Asserts that the data can be serialized and 
+   * Creates multiple WebPage objects setting several fields to dirty.
+   * Asserts that the data can be serialized and
    * deserialzed without loosing data. We do this by asserting
    * what we get 'before' and 'after' (de)serialization processes.
    * @throws Exception
@@ -135,17 +130,16 @@ public class TestPersistentSerialization {
     WebPage page2 = WebPage.newBuilder().build();
     WebPage page3 = WebPage.newBuilder().build();
 
-    page1.setUrl(new StringBuffer("foo"));
-    page2.setUrl(new StringBuffer("baz"));
-    page3.setUrl(new StringBuffer("bar"));
+    page1.setUrl(new Utf8("foo"));
+    page2.setUrl(new Utf8("baz"));
+    page3.setUrl(new Utf8("bar"));
     page1.setParsedContent(new ArrayList<CharSequence>());
-    page1.getParsedContent().add(new StringBuffer("coo"));
-    page2.setParsedContent(new ArrayList<CharSequence>());
-    page2.getParsedContent().add(new StringBuffer("coo2"));
-    page3.setParsedContent(new ArrayList<CharSequence>());
-    page3.getParsedContent().add(new StringBuffer("coo3"));
+    page1.getParsedContent().add(new Utf8("coo"));
+    page2.setOutlinks(new HashMap<CharSequence, CharSequence>());
+    page2.getOutlinks().put(new Utf8("a"), new Utf8("b"));
 
     TestIOUtils.testSerializeDeserialize(page1, page2, page3);
   }
 
 }
+

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-core/src/test/java/org/apache/gora/mock/persistency/MockPersistent.java
----------------------------------------------------------------------
diff --git 
a/gora-core/src/test/java/org/apache/gora/mock/persistency/MockPersistent.java 
b/gora-core/src/test/java/org/apache/gora/mock/persistency/MockPersistent.java
index 1a83952..a559b1d 100644
--- 
a/gora-core/src/test/java/org/apache/gora/mock/persistency/MockPersistent.java
+++ 
b/gora-core/src/test/java/org/apache/gora/mock/persistency/MockPersistent.java
@@ -93,4 +93,31 @@ public class MockPersistent extends PersistentBase {
     return new MockPersistent();
   }
 
+  private final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(getSchema());
+  private final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(getSchema());
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java 
b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
index 4838cfe..fb70265 100644
--- a/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
+++ b/gora-jcache/src/main/java/org/apache/gora/jcache/store/JCacheStore.java
@@ -91,6 +91,7 @@ public class JCacheStore<K,T extends PersistentBase> extends 
DataStoreBase<K,T>
   private static final String 
HAZELCAST_CACHE_BINARY_IN_MEMORY_FORMAT_IDENTIFIER = "BINARY";
   private static final String 
HAZELCAST_CACHE_OBJECT_IN_MEMORY_FORMAT_IDENTIFIER = "OBJECT";
   private static final String 
HAZELCAST_CACHE_NATIVE_IN_MEMORY_FORMAT_IDENTIFIER = "NATIVE";
+  private static final String JCACHE_AUTO_CREATE_CACHE_PROPERTY_KEY 
="jcache.auto.create.cache";
   private String goraCacheNamespace = GORA_DEFAULT_JCACHE_NAMESPACE;
   private static final Logger LOG = LoggerFactory.getLogger(JCacheStore.class);
   private DataStore<K, T> persistentDataStore;
@@ -196,8 +197,16 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
                     null, true, true
             )
     );
-    cache = manager.createCache(persistentClass.getSimpleName(),
-            cacheConfig).unwrap(ICache.class);
+    if (properties.getProperty(JCACHE_AUTO_CREATE_CACHE_PROPERTY_KEY) != null) 
{
+      Boolean createCache = 
Boolean.valueOf(properties.getProperty(JCACHE_AUTO_CREATE_CACHE_PROPERTY_KEY));
+      if (createCache) {
+        cache = manager.createCache(persistentClass.getSimpleName(),
+                cacheConfig).unwrap(ICache.class);
+      }
+    } else {
+      cache = manager.createCache(persistentClass.getSimpleName(),
+              cacheConfig).unwrap(ICache.class);
+    }
     LOG.info("JCache Gora datastore initialized successfully.");
   }
 
@@ -208,7 +217,8 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
 
   @Override
   public void createSchema() {
-    if (manager.getCache(super.getPersistentClass().getSimpleName()) == null) {
+    if (manager.getCache(super.getPersistentClass().getSimpleName(), keyClass, 
persistentClass) == null) {
+      cacheEntryList.clear();
       cache = manager.createCache(persistentClass.getSimpleName(),
               cacheConfig).unwrap(ICache.class);
     }
@@ -219,6 +229,7 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
 
   @Override
   public void deleteSchema() {
+    cacheEntryList.clear();
     manager.destroyCache(super.getPersistentClass().getSimpleName());
     persistentDataStore.deleteSchema();
     LOG.info("Deleted schema on persistent store and destroyed cache for 
persistent bean "
@@ -227,8 +238,7 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
 
   @Override
   public boolean schemaExists() {
-    return (manager.getCache(super.getPersistentClass().getSimpleName()) != 
null)
-            && persistentDataStore.schemaExists();
+    return (manager.getCache(super.getPersistentClass().getSimpleName(), 
keyClass, persistentClass) != null);
   }
 
   @Override
@@ -251,10 +261,18 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
     }
     T clonedPersistent = AvroUtils.deepClonePersistent(persitent);
     clonedPersistent.clear();
-    for (String field : fields) {
-      Schema.Field otherField = persitent.getSchema().getField(field);
-      int index = otherField.pos();
-      clonedPersistent.put(index, persitent.get(index));
+    if (fields != null && fields.length > 0) {
+      for (String field : fields) {
+        Schema.Field otherField = persitent.getSchema().getField(field);
+        int index = otherField.pos();
+        clonedPersistent.put(index, persitent.get(index));
+      }
+    } else {
+      for (String field : otherFieldStrings) {
+        Schema.Field otherField = persitent.getSchema().getField(field);
+        int index = otherField.pos();
+        clonedPersistent.put(index, persitent.get(index));
+      }
     }
     return clonedPersistent;
   }
@@ -376,7 +394,8 @@ public class JCacheStore<K,T extends PersistentBase> 
extends DataStoreBase<K,T>
   @Override
   public void close() {
     flush();
-    if (!cache.isDestroyed()) {
+    cacheEntryList.clear();
+    if (!cache.isDestroyed() && !manager.isClosed()) {
       cache.destroy();
     }
     if (!manager.isClosed()) {

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-jcache/src/test/java/org/apache/gora/jcache/store/JCacheGoraDataStoreTest.java
----------------------------------------------------------------------
diff --git 
a/gora-jcache/src/test/java/org/apache/gora/jcache/store/JCacheGoraDataStoreTest.java
 
b/gora-jcache/src/test/java/org/apache/gora/jcache/store/JCacheGoraDataStoreTest.java
new file mode 100644
index 0000000..51eb086
--- /dev/null
+++ 
b/gora-jcache/src/test/java/org/apache/gora/jcache/store/JCacheGoraDataStoreTest.java
@@ -0,0 +1,194 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.gora.jcache.store;
+
+import org.apache.gora.examples.WebPageDataCreator;
+import org.apache.gora.examples.generated.Employee;
+import org.apache.gora.examples.generated.WebPage;
+import org.apache.gora.persistency.BeanFactory;
+import org.apache.gora.persistency.impl.BeanFactoryImpl;
+import org.apache.gora.query.Query;
+import org.apache.gora.store.DataStore;
+import org.apache.gora.store.DataStoreFactory;
+import org.apache.gora.store.DataStoreTestBase;
+import org.apache.gora.store.DataStoreTestUtil;
+import org.apache.hadoop.conf.Configuration;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+
+import static org.apache.gora.examples.WebPageDataCreator.SORTED_URLS;
+import static org.apache.gora.examples.WebPageDataCreator.URLS;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+public class JCacheGoraDataStoreTest extends DataStoreTestBase {
+
+  private static final Logger LOG = 
LoggerFactory.getLogger(JCacheGoraDataStoreTest.class);
+  private static final int NUM_KEYS = 4;
+  private Configuration conf = new Configuration();
+
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    super.tearDown();
+    //mandatory to clean up hazelcast instances
+    //this is not handled at super class level
+    super.employeeStore.close();
+    super.webPageStore.close();
+  }
+
+  @SuppressWarnings("unchecked")
+  protected DataStore<String, Employee> createEmployeeDataStore() throws 
IOException {
+    return DataStoreFactory.getDataStore(String.class, Employee.class, conf, 
true);
+  }
+
+  @SuppressWarnings("unchecked")
+  protected DataStore<String, WebPage> createWebPageDataStore() throws 
IOException {
+    return DataStoreFactory.getDataStore(String.class, WebPage.class, conf, 
true);
+  }
+
+  @Test
+  public void testGetMissingValue() throws IOException {
+    DataStore<String, WebPage> store = super.webPageStore;
+    WebPage nullWebPage = store.get("missing", new String[0]);
+    assertNull(nullWebPage);
+  }
+
+  @Test
+  public void testDeleteSchema() throws Exception {
+    DataStore<String, WebPage> store = super.webPageStore;
+    assertTrue(store.schemaExists());
+    store.deleteSchema();
+    assertTrue(!store.schemaExists());
+  }
+
+  @Test
+  public void testSchemaExists() throws Exception {
+    DataStore<String, WebPage> store = super.webPageStore;
+    assertTrue(store.schemaExists());
+  }
+
+  @Test
+  public void testStorePutGet() throws Exception {
+    String key = "org.apache.gora:http:/";
+    DataStore<String, WebPage> store = super.webPageStore;
+    assumeTrue(store.get(key, new String[0]) == null);
+    store.put(key, WebPage.newBuilder().build());
+    assertNotNull(store.get(key, new String[0]));
+  }
+
+  @Test
+  public void testGetWithFields() throws Exception {
+
+    DataStore<String, WebPage> store = super.webPageStore;
+    BeanFactory<String, WebPage> beanFactory = new 
BeanFactoryImpl<>(String.class, WebPage.class);
+    store.setBeanFactory(beanFactory);
+    WebPageDataCreator.createWebPageData(store);
+    String[] interestFields = new String[2];
+    interestFields[0] = "url";
+    interestFields[1] = "content";
+    WebPage page = store.get(URLS[1], interestFields);
+    assertNotNull(page);
+    assertNotNull(page.getUrl());
+    assertEquals(page.getUrl().toString(), URLS[1]);
+    assertNotNull(page.getContent());
+    assertEquals("Map of Outlinks should have a size of '0' as it is omitted 
at retrieval",
+            0, page.getOutlinks().size());
+    assertEquals("Map of Parsed Content should have a size of '0' as it is 
omitted at retrieval",
+            0, page.getParsedContent().size());
+  }
+
+  @Test
+  public void testDeleteByQueryFields() throws Exception {
+
+    DataStore<String, WebPage> store = super.webPageStore;
+    BeanFactory<String, WebPage> beanFactory = new 
BeanFactoryImpl<>(String.class, WebPage.class);
+    store.setBeanFactory(beanFactory);
+    Query<String, WebPage> query;
+    WebPageDataCreator.createWebPageData(store);
+    query = store.newQuery();
+    query.setFields("outlinks", "parsedContent", "content");
+    Query<String, WebPage> newQuery = store.newQuery();
+    newQuery.setStartKey(SORTED_URLS[0]);
+    newQuery.setEndKey(SORTED_URLS[9]);
+    newQuery.setFields("outlinks", "parsedContent", "content");
+    DataStoreTestUtil.assertNumResults(newQuery, URLS.length);
+    store.deleteByQuery(query);
+    store.deleteByQuery(query);
+    store.deleteByQuery(query);
+    store.flush();
+    DataStoreTestUtil.assertNumResults(store.newQuery(), URLS.length);
+    for (String SORTED_URL : SORTED_URLS) {
+      WebPage page = store.get(SORTED_URL);
+      assertNotNull(page);
+
+      assertNotNull(page.getUrl());
+      assertEquals(page.getUrl().toString(), SORTED_URL);
+      assertEquals("Map of Outlinks should have a size of '0' as the 
deleteByQuery "
+              + "not only removes the data but also the data structure.", 0, 
page.getOutlinks().size());
+      assertEquals(0, page.getParsedContent().size());
+      if (page.getContent() != null) {
+        LOG.info("url:" + page.getUrl().toString());
+        LOG.info("limit:" + page.getContent().limit());
+      } else {
+        assertNull(page.getContent());
+      }
+    }
+    WebPageDataCreator.createWebPageData(store);
+    query = store.newQuery();
+    query.setFields("url");
+    String startKey = SORTED_URLS[NUM_KEYS];
+    String endKey = SORTED_URLS[SORTED_URLS.length - NUM_KEYS];
+    query.setStartKey(startKey);
+    query.setEndKey(endKey);
+    DataStoreTestUtil.assertNumResults(store.newQuery(), URLS.length);
+    store.deleteByQuery(query);
+    store.deleteByQuery(query);
+    store.deleteByQuery(query);
+    store.flush();
+    DataStoreTestUtil.assertNumResults(store.newQuery(), URLS.length);
+    for (int i = 0; i < URLS.length; i++) {
+      WebPage page = store.get(URLS[i]);
+      assertNotNull(page);
+      if (URLS[i].compareTo(startKey) < 0 || URLS[i].compareTo(endKey) > 0) {
+        DataStoreTestUtil.assertWebPage(page, i);
+      } else {
+        assertNull(page.getUrl());
+        assertNotNull(page.getOutlinks());
+        assertNotNull(page.getParsedContent());
+        assertNotNull(page.getContent());
+        assertTrue(page.getOutlinks().size() > 0);
+        assertTrue(page.getParsedContent().size() > 0);
+      }
+    }
+
+  }
+}

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-jcache/src/test/resources/gora.properties
----------------------------------------------------------------------
diff --git a/gora-jcache/src/test/resources/gora.properties 
b/gora-jcache/src/test/resources/gora.properties
index ccbd282..929115a 100644
--- a/gora-jcache/src/test/resources/gora.properties
+++ b/gora-jcache/src/test/resources/gora.properties
@@ -14,4 +14,5 @@
 # limitations under the License.
 
 gora.cache.datastore.default=org.apache.gora.jcache.store.JCacheStore
-gora.datastore.jcache.provider=com.hazelcast.cache.HazelcastCachingProvider
+gora.datastore.jcache.provider=com.hazelcast.cache.impl.HazelcastServerCachingProvider
+gora.datastore.default=org.apache.gora.memory.store.MemStore

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-jcache/src/test/resources/hazelcast.xml
----------------------------------------------------------------------
diff --git a/gora-jcache/src/test/resources/hazelcast.xml 
b/gora-jcache/src/test/resources/hazelcast.xml
index 5f24979..dcf138e 100755
--- a/gora-jcache/src/test/resources/hazelcast.xml
+++ b/gora-jcache/src/test/resources/hazelcast.xml
@@ -27,7 +27,7 @@
     <network>
         <join>
             <multicast enabled="false"/>
-            <tcp-ip enabled="true">
+            <tcp-ip enabled="false">
                 <member>127.0.0.1</member>
             </tcp-ip>
         </join>

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/MetricDatum.java
----------------------------------------------------------------------
diff --git 
a/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/MetricDatum.java
 
b/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/MetricDatum.java
index 0d7be00..df9662d 100644
--- 
a/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/MetricDatum.java
+++ 
b/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/MetricDatum.java
@@ -6,7 +6,7 @@
 package org.apache.gora.tutorial.log.generated;  
 public class MetricDatum extends 
org.apache.gora.persistency.impl.PersistentBase implements 
org.apache.avro.specific.SpecificRecord, org.apache.gora.persistency.Persistent 
{
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"MetricDatum\",\"namespace\":\"org.apache.gora.tutorial.log.generated\",\"fields\":[{\"name\":\"metricDimension\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"timestamp\",\"type\":\"long\",\"default\":0},{\"name\":\"metric\",\"type\":\"long\",\"default\":0}],\"default\":null}");
-
+  private static final long serialVersionUID = -6468793522296148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     METRIC_DIMENSION(0, "metricDimension"),
@@ -401,6 +401,33 @@ public class MetricDatum extends 
org.apache.gora.persistency.impl.PersistentBase
        
                  
   }
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
   
 }
 

http://git-wip-us.apache.org/repos/asf/gora/blob/a05928a7/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java
----------------------------------------------------------------------
diff --git 
a/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java
 
b/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java
index 4ace856..861be2b 100644
--- 
a/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java
+++ 
b/gora-tutorial/src/main/java/org/apache/gora/tutorial/log/generated/Pageview.java
@@ -3,11 +3,12 @@
  * 
  * DO NOT EDIT DIRECTLY
  */
-package org.apache.gora.tutorial.log.generated;  
+package org.apache.gora.tutorial.log.generated;
+
 @SuppressWarnings("all")
 public class Pageview extends org.apache.gora.persistency.impl.PersistentBase 
implements org.apache.avro.specific.SpecificRecord, 
org.apache.gora.persistency.Persistent {
   public static final org.apache.avro.Schema SCHEMA$ = new 
org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Pageview\",\"namespace\":\"org.apache.gora.tutorial.log.generated\",\"fields\":[{\"name\":\"url\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"timestamp\",\"type\":\"long\",\"default\":0},{\"name\":\"ip\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"httpMethod\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"httpStatusCode\",\"type\":\"int\",\"default\":0},{\"name\":\"responseSize\",\"type\":\"int\",\"default\":0},{\"name\":\"referrer\",\"type\":[\"null\",\"string\"],\"default\":null},{\"name\":\"userAgent\",\"type\":[\"null\",\"string\"],\"default\":null}],\"default\":null}");
-
+  private static final long serialVersionUID = -6468893522296148608L;
   /** Enum containing all data bean's fields. */
   public static enum Field {
     URL(0, "url"),
@@ -806,6 +807,33 @@ public class Pageview extends 
org.apache.gora.persistency.impl.PersistentBase im
        
                  
   }
-  
+
+  private static final org.apache.avro.io.DatumWriter
+          DATUM_WRITER$ = new 
org.apache.avro.specific.SpecificDatumWriter(SCHEMA$);
+  private static final org.apache.avro.io.DatumReader
+          DATUM_READER$ = new 
org.apache.avro.specific.SpecificDatumReader(SCHEMA$);
+
+  @Override
+  public void writeExternal(java.io.ObjectOutput out)
+          throws java.io.IOException {
+    out.write(super.getDirtyBytes().array());
+    DATUM_WRITER$.write
+            (this, org.apache.avro.io.EncoderFactory.get()
+                    .directBinaryEncoder((java.io.OutputStream) out,
+                            null));
+  }
+
+  @Override
+  public void readExternal(java.io.ObjectInput in)
+          throws java.io.IOException {
+    byte[] __g__dirty = new byte[getFieldsCount()];
+    in.read(__g__dirty);
+    super.setDirtyBytes(java.nio.ByteBuffer.wrap(__g__dirty));
+    DATUM_READER$.read
+            (this, org.apache.avro.io.DecoderFactory.get()
+                    .directBinaryDecoder((java.io.InputStream) in,
+                            null));
+  }
+
 }
 

Reply via email to