Updated Branches:
  refs/heads/master f0526cdfe -> 9b651e2e5

ISIS-233: refactoring JsonValueEncoder


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

Branch: refs/heads/master
Commit: 4ff4f71373a8b6bc453f91ea0f2c6c52d7329414
Parents: f0526cd
Author: Dan Haywood <[email protected]>
Authored: Mon Apr 29 20:48:07 2013 +0100
Committer: Dan Haywood <[email protected]>
Committed: Mon Apr 29 20:48:07 2013 +0100

----------------------------------------------------------------------
 .../restfulobjects/applib/JsonRepresentation.java  |   24 +-
 .../domainobjects/DomainObjectReprRenderer.java    |    2 +-
 .../rendering/domainobjects/JsonValueEncoder.java  |  505 +++++++++------
 .../domainobjects/ScalarValueReprRenderer.java     |    3 +-
 .../JsonValueEncoderTest_asAdapter.java            |    7 +-
 .../JsonValueEncoderTest_asObject.java             |   41 +-
 .../server/resources/DomainResourceHelper.java     |    2 +-
 ...hJodaProperties_thenRepresentation_ok_TODO.java |    1 -
 .../fixture/scalars/JodaValuedEntityFixture.java   |    8 +-
 9 files changed, 356 insertions(+), 237 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
 
b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
index 58cd446..d4f7bb7 100644
--- 
a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
+++ 
b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
@@ -272,15 +272,36 @@ public class JsonRepresentation {
         return !representsNull(node) && node.isValueNode() && node.isNumber();
     }
 
+    public Number asNumber() {
+        return getNumber(null, asJsonNode());
+    }
+
+    private Number getNumber(final String path, final JsonNode node) {
+        if (representsNull(node)) {
+            return null;
+        }
+        checkValue(path, node, "a number");
+        if (!node.isNumber()) {
+            throw new IllegalArgumentException(formatExMsg(path, "is not a 
number"));
+        }
+        return node.getNumberValue();
+    }
+
 
     // ///////////////////////////////////////////////////////////////////////
-    // isIntegralNumber
+    // isIntegralNumber, getIntegralNumber, asIntegralNumber
     // ///////////////////////////////////////////////////////////////////////
 
+    /**
+     * Is a long, an int or a {@link BigInteger}.
+     */
     public boolean isIntegralNumber(final String path) {
         return isIntegralNumber(getNode(path));
     }
 
+    /**
+     * Is a long, an int or a {@link BigInteger}.
+     */
     public boolean isIntegralNumber() {
         return isIntegralNumber(asJsonNode());
     }
@@ -1379,4 +1400,5 @@ public class JsonRepresentation {
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index 9aeef67..dc51bb7 100644
--- 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -360,7 +360,7 @@ public class DomainObjectReprRenderer extends 
ReprRendererAbstract<DomainObjectR
     public static Object valueOrRef(final RendererContext resourceContext, 
final ObjectAdapter objectAdapter, final ObjectSpecification objectSpec) {
         final ValueFacet valueFacet = objectSpec.getFacet(ValueFacet.class);
         if (valueFacet != null) {
-            return new JsonValueEncoder().asObject(objectAdapter);
+            return JsonValueEncoder.asObject(objectAdapter);
         }
         final TitleFacet titleFacet = objectSpec.getFacet(TitleFacet.class);
         final String title = titleFacet.title(objectAdapter, 
resourceContext.getLocalization());

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 0989147..3655e4e 100644
--- 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -20,12 +20,23 @@ package 
org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 import org.codehaus.jackson.node.NullNode;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
 /**
@@ -34,11 +45,251 @@ import 
org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
  */
 public final class JsonValueEncoder {
 
+    private JsonValueEncoder(){}
+
+    
     public static class ExpectedStringRepresentingValueException extends 
IllegalArgumentException {
         private static final long serialVersionUID = 1L;
     }
 
-    public ObjectAdapter asAdapter(final ObjectSpecification objectSpec, final 
JsonRepresentation argRepr) {
+    public static abstract class JsonValueConverter {
+
+        private final String format;
+        private final String xIsisFormat;
+        private final Class<?>[] classes;
+
+        public JsonValueConverter(String format, String xIsisFormat, 
Class<?>... classes) {
+            this.format = format;
+            this.xIsisFormat = xIsisFormat;
+            this.classes = classes;
+        }
+
+        public List<ObjectSpecId> getSpecIds() {
+            return 
Lists.newArrayList(Iterables.transform(Arrays.asList(classes), new 
Function<Class<?>, ObjectSpecId>() {
+                public ObjectSpecId apply(Class<?> cls) {
+                    return new ObjectSpecId(cls.getName());
+                }
+            }));
+        }
+        
+        /**
+         * The value, otherwise <tt>null</tt>.
+         */
+        public abstract ObjectAdapter asAdapter(JsonRepresentation repr);
+        
+        public void appendValueAndFormat(ObjectAdapter objectAdapter, 
JsonRepresentation repr) {
+            append(repr, objectAdapter, format, xIsisFormat);
+        }
+
+        public Object asObject(ObjectAdapter objectAdapter) {
+            return objectAdapter.getObject();
+        }
+        
+        
+
+
+    }
+    
+    private static Map<ObjectSpecId, JsonValueConverter> converterBySpec = 
Maps.newLinkedHashMap();
+    
+    private static void putConverter(JsonValueConverter jvc) {
+        final List<ObjectSpecId> specIds = jvc.getSpecIds();
+        for (ObjectSpecId specId : specIds) {
+            converterBySpec.put(specId, jvc);
+        }
+    }
+
+    static {
+        putConverter(new JsonValueConverter(null, "boolean", boolean.class, 
Boolean.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isBoolean()) {
+                    return adapterFor(repr.asBoolean());
+                } 
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter(null, "byte", byte.class, 
Byte.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().byteValue());
+                }
+                if (repr.isInt()) {
+                    return adapterFor((byte)(int)repr.asInt());
+                }
+                if (repr.isLong()) {
+                    return adapterFor((byte)(long)repr.asLong());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().byteValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter(null, "short", short.class, 
Short.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().shortValue());
+                }
+                if (repr.isInt()) {
+                    return adapterFor((short)(int)repr.asInt());
+                }
+                if (repr.isLong()) {
+                    return adapterFor((short)(long)repr.asLong());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().shortValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("int", "int", int.class, 
Integer.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isInt()) {
+                    return adapterFor(repr.asInt());
+                }
+                if (repr.isLong()) {
+                    return adapterFor((int)(long)repr.asLong());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().intValue());
+                }
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().intValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("int", "long", long.class, 
Long.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isLong()) {
+                    return adapterFor(repr.asLong());
+                }
+                if (repr.isInt()) {
+                    return adapterFor(repr.asInt());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().longValue());
+                }
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().longValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("decimal", "float", float.class, 
Float.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isDouble()) {
+                    return adapterFor((float)(double)repr.asDouble());
+                }
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().floatValue());
+                }
+                if (repr.isLong()) {
+                    return adapterFor((float)repr.asLong());
+                }
+                if (repr.isInt()) {
+                    return adapterFor((float)repr.asInt());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().floatValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("decimal", "double", double.class, 
Double.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isDouble()) {
+                    return adapterFor(repr.asDouble());
+                }
+                if (repr.isLong()) {
+                    return adapterFor((double)repr.asLong());
+                }
+                if (repr.isInt()) {
+                    return adapterFor((double)repr.asInt());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger().doubleValue());
+                }
+                if (repr.isBigDecimal()) {
+                    return adapterFor(repr.asBigDecimal().doubleValue());
+                }
+                if (repr.isNumber()) {
+                    return adapterFor(repr.asNumber().doubleValue());
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter(null, "char", char.class, 
Character.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isString()) {
+                    final String str = repr.asString();
+                    if(str != null && str.length()>0) {
+                        return adapterFor(str.charAt(0));
+                    }
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("int", "biginteger", 
BigInteger.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                if (repr.isBigInteger()) {
+                    return adapterFor(repr.asBigInteger());
+                }
+                if (repr.isLong()) {
+                    return adapterFor(BigInteger.valueOf(repr.asLong()));
+                }
+                if (repr.isInt()) {
+                    return adapterFor(BigInteger.valueOf(repr.asInt()));
+                }
+                if (repr.isNumber()) {
+                    return 
adapterFor(BigInteger.valueOf(repr.asNumber().longValue()));
+                }
+                return null;
+            }
+        });
+        
+        putConverter(new JsonValueConverter("decimal", "bigdecimal", 
BigDecimal.class){
+            @Override
+            public ObjectAdapter asAdapter(JsonRepresentation repr) {
+                // TODO: if inferring a BigDecimal, need to get the scale from 
somewhere...
+                if (repr.isBigDecimal()) {
+                    return adapterFor(repr.asBigDecimal());
+                }
+                if (repr.isBigInteger()) {
+                    return adapterFor(new BigDecimal(repr.asBigInteger()));
+                }
+                if (repr.isDouble()) {
+                    return adapterFor(BigDecimal.valueOf(repr.asDouble()));
+                }
+                if (repr.isLong()) {
+                    return adapterFor(BigDecimal.valueOf(repr.asLong()));
+                }
+                if (repr.isInt()) {
+                    return adapterFor(BigDecimal.valueOf(repr.asInt()));
+                }
+                return null;
+            }
+        });
+    }
+
+    public static ObjectAdapter asAdapter(final ObjectSpecification 
objectSpec, final JsonRepresentation argRepr) {
         if (objectSpec == null) {
             String reason = "ObjectSpec is null, cannot validate";
             argRepr.mapPut("invalidReason", reason);
@@ -50,6 +301,7 @@ public final class JsonValueEncoder {
             argRepr.mapPut("invalidReason", reason);
             throw new IllegalArgumentException(reason);
         }
+        
         if(!argRepr.mapHas("value")) {
             String reason = "No 'value' key";
             argRepr.mapPut("invalidReason", reason);
@@ -65,198 +317,62 @@ public final class JsonValueEncoder {
             throw new IllegalArgumentException(reason);
         }
 
-        // special case handling for JSON built-ins
-        if (isBoolean(objectSpec)) {
-            if (!argValueRepr.isBoolean()) {
-                throwIncompatibleException(objectSpec, argRepr);
-            }
-            final String argStr = "" + argValueRepr.asBoolean();
-            return encodableFacet.fromEncodedString(argStr);
-        }
-
-        if (isInteger(objectSpec)) {
-            if (argValueRepr.isInt()) {
-                final String argStr = "" + argValueRepr.asInt();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // best effort
-            if (argValueRepr.isString()) {
-                final String argStr = argValueRepr.asString();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // give up
-            throwIncompatibleException(objectSpec, argRepr);
-        }
-
-        if (isLong(objectSpec)) {
-            if (!argValueRepr.isLong()) {
-                throwIncompatibleException(objectSpec, argRepr);
-            }
-            final String argStr = "" + argValueRepr.asLong();
-            return encodableFacet.fromEncodedString(argStr);
-        }
-
-        if (isBigInteger(objectSpec)) {
-            if (argValueRepr.isBigInteger()) {
-                final String argStr = "" + argValueRepr.asBigInteger();
-                return encodableFacet.fromEncodedString(argStr);
-            }
+        final JsonValueConverter jvc = 
converterBySpec.get(objectSpec.getSpecId());
+        if(jvc == null) {
             // best effort
-            if (argValueRepr.isLong()) {
-                final String argStr = "" + argValueRepr.asLong();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isInt()) {
-                final String argStr = "" + argValueRepr.asInt();
-                return encodableFacet.fromEncodedString(argStr);
-            }
             if (argValueRepr.isString()) {
                 final String argStr = argValueRepr.asString();
                 return encodableFacet.fromEncodedString(argStr);
             }
-            // give up
-            throwIncompatibleException(objectSpec, argRepr);
-        }
 
-        if (isBigDecimal(objectSpec)) {
-            if (argValueRepr.isBigDecimal()) {
-                final String argStr = "" + argValueRepr.asBigDecimal();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // best effort
-            if (argValueRepr.isBigInteger()) {
-                final String argStr = "" + argValueRepr.asBigInteger();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isDouble()) {
-                final String argStr = "" + argValueRepr.asDouble();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isLong()) {
-                final String argStr = "" + argValueRepr.asLong();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isInt()) {
-                final String argStr = "" + argValueRepr.asInt();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isString()) {
-                final String argStr = argValueRepr.asString();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // give up
-            throwIncompatibleException(objectSpec, argRepr);
+            final String reason = "Unable to parse value";
+            argRepr.mapPut("invalidReason", reason);
+            throw new IllegalArgumentException(reason);
         }
 
-        if (isDouble(objectSpec)) {
-            if (argValueRepr.isDouble()) {
-                final String argStr = "" + argValueRepr.asDouble();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // best effort
-            if (argValueRepr.isLong()) {
-                final String argStr = "" + argValueRepr.asLong();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isInt()) {
-                final String argStr = "" + argValueRepr.asInt();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            if (argValueRepr.isString()) {
-                final String argStr = argValueRepr.asString();
-                return encodableFacet.fromEncodedString(argStr);
-            }
-            // give up
-            throwIncompatibleException(objectSpec, argRepr);
+        final ObjectAdapter asAdapter = jvc.asAdapter(argValueRepr);
+        if(asAdapter != null) {
+            return asAdapter;
         }
-
+        
+        // last attempt
         if (argValueRepr.isString()) {
             final String argStr = argValueRepr.asString();
             return encodableFacet.fromEncodedString(argStr);
         }
-        
-        final String reason = "Unable to parse value";
+
+        final String reason = "Could not parse value '" + 
argValueRepr.asString() + "' as a " + objectSpec.getFullIdentifier();
         argRepr.mapPut("invalidReason", reason);
         throw new IllegalArgumentException(reason);
     }
 
-    static void appendValueAndFormat(ObjectSpecification objectSpec, 
ObjectAdapter objectAdapter, JsonRepresentation repr) {
+    public static void appendValueAndFormat(ObjectSpecification objectSpec, 
ObjectAdapter objectAdapter, JsonRepresentation repr) {
 
-        // special case handling for JSON built-ins 
-        // (at least so far as json.org defines them).
-        Object value;
-        String format = null; // as defined by RO spec
-        String xIsisFormat = null; // isis-specific support
-        if (isBoolean(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            xIsisFormat = "boolean";
-        } else if (isByte(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            xIsisFormat = "byte";
-        } else if (isChar(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            xIsisFormat = "char";
-        } else if (isShort(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            xIsisFormat = "short";
-        } else if (isInteger(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "int";
-            xIsisFormat = "int";
-        } else if (isLong(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "int";
-            xIsisFormat = "long";
-        } else if (isBigInteger(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "int";
-            xIsisFormat = "biginteger";
-        } else if (isFloat(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "decimal";
-            xIsisFormat = "float";
-        } else if (isDouble(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "decimal";
-            xIsisFormat = "double";
-        } else if (isBigDecimal(objectSpec)) {
-            value = asValueElseNull(objectAdapter);
-            format = "decimal";
-            xIsisFormat = "bigdecimal";
+        final JsonValueConverter jvc = 
converterBySpec.get(objectSpec.getSpecId());
+        if(jvc != null) {
+            jvc.appendValueAndFormat(objectAdapter, repr);
         } else {
             final EncodableFacet encodableFacet = 
objectSpec.getFacet(EncodableFacet.class);
             if (encodableFacet == null) {
                 throw new IllegalArgumentException("objectSpec expected to 
have EncodableFacet");
             }
-            value = objectAdapter != null? 
encodableFacet.toEncodedString(objectAdapter): NullNode.getInstance();
-        }
-        
-        repr.mapPut("value", value);
-        if(format != null) {
-            repr.mapPut("format", format);
-        }
-        if(xIsisFormat != null) {
-            repr.mapPut("x-isis-format", xIsisFormat);
+            Object value = objectAdapter != null? 
encodableFacet.toEncodedString(objectAdapter): NullNode.getInstance();
+            append(repr, value, "decimal", "bigdecimal");
         }
     }
-
-    private static Object asValueElseNull(ObjectAdapter objectAdapter) {
-        return objectAdapter != null? objectAdapter.getObject(): 
NullNode.getInstance();
-    }
-
-    static Object asObject(final ObjectAdapter objectAdapter) {
+    
+    public static Object asObject(final ObjectAdapter objectAdapter) {
         if (objectAdapter == null) {
             throw new IllegalArgumentException("objectAdapter cannot be null");
         }
         final ObjectSpecification objectSpec = 
objectAdapter.getSpecification();
 
-        // special case handling for JSON built-ins (at least so far as 
json.org
-        // defines them).
-        if (isBoolean(objectSpec) || isInteger(objectSpec) || 
isLong(objectSpec) || isBigInteger(objectSpec) || isDouble(objectSpec) || 
isBigDecimal(objectSpec)) {
-            // simply return
-            return objectAdapter.getObject();
-        }
-
+        final JsonValueConverter jvc = 
converterBySpec.get(objectSpec.getSpecId());
+        if(jvc != null) {
+            return jvc.asObject(objectAdapter);
+        } 
+        
+        // else
         final EncodableFacet encodableFacet = 
objectSpec.getFacet(EncodableFacet.class);
         if (encodableFacet == null) {
             throw new IllegalArgumentException("objectSpec expected to have 
EncodableFacet");
@@ -264,61 +380,34 @@ public final class JsonValueEncoder {
         return encodableFacet.toEncodedString(objectAdapter);
     }
 
-    private static boolean isBoolean(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, boolean.class, Boolean.class);
-    }
-
-    private static boolean isByte(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, byte.class, Byte.class);
-    }
-    
-    private static boolean isChar(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, char.class, Character.class);
-    }
     
-    private static boolean isShort(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, short.class, Short.class);
-    }
 
-    private static boolean isInteger(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, int.class, Integer.class);
-    }
-    
-    private static boolean isLong(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, long.class, Long.class);
+    private static void append(JsonRepresentation repr, Object value, String 
format, String xIsisFormat) {
+        repr.mapPut("value", value);
+        if(format != null) {
+            repr.mapPut("format", format);
+        }
+        if(xIsisFormat != null) {
+            repr.mapPut("x-isis-format", xIsisFormat);
+        }
     }
 
-    private static boolean isBigInteger(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, BigInteger.class);
+    private static void append(JsonRepresentation repr, ObjectAdapter value, 
String format, String xIsisFormat) {
+        append(repr, unwrap(value), format, xIsisFormat);
     }
     
-    private static boolean isFloat(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, float.class, Float.class);
+    private static Object unwrap(ObjectAdapter objectAdapter) {
+        return objectAdapter != null? objectAdapter.getObject(): 
NullNode.getInstance();
     }
 
-    private static boolean isDouble(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, double.class, Double.class);
-    }
-    
-    private static boolean isBigDecimal(final ObjectSpecification objectSpec) {
-        return hasCorrespondingClass(objectSpec, BigDecimal.class);
-    }
 
-    private static boolean hasCorrespondingClass(final ObjectSpecification 
objectSpec, final Class<?>... candidates) {
-        final Class<?> specClass = objectSpec.getCorrespondingClass();
-        for (final Class<?> candidate : candidates) {
-            if (specClass == candidate) {
-                return true;
-            }
-        }
-        return false;
-    }
 
-    private void throwIncompatibleException(final ObjectSpecification 
objectSpec, final JsonRepresentation argRepr) {
-        String reason = String.format("representation '%s' incompatible with 
objectSpec '%s'", argRepr.getMap("value").toString(), 
objectSpec.getCorrespondingClass().getName());
-        argRepr.mapPut("invalidReason", reason);
-        throw new IllegalArgumentException(reason);
+    private static ObjectAdapter adapterFor(Object value) {
+        return getAdapterManager().adapterFor(value);
+    }
+    
+    public static AdapterManager getAdapterManager() {
+        return IsisContext.getPersistenceSession().getAdapterManager();
     }
-
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
index f5eb48a..159765c 100644
--- 
a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
+++ 
b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
@@ -31,7 +31,6 @@ import 
org.apache.isis.viewer.restfulobjects.rendering.ReprRendererException;
 
 public class ScalarValueReprRenderer extends 
ReprRendererAbstract<ScalarValueReprRenderer, ObjectAdapter> {
 
-    private final JsonValueEncoder jsonValueEncoder = new JsonValueEncoder();
     private ObjectSpecification returnType;
 
     ScalarValueReprRenderer(final RendererContext resourceContext, final 
LinkFollowSpecs linkFollower, final JsonRepresentation representation) {
@@ -55,7 +54,7 @@ public class ScalarValueReprRenderer extends 
ReprRendererAbstract<ScalarValueRep
         if (facet == null) {
             throw ReprRendererException.create("Not an (encodable) value", 
objectAdapter.titleString());
         }
-        final Object value = jsonValueEncoder.asObject(objectAdapter);
+        final Object value = JsonValueEncoder.asObject(objectAdapter);
 
         representation.mapPut("value", value);
         return this;

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
 
b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
index b313c74..e4cf0e4 100644
--- 
a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
+++ 
b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asAdapter.java
@@ -63,18 +63,17 @@ public class JsonValueEncoderTest_asAdapter {
         objectAdapter = context.mock(ObjectAdapter.class);
 
         representation = new JsonRepresentation(TextNode.valueOf("aString"));
-        jsonValueEncoder = new JsonValueEncoder();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void whenSpecIsNull() throws Exception {
-        jsonValueEncoder.asAdapter(null, representation);
+        JsonValueEncoder.asAdapter(null, representation);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void whenReprIsNull() throws Exception {
         allowingObjectSpecHas(EncodableFacet.class, encodableFacet);
-        jsonValueEncoder.asAdapter(objectSpec, null);
+        JsonValueEncoder.asAdapter(objectSpec, null);
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -308,7 +307,7 @@ public class JsonValueEncoderTest_asAdapter {
         });
 
         // when
-        final ObjectAdapter adapter = jsonValueEncoder.asAdapter(objectSpec, 
representation);
+        final ObjectAdapter adapter = JsonValueEncoder.asAdapter(objectSpec, 
representation);
 
         // then
         assertSame(objectAdapter, adapter);

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
 
b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
index 584b883..d324744 100644
--- 
a/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
+++ 
b/component/viewer/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_asObject.java
@@ -24,11 +24,6 @@ import static org.junit.Assert.assertSame;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.integration.junit4.JMock;
@@ -37,12 +32,18 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+
 @RunWith(JMock.class)
 public class JsonValueEncoderTest_asObject {
 
     private final Mockery context = new JUnit4Mockery();
 
-    private JsonValueEncoder jsonValueEncoder;
     private JsonRepresentation representation;
     private ObjectAdapter objectAdapter;
     private ObjectSpecification objectSpec;
@@ -64,20 +65,18 @@ public class JsonValueEncoderTest_asObject {
         encodableFacet = context.mock(EncodableFacet.class);
 
         encoded = new Object();
-
-        jsonValueEncoder = new JsonValueEncoder();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void whenAdapterIsNull() throws Exception {
-        jsonValueEncoder.asObject(null);
+        JsonValueEncoder.asObject(null);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void whenObjectAdapterIsNotSpecialCaseAndSpecIsNotEncodable() 
throws Exception {
         allowingObjectSpecCorrespondingClassIs(String.class);
         allowingObjectSpecHas(EncodableFacet.class, null);
-        jsonValueEncoder.asObject(objectAdapter);
+        JsonValueEncoder.asObject(objectAdapter);
     }
 
     @Test
@@ -100,7 +99,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(true));
             }
         });
-        assertEquals(true, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(true, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -123,7 +122,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(123));
             }
         });
-        assertEquals(123, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(123, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -146,7 +145,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(123456789L));
             }
         });
-        assertEquals(123456789L, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(123456789L, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -169,7 +168,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(12345.6789));
             }
         });
-        assertEquals(12345.6789, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(12345.6789, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -185,7 +184,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(value));
             }
         });
-        assertEquals(value, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(value, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -197,11 +196,11 @@ public class JsonValueEncoderTest_asObject {
         context.checking(new Expectations() {
 
             {
-                one(objectAdapter).getObject();
+                oneOf(objectAdapter).getObject();
                 will(returnValue(value));
             }
         });
-        assertEquals(value, jsonValueEncoder.asObject(objectAdapter));
+        assertEquals(value, JsonValueEncoder.asObject(objectAdapter));
     }
 
     @Test
@@ -214,7 +213,7 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue("encodedString"));
             }
         });
-        assertSame("encodedString", jsonValueEncoder.asObject(objectAdapter));
+        assertSame("encodedString", JsonValueEncoder.asObject(objectAdapter));
     }
 
     private void allowingObjectSpecCorrespondingClassIs(final Class<?> result) 
{
@@ -224,6 +223,12 @@ public class JsonValueEncoderTest_asObject {
                 will(returnValue(result));
             }
         });
+        context.checking(new Expectations() {
+            {
+                allowing(objectSpec).getSpecId();
+                will(returnValue(new ObjectSpecId(result.getName())));
+            }
+        });
     }
 
     private <T extends Facet> void allowingObjectSpecHas(final Class<T> 
facetClass, final T encodableFacet) {

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
 
b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index 0e0450d..d965aea 100644
--- 
a/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ 
b/component/viewer/restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -310,7 +310,7 @@ public final class DomainResourceHelper {
 
         // value (encodable)
         if (objectSpec.isEncodeable()) {
-            return new JsonValueEncoder().asAdapter(objectSpec, argRepr);
+            return JsonValueEncoder.asAdapter(objectSpec, argRepr);
         }
 
         final JsonRepresentation argValueRepr = 
argRepr.getRepresentation("value");

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO.java
 
b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO.java
index 6c21f23..3118e68 100644
--- 
a/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO.java
+++ 
b/component/viewer/restfulobjects/tck/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO.java
@@ -61,7 +61,6 @@ public class 
Get_givenEntityWithJodaProperties_thenRepresentation_ok_TODO {
         client = new RestfulClient(webServer.getBase());
     }
 
-    @Ignore("TODO")
     @Test
     public void thenMembers() throws Exception {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/4ff4f713/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
----------------------------------------------------------------------
diff --git 
a/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
 
b/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
index e86e457..8f5a23d 100644
--- 
a/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
+++ 
b/core/tck/tck-fixture/src/main/java/org/apache/isis/core/tck/fixture/scalars/JodaValuedEntityFixture.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.tck.fixture.scalars;
 
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+
 import org.apache.isis.applib.fixtures.AbstractFixture;
 import org.apache.isis.core.tck.dom.scalars.JodaValuedEntity;
 import org.apache.isis.core.tck.dom.scalars.JodaValuedEntityRepository;
@@ -35,7 +38,10 @@ public class JodaValuedEntityFixture extends AbstractFixture 
{
     }
 
     private JodaValuedEntity createEntity() {
-        return jodaValuesEntityRepository.newEntity();
+        final JodaValuedEntity jve = jodaValuesEntityRepository.newEntity();
+        jve.setLocalDateProperty(new LocalDate(2008,3,21));
+        jve.setLocalDateTimeProperty(new LocalDateTime(2009, 4, 29, 13, 45, 
22, 213));
+        return jve;
     }
 
     private JodaValuedEntityRepository jodaValuesEntityRepository;

Reply via email to