You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2016/08/19 12:18:59 UTC

[25/25] zest-java git commit: ZEST-156 - introducing a new Value Serialization system

 ZEST-156 - introducing a new Value Serialization system


Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/301f837d
Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/301f837d
Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/301f837d

Branch: refs/heads/ValueSerializationCleaning
Commit: 301f837df0e89f6966f56a953870d92816dad87e
Parents: 0e78cbc
Author: Niclas Hedhman <ni...@hedhman.org>
Authored: Fri Jul 22 18:54:55 2016 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
Committed: Fri Jul 22 18:54:55 2016 +0800

----------------------------------------------------------------------
 .../java/org/apache/zest/api/type/MapType.java  |   1 -
 .../spi/value/BooleanClassDeserializer.java     |  70 +++++
 .../java/org/apache/zest/spi/value/Entry.java   |  63 ++++
 .../value/IllegalDeserializationException.java  |  31 ++
 .../org/apache/zest/spi/value/ObjectField.java  |  63 ++++
 .../apache/zest/spi/value/ParserLocation.java   |  41 +++
 .../apache/zest/spi/value/TypeDeserializer.java |  40 +++
 .../value/ValueDeserializationException.java    |  33 +++
 .../index/rdf/query/RdfQueryParserFactory.java  |   8 +-
 .../rdf/query/internal/RdfQueryParserImpl.java  |   4 +-
 .../jackson/JacksonDeserializer.java            | 239 +++++++++++++++
 .../jackson/JacksonDeserializerTest.java        | 293 +++++++++++++++++++
 12 files changed, 876 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/api/src/main/java/org/apache/zest/api/type/MapType.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/zest/api/type/MapType.java b/core/api/src/main/java/org/apache/zest/api/type/MapType.java
index c76fd60..ace1fca 100644
--- a/core/api/src/main/java/org/apache/zest/api/type/MapType.java
+++ b/core/api/src/main/java/org/apache/zest/api/type/MapType.java
@@ -30,7 +30,6 @@ import org.apache.zest.api.util.Classes;
 public final class MapType
     extends ValueType
 {
-
     private ValueType keyType;
     private ValueType valueType;
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/BooleanClassDeserializer.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/BooleanClassDeserializer.java b/core/spi/src/main/java/org/apache/zest/spi/value/BooleanClassDeserializer.java
new file mode 100644
index 0000000..0420672
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/BooleanClassDeserializer.java
@@ -0,0 +1,70 @@
+/*
+ *  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.zest.spi.value;
+
+import java.lang.reflect.Type;
+import java.util.List;
+
+public class BooleanClassDeserializer
+    implements TypeDeserializer<Boolean>
+{
+
+    @Override
+    public Boolean deserialize( Class<? extends Boolean> type, VDA parent, Object parser )
+        throws Exception
+    {
+        Object value = parent.nextValue( parser );
+        if( value instanceof String )
+        {
+            return Boolean.valueOf( (String) value );
+        }
+        if( value instanceof Boolean )
+        {
+            return (Boolean) value;
+        }
+        throw new IllegalDeserializationException( "Boolean value expected.", parent.location(parser) );
+    }
+
+    @Override
+    public Boolean deserialize( Class<? extends Boolean> type, VDA parent, String stringValue )
+        throws Exception
+    {
+        return Boolean.valueOf( stringValue );
+    }
+
+    @Override
+    public List<String> fieldNames( Class<?> type )
+    {
+        return null;
+    }
+
+    @Override
+    public Class<?> fieldTypeOf( Type parent, String fieldName )
+    {
+        return null;
+    }
+
+    @Override
+    public Boolean createObject( Object data )
+    {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/Entry.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/Entry.java b/core/spi/src/main/java/org/apache/zest/spi/value/Entry.java
new file mode 100644
index 0000000..0362abd
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/Entry.java
@@ -0,0 +1,63 @@
+/*
+ *  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.zest.spi.value;
+
+import java.util.Objects;
+
+public class Entry<K, V>
+{
+    public final K key;
+    public final V value;
+
+    public Entry( K key, V value )
+    {
+        this.key = key;
+        this.value = value;
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( !( o instanceof Entry ) )
+        {
+            return false;
+        }
+        Entry<?, ?> entry = (Entry<?, ?>) o;
+        return Objects.equals( key, entry.key ) &&
+               Objects.equals( value, entry.value );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash( key, value );
+    }
+
+    @Override
+    public String toString()
+    {
+        return key + ":" + value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/IllegalDeserializationException.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/IllegalDeserializationException.java b/core/spi/src/main/java/org/apache/zest/spi/value/IllegalDeserializationException.java
new file mode 100644
index 0000000..7bd8dc0
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/IllegalDeserializationException.java
@@ -0,0 +1,31 @@
+/*
+ *  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.zest.spi.value;
+
+import org.apache.zest.api.value.ValueSerializationException;
+
+public class IllegalDeserializationException extends ValueDeserializationException
+{
+    public IllegalDeserializationException( String message, ParserLocation location )
+    {
+        super( message + " at " + location );
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/ObjectField.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ObjectField.java b/core/spi/src/main/java/org/apache/zest/spi/value/ObjectField.java
new file mode 100644
index 0000000..17ecfe7
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/ObjectField.java
@@ -0,0 +1,63 @@
+/*
+ *  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.zest.spi.value;
+
+import java.util.Objects;
+
+public class ObjectField<V>
+{
+    public final String name;
+    public final V value;
+
+    public ObjectField( String name, V value )
+    {
+        this.name = name;
+        this.value = value;
+    }
+
+    @Override
+    public boolean equals( Object o )
+    {
+        if( this == o )
+        {
+            return true;
+        }
+        if( !( o instanceof ObjectField ) )
+        {
+            return false;
+        }
+        ObjectField<?> field = (ObjectField<?>) o;
+        return Objects.equals( name, field.name ) &&
+               Objects.equals( value, field.value );
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash( name, value );
+    }
+
+    @Override
+    public String toString()
+    {
+        return name + ':' + value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/ParserLocation.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ParserLocation.java b/core/spi/src/main/java/org/apache/zest/spi/value/ParserLocation.java
new file mode 100644
index 0000000..e00483a
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/ParserLocation.java
@@ -0,0 +1,41 @@
+/*
+ *  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.zest.spi.value;
+
+public class ParserLocation
+{
+    public final String info;
+    public final int line;
+    public final int column;
+
+    public ParserLocation( String info, int line, int column )
+    {
+        this.info = info;
+        this.line = line;
+        this.column = column;
+    }
+
+    @Override
+    public String toString()
+    {
+        return "'" + info + "' " + line + ":" + column;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/TypeDeserializer.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/TypeDeserializer.java b/core/spi/src/main/java/org/apache/zest/spi/value/TypeDeserializer.java
new file mode 100644
index 0000000..e9db38f
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/TypeDeserializer.java
@@ -0,0 +1,40 @@
+/*
+ *  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.zest.spi.value;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
+public interface TypeDeserializer<T>
+{
+    T deserialize( Class<? extends T> type, VDA parent, Object parser )
+        throws Exception;
+
+    T deserialize( Class<? extends T> type, VDA parent, String stringValue )
+        throws Exception;
+
+    List<String> fieldNames( Class<?> type );
+
+    Class<?> fieldTypeOf( Type parent, String fieldName );
+
+    T createObject( Object data );
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializationException.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializationException.java b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializationException.java
new file mode 100644
index 0000000..c4ddf20
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializationException.java
@@ -0,0 +1,33 @@
+/*
+ *  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.zest.spi.value;
+
+public class ValueDeserializationException extends RuntimeException
+{
+    public ValueDeserializationException( String message  )
+    {
+        super( message );
+    }
+
+    public ValueDeserializationException( String message, Exception cause )
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParserFactory.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParserFactory.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParserFactory.java
index f89ff68..a3bfc6b 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParserFactory.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/RdfQueryParserFactory.java
@@ -20,9 +20,7 @@
 
 package org.apache.zest.index.rdf.query;
 
-import org.openrdf.query.QueryLanguage;
 import org.apache.zest.api.injection.scope.Service;
-import org.apache.zest.api.injection.scope.Structure;
 import org.apache.zest.api.mixin.Mixins;
 import org.apache.zest.api.service.ServiceComposite;
 import org.apache.zest.api.service.qualifier.Tagged;
@@ -30,7 +28,7 @@ import org.apache.zest.api.value.ValueSerialization;
 import org.apache.zest.api.value.ValueSerializer;
 import org.apache.zest.index.rdf.UnsupportedLanguageException;
 import org.apache.zest.index.rdf.query.internal.RdfQueryParserImpl;
-import org.apache.zest.spi.ZestSPI;
+import org.openrdf.query.QueryLanguage;
 
 @Mixins( RdfQueryParserFactory.RdfQueryParserFactoryMixin.class )
 public interface RdfQueryParserFactory
@@ -41,8 +39,6 @@ public interface RdfQueryParserFactory
     abstract class RdfQueryParserFactoryMixin
         implements RdfQueryParserFactory
     {
-        @Structure
-        private ZestSPI spi;
         @Service
         @Tagged( ValueSerialization.Formats.JSON )
         private ValueSerializer valueSerializer;
@@ -52,7 +48,7 @@ public interface RdfQueryParserFactory
         {
             if( language.equals( QueryLanguage.SPARQL ) )
             {
-                return new RdfQueryParserImpl( spi, valueSerializer );
+                return new RdfQueryParserImpl( valueSerializer );
             }
             throw new UnsupportedLanguageException( language );
         }

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
----------------------------------------------------------------------
diff --git a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
index e79178f..f453d71 100644
--- a/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
+++ b/extensions/indexing-rdf/src/main/java/org/apache/zest/index/rdf/query/internal/RdfQueryParserImpl.java
@@ -74,7 +74,6 @@ public class RdfQueryParserImpl
 
     private final Namespaces namespaces = new Namespaces();
     private final Triples triples = new Triples( namespaces );
-    private final ZestSPI spi;
     private final ValueSerializer valueSerializer;
     private Map<String, Object> variables;
 
@@ -93,9 +92,8 @@ public class RdfQueryParserImpl
         ) );
     }
 
-    public RdfQueryParserImpl( ZestSPI spi, ValueSerializer valueSerializer )
+    public RdfQueryParserImpl( ValueSerializer valueSerializer )
     {
-        this.spi = spi;
         this.valueSerializer = valueSerializer;
     }
 

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonDeserializer.java b/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonDeserializer.java
new file mode 100644
index 0000000..08474ab
--- /dev/null
+++ b/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonDeserializer.java
@@ -0,0 +1,239 @@
+/*
+ *  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.zest.valueserialization.jackson;
+
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+import java.io.InputStream;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.zest.spi.value.Entry;
+import org.apache.zest.spi.value.ObjectField;
+import org.apache.zest.spi.value.ParserLocation;
+import org.apache.zest.spi.value.VDA;
+
+public class JacksonDeserializer extends VDA<JsonParser>
+{
+    private final JsonFactory jsonFactory = new JsonFactory();
+
+    @Override
+    protected JsonParser adaptInput( InputStream input )
+        throws Exception
+    {
+        return jsonFactory.createParser( input );
+    }
+
+    @Override
+    protected <T> T readPlainValue( Class<T> type, JsonParser jsonParser )
+        throws Exception
+    {
+        JsonToken currentToken = jsonParser.nextValue();
+        if( type.equals( Boolean.class ) || type.equals( Boolean.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_TRUE )
+            {
+                return (T) Boolean.TRUE;
+            }
+            if( currentToken == JsonToken.VALUE_FALSE )
+            {
+                return (T) Boolean.FALSE;
+            }
+            return (T) Boolean.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Byte.class ) || type.equals( Byte.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Byte.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Byte.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Character.class ) || type.equals( Character.TYPE ) )
+        {
+            return (T) Character.valueOf( ( (String) jsonParser.getCurrentValue() ).charAt( 0 ) );
+        }
+        if( type.equals( Short.class ) || type.equals( Short.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Short.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Short.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Integer.class ) || type.equals( Integer.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Integer.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Integer.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Long.class ) || type.equals( Long.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Long.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Long.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Float.class ) || type.equals( Float.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Float.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Float.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        if( type.equals( Double.class ) || type.equals( Double.TYPE ) )
+        {
+            if( currentToken == JsonToken.VALUE_NUMBER_INT ||
+                currentToken == JsonToken.VALUE_NUMBER_FLOAT )
+            {
+                return (T) Double.valueOf( (Byte) jsonParser.getCurrentValue() );
+            }
+            return (T) Double.valueOf( (String) jsonParser.getCurrentValue() );
+        }
+        throw new InternalError( "Please contact dev@zest.apache.org." );
+    }
+
+    protected <T> T readObjectValue( Type tType, JsonParser jsonParser )
+        throws Exception
+    {
+        JsonToken currentToken = jsonParser.nextToken();
+        Map<Object, Object> entries = new HashMap<>();
+        if( currentToken == JsonToken.START_OBJECT )
+        {
+            while( currentToken != JsonToken.END_OBJECT )
+            {
+                String fieldName = jsonParser.nextFieldName();
+                Class<?> fieldType = fieldTypeOf( tType, fieldName );
+                Object fieldValue = readObject( fieldType, jsonParser );
+                entries.put( fieldName, fieldValue );
+                currentToken = jsonParser.nextToken();
+            }
+            return createObject( tType, entries );
+        }
+        return null;
+    }
+
+    @Override
+    protected <T> T readArrayValue( Class<T> type, JsonParser jsonParser )
+        throws Exception
+    {
+        JsonToken currentToken = jsonParser.nextToken();
+        List<Object> entries = new ArrayList<>();
+        if( currentToken == JsonToken.START_ARRAY )
+        {
+            while( currentToken != JsonToken.END_ARRAY )
+            {
+                Object fieldValue = readObject( type.getComponentType(), jsonParser );
+                entries.add( fieldValue );
+                currentToken = jsonParser.nextToken();
+            }
+            return createArray( type, entries );
+        }
+        return null;
+    }
+
+    @Override
+    protected <K, V> Map<K, V> readMapValue( Type mapType, JsonParser jsonParser )
+        throws Exception
+    {
+        Type keyType;
+        Type valueType;
+        if( mapType instanceof ParameterizedType )
+        {
+            keyType = ( (ParameterizedType) mapType ).getActualTypeArguments()[ 0 ];
+            valueType = ( (ParameterizedType) mapType ).getActualTypeArguments()[ 1 ];
+        }
+        else
+        {
+            keyType = Object.class;
+            valueType = Object.class;
+        }
+
+        JsonToken currentToken = jsonParser.nextToken();
+        Map<Object, Object> entries = new HashMap<>();
+        if( currentToken == JsonToken.START_OBJECT )
+        {
+            while( currentToken != JsonToken.END_OBJECT )
+            {
+                Object fieldKey = readObject( keyType, jsonParser );
+                Object fieldValue = readObject( valueType, jsonParser );
+                entries.put( fieldKey, fieldValue );
+                currentToken = jsonParser.nextToken();
+            }
+            return createObject(mapType, entries);
+        }
+        return null;
+    }
+
+    @Override
+    protected <T> T readListValue( Type listType, JsonParser jsonParser )
+        throws Exception
+    {
+        return null;
+    }
+
+    @Override
+    protected <T> T readEnumValue( Class<T> type, JsonParser jsonParser )
+        throws Exception
+    {
+        return null;
+    }
+
+    @Override
+    protected ObjectField nextField( JsonParser jsonParser )
+        throws Exception
+    {
+        return null;
+    }
+
+    @Override
+    protected Entry nextEntry( JsonParser jsonParser )
+        throws Exception
+    {
+        return null;
+    }
+
+    @Override
+    protected Object nextValue( JsonParser jsonParser )
+        throws Exception
+    {
+        return null;
+    }
+
+    @Override
+    public ParserLocation location( JsonParser jsonParser )
+    {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/zest-java/blob/301f837d/extensions/valueserialization-jackson/src/test/java/org/apache/zest/valueserialization/jackson/JacksonDeserializerTest.java
----------------------------------------------------------------------
diff --git a/extensions/valueserialization-jackson/src/test/java/org/apache/zest/valueserialization/jackson/JacksonDeserializerTest.java b/extensions/valueserialization-jackson/src/test/java/org/apache/zest/valueserialization/jackson/JacksonDeserializerTest.java
new file mode 100644
index 0000000..2943037
--- /dev/null
+++ b/extensions/valueserialization-jackson/src/test/java/org/apache/zest/valueserialization/jackson/JacksonDeserializerTest.java
@@ -0,0 +1,293 @@
+/*
+ *  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.zest.valueserialization.jackson;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import org.apache.zest.api.entity.EntityBuilder;
+import org.apache.zest.api.entity.EntityReference;
+import org.apache.zest.api.injection.scope.Service;
+import org.apache.zest.api.property.Property;
+import org.apache.zest.api.unitofwork.UnitOfWork;
+import org.apache.zest.api.usecase.UsecaseBuilder;
+import org.apache.zest.api.value.ValueBuilder;
+import org.apache.zest.api.value.ValueSerialization;
+import org.apache.zest.bootstrap.AssemblyException;
+import org.apache.zest.bootstrap.ModuleAssembly;
+import org.apache.zest.entitystore.memory.MemoryEntityStoreService;
+import org.apache.zest.spi.uuid.UuidIdentityGeneratorService;
+import org.apache.zest.test.AbstractZestTest;
+import org.junit.Test;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertThat;
+
+public class JacksonDeserializerTest extends AbstractZestTest
+{
+
+    @Service
+    @SuppressWarnings( "ProtectedField" )
+    protected ValueSerialization valueSerialization;
+
+    @Override
+    public void assemble( ModuleAssembly module )
+        throws AssemblyException
+    {
+        module.values( Regression142Type.class );
+        module.entities( Regression142Type.class );
+
+        module.services( MemoryEntityStoreService.class );
+        module.services( UuidIdentityGeneratorService.class );
+    }
+
+    @Test
+    public void givenCharacterValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( 'q' );
+        assertThat( "Serialized", serialized, equalTo( "q" ) );
+
+        Character deserialized = valueSerialization.deserialize( module, Character.class, serialized );
+        assertThat( "Deserialized", deserialized, equalTo( 'q' ) );
+    }
+
+    @Test
+    public void givenEmptyStringValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( "" );
+        assertThat( "Serialized", serialized, equalTo( "" ) );
+
+        String deserialized = valueSerialization.deserialize( module, String.class, serialized );
+        assertThat( "Deserialized", deserialized, equalTo( "" ) );
+    }
+
+    @Test
+    public void givenStringValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( "test" );
+        assertThat( serialized, equalTo( "test" ) );
+
+        String deserialized = valueSerialization.deserialize( module, String.class, serialized );
+        assertThat( deserialized, equalTo( "test" ) );
+    }
+
+    @Test
+    public void givenBooleanValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( Boolean.TRUE );
+        assertThat( serialized, equalTo( "true" ) );
+
+        Boolean deserialized = valueSerialization.deserialize( module, Boolean.class, serialized );
+        assertThat( deserialized, equalTo( Boolean.TRUE ) );
+    }
+
+    @Test
+    public void givenIntegerValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( 42 );
+        assertThat( serialized, equalTo( "42" ) );
+        Integer deserialized = valueSerialization.deserialize( module, Integer.class, serialized );
+        assertThat( deserialized, equalTo( 42 ) );
+    }
+
+    @Test
+    public void givenLongValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( 42L );
+        assertThat( serialized, equalTo( "42" ) );
+
+        Long deserialized = valueSerialization.deserialize( module, Long.class, serialized );
+        assertThat( deserialized, equalTo( 42L ) );
+    }
+
+    @Test
+    public void givenShortValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( (short) 42 );
+        assertThat( serialized, equalTo( "42" ) );
+
+        Short deserialized = valueSerialization.deserialize( module, Short.class, serialized );
+        assertThat( deserialized, equalTo( (short) 42 ) );
+    }
+
+    @Test
+    public void givenByteValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( (byte) 42 );
+        assertThat( serialized, equalTo( "42" ) );
+        Byte deserialized = valueSerialization.deserialize( module, Byte.class, serialized );
+        assertThat( deserialized, equalTo( (byte) 42 ) );
+    }
+
+    @Test
+    public void givenFloatValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( 42F );
+        assertThat( serialized, equalTo( "42.0" ) );
+
+        Float deserialized = valueSerialization.deserialize( module, Float.class, serialized );
+        assertThat( deserialized, equalTo( 42F ) );
+    }
+
+    @Test
+    public void givenDoubleValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( 42D );
+        assertThat( serialized, equalTo( "42.0" ) );
+
+        Double deserialized = valueSerialization.deserialize( module, Double.class, serialized );
+        assertThat( deserialized, equalTo( 42D ) );
+    }
+
+    @Test
+    public void givenBigIntegerValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        BigInteger bigInteger = new BigInteger( "42424242424242424242424242" );
+        assertThat( bigInteger, not( equalTo( BigInteger.valueOf( bigInteger.longValue() ) ) ) );
+
+        String serialized = valueSerialization.serialize( bigInteger );
+        assertThat( serialized, equalTo( "42424242424242424242424242" ) );
+
+        BigInteger deserialized = valueSerialization.deserialize( module, BigInteger.class, serialized );
+        assertThat( deserialized, equalTo( bigInteger ) );
+    }
+
+    @Test
+    public void givenBigDecimalValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        BigDecimal bigDecimal = new BigDecimal( "42.2376931348623157e+309" );
+        assertThat( bigDecimal.doubleValue(), equalTo( Double.POSITIVE_INFINITY ) );
+
+        String serialized = valueSerialization.serialize( bigDecimal );
+        assertThat( serialized, equalTo( "4.22376931348623157E+310" ) );
+
+        BigDecimal deserialized = valueSerialization.deserialize( module, BigDecimal.class, serialized );
+        assertThat( deserialized, equalTo( bigDecimal ) );
+    }
+
+    @Test
+    public void givenDateTimeValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( OffsetDateTime.of( 2020, 3, 4, 13, 24, 35, 123000000, ZoneOffset
+            .ofHours( 1 ) ) );
+        assertThat( serialized, equalTo( "2020-03-04T13:24:35.123+01:00" ) );
+        ZonedDateTime deserialized = valueSerialization.deserialize( module, ZonedDateTime.class, serialized );
+        assertThat( deserialized, equalTo( ZonedDateTime.of( 2020, 3, 4, 13, 24, 35, 123000000, ZoneOffset.ofHours( 1 ) ) ) );
+    }
+
+    @Test
+    public void givenLocalDateTimeValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        // Serialized without TimeZone
+        String serialized = valueSerialization.serialize( LocalDateTime.of( 2020, 3, 4, 13, 23, 12 ) );
+        assertThat( serialized, equalTo( "2020-03-04T13:23:12" ) );
+
+        LocalDateTime deserialized = valueSerialization.deserialize( module, LocalDateTime.class, serialized );
+        assertThat( deserialized, equalTo( LocalDateTime.of( 2020, 3, 4, 13, 23, 12 ) ) );
+    }
+
+    @Test
+    public void givenLocalDateValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( LocalDate.of( 2020, 3, 4 ) );
+        assertThat( serialized, equalTo( "2020-03-04" ) );
+
+        LocalDate deserialized = valueSerialization.deserialize( module, LocalDate.class, serialized );
+        assertThat( deserialized, equalTo( LocalDate.of( 2020,3,4 ) ) );
+    }
+
+    @Test
+    public void givenEntityReferenceValueWhenSerializingAndDeserializingExpectEquals()
+    {
+        String serialized = valueSerialization.serialize( EntityReference.parseEntityReference( "ABCD-1234" ) );
+        assertThat( serialized, equalTo( "ABCD-1234" ) );
+
+        EntityReference deserialized = valueSerialization.deserialize( module, EntityReference.class, serialized );
+        assertThat( deserialized, equalTo( EntityReference.parseEntityReference( "ABCD-1234" ) ) );
+    }
+
+    @Test
+    public void zest142RegressionTest()
+        throws Exception
+    {
+        if( getClass().getName().equals( "org.apache.zest.valueserialization.stax.StaxPlainValueSerializationTest" ) )
+        {
+            // This test is disabled, as this test expect a JSON capable serializer as it uses
+            // the JSONMapEntityStoreMixin in MemoryEntityStore.
+            return;
+        }
+        ValueSerialization serialization = serviceFinder.findService( ValueSerialization.class ).get();
+
+        Regression142Type value;
+        {
+            ValueBuilder<Regression142Type> builder = valueBuilderFactory.newValueBuilder( Regression142Type.class );
+            builder.prototype().price().set( 23.45 );
+            builder.prototype().testenum().set( Regression142Enum.B );
+            value = builder.newInstance();
+            String serialized = serialization.serialize( value );
+            System.out.println( serialized ); // ok
+            value = serialization.deserialize( module, Regression142Type.class, serialized ); // ok
+        }
+        {
+            String valueId = "abcdefg";
+            {
+                try (UnitOfWork uow = unitOfWorkFactory.newUnitOfWork( UsecaseBuilder.newUsecase( "create" ) ))
+                {
+                    EntityBuilder<Regression142Type> builder = uow.newEntityBuilder( Regression142Type.class, valueId );
+                    builder.instance().price().set( 45.67 );
+                    builder.instance().testenum().set( Regression142Enum.A );
+                    value = builder.newInstance();
+                    System.out.println( value.testenum().get() );
+                    uow.complete();
+                }
+                catch( Exception e_ )
+                {
+                    e_.printStackTrace();
+                }
+            }
+            {
+                try (UnitOfWork uow = unitOfWorkFactory.newUnitOfWork( UsecaseBuilder.newUsecase( "create" ) ))
+                {
+                    value = uow.get( Regression142Type.class, valueId );
+                    System.out.println( value.price().get() );
+                    System.out.println( value.testenum().get() ); // FAIL
+                }
+            }
+        }
+    }
+
+    private enum Regression142Enum
+    {
+        A, B, C, D
+    }
+
+    interface Regression142Type
+    {
+        Property<Double> price();
+
+        Property<Regression142Enum> testenum();
+    }
+}