You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2011/09/06 00:54:10 UTC

svn commit: r1165442 [1/2] - in /incubator/isis/trunk/framework/viewer/json: json-applib/src/main/java/org/apache/isis/viewer/json/applib/ json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/ json-applib/src/main/java/org/apache/i...

Author: danhaywood
Date: Mon Sep  5 22:54:08 2011
New Revision: 1165442

URL: http://svn.apache.org/viewvc?rev=1165442&view=rev
Log:
ISIS-109: more on json viewer

Added:
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_arrayIterator.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/resources/org/apache/isis/viewer/json/applib/listOfStrings.json
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/CapabilitiesResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java
      - copied, changed from r1165265, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java
Modified:
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/JsonRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/LinksToSelf.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulClient.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulResponse.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/CapabilitiesRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ActionPromptRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/CollectionDetailsRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectResource.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServicesRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/PropertyDetailsRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ScalarValueRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/types/
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/user/UserRepresentation.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_getArray.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/DomainObjectResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/HomePageResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractMemberRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberSelfRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServiceListRepBuilder.java

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/JsonRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/JsonRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/JsonRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/JsonRepresentation.java Mon Sep  5 22:54:08 2011
@@ -8,7 +8,9 @@ import java.io.StringReader;
 import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import net.sf.json.JSON;
 import net.sf.json.JSONNull;
@@ -31,7 +33,11 @@ import org.jdom.input.SAXBuilder;
 import org.jdom.output.XMLOutputter;
 import org.jdom.xpath.XPath;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 
 /**
@@ -40,6 +46,41 @@ import com.google.common.collect.Lists;
  */
 public class JsonRepresentation {
 
+    public interface LinksToSelf {
+        public Link getSelf();
+    }
+
+    public interface HasLinks {
+        public JsonRepresentation getLinks();
+    }
+
+    public interface HasExtensions {
+        public JsonRepresentation getExtensions();
+    }
+
+    private static Map<Class<?>, Function<JsonNode, ?>> JSON_NODE_TRANSFORMERS = Maps.newHashMap();
+    static {
+        JSON_NODE_TRANSFORMERS.put(String.class, new Function<JsonNode, String>() {
+            @Override
+            public String apply(JsonNode input) {
+                if(!input.isTextual()) {
+                    throw new IllegalStateException("found node that is not a string " + input.toString());
+                }
+                return input.getTextValue();
+            }});
+        JSON_NODE_TRANSFORMERS.put(JsonNode.class, new Function<JsonNode, JsonNode>() {
+            @Override
+            public JsonNode apply(JsonNode input) {
+                return input;
+            }});
+        JSON_NODE_TRANSFORMERS.put(JsonRepresentation.class, new Function<JsonNode, JsonRepresentation>() {
+            @Override
+            public JsonRepresentation apply(JsonNode input) {
+                return new JsonRepresentation(input);
+            }});
+    }
+    
+
     public static JsonRepresentation newMap() {
         return new JsonRepresentation(new ObjectNode(JsonNodeFactory.instance));
     }
@@ -105,34 +146,6 @@ public class JsonRepresentation {
     }
 
 
-    /////////////////////////////////////////////////////////////////////////
-    // elementAt, setElementAt
-    /////////////////////////////////////////////////////////////////////////
-
-    public JsonRepresentation elementAt(int i) {
-        ensureIsAnArrayAtLeastAsLargeAs(i);
-        return new JsonRepresentation(jsonNode.get(i));
-    }
-
-    public void setElementAt(int i, JsonRepresentation objectRepr) {
-        ensureIsAnArrayAtLeastAsLargeAs(i);
-        if(objectRepr.isArray()) {
-            throw new IllegalArgumentException("Representation being set cannot be an array");
-        }
-        // can safely downcast because *this* representation is an array
-        ArrayNode arrayNode = (ArrayNode)jsonNode;
-        arrayNode.set(i, objectRepr.getJsonNode());
-    }
-
-    private void ensureIsAnArrayAtLeastAsLargeAs(int i) {
-        if (!jsonNode.isArray()) {
-            throw new IllegalStateException("Is not an array");
-        }
-        if(i >= arraySize()) {
-            throw new IndexOutOfBoundsException("array has " + arraySize() + " elements"); 
-        }
-    }
-
 
     /////////////////////////////////////////////////////////////////////////
     // getInt, getLong, getDouble, getString
@@ -282,11 +295,19 @@ public class JsonRepresentation {
         if (representsNull(node)) {
             return null;
         }
-        if (node.isValueNode()) {
-            throw new IllegalArgumentException("'" + path + "' (a value) is not an array");
-        }
         if (!node.isArray()) {
-            throw new IllegalArgumentException("'" + path + "' (a map) is not an array");
+            throw new IllegalArgumentException("'" + path + "' is not an array");
+        }
+        return new JsonRepresentation(node);
+    }
+
+    public JsonRepresentation getMap(String path) {
+        JsonNode node = getNode(path);
+        if (representsNull(node)) {
+            return null;
+        }
+        if (node.isArray() || node.isValueNode()) {
+            throw new IllegalArgumentException("'" + path + "' is not a map");
         }
         return new JsonRepresentation(node);
     }
@@ -510,6 +531,56 @@ public class JsonRepresentation {
         nodeAsArray().add(value);
     }
 
+    public <T> Iterable<T> arrayIterable(final Class<T> requiredType) {
+        return new Iterable<T>() {
+            @Override
+            public Iterator<T> iterator() {
+                return arrayIterator(requiredType);
+            }
+        };
+    }
+
+    public <T> Iterator<T> arrayIterator(final Class<T> requiredType) {
+        ensureIsAnArrayAtLeastAsLargeAs(0);
+        Function<JsonNode, ?> transformer = JSON_NODE_TRANSFORMERS.get(requiredType);
+        if(transformer == null) {
+            throw new IllegalArgumentException("Conversions from JsonNode to " + requiredType + " are not supported");
+        }
+        ArrayNode arrayNode = (ArrayNode)jsonNode;
+        Iterator<JsonNode> iterator = arrayNode.iterator();
+        Function<JsonNode, T> typedTransformer = asT(transformer); // necessary to do in two steps
+        return Iterators.transform(iterator, typedTransformer);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> Function<JsonNode, T> asT(Function<JsonNode, ?> transformer) {
+        return (Function<JsonNode, T>) transformer;
+    }
+
+    public JsonRepresentation elementAt(int i) {
+        ensureIsAnArrayAtLeastAsLargeAs(i);
+        return new JsonRepresentation(jsonNode.get(i));
+    }
+
+    public void setElementAt(int i, JsonRepresentation objectRepr) {
+        ensureIsAnArrayAtLeastAsLargeAs(i);
+        if(objectRepr.isArray()) {
+            throw new IllegalArgumentException("Representation being set cannot be an array");
+        }
+        // can safely downcast because *this* representation is an array
+        ArrayNode arrayNode = (ArrayNode)jsonNode;
+        arrayNode.set(i, objectRepr.getJsonNode());
+    }
+
+    private void ensureIsAnArrayAtLeastAsLargeAs(int i) {
+        if (!jsonNode.isArray()) {
+            throw new IllegalStateException("Is not an array");
+        }
+        if(i >= arraySize()) {
+            throw new IndexOutOfBoundsException("array has " + arraySize() + " elements"); 
+        }
+    }
+
     /////////////////////////////////////////////////////////////////////////
     // mutable (map)
     /////////////////////////////////////////////////////////////////////////
@@ -652,4 +723,5 @@ public class JsonRepresentation {
 
 
 
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulClient.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulClient.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulClient.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulClient.java Mon Sep  5 22:54:08 2011
@@ -24,10 +24,12 @@ import javax.ws.rs.core.Response;
 
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.isis.viewer.json.applib.blocks.Link;
+import org.apache.isis.viewer.json.applib.capabilities.CapabilitiesResource;
 import org.apache.isis.viewer.json.applib.domainobjects.DomainObjectResource;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
 import org.apache.isis.viewer.json.applib.domainobjects.DomainServicesResource;
+import org.apache.isis.viewer.json.applib.domaintypes.DomainTypeResource;
 import org.apache.isis.viewer.json.applib.homepage.HomePageResource;
-import org.apache.isis.viewer.json.applib.types.TypeResource;
 import org.apache.isis.viewer.json.applib.user.UserResource;
 import org.jboss.resteasy.client.ClientExecutor;
 import org.jboss.resteasy.client.ClientRequestFactory;
@@ -37,10 +39,12 @@ import org.jboss.resteasy.client.core.ex
 public class RestfulClient {
 
     private final HomePageResource homePageResource;
-    private final DomainServicesResource servicesResource;
-    private final DomainObjectResource domainObjectResource;
     private final UserResource userResource;
-    private final TypeResource specsResource;
+    private final CapabilitiesResource capabilitiesResource;
+    private final DomainServicesResource domainServicesResource;
+    private final DomainObjectResource domainObjectResource;
+    private final DomainServiceResource domainServiceResource;
+    private final DomainTypeResource domainTypeResource;
 
     private final ClientExecutor executor;
     private final ClientRequestFactory clientRequestFactory;
@@ -55,36 +59,51 @@ public class RestfulClient {
         
         this.homePageResource = clientRequestFactory.createProxy(HomePageResource.class);
         this.userResource = clientRequestFactory.createProxy(UserResource.class);
-        this.specsResource = clientRequestFactory.createProxy(TypeResource.class);
-        this.servicesResource = clientRequestFactory.createProxy(DomainServicesResource.class);
+        this.domainTypeResource = clientRequestFactory.createProxy(DomainTypeResource.class);
+        this.domainServicesResource = clientRequestFactory.createProxy(DomainServicesResource.class);
+        this.domainServiceResource = clientRequestFactory.createProxy(DomainServiceResource.class);
         this.domainObjectResource = clientRequestFactory.createProxy(DomainObjectResource.class);
+        this.capabilitiesResource = clientRequestFactory.createProxy(CapabilitiesResource.class);
     }
 
+    
+    /////////////////////////////////////////////////////////////////
+    // resources
+    /////////////////////////////////////////////////////////////////
 
     public HomePageResource getHomePageResource() {
         return homePageResource;
     }
 
     public DomainServicesResource getDomainServicesResource() {
-        return servicesResource;
+        return domainServicesResource;
     }
 
     public UserResource getUserResource() {
         return userResource;
     }
 
-    public TypeResource getSpecsResource() {
-        return specsResource;
+    public CapabilitiesResource getCapabilitiesResource() {
+        return capabilitiesResource;
+    }
+
+    public DomainTypeResource getDomainTypeResource() {
+        return domainTypeResource;
     }
 
     public DomainObjectResource getDomainObjectResource() {
         return domainObjectResource;
     }
     
-    public ClientExecutor getExecutor() {
-        return executor;
+    public DomainServiceResource getDomainServiceResource() {
+        return domainServiceResource;
     }
 
+    
+    /////////////////////////////////////////////////////////////////
+    // resource walking support
+    /////////////////////////////////////////////////////////////////
+
     public RepresentationWalker createWalker(Response response) {
         return new RepresentationWalker(this, response);
     }
@@ -102,4 +121,5 @@ public class RestfulClient {
         return response;
     }
 
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulResponse.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulResponse.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulResponse.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulResponse.java Mon Sep  5 22:54:08 2011
@@ -2,8 +2,10 @@ package org.apache.isis.viewer.json.appl
 
 import java.io.IOException;
 
+import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 
+import org.apache.isis.viewer.json.applib.RestfulResponse.Header;
 import org.apache.isis.viewer.json.applib.util.JsonMapper;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
@@ -14,6 +16,7 @@ public class RestfulResponse<T> {
         WARNING,
         LAST_MODIFIED,
         CONTENT_TYPE,
+        CACHE_CONTROL,
         X_REPRESENTATION_TYPE;
 
         public String getName() {
@@ -44,5 +47,25 @@ public class RestfulResponse<T> {
         return JsonMapper.instance().read(response, returnType);
     }
 
+    public <V> V getHeader(Header header, Class<V> returnType) {
+        MultivaluedMap<String, Object> metadata = response.getMetadata();
+        // in spite of the always returns a String
+        String value = (String) metadata.getFirst(Header.CACHE_CONTROL.getName());
+        return cast(value, returnType);
+    }
+
+    @SuppressWarnings("unchecked")
+    protected <V> V cast(String value, Class<V> returnType) {
+        if(value == null) {
+            return null;
+        }
+        if(returnType == String.class) {
+            return (V) value;
+        }
+        if(returnType == int.class) {
+            return (V) Integer.valueOf(value);
+        }
+        throw new IllegalArgumentException("requested type of " + returnType + " not supported");
+    }
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/CapabilitiesRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/CapabilitiesRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/CapabilitiesRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/capabilities/CapabilitiesRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,11 +1,13 @@
 package org.apache.isis.viewer.json.applib.capabilities;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
-public class CapabilitiesRepresentation extends JsonRepresentation implements LinksToSelf {
+public class CapabilitiesRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public CapabilitiesRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -15,4 +17,15 @@ public class CapabilitiesRepresentation 
         return getLink("self");
     }
 
+    public JsonRepresentation getCapabilities() {
+        return getMap("capabilities");
+    }
+
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ActionPromptRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ActionPromptRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ActionPromptRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ActionPromptRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class ActionPromptRepresentation extends JsonRepresentation implements LinksToSelf {
+public class ActionPromptRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public ActionPromptRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -16,4 +18,11 @@ public class ActionPromptRepresentation 
         return getLink("self");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/CollectionDetailsRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/CollectionDetailsRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/CollectionDetailsRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/CollectionDetailsRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class CollectionDetailsRepresentation extends JsonRepresentation implements LinksToSelf {
+public class CollectionDetailsRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public CollectionDetailsRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -17,4 +19,11 @@ public class CollectionDetailsRepresenta
     }
 
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class DomainObjectRepresentation extends JsonRepresentation implements LinksToSelf {
+public class DomainObjectRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public DomainObjectRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -16,10 +18,6 @@ public class DomainObjectRepresentation 
         return getLink("self");
     }
 
-    public Link getDomainType() {
-        return getLink("domainType");
-    }
-
     public String getOid() {
         return getString("oid");
     }
@@ -43,4 +41,12 @@ public class DomainObjectRepresentation 
     }
 
 
+    
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectResource.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectResource.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainObjectResource.java Mon Sep  5 22:54:08 2011
@@ -1,4 +1,4 @@
-/*
+/*s
  *  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
@@ -19,7 +19,6 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import java.io.InputStream;
-import java.util.List;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -38,12 +37,30 @@ import org.jboss.resteasy.annotations.Cl
 @Path("/objects")
 public interface DomainObjectResource {
 
+    ////////////////////////////////////////////////////////////
+    // domain object
+    ////////////////////////////////////////////////////////////
+
     @GET
     @Path("/{oid}")
     @Produces({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
     public Response object(@PathParam("oid") final String oidStr);
 
+    @PUT
+    @Path("/{oid}")
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response object(
+        @PathParam("oid") final String oidStr, 
+        final InputStream arguments);
+
+
+    ////////////////////////////////////////////////////////////
+    // domain object property
+    ////////////////////////////////////////////////////////////
+
     @GET
     @Path("/{oid}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON })
@@ -52,40 +69,37 @@ public interface DomainObjectResource {
         @PathParam("oid") final String oidStr,
         @PathParam("propertyId") final String propertyId);
 
-    @GET
-    @Path("/{oid}/collections/{collectionId}")
+    @PUT
+    @Path("/{oid}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
-    public Response accessCollection(
+    public Response modifyProperty(
         @PathParam("oid") final String oidStr,
-        @PathParam("collectionId") final String collectionId);
+        @PathParam("propertyId") final String propertyId, 
+        final InputStream arguments);
 
-    @GET
-    @Path("/{oid}/actions/{actionId}")
+    @DELETE
+    @Path("/{oid}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
-    public Response actionPrompt(
+    public Response clearProperty(
         @PathParam("oid") final String oidStr, 
-        @PathParam("actionId") final String actionId);
+        @PathParam("propertyId") final String propertyId);
 
-    @GET
-    @Path("/{oid}/actions/{actionId}/invoke")
-    @Produces({ MediaType.APPLICATION_JSON })
-    @ClientResponseType(entityType=String.class)
-    public Response invokeActionIdempotent(
-        @PathParam("oid") final String oidStr, 
-        @PathParam("actionId") final String actionId,
-        @QueryParam("arg") final List<String> arguments);
 
-    @PUT
-    @Path("/{oid}/properties{propertyId}")
+    
+    ////////////////////////////////////////////////////////////
+    // domain object collection
+    ////////////////////////////////////////////////////////////
+
+    @GET
+    @Path("/{oid}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON })
-    @Consumes({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
-    public Response modifyProperty(
+    public Response accessCollection(
         @PathParam("oid") final String oidStr,
-        @PathParam("propertyId") final String propertyId, 
-        final InputStream body);
+        @PathParam("collectionId") final String collectionId);
 
     @PUT
     @Path("/{oid}/collections/{collectionId}")
@@ -94,16 +108,18 @@ public interface DomainObjectResource {
     public Response addToSet(
         @PathParam("oid") final String oidStr,
         @PathParam("collectionId") final String collectionId,
-        final InputStream body);
+        final InputStream arguments);
 
-    @DELETE
-    @Path("/{oid}/properties/{propertyId}")
+    @POST
+    @Path("/{oid}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
-    public Response clearProperty(
-        @PathParam("oid") final String oidStr, 
-        @PathParam("propertyId") final String propertyId);
-
+    public Response addToList(
+        @PathParam("oid") final String oidStr,
+        @PathParam("collectionId") final String collectionId,
+        final InputStream arguments);
+ 
     @DELETE
     @Path("/{oid}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON })
@@ -112,18 +128,44 @@ public interface DomainObjectResource {
     public Response removeFromCollection(
         @PathParam("oid") final String oidStr,
         @PathParam("collectionId") final String collectionId,
-        final InputStream body);
+        final InputStream arguments);
 
-    @POST
-    @Path("/{oid}/collections/{collectionId}")
+    
+    ////////////////////////////////////////////////////////////
+    // domain object action
+    ////////////////////////////////////////////////////////////
+
+    @GET
+    @Path("/{oid}/actions/{actionId}")
     @Produces({ MediaType.APPLICATION_JSON })
-    @Consumes({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
-    public Response addToList(
-        @PathParam("oid") final String oidStr,
-        @PathParam("collectionId") final String collectionId,
-        final InputStream body);
+    public Response actionPrompt(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId);
+    
+    ////////////////////////////////////////////////////////////
+    // domain object action invoke
+    ////////////////////////////////////////////////////////////
+
+    @GET
+    @Path("/{oid}/actions/{actionId}/invoke")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response invokeActionQueryOnly(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId,
+        @QueryParam("args") final String arguments);
 
+    @PUT
+    @Path("/{oid}/actions/{actionId}/invoke")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response invokeActionIdempotent(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId,
+        final InputStream arguments);
+    
     @POST
     @Path("/{oid}/actions/{actionId}/invoke")
     @Produces({ MediaType.APPLICATION_JSON })
@@ -132,5 +174,6 @@ public interface DomainObjectResource {
     public Response invokeAction(
         @PathParam("oid") final String oidStr, 
         @PathParam("actionId") final String actionId,
-        final InputStream body);
+        final InputStream arguments);
+    
 }
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java?rev=1165442&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java Mon Sep  5 22:54:08 2011
@@ -0,0 +1,95 @@
+/*
+ *  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.isis.viewer.json.applib.domainobjects;
+
+import java.io.InputStream;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.jboss.resteasy.annotations.ClientResponseType;
+
+@Path("/services")
+public interface DomainServiceResource {
+
+    ////////////////////////////////////////////////////////////
+    // domain service
+    ////////////////////////////////////////////////////////////
+
+    @GET
+    @Path("/{serviceId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response service(@PathParam("serviceid") final String serviceId);
+    
+    
+    ////////////////////////////////////////////////////////////
+    // domain service action
+    ////////////////////////////////////////////////////////////
+    
+    @GET
+    @Path("/{serviceId}/actions/{actionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response serviceActionPrompt(
+        @PathParam("serviceId") final String serviceId, 
+        @PathParam("actionId") final String actionId);
+
+    
+    ////////////////////////////////////////////////////////////
+    // domain service action invoke
+    ////////////////////////////////////////////////////////////
+
+    @GET
+    @Path("/{oid}/actions/{actionId}/invoke")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response serviceInvokeActionQueryOnly(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId,
+        @QueryParam("args") final String arguments);
+
+    @PUT
+    @Path("/{oid}/actions/{actionId}/invoke")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response serviceInvokeActionIdempotent(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId,
+        final InputStream arguments);
+
+    @POST
+    @Path("/{oid}/actions/{actionId}/invoke")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public Response serviceInvokeAction(
+        @PathParam("oid") final String oidStr, 
+        @PathParam("actionId") final String actionId,
+        final InputStream arguments);
+}
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServicesRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServicesRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServicesRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServicesRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class DomainServicesRepresentation extends JsonRepresentation implements LinksToSelf {
+public class DomainServicesRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public DomainServicesRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -16,4 +18,11 @@ public class DomainServicesRepresentatio
         return getLink("self");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/PropertyDetailsRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/PropertyDetailsRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/PropertyDetailsRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/PropertyDetailsRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class PropertyDetailsRepresentation extends JsonRepresentation implements LinksToSelf {
+public class PropertyDetailsRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public PropertyDetailsRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -16,5 +18,12 @@ public class PropertyDetailsRepresentati
         return getLink("self");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ScalarValueRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ScalarValueRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ScalarValueRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/ScalarValueRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.domainobjects;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class ScalarValueRepresentation extends JsonRepresentation implements LinksToSelf {
+public class ScalarValueRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public ScalarValueRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -16,4 +18,11 @@ public class ScalarValueRepresentation e
         return getLink("self");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,22 +1,27 @@
 package org.apache.isis.viewer.json.applib.domaintypes;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
-public class DomainTypeRepresentation extends JsonRepresentation implements LinksToSelf {
+public class DomainTypeRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public DomainTypeRepresentation(JsonNode jsonNode) {
         super(jsonNode);
     }
 
-    public Link getRepresentationType() {
-        return getLink("representationType");
-    }
-
     public Link getSelf() {
         return getLink("self");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java?rev=1165442&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java Mon Sep  5 22:54:08 2011
@@ -0,0 +1,73 @@
+/*
+ *  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.isis.viewer.json.applib.domaintypes;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.jboss.resteasy.annotations.ClientResponseType;
+
+@Path("/domainTypes")
+public interface DomainTypeResource {
+
+    @GET
+    @Path("/")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response domainTypes();
+
+    @GET
+    @Path("/{domainType}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response domainType(@PathParam("domainType") final String domainType);
+
+    @GET
+    @Path("/{domainType}/properties/{propertyId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response typeProperty(@PathParam("domainType") final String domainType,
+        @PathParam("propertyId") final String propertyId);
+
+    @GET
+    @Path("/{domainType}/collections/{collectionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response typeCollection(@PathParam("domainType") final String domainType,
+        @PathParam("collectionId") final String collectionId);
+
+    @GET
+    @Path("/{domainType}/actions/{actionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response typeAction(@PathParam("domainType") final String domainType,
+        @PathParam("actionId") final String actionId);
+
+    @GET
+    @Path("/{domainType}/actions/{actionId}/params/{paramNum}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    @ClientResponseType(entityType=String.class)
+    public abstract Response typeActionParam(@PathParam("domainType") final String domainType,
+        @PathParam("actionId") final String actionId, @PathParam("paramNum") final int paramNum);
+
+}
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,11 +1,13 @@
 package org.apache.isis.viewer.json.applib.homepage;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
-public class HomePageRepresentation extends JsonRepresentation implements LinksToSelf {
+public class HomePageRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public HomePageRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -27,8 +29,8 @@ public class HomePageRepresentation exte
     public JsonRepresentation getLinks() {
         return getArray("links");
     }
-    public JsonRepresentation getMetadata() {
-        return getArray("metadata");
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
     }
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/user/UserRepresentation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/user/UserRepresentation.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/user/UserRepresentation.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/user/UserRepresentation.java Mon Sep  5 22:54:08 2011
@@ -1,12 +1,14 @@
 package org.apache.isis.viewer.json.applib.user;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasExtensions;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.HasLinks;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.codehaus.jackson.JsonNode;
 
 
-public class UserRepresentation extends JsonRepresentation implements LinksToSelf {
+public class UserRepresentation extends JsonRepresentation implements LinksToSelf, HasLinks, HasExtensions {
 
     public UserRepresentation(JsonNode jsonNode) {
         super(jsonNode);
@@ -32,4 +34,11 @@ public class UserRepresentation extends 
         return getRepresentation("roles");
     }
 
+    public JsonRepresentation getLinks() {
+        return getArray("links");
+    }
+    public JsonRepresentation getExtensions() {
+        return getMap("extensions");
+    }
+
 }

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_arrayIterator.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_arrayIterator.java?rev=1165442&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_arrayIterator.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_arrayIterator.java Mon Sep  5 22:54:08 2011
@@ -0,0 +1,64 @@
+/*
+ *  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.isis.viewer.json.applib;
+
+import static org.apache.isis.viewer.json.applib.JsonUtils.readJson;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.junit.Before;
+import org.junit.Test;
+
+public class JsonRepresentationTest_arrayIterator {
+
+    private JsonRepresentation jsonRepresentation;
+    
+    @Test
+    public void forJsonRepresentation() throws JsonParseException, JsonMappingException, IOException {
+        jsonRepresentation = new JsonRepresentation(readJson("list.json"));
+        Iterator<JsonRepresentation> arrayIterator = jsonRepresentation.arrayIterator(JsonRepresentation.class);
+        assertThat(arrayIterator.hasNext(), is(true));
+        assertThat(arrayIterator.next().getString("a"), is("a1"));
+        assertThat(arrayIterator.hasNext(), is(true));
+        assertThat(arrayIterator.next().getString("b"), is("b1"));
+        assertThat(arrayIterator.hasNext(), is(false));
+    }
+
+    @Test
+    public void forString() throws JsonParseException, JsonMappingException, IOException {
+        jsonRepresentation = new JsonRepresentation(readJson("listOfStrings.json"));
+        Iterator<String> arrayIterator = jsonRepresentation.arrayIterator(String.class);
+        assertThat(arrayIterator.hasNext(), is(true));
+        assertThat(arrayIterator.next(), is("a"));
+        assertThat(arrayIterator.hasNext(), is(true));
+        assertThat(arrayIterator.next(), is("b"));
+        assertThat(arrayIterator.hasNext(), is(true));
+        assertThat(arrayIterator.next(), is("c"));
+        assertThat(arrayIterator.hasNext(), is(false));
+    }
+
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_getArray.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_getArray.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_getArray.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_getArray.java Mon Sep  5 22:54:08 2011
@@ -66,7 +66,7 @@ public class JsonRepresentationTest_getA
             jsonRepresentation.getArray("aString");
             fail();
         } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), is("'aString' (a value) is not an array"));
+            assertThat(e.getMessage(), is("'aString' is not an array"));
         }
     }
 
@@ -76,7 +76,7 @@ public class JsonRepresentationTest_getA
             jsonRepresentation.getArray("aSubMap");
             fail();
         } catch (IllegalArgumentException e) {
-            assertThat(e.getMessage(), is("'aSubMap' (a map) is not an array"));
+            assertThat(e.getMessage(), is("'aSubMap' is not an array"));
         }
     }
     

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/resources/org/apache/isis/viewer/json/applib/listOfStrings.json
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/test/resources/org/apache/isis/viewer/json/applib/listOfStrings.json?rev=1165442&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/resources/org/apache/isis/viewer/json/applib/listOfStrings.json (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/resources/org/apache/isis/viewer/json/applib/listOfStrings.json Mon Sep  5 22:54:08 2011
@@ -0,0 +1,3 @@
+[
+    "a", "b", "c"
+]
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/CapabilitiesResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/CapabilitiesResourceTest.java?rev=1165442&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/CapabilitiesResourceTest.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/CapabilitiesResourceTest.java Mon Sep  5 22:54:08 2011
@@ -0,0 +1,113 @@
+package org.apache.isis.viewer.json.tck;
+
+import static org.apache.isis.core.commons.matchers.IsisMatchers.greaterThan;
+import static org.apache.isis.core.commons.matchers.IsisMatchers.matches;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isArray;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isFollowableLinkToSelf;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isLink;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isMap;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.entry;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.Matchers.hasItem;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status.Family;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.blocks.Link;
+import org.apache.isis.viewer.json.applib.blocks.Method;
+import org.apache.isis.viewer.json.applib.capabilities.CapabilitiesRepresentation;
+import org.apache.isis.viewer.json.applib.capabilities.CapabilitiesResource;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainObjectRepresentation;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServicesRepresentation;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServicesResource;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.hamcrest.Matcher;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+
+
+public class CapabilitiesResourceTest {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+    
+    private RestfulClient client;
+    private CapabilitiesResource resource;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+        
+        resource = client.getCapabilitiesResource();
+    }
+
+
+    @Test
+    public void representation() throws Exception {
+        
+        // when
+        Response servicesResp = resource.capabilities();
+        RestfulResponse<CapabilitiesRepresentation> jsonResp = RestfulResponse.of(servicesResp, CapabilitiesRepresentation.class);
+        assertThat(jsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
+        
+        // then
+        CapabilitiesRepresentation repr = jsonResp.getEntity();
+        assertThat(repr, isMap());
+
+        assertThat(repr.getSelf(), isLink().method(Method.GET));
+
+        JsonRepresentation capabilities = repr.getCapabilities();
+        assertThat(capabilities, isMap());
+        
+        assertThat(capabilities.getString("concurrencyChecking"), is("no"));
+        assertThat(capabilities.getString("transientObjects"), is("no"));
+        assertThat(capabilities.getString("deleteObjects"), is("no"));
+        assertThat(capabilities.getString("simpleArguments"), is("no"));
+        assertThat(capabilities.getString("partialArguments"), is("no"));
+        assertThat(capabilities.getString("followLinks"), is("no"));
+        assertThat(capabilities.getString("validateOnly"), is("no"));
+        assertThat(capabilities.getString("pagination"), is("no"));
+        assertThat(capabilities.getString("sorting"), is("no"));
+        assertThat(capabilities.getString("domainModel"), is("rich"));
+        
+        assertThat(repr.getLinks(), is(not(nullValue())));
+        assertThat(repr.getExtensions(), is(not(nullValue())));
+    }
+
+
+    @Test
+    public void linksToSelf() throws Exception {
+        // given
+        CapabilitiesRepresentation repr = givenRepresentation();
+
+        // when, then
+        assertThat(repr, isFollowableLinkToSelf(client));
+    }
+
+
+    private CapabilitiesRepresentation givenRepresentation() throws JsonParseException, JsonMappingException, IOException {
+        return RepresentationMatchers.entityOf(resource.capabilities(), CapabilitiesRepresentation.class);
+    }
+
+
+}
+    
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/DomainObjectResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/DomainObjectResourceTest.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/DomainObjectResourceTest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/DomainObjectResourceTest.java Mon Sep  5 22:54:08 2011
@@ -63,8 +63,8 @@ public class DomainObjectResourceTest {
         Link self = domainObjectRepr.getSelf();
         assertThat(self, 
                 isLink().rel("object").href(matches(".+objects/OID:1")).method(Method.GET));
-        assertThat(domainObjectRepr.getDomainType(), 
-                isLink().rel("type").href(matches(".+" + ApplibValuedEntityRepositoryDefault.class.getName() + ".+")).method(Method.GET));
+//        assertThat(domainObjectRepr.getDomainType(), 
+//                isLink().rel("type").href(matches(".+" + ApplibValuedEntityRepositoryDefault.class.getName() + ".+")).method(Method.GET));
         
         assertThat(domainObjectRepr.getTitle(), is("ApplibValues"));
         assertThat(domainObjectRepr.getOid(), is("OID:1"));

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/HomePageResourceTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/HomePageResourceTest.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/HomePageResourceTest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/HomePageResourceTest.java Mon Sep  5 22:54:08 2011
@@ -24,6 +24,7 @@ import org.apache.isis.viewer.json.appli
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -44,59 +45,59 @@ public class HomePageResourceTest {
         resource = client.getHomePageResource();
     }
 
-    @org.junit.Ignore("to get working")
+    @Ignore("cache-control")
     @Test
     public void returnsHomePageRepresentation() throws Exception {
 
         // given
-        Response resourcesResp = resource.resources();
+        Response resp = resource.resources();
         
         // when
-        RestfulResponse<HomePageRepresentation> homePageJsonResp = RestfulResponse.of(resourcesResp, HomePageRepresentation.class);
-        assertThat(homePageJsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
+        RestfulResponse<HomePageRepresentation> jsonResp = RestfulResponse.of(resp, HomePageRepresentation.class);
+        assertThat(jsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
         
         // then
-        assertThat(homePageJsonResp.getStatus(), is(HttpStatusCode.OK));
+        assertThat(jsonResp.getStatus(), is(HttpStatusCode.OK));
+        assertThat(jsonResp.getHeader(RestfulResponse.Header.CACHE_CONTROL, int.class), is(86400));
+        assertThat(jsonResp.getHeader(RestfulResponse.Header.X_REPRESENTATION_TYPE, String.class), is("homePage"));
+        
+        HomePageRepresentation repr = jsonResp.getEntity();
+        assertThat(repr, is(not(nullValue())));
+        assertThat(repr.isMap(), is(true));
+        
+        assertThat(repr.getSelf(), isLink(client).method(Method.GET));
+        assertThat(repr.getUser(), isLink(client).method(Method.GET));
+        assertThat(repr.getServices(), isLink(client).method(Method.GET));
+        assertThat(repr.getCapabilities(), isLink(client).method(Method.GET));
         
-        HomePageRepresentation homePageRepr = homePageJsonResp.getEntity();
-        assertThat(homePageRepr, is(not(nullValue())));
-        assertThat(homePageRepr.isMap(), is(true));
-        
-        assertThat(homePageRepr.getSelf(), isLink(client).method(Method.GET));
-        assertThat(homePageRepr.getUser(), isLink(client).method(Method.GET));
-        assertThat(homePageRepr.getServices(), isLink(client).method(Method.GET));
-        assertThat(homePageRepr.getCapabilities(), isLink(client).method(Method.GET));
-        
-        assertThat(homePageRepr.getLinks(), is(not(nullValue())));
-        assertThat(homePageRepr.getMetadata(), is(not(nullValue())));
+        assertThat(repr.getLinks(), is(not(nullValue())));
+        assertThat(repr.getExtensions(), is(not(nullValue())));
     }
 
     @Test
     public void linksToSelf() throws Exception {
         // given
-        HomePageRepresentation homePageRepr = givenRepresentation();
+        HomePageRepresentation repr = givenRepresentation();
 
         // when, then
-        assertThat(homePageRepr, isFollowableLinkToSelf(client));
+        assertThat(repr, isFollowableLinkToSelf(client));
     }
     
-    @org.junit.Ignore("to get working")
     @Test
     public void links() throws Exception {
         
-        HomePageRepresentation homePageRepr = givenRepresentation();
+        HomePageRepresentation repr = givenRepresentation();
 
         // when, then
-        assertThat(homePageRepr.getServices(), isLink(client).returning(HttpStatusCode.OK));
-        assertThat(homePageRepr.getUser(), isLink(client).returning(HttpStatusCode.OK));
-        assertThat(homePageRepr.getCapabilities(), isLink(client).returning(HttpStatusCode.OK));
+        assertThat(repr.getServices(), isLink(client).returning(HttpStatusCode.OK));
+        assertThat(repr.getUser(), isLink(client).returning(HttpStatusCode.OK));
+        assertThat(repr.getCapabilities(), isLink(client).returning(HttpStatusCode.OK));
     }
 
     private HomePageRepresentation givenRepresentation() throws JsonParseException, JsonMappingException, IOException {
         return entityOf(resource.resources(), HomePageRepresentation.class);
     }
 
-    //
 }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java Mon Sep  5 22:54:08 2011
@@ -6,7 +6,7 @@ import javax.ws.rs.core.Response;
 
 import org.apache.isis.viewer.json.applib.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.applib.LinksToSelf;
+import org.apache.isis.viewer.json.applib.JsonRepresentation.LinksToSelf;
 import org.apache.isis.viewer.json.applib.RestfulClient;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
 import org.apache.isis.viewer.json.applib.blocks.Link;
@@ -122,6 +122,10 @@ public class RepresentationMatchers {
     public static abstract class AbstractMatcherBuilder<T> {
         protected RestfulClient client;
 
+        public AbstractMatcherBuilder() {
+            this(null);
+        }
+
         public AbstractMatcherBuilder(RestfulClient client) {
             this.client = client;
         }
@@ -244,5 +248,53 @@ public class RepresentationMatchers {
         }
     }
 
+    public static EntryMatcherBuilder entry(String key) {
+        return new EntryMatcherBuilder(key); 
+    }
+
+    public static class EntryMatcherBuilder extends AbstractMatcherBuilder<JsonRepresentation>  {
+
+        private final String key;
+        private String value;
+        private EntryMatcherBuilder(String key) {
+            this.key = key;
+        }
+
+        public EntryMatcherBuilder value(String value) {
+            this.value = value;
+            return this;
+        }
+
+        @Override
+        public Matcher<JsonRepresentation> build() {
+            return new TypeSafeMatcher<JsonRepresentation>() {
+
+                @Override
+                public void describeTo(Description description) {
+                    description.appendText("map with entry with key: " + key);
+                    if(value != null) {
+                        description.appendText(", and value: " + value);
+                    }
+                }
+
+                @Override
+                public boolean matchesSafely(JsonRepresentation item) {
+                    if(!item.isMap()) {
+                        return false;
+                    }
+                    String val = item.getString(key);
+                    if(val == null) {
+                        return false;
+                    }
+                    if(value != null && !value.equals(val)) {
+                        return false;
+                    }
+                    return true;
+                }
+            };
+        }
+
+    }
+
 }
     
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/JsonApplication.java Mon Sep  5 22:54:08 2011
@@ -18,7 +18,9 @@
  */
 package org.apache.isis.viewer.json.viewer;
 
+import org.apache.isis.viewer.json.viewer.resources.capabilities.CapabilitiesResourceServerside;
 import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainObjectResourceServerside;
+import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainServiceResourceServerside;
 import org.apache.isis.viewer.json.viewer.resources.domaintypes.DomainTypeResourceServerside;
 import org.apache.isis.viewer.json.viewer.resources.home.HomePageResourceServerside;
 import org.apache.isis.viewer.json.viewer.resources.services.DomainServicesResourceServerside;
@@ -32,6 +34,8 @@ public class JsonApplication extends Abs
         addSingleton(new DomainServicesResourceServerside());
         addSingleton(new UserResourceServerside());
         addSingleton(new DomainObjectResourceServerside());
+        addSingleton(new DomainServiceResourceServerside());
+        addSingleton(new CapabilitiesResourceServerside());
     }
 
 }

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java (from r1165265, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java&r1=1165265&r2=1165442&rev=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java Mon Sep  5 22:54:08 2011
@@ -19,10 +19,10 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
 
-public class LinkRepBuilder extends RepresentationBuilder<LinkRepBuilder> {
+public class LinkBuilder extends RepresentationBuilder<LinkBuilder> {
 
-    public static LinkRepBuilder newBuilder(ResourceContext resourceContext, String rel, String hrefFormat, Object... args) {
-        return new LinkRepBuilder(resourceContext, rel, String.format(hrefFormat, args));
+    public static LinkBuilder newBuilder(ResourceContext resourceContext, String rel, String hrefFormat, Object... args) {
+        return new LinkBuilder(resourceContext, rel, String.format(hrefFormat, args));
     }
 
 	private final String rel;
@@ -32,20 +32,20 @@ public class LinkRepBuilder extends Repr
     private String title;
     private JsonRepresentation arguments;
     
-    private LinkRepBuilder(ResourceContext resourceContext, String rel, String href) {
+    private LinkBuilder(ResourceContext resourceContext, String rel, String href) {
         super(resourceContext);
         this.rel = rel;
         this.href = href;
     }
-    public LinkRepBuilder withHttpMethod(HttpMethod method) {
+    public LinkBuilder withHttpMethod(HttpMethod method) {
         this.method = method;
         return this;
     }
-    public LinkRepBuilder withTitle(String title) {
+    public LinkBuilder withTitle(String title) {
         this.title = title;
         return this;
     }
-    public LinkRepBuilder withArguments(JsonRepresentation arguments) {
+    public LinkBuilder withArguments(JsonRepresentation arguments) {
         this.arguments = arguments;
         return this;
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java Mon Sep  5 22:54:08 2011
@@ -35,7 +35,7 @@ public abstract class RepresentationBuil
     }
 
     public T withSelf(String href) {
-        representation.put("self", LinkRepBuilder.newBuilder(resourceContext, "self", href).build());
+        representation.put("self", LinkBuilder.newBuilder(resourceContext, "self", href).build());
         return asT(this);
     }
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesResourceServerside.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesResourceServerside.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesResourceServerside.java Mon Sep  5 22:54:08 2011
@@ -26,7 +26,7 @@ import javax.ws.rs.core.Response;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.capabilities.CapabilitiesResource;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
 
 /**
@@ -43,7 +43,24 @@ public class CapabilitiesResourceServers
         init();
 
         JsonRepresentation representation = JsonRepresentation.newMap();
-        representation.put("self", LinkRepBuilder.newBuilder(getResourceContext(), "self", "capabilities/").build());
+        representation.put("self", LinkBuilder.newBuilder(getResourceContext(), "self", "capabilities/").build());
+        
+        JsonRepresentation capabilities = JsonRepresentation.newMap();
+        representation.put("capabilities", capabilities);
+
+        capabilities.put("concurrencyChecking", "no");
+        capabilities.put("transientObjects", "no");
+        capabilities.put("deleteObjects", "no");
+        capabilities.put("simpleArguments", "no");
+        capabilities.put("partialArguments", "no");
+        capabilities.put("followLinks", "no");
+        capabilities.put("validateOnly", "no");
+        capabilities.put("pagination", "no");
+        capabilities.put("sorting", "no");
+        capabilities.put("domainModel", "rich");
+
+        representation.put("links", JsonRepresentation.newArray());
+        representation.put("extensions", JsonRepresentation.newMap());
         
         return responseOfOk(asJson(representation));
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractMemberRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractMemberRepBuilder.java?rev=1165442&r1=1165441&r2=1165442&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractMemberRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractMemberRepBuilder.java Mon Sep  5 22:54:08 2011
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 
 public abstract class AbstractMemberRepBuilder<R extends RepresentationBuilder<R>, T extends ObjectMember> extends RepresentationBuilder<R> {
@@ -49,7 +49,7 @@ public abstract class AbstractMemberRepB
         
         JsonRepresentation selfRep = JsonRepresentation.newMap();
         String url = AbstractMemberRepBuilder.urlForMember(objectAdapter, memberType, objectMember, getOidStringifier());
-        JsonRepresentation memberLinkRep = LinkRepBuilder.newBuilder(resourceContext, "member", url).build();
+        JsonRepresentation memberLinkRep = LinkBuilder.newBuilder(resourceContext, "member", url).build();
         selfRep.put("link", memberLinkRep);
         
         JsonRepresentation linkTo = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, objectAdapter, getOidStringifier()).build();
@@ -78,7 +78,7 @@ public abstract class AbstractMemberRepB
                 String urlForMember = urlForMember(mutatorSpec.suffix);
                 JsonRepresentation arguments = mutatorArgs(mutatorSpec);
                 JsonRepresentation detailsLink = 
-                    LinkRepBuilder.newBuilder(resourceContext, mutator, urlForMember)
+                    LinkBuilder.newBuilder(resourceContext, mutator, urlForMember)
                         .withHttpMethod(mutatorSpec.httpMethod)
                         .withArguments(arguments)
                         .build();
@@ -128,7 +128,7 @@ public abstract class AbstractMemberRepB
             return;
         } 
         String urlForMember = urlForMember();
-        JsonRepresentation detailsLink = LinkRepBuilder.newBuilder(resourceContext, memberType.name().toLowerCase(), urlForMember).build();
+        JsonRepresentation detailsLink = LinkBuilder.newBuilder(resourceContext, memberType.name().toLowerCase(), urlForMember).build();
         representation.put("details", detailsLink);
     }