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/10/13 23:57:17 UTC

svn commit: r1183125 [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/homepage/ json-applib/src/test/java/org/apache/isis/...

Author: danhaywood
Date: Thu Oct 13 21:57:15 2011
New Revision: 1183125

URL: http://svn.apache.org/viewvc?rev=1183125&view=rev
Log:
ISIS-109: x-ro-follow-links now has support for criteria syntax

Added:
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_accept.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_representationAndHeaders.java
      - copied, changed from r1182130, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_accept.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_notFound.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_representationAndHeaders.java
      - copied, changed from r1182130, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_service_serviceId.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ListUtil.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/Node.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java
      - copied, changed from r1182130, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java
      - copied, changed from r1182130, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkTo.java
      - copied, changed from r1182130, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/LinkFollowerTest_follow.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/ListUtilTest_asGraph.java
      - copied, changed from r1182226, incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/PathFollowerTest_asGraph.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/NodeTest_equalsHashcode.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/NodeTest_parse.java
Removed:
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_service_serviceId.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkToBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/PathFollowerTest_asGraph.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/RestfulClient.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageResource.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_xpath.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_representationAndHeaders.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/stories/UserStoryTest.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.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=1183125&r1=1183124&r2=1183125&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 Thu Oct 13 21:57:15 2011
@@ -96,8 +96,21 @@ public class JsonRepresentation {
     }
     
 
-    public static JsonRepresentation newMap() {
-        return new JsonRepresentation(new ObjectNode(JsonNodeFactory.instance));
+    public static JsonRepresentation newMap(String... keyValuePairs) {
+        final JsonRepresentation repr = new JsonRepresentation(new ObjectNode(JsonNodeFactory.instance));
+        String key = null;
+        for(String keyOrValue: keyValuePairs) {
+            if(key != null) {
+                repr.mapPut(key, keyOrValue);
+                key = null;
+            } else {
+                key = keyOrValue;
+            }
+        }
+        if(key != null) {
+            throw new IllegalArgumentException("must provide an even number of keys and values");
+        }
+        return repr;
     }
 
     public static JsonRepresentation newArray() {
@@ -616,11 +629,12 @@ public class JsonRepresentation {
     /////////////////////////////////////////////////////////////////////////
     // xpath support
     /////////////////////////////////////////////////////////////////////////
-    
+
     /**
      * Requires xom:xom:1.1 (LGPL) to be added as a dependency.
      */
-    public JsonRepresentation xpath(String xpathExpression) {
+    public JsonRepresentation xpath(String xpathExpressionFormat, Object... args) {
+        String xpathExpression = String.format(xpathExpressionFormat,  args);
         try {
             // puts object structure under a <o>
             org.jdom.Document jdomDoc = new SAXBuilder().build(new StringReader(toXml()));

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=1183125&r1=1183124&r2=1183125&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 Thu Oct 13 21:57:15 2011
@@ -119,12 +119,21 @@ public class RestfulClient {
 
     public RestfulRequest createRequest(HttpMethod httpMethod, String uriTemplate) {
         
-        ClientRequest clientRequest = clientRequestFactory.createRelativeRequest(uriTemplate);
+        ClientRequest clientRequest = createRequest(uriTemplate);
         clientRequest.accept(MediaType.APPLICATION_JSON_TYPE);
         clientRequest.setHttpMethod(httpMethod.getJavaxRsMethod());
         
         return new RestfulRequest(clientRequest, httpMethod);
     }
+
+    private ClientRequest createRequest(String uriTemplate) {
+        boolean includesScheme = uriTemplate.startsWith("http:") || uriTemplate.startsWith("https:");
+        if(includesScheme) {
+            return clientRequestFactory.createRequest(uriTemplate);
+        } else {
+            return clientRequestFactory.createRelativeRequest(uriTemplate);
+        }
+    }
     
     /**
      * exposed for testing purposes only.

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java Thu Oct 13 21:57:15 2011
@@ -153,8 +153,9 @@ public final class RestfulRequest {
         return this;
     }
 
-    public <Q> RestfulRequest withArg(RestfulRequest.QueryParameter<Q> queryParam, String argStr) {
-        final Q arg = queryParam.getParser().valueOf(argStr);
+    public <Q> RestfulRequest withArg(RestfulRequest.QueryParameter<Q> queryParam, String argStrFormat, Object... args) {
+        String argStr = String.format(argStrFormat, args);
+        final Q arg = queryParam.getParser().valueOf(argStr );
         return withArg(queryParam, arg);
     }
 

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageResource.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/HomePageResource.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageResource.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/homepage/HomePageResource.java Thu Oct 13 21:57:15 2011
@@ -33,6 +33,6 @@ public interface HomePageResource {
     @GET
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_HOME_PAGE })
     @ClientResponseType(entityType=String.class)
-    public Response resources();
+    public Response homePage();
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_xpath.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_xpath.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_xpath.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/JsonRepresentationTest_xpath.java Thu Oct 13 21:57:15 2011
@@ -48,7 +48,7 @@ public class JsonRepresentationTest_xpat
     }
     
     @Test
-    public void mapXpath_matchingSingleElement() throws JsonParseException, JsonMappingException, IOException, ValidityException, ParsingException {
+    public void xpath_matchingSingleElement() throws JsonParseException, JsonMappingException, IOException, ValidityException, ParsingException {
         JsonRepresentation matching = mapRepresentation.xpath("//*[rel='someRel']");
         assertThat(matching, is(not(nullValue())));
         assertThat(matching.isArray(), is(false));
@@ -56,7 +56,7 @@ public class JsonRepresentationTest_xpat
     }
 
     @Test
-    public void mapXpath_matchingMultipleElementsInMap() throws JsonParseException, JsonMappingException, IOException, ValidityException, ParsingException {
+    public void xpath_matchingMultipleElementsInMap() throws JsonParseException, JsonMappingException, IOException, ValidityException, ParsingException {
         JsonRepresentation matching = mapRepresentation.xpath("/*");
         assertThat(matching, is(not(nullValue())));
         assertThat(matching.isArray(), is(false));

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_accept.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_accept.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_accept.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_accept.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,64 @@
+package org.apache.isis.viewer.json.tck.resources.capabilities;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.RepresentationType;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.capabilities.CapabilitiesRepresentation;
+import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class CapabilitiesResourceTest_accept {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void applicationJson() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "capabilities").withHeader(RestfulRequest.Header.ACCEPT, MediaType.APPLICATION_JSON_TYPE);
+        final RestfulResponse<CapabilitiesRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_profileCapabilities() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "capabilities").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.CAPABILITIES.getMediaType());
+        final RestfulResponse<CapabilitiesRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_invalid() throws Exception {
+
+        final RestfulRequest request = client.createRequest(HttpMethod.GET, "/").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.USER.getMediaType());
+        final RestfulResponse<CapabilitiesRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.NOT_ACCEPTABLE));
+    }
+
+}

Copied: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_representationAndHeaders.java (from r1182130, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/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/resources/capabilities/CapabilitiesResourceTest_representationAndHeaders.java?p2=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_representationAndHeaders.java&p1=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest.java&r1=1182130&r2=1183125&rev=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/capabilities/CapabilitiesResourceTest_representationAndHeaders.java Thu Oct 13 21:57:15 2011
@@ -1,6 +1,11 @@
 package org.apache.isis.viewer.json.tck.resources.capabilities;
 
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasMaxAge;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasParameter;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasSubType;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasType;
+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;
@@ -11,18 +16,22 @@ import static org.junit.Assert.assertTha
 
 import java.io.IOException;
 
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.MediaType;
 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.RepresentationType;
 import org.apache.isis.viewer.json.applib.RestfulClient;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.Header;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
 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.tck.IsisWebServerRule;
-import org.apache.isis.viewer.json.tck.RepresentationMatchers;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.junit.Before;
@@ -30,7 +39,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 
-public class CapabilitiesResourceTest {
+public class CapabilitiesResourceTest_representationAndHeaders {
 
     @Rule
     public IsisWebServerRule webServerRule = new IsisWebServerRule();
@@ -46,17 +55,21 @@ public class CapabilitiesResourceTest {
         resource = client.getCapabilitiesResource();
     }
 
-
     @Test
     public void representation() throws Exception {
         
-        // when
+        // given
         Response servicesResp = resource.capabilities();
-        RestfulResponse<CapabilitiesRepresentation> jsonResp = RestfulResponse.ofT(servicesResp);
-        assertThat(jsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
+        
+        // when
+        RestfulResponse<CapabilitiesRepresentation> restfulResponse = RestfulResponse.ofT(servicesResp);
+        assertThat(restfulResponse.getStatus().getFamily(), is(Family.SUCCESSFUL));
         
         // then
-        CapabilitiesRepresentation repr = jsonResp.getEntity();
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+        
+        CapabilitiesRepresentation repr = restfulResponse.getEntity();
+        assertThat(repr, is(not(nullValue())));
         assertThat(repr, isMap());
 
         assertThat(repr.getSelf(), isLink().method(Method.GET));
@@ -75,10 +88,31 @@ public class CapabilitiesResourceTest {
         assertThat(capabilities.getString("sorting"), is("no"));
         assertThat(capabilities.getString("domainModel"), is("rich"));
         
-        assertThat(repr.getLinks(), is(not(nullValue())));
+        assertThat(repr.getLinks(), isArray());
         assertThat(repr.getExtensions(), is(not(nullValue())));
     }
 
+    @Test
+    public void headers() throws Exception {
+        // given
+        Response resp = resource.capabilities();
+        
+        // when
+        RestfulResponse<CapabilitiesRepresentation> restfulResponse = RestfulResponse.ofT(resp);
+        
+        // then
+        final MediaType contentType = restfulResponse.getHeader(Header.CONTENT_TYPE);
+        assertThat(contentType, hasType("application"));
+        assertThat(contentType, hasSubType("json"));
+        assertThat(contentType, hasParameter("profile", "http://restfulobjects.org/profiles/capabilities"));
+        assertThat(contentType, is(RepresentationType.CAPABILITIES.getMediaType()));
+        
+        // then
+        final CacheControl cacheControl = restfulResponse.getHeader(Header.CACHE_CONTROL);
+        assertThat(cacheControl, hasMaxAge(24*60*60));
+        assertThat(cacheControl.getMaxAge(), is(24*60*60));
+    }
+
 
     @Test
     public void selfIsFollowable() throws Exception {

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_representationAndHeaders.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_representationAndHeaders.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_representationAndHeaders.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_representationAndHeaders.java Thu Oct 13 21:57:15 2011
@@ -58,7 +58,7 @@ public class HomePageResourceTest_repres
     public void representation() throws Exception {
 
         // given
-        Response resp = resource.resources();
+        Response resp = resource.homePage();
         
         // when
         RestfulResponse<HomePageRepresentation> restfulResponse = RestfulResponse.ofT(resp);
@@ -69,7 +69,7 @@ public class HomePageResourceTest_repres
         
         HomePageRepresentation repr = restfulResponse.getEntity();
         assertThat(repr, is(not(nullValue())));
-        assertThat(repr.isMap(), is(true));
+        assertThat(repr, isMap());
         
         assertThat(repr.getSelf(), isLink(client).method(Method.GET));
         assertThat(repr.getUser(), isLink(client).method(Method.GET));
@@ -83,7 +83,7 @@ public class HomePageResourceTest_repres
     @Test
     public void headers() throws Exception {
         // given
-        Response resp = resource.resources();
+        Response resp = resource.homePage();
         
         // when
         RestfulResponse<HomePageRepresentation> restfulResponse = RestfulResponse.ofT(resp);
@@ -122,7 +122,7 @@ public class HomePageResourceTest_repres
     }
 
     private HomePageRepresentation givenRepresentation() throws JsonParseException, JsonMappingException, IOException {
-        RestfulResponse<HomePageRepresentation> response = RestfulResponse.ofT(resource.resources());
+        RestfulResponse<HomePageRepresentation> response = RestfulResponse.ofT(resource.homePage());
         return response.getEntity();
     }
 

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java Thu Oct 13 21:57:15 2011
@@ -4,15 +4,21 @@ import static org.hamcrest.CoreMatchers.
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.*;
+
+import java.io.IOException;
 
 import org.apache.isis.runtimes.dflt.webserver.WebServer;
 import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RestfulClient;
 import org.apache.isis.viewer.json.applib.RestfulRequest;
 import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
 import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
 import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -25,35 +31,86 @@ public class HomePageResourceTest_xrofol
     
     private RestfulClient client;
 
+    private RestfulRequest request;
+    private RestfulResponse<HomePageRepresentation> restfulResponse;
+    private HomePageRepresentation repr;
+
     @Before
     public void setUp() throws Exception {
         WebServer webServer = webServerRule.getWebServer();
         client = new RestfulClient(webServer.getBase());
-    }
-
-    @Test
-    public void xrofollowLinks() throws Exception {
 
-        RestfulRequest request;
-        RestfulResponse<HomePageRepresentation> restfulResponse;
-        HomePageRepresentation repr;
-        
         request = client.createRequest(HttpMethod.GET, "/");
         restfulResponse = request.executeT();
         repr = restfulResponse.getEntity();
         
+        // given
         assertThat(repr.getUser().getValue(), is(nullValue()));
         assertThat(repr.getCapabilities().getValue(), is(nullValue()));
         assertThat(repr.getServices().getValue(), is(nullValue()));
+    }
 
-        request = client.createRequest(HttpMethod.GET, "/").withArg(QueryParameter.FOLLOW_LINKS, "user,services,capabilities");
-        restfulResponse = request.executeT();
-        repr = restfulResponse.getEntity();
+    @Test
+    public void all() throws Exception {
+
+        repr = whenExecuteWith("/", "user,services,capabilities");
 
         assertThat(repr.getUser().getValue(), is(not(nullValue())));
         assertThat(repr.getCapabilities().getValue(), is(not(nullValue())));
         assertThat(repr.getServices().getValue(), is(not(nullValue())));
     }
+
+    @Test
+    public void servicesValues() throws Exception {
+
+        repr = whenExecuteWith("/", "services.values");
+
+        JsonRepresentation servicesValue = repr.getServices().getValue();
+        assertThat(servicesValue, is(not(nullValue())));
+        assertThat(servicesValue, isMap());
+        final JsonRepresentation serviceLinkList = servicesValue.getArray("values");
+        assertThat(serviceLinkList, isArray());
+        
+        JsonRepresentation service;
+        
+        service = serviceLinkList.xpath("/e[key='%s']", "simples");
+        assertThat(service.getRepresentation("e"), isMap());
+        assertThat(service.getString("e.key"), is("simples"));
+        assertThat(service.getRepresentation("e.value"), is(not(nullValue())));
+
+        service = serviceLinkList.xpath("/e[key='%s']", "applibValuedEntities");
+        assertThat(service.getRepresentation("e"), isMap());
+        assertThat(service.getString("e.key"), is("applibValuedEntities"));
+        assertThat(service.getRepresentation("e.value"), is(not(nullValue())));
+    }
+
+    @Test
+    public void servicesValuesWithCriteria() throws Exception {
+
+        repr = whenExecuteWith("/", "services.values[key=simples]");
+
+        JsonRepresentation servicesValue = repr.getServices().getValue();
+        assertThat(servicesValue, is(not(nullValue())));
+        assertThat(servicesValue, isMap());
+        final JsonRepresentation serviceLinkList = servicesValue.getArray("values");
+        assertThat(serviceLinkList, isArray());
+        
+        JsonRepresentation service;
+        
+        service = serviceLinkList.xpath("/e[key='%s']", "simples");
+        assertThat(service.getRepresentation("e"), isMap());
+        assertThat(service.getString("e.key"), is("simples"));
+        assertThat(service.getRepresentation("e.value"), is(not(nullValue())));
+
+        service = serviceLinkList.xpath("/e[key='%s']", "applibValuedEntities");
+        assertThat(service.getRepresentation("e.value"), is(nullValue()));
+    }
+
+    private HomePageRepresentation whenExecuteWith(final String uriTemplate, final String followLinks) throws JsonParseException, JsonMappingException, IOException {
+        request = client.createRequest(HttpMethod.GET, uriTemplate).withArg(QueryParameter.FOLLOW_LINKS, followLinks);
+        restfulResponse = request.executeT();
+        return restfulResponse.getEntity();
+    }
     
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java Thu Oct 13 21:57:15 2011
@@ -8,7 +8,6 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.domainobjects.DomainObjectRepresentation;
 import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
 import org.apache.isis.viewer.json.tck.IsisWebServerRule;
-import org.apache.isis.viewer.json.tck.RepresentationMatchers;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.junit.Before;

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_accept.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_accept.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_accept.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_accept.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,89 @@
+package org.apache.isis.viewer.json.tck.resources.service.serviceId;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.RepresentationType;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainObjectRepresentation;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
+import org.apache.isis.viewer.json.applib.domainobjects.ListRepresentation;
+import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.jboss.resteasy.spi.Link;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class DomainServiceResourceTest_serviceId_accept {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void applicationJson() throws Exception {
+
+        final String href = givenLinkToService();
+        
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, href).withHeader(RestfulRequest.Header.ACCEPT, MediaType.APPLICATION_JSON_TYPE);
+        final RestfulResponse<DomainObjectRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_profileList() throws Exception {
+
+        final String href = givenLinkToService();
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, href).withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.DOMAIN_OBJECT.getMediaType());
+        final RestfulResponse<DomainObjectRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_invalid() throws Exception {
+
+        final String href = givenLinkToService();
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, href).withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.USER.getMediaType());
+        final RestfulResponse<DomainObjectRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.NOT_ACCEPTABLE));
+    }
+
+    private String givenLinkToService() throws JsonParseException, JsonMappingException, IOException {
+        final DomainServiceResource resource = client.getDomainServiceResource();
+        final Response response = resource.services();
+        final ListRepresentation services = RestfulResponse.<ListRepresentation>ofT(response).getEntity();
+
+        final String href = services.xpath("//*[key='%s']", "simples").getLink("e").getHref();
+        return href;
+    }
+
+
+}

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_notFound.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_notFound.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_notFound.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_notFound.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,49 @@
+package org.apache.isis.viewer.json.tck.resources.service.serviceId;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import javax.ws.rs.core.Response;
+
+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.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+
+public class DomainServiceResourceTest_serviceId_notFound {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+    
+    private RestfulClient client;
+    private DomainServiceResource resource;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+        
+        resource = client.getDomainServiceResource();
+    }
+
+    @Test
+    public void notFound() throws Exception {
+
+        // when
+        Response resp = resource.service("nonExistentServiceId");
+        RestfulResponse<JsonRepresentation> jsonResp = RestfulResponse.of(resp);
+        
+        // then
+        assertThat(jsonResp.getStatus(), is(HttpStatusCode.NOT_FOUND));
+    }
+
+
+}
+    
\ No newline at end of file

Copied: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_representationAndHeaders.java (from r1182130, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_service_serviceId.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_representationAndHeaders.java?p2=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_representationAndHeaders.java&p1=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_service_serviceId.java&r1=1182130&r2=1183125&rev=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_service_serviceId.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_representationAndHeaders.java Thu Oct 13 21:57:15 2011
@@ -1,4 +1,4 @@
-package org.apache.isis.viewer.json.tck.resources.service;
+package org.apache.isis.viewer.json.tck.resources.service.serviceId;
 
 import static org.apache.isis.core.commons.matchers.IsisMatchers.matches;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
@@ -7,8 +7,6 @@ import static org.apache.isis.viewer.jso
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isLink;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isMap;
 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;
@@ -16,28 +14,22 @@ import java.io.IOException;
 import javax.ws.rs.core.Response;
 
 import org.apache.isis.runtimes.dflt.webserver.WebServer;
-import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.applib.RestfulClient;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
-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.domainobjects.DomainObjectRepresentation;
 import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
-import org.apache.isis.viewer.json.applib.domainobjects.ObjectActionRepresentation;
 import org.apache.isis.viewer.json.tck.IsisWebServerRule;
-import org.apache.isis.viewer.json.tck.RepresentationMatchers;
-import org.apache.isis.viewer.json.viewer.resources.domainobjects.MemberType;
 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;
 
 
-public class DomainServiceResourceTest_service_serviceId {
+public class DomainServiceResourceTest_serviceId_representationAndHeaders {
 
     @Rule
     public IsisWebServerRule webServerRule = new IsisWebServerRule();
@@ -65,8 +57,6 @@ public class DomainServiceResourceTest_s
         
         // then
         assertThat(jsonResp.getStatus(), is(HttpStatusCode.OK));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CONTENT_TYPE), is(RepresentationType.DOMAIN_OBJECT.getMediaType()));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CACHE_CONTROL).getMaxAge(), is(24*60*60));
 
         DomainObjectRepresentation repr = jsonResp.getEntity();
 
@@ -84,52 +74,29 @@ public class DomainServiceResourceTest_s
 
 
     @Test
-    public void self_isFollowable() throws Exception {
-        // given
-        DomainObjectRepresentation repr = givenRepresentation("simples");
-
-        // when, then
-        assertThat(repr, isFollowableLinkToSelf(client));
-    }
-
-
-    @Ignore("broken - need to duplicate logic in DSRS")
-    @Test
-    public void members_actions() throws Exception {
+    public void headers() throws Exception {
         // given
-        DomainObjectRepresentation repr = givenRepresentation("simples");
-
-        JsonRepresentation actions = repr.xpath("/members/e[memberType='objectAction']");
-        assertThat(actions.arraySize(), is(3));
-        for (ObjectActionRepresentation memberRepr : actions.arrayIterable(ObjectActionRepresentation.class)) {
-            assertThat(memberRepr.getMemberType(), is(not(nullValue())));
-            assertThat(MemberType.lookup(memberRepr.getMemberType()), is(MemberType.OBJECT_ACTION));
-            assertThat(memberRepr.getActionId(), is(not(nullValue())));
-            assertThat(memberRepr.getActionDetails(), isLink());
-            assertThat(memberRepr.getDisabledReason(), is(nullValue()));
-        }
-        
-        JsonRepresentation listActionRepr = repr.xpath("/members/e[memberType='objectAction' and actionId='list']").getRepresentation("e");
-        Link listActionDetailsLink = listActionRepr.getLink("actionDetails");
+        Response resp = resource.service("simples");
         
         // when
-        Response listActionDetailsResp = client.follow(listActionDetailsLink);
+        RestfulResponse<DomainObjectRepresentation> jsonResp = RestfulResponse.ofT(resp);
         
         // then
-        RestfulResponse<ObjectActionRepresentation> listActionDetailsJsonResp = RestfulResponse.ofT(listActionDetailsResp);
-        assertThat(listActionDetailsJsonResp.getStatus(), is(HttpStatusCode.OK));
-
-        ObjectActionRepresentation listActionDetailsRepr = listActionDetailsJsonResp.getEntity();
-        
-        
+        assertThat(jsonResp.getStatus(), is(HttpStatusCode.OK));
+        assertThat(jsonResp.getHeader(RestfulResponse.Header.CONTENT_TYPE), is(RepresentationType.DOMAIN_OBJECT.getMediaType()));
+        assertThat(jsonResp.getHeader(RestfulResponse.Header.CACHE_CONTROL).getMaxAge(), is(24*60*60));
     }
 
-    @Ignore("TODO - need to add fixture data")
     @Test
-    public void members_actions_disabled() throws Exception {
-        
+    public void self_isFollowable() throws Exception {
+        // given
+        DomainObjectRepresentation repr = givenRepresentation("simples");
+
+        // when, then
+        assertThat(repr, isFollowableLinkToSelf(client));
     }
 
+
     @Test
     public void links() throws Exception {
         // given, when
@@ -140,25 +107,6 @@ public class DomainServiceResourceTest_s
     }
     
 
-    @Ignore("TODO - need to add fixture data")
-    @Test
-    public void links_icons() throws Exception {
-        
-    }
-    
-
-    @Test
-    public void notFound() throws Exception {
-
-        // when
-        Response resp = resource.service("nonExistentServiceId");
-        RestfulResponse<JsonRepresentation> jsonResp = RestfulResponse.of(resp);
-        
-        // then
-        assertThat(jsonResp.getStatus(), is(HttpStatusCode.NOT_FOUND));
-    }
-
-
     private DomainObjectRepresentation givenRepresentation(String serviceId) throws JsonParseException, JsonMappingException, IOException {
         RestfulResponse<DomainObjectRepresentation> jsonResp = RestfulResponse.ofT(resource.service(serviceId));
         return jsonResp.getEntity();

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_xrofollowlinks.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_xrofollowlinks.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_xrofollowlinks.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/serviceId/DomainServiceResourceTest_serviceId_xrofollowlinks.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,62 @@
+package org.apache.isis.viewer.json.tck.resources.service.serviceId;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.io.IOException;
+
+import javax.ws.rs.core.Response;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
+import org.apache.isis.viewer.json.applib.domainobjects.ListRepresentation;
+import org.apache.isis.viewer.json.applib.domainobjects.ObjectActionRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class DomainServiceResourceTest_serviceId_xrofollowlinks {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void usingXpath() throws Exception {
+
+        final String href = givenLinkToService();
+        
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, href).withArg(QueryParameter.FOLLOW_LINKS, "members[actionId='%s'].actionDetails", "list");
+        final RestfulResponse<ObjectActionRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+
+    private String givenLinkToService() throws JsonParseException, JsonMappingException, IOException {
+        final DomainServiceResource resource = client.getDomainServiceResource();
+        final Response response = resource.services();
+        final ListRepresentation services = RestfulResponse.<ListRepresentation>ofT(response).getEntity();
+
+        return services.xpath("//*[key='%s']", "simples").getLink("e").getHref();
+    }
+
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java Thu Oct 13 21:57:15 2011
@@ -52,15 +52,15 @@ public class DomainServiceResourceTest_s
     public void representation() throws Exception {
         
         // when
-        Response resp = resource.services();
-        RestfulResponse<ListRepresentation> jsonResp = RestfulResponse.ofT(resp);
+        final Response response = resource.services();
+        final RestfulResponse<ListRepresentation> restfulResponse = RestfulResponse.ofT(response);
         
         // then
-        assertThat(jsonResp.getStatus(), is(HttpStatusCode.OK));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CONTENT_TYPE), is(RepresentationType.LIST.getMediaType()));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CACHE_CONTROL).getMaxAge(), is(24*60*60));
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+        assertThat(restfulResponse.getHeader(RestfulResponse.Header.CONTENT_TYPE), is(RepresentationType.LIST.getMediaType()));
+        assertThat(restfulResponse.getHeader(RestfulResponse.Header.CACHE_CONTROL).getMaxAge(), is(24*60*60));
 
-        ListRepresentation repr = jsonResp.getEntity();
+        ListRepresentation repr = restfulResponse.getEntity();
 
         assertThat(repr, isMap());
 

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java Thu Oct 13 21:57:15 2011
@@ -28,7 +28,6 @@ public class DomainServiceResourceTest_s
 
     @Rule
     public IsisWebServerRule webServerRule = new IsisWebServerRule();
-    
     private RestfulClient client;
 
     @Before

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/stories/UserStoryTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/stories/UserStoryTest.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/stories/UserStoryTest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/stories/UserStoryTest.java Thu Oct 13 21:57:15 2011
@@ -37,7 +37,7 @@ public class UserStoryTest {
     
         // given a response for an initial resource
         HomePageResource homePageResource = client.getHomePageResource();
-        Response homePageResp = homePageResource.resources();
+        Response homePageResp = homePageResource.homePage();
         
         // and given a walker starting from this response
         RepresentationWalker walker = client.createWalker(homePageResp);

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.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?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkBuilder.java Thu Oct 13 21:57:15 2011
@@ -43,6 +43,7 @@ public final class LinkBuilder {
     private String title;
     private JsonRepresentation arguments;
     private JsonRepresentation value;
+    private String key;
 
     protected LinkBuilder(ResourceContext resourceContext, String rel, String href, MediaType mediaType) {
         this.resourceContext = resourceContext;
@@ -62,12 +63,17 @@ public final class LinkBuilder {
         this.arguments = arguments;
         return this;
     }
+    public LinkBuilder withKey(String key) {
+        this.key = key;
+        return this;
+    }
     public LinkBuilder withValue(JsonRepresentation value) {
         this.value = value;
         return this;
     }
 
     public JsonRepresentation build() {
+        representation.mapPut("key", key);
         representation.mapPut("rel", rel);
         representation.mapPut("href", resourceContext.urlFor(href));
         representation.mapPut("method", method);

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.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/LinkFollower.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java Thu Oct 13 21:57:15 2011
@@ -3,87 +3,108 @@ package org.apache.isis.viewer.json.view
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
-import com.google.common.collect.Maps;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
 
-@SuppressWarnings({"rawtypes","unchecked"})
-public final class LinkFollower {
-
-    public final static Map<String,Map> asGraph(List<List<String>> links) {
-        if(links == null) {
-            return Collections.emptyMap();
-        }
-        final Map<String, Map> map = Maps.newHashMap();
-        for (List<String> link : links) {
-            mergeInto(link, map);
-        }
-        return map;
-    }
+import com.google.common.base.Objects;
 
-    private static void mergeInto(List<String> list, Map<String, Map> map) {
-        if(list.size() == 0) {
-            return;
-        }
-        final String str = list.get(0);
-        Map submap = map.get(str);
-        if(submap == null) {
-            submap = Maps.newHashMap(); 
-            map.put(str, submap);
-        }
-        mergeInto(list.subList(1, list.size()), submap);
-    }
 
-    public final static LinkFollower initial(List<List<String>> links) {
-        final Map<String, Map> graph = asGraph(links);
-        return new LinkFollower(graph, Mode.FOLLOWINGPATH);
-    }
 
-    public final static LinkFollower following(Map<String,Map> graph) {
-        return new LinkFollower(graph, Mode.FOLLOWINGPATH);
-    }
+@SuppressWarnings({"rawtypes","unchecked"})
+public final class LinkFollower {
 
-    private static LinkFollower terminated() {
-        return new LinkFollower(null, Mode.TERMINATED);
+    public final static LinkFollower create(List<List<String>> links) {
+        final Map<Node, Map> graph = ListUtil.asGraph(links);
+        return new LinkFollower(graph, Mode.FOLLOWING, Node.NULL);
     }
 
-
     private enum Mode {
-        FOLLOWINGPATH,
+        FOLLOWING,
         TERMINATED;
     }
 
-    private final Map<String, Map> graph;
+    private final Map<Node, Map> graph;
     private Mode mode;
+    private final Node root;
 
-    private LinkFollower(Map<String, Map> graph, Mode mode) {
+    private LinkFollower(Map<Node, Map> graph, Mode mode, Node root) {
         this.graph = graph;
         this.mode = mode;
+        this.root = root;
     }
 
     /**
      * A little algebra...
      */
     public LinkFollower follow(String path) {
-        if(path == null || mode == Mode.TERMINATED) {
-            return LinkFollower.terminated();
+        if(path == null) {
+            return terminated(Node.NULL);
         }
-        if(mode == Mode.FOLLOWINGPATH) {
-            Map remaining = graph.get(path);
+        if(mode == Mode.TERMINATED) {
+            return terminated(this.root);
+        }
+        Node node = Node.parse(path);
+        if(mode == Mode.FOLLOWING) {
+            Map<Node, Map> remaining = graph.get(node);
             if(remaining != null) {
-                return LinkFollower.following(remaining);
+                Node key = findKey(node);
+                return new LinkFollower(remaining, Mode.FOLLOWING, key);
             } else {
-                return LinkFollower.terminated();
+                return terminated(node);
             }
         }
-        return LinkFollower.terminated();
+        return terminated(node);
+    }
+
+    /**
+     * somewhat bizarre, but we have to find the actual node that is in the graph;
+     * the one we matching on doesn't match on the {@link Node#getCriteria()} map.
+     */
+    private Node findKey(Node node) {
+        final Set<Node> keySet = graph.keySet();
+        for(Node key: keySet) {
+            if(key.equals(node)) {
+                return key;
+            }
+        }
+        // shouldn't happen
+        return node;
+    }
+
+    private static LinkFollower terminated(Node node) {
+        return new LinkFollower(null, Mode.TERMINATED, node);
     }
 
     public boolean isFollowing() {
-        return mode == Mode.FOLLOWINGPATH;
+        return mode == Mode.FOLLOWING;
     }
 
     public boolean isTerminated() {
         return mode == Mode.TERMINATED;
     }
 
+    public Map<String, String> criteria() {
+        return Collections.unmodifiableMap(root.getCriteria());
+    }
+
+    /**
+     * Ensure that every key present in the provided map matches the criterium.
+     * 
+     * <p>
+     * Any keys in the criterium that are not present in the map will be ignored.
+     */
+    public boolean matches(JsonRepresentation map) {
+        if(!isFollowing()) {
+            return false;
+        }
+        for(Map.Entry<String,String> criterium: root.getCriteria().entrySet()) {
+            final String mapValue = map.getString(criterium.getKey());
+            if(mapValue != null && !Objects.equal(mapValue, criterium.getValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ListUtil.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/ListUtil.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ListUtil.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ListUtil.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,39 @@
+package org.apache.isis.viewer.json.viewer.representations;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
+@SuppressWarnings({"rawtypes","unchecked"})
+public final class ListUtil {
+    
+    private ListUtil(){}
+
+    public final static Map<Node,Map> asGraph(List<List<String>> links) {
+        if(links == null) {
+            return Collections.emptyMap();
+        }
+        final Map<Node, Map> map = Maps.newHashMap();
+        for (List<String> link : links) {
+            ListUtil.mergeInto(link, map);
+        }
+        return map;
+    }
+
+    private static void mergeInto(List<String> list, Map<Node, Map> map) {
+        if(list.size() == 0) {
+            return;
+        }
+        final String str = list.get(0);
+        final Node node = Node.parse(str);
+        Map<Node,Map> submap = map.get(node);
+        if(submap == null) {
+            submap = Maps.newHashMap(); 
+            map.put(node, submap);
+        }
+        mergeInto(list.subList(1, list.size()), submap);
+    }
+
+}

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/Node.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/Node.java?rev=1183125&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/Node.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/Node.java Thu Oct 13 21:57:15 2011
@@ -0,0 +1,83 @@
+package org.apache.isis.viewer.json.viewer.representations;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.Maps;
+
+class Node {
+    private static final Pattern NODE = Pattern.compile("^([^\\[]+)(\\[(.+)\\])?$");
+    private static final Pattern WHITESPACE = Pattern.compile("\\s+");
+    private static final Pattern KEY_VALUE = Pattern.compile("^([^=]+)=(.+)$");
+    
+    public static final Node NULL = new Node("", Collections.<String,String>emptyMap());
+    
+    public static Node parse(String path) {
+        Matcher nodeMatcher = NODE.matcher(path);
+        if(!nodeMatcher.matches()) {
+            return null;
+        } 
+        final int groupCount = nodeMatcher.groupCount();
+        if(groupCount < 1) {
+            return null;
+        }
+        final String key = nodeMatcher.group(1);
+        final Map<String, String> criteria = Maps.newHashMap();
+        final String criteriaStr = nodeMatcher.group(3);
+        if(criteriaStr != null) {
+            for (String criterium : Splitter.on(WHITESPACE).split(criteriaStr)) {
+                final Matcher keyValueMatcher = KEY_VALUE.matcher(criterium);
+                if(keyValueMatcher.matches()) {
+                    criteria.put(keyValueMatcher.group(1), keyValueMatcher.group(2));
+                }
+            }
+        }
+
+        return new Node(key, criteria);
+    }
+    
+    private final String key;
+    private final Map<String,String> criteria;
+    private Node(String key, Map<String, String> criteria) {
+        this.key = key;
+        this.criteria = Collections.unmodifiableMap(criteria);
+    }
+    public String getKey() {
+        return key;
+    }
+    public Map<String, String> getCriteria() {
+        return criteria;
+    }
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((key == null) ? 0 : key.hashCode());
+        return result;
+    }
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        Node other = (Node) obj;
+        if (key == null) {
+            if (other.key != null)
+                return false;
+        } else if (!key.equals(other.key))
+            return false;
+        return true;
+    }
+    
+    @Override
+    public String toString() {
+        return key + (criteria.isEmpty()?"":criteria);
+    }
+    
+}
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.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/ReprRendererAbstract.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java Thu Oct 13 21:57:15 2011
@@ -30,7 +30,7 @@ public abstract class ReprRendererAbstra
         if(linkFollower != null) {
             return linkFollower;
         }
-        return LinkFollower.initial(resourceContext.getFollowLinks());
+        return LinkFollower.create(resourceContext.getFollowLinks());
     }
 
     public ResourceContext getResourceContext() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.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/AbstractObjectMemberReprRenderer.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java Thu Oct 13 21:57:15 2011
@@ -30,7 +30,7 @@ import org.apache.isis.viewer.json.viewe
 public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbstract<R, ObjectAndMember<T>>, T extends ObjectMember> 
         extends ReprRendererAbstract<R, ObjectAndMember<T>> {
 
-    protected ObjectAdapterLinkToBuilder linkToBuilder;
+    protected ObjectAdapterLinkTo linkToBuilder;
     
     protected ObjectAdapter objectAdapter;
     protected MemberType memberType;
@@ -46,14 +46,14 @@ public abstract class AbstractObjectMemb
         this.objectAdapter = objectAndMember.getObjectAdapter();
         this.objectMember = objectAndMember.getMember();
         this.memberType = MemberType.determineFrom(objectMember);
-        usingLinkToBuilder(new DomainObjectLinkToBuilder());
+        usingLinkToBuilder(new DomainObjectLinkTo());
         return cast(this);
     }
 
     /**
      * Must be called after {@link #with(ObjectAndMember)} (which provides the {@link #objectAdapter}).
      */
-    public R usingLinkToBuilder(ObjectAdapterLinkToBuilder linkToBuilder) {
+    public R usingLinkToBuilder(ObjectAdapterLinkTo linkToBuilder) {
         this.linkToBuilder = linkToBuilder.usingResourceContext(resourceContext).with(objectAdapter);
         return cast(this);
     }

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java (from r1182130, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkToBuilder.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/DomainObjectLinkTo.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkToBuilder.java&r1=1182130&r2=1183125&rev=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkToBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java Thu Oct 13 21:57:15 2011
@@ -22,33 +22,54 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 
-public class DomainObjectLinkToBuilder implements ObjectAdapterLinkToBuilder {
+public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
 
     protected ResourceContext resourceContext;
     protected ObjectAdapter objectAdapter;
 
     @Override
-    public final DomainObjectLinkToBuilder usingResourceContext(ResourceContext resourceContext) {
+    public final DomainObjectLinkTo usingResourceContext(ResourceContext resourceContext) {
         this.resourceContext = resourceContext;
         return this;
     }
 
     @Override
-    public final ObjectAdapterLinkToBuilder with(ObjectAdapter objectAdapter) {
+    public ObjectAdapterLinkTo with(ObjectAdapter objectAdapter) {
         this.objectAdapter = objectAdapter;
         return this;
     }
 
     @Override
-    public final LinkBuilder linkToAdapter() {
-        StringBuilder buf = objectsBuf();
-        return LinkBuilder.newBuilder(resourceContext, "object", RepresentationType.DOMAIN_OBJECT, buf.toString());
+    public LinkBuilder builder() {
+        return LinkBuilder.newBuilder(resourceContext, linkRel(), RepresentationType.DOMAIN_OBJECT, linkRef());
+    }
+
+    /**
+     * hook method
+     */
+    protected String linkRef() {
+        if(resourceContext == null) {
+            throw new IllegalStateException("resourceContext not provided");
+        }
+        if(objectAdapter == null) {
+            throw new IllegalStateException("objectAdapter not provided");
+        }
+        StringBuilder buf = new StringBuilder("objects/");
+        buf.append(resourceContext.getOidStringifier().enString(objectAdapter.getOid()));
+        return buf.toString();
+    }
+
+    /**
+     * hook method
+     */
+    protected String linkRel() {
+        return "object";
     }
 
 
     @Override
     public final LinkBuilder linkToMember(String rel, MemberType memberType, ObjectMember objectMember, String... parts) {
-        StringBuilder buf = objectsBuf();
+        StringBuilder buf = new StringBuilder(linkRef());
         buf.append("/").append(memberType.getUrlPart()).append(objectMember.getId());
         for(String part: parts) {
             if(part == null) {
@@ -60,21 +81,6 @@ public class DomainObjectLinkToBuilder i
         return LinkBuilder.newBuilder(resourceContext, rel, memberType.getRepresentationType(), url);
     }
 
-    /**
-     * hook method
-     * @return
-     */
-    protected StringBuilder objectsBuf() {
-        if(resourceContext == null) {
-            throw new IllegalStateException("resourceContext not provided");
-        }
-        if(objectAdapter == null) {
-            throw new IllegalStateException("objectAdapter not provided");
-        }
-        StringBuilder buf = new StringBuilder("objects/");
-        buf.append(resourceContext.getOidStringifier().enString(objectAdapter.getOid()));
-        return buf;
-    }
     
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.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/DomainObjectReprRenderer.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.java Thu Oct 13 21:57:15 2011
@@ -63,19 +63,19 @@ public class DomainObjectReprRenderer ex
         return LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.DOMAIN_OBJECT, url);
     }
 
-    private ObjectAdapterLinkToBuilder linkToBuilder;
+    private ObjectAdapterLinkTo linkToBuilder;
     private ObjectAdapter objectAdapter;
 
     private DomainObjectReprRenderer(ResourceContext resourceContext, LinkFollower linkFollower, RepresentationType representationType, JsonRepresentation representation) {
         super(resourceContext, linkFollower, representationType, representation);
-        usingLinkToBuilder(new DomainObjectLinkToBuilder());
+        usingLinkToBuilder(new DomainObjectLinkTo());
     }
 
     /**
-     * Override the default {@link ObjectAdapterLinkToBuilder} (that is used for generating links in
+     * Override the default {@link ObjectAdapterLinkTo} (that is used for generating links in
      * {@link #linkTo(ObjectAdapter)}).
      */
-    public DomainObjectReprRenderer usingLinkToBuilder(ObjectAdapterLinkToBuilder objectAdapterLinkToBuilder) {
+    public DomainObjectReprRenderer usingLinkToBuilder(ObjectAdapterLinkTo objectAdapterLinkToBuilder) {
         this.linkToBuilder = objectAdapterLinkToBuilder.usingResourceContext(resourceContext);
         return this;
     }
@@ -89,7 +89,7 @@ public class DomainObjectReprRenderer ex
 
         // self
         if(includesSelf) {
-            JsonRepresentation self = linkToBuilder.with(objectAdapter).linkToAdapter().build();
+            JsonRepresentation self = linkToBuilder.with(objectAdapter).builder().build();
             representation.mapPut("self", self);
         }
 
@@ -127,6 +127,8 @@ public class DomainObjectReprRenderer ex
 
     private void addAssociations(ObjectAdapter objectAdapter, JsonRepresentation members, List<ObjectAssociation> associations) {
         for (ObjectAssociation assoc : associations) {
+            final LinkFollower follow = getLinkFollower().follow("members");
+            
             Consent visibility = assoc.isVisible(getSession(), objectAdapter);
             if(!visibility.isAllowed()) {
                 continue;

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java (from r1182130, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkToBuilder.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/DomainServiceLinkTo.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkToBuilder.java&r1=1182130&r2=1183125&rev=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkToBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java Thu Oct 13 21:57:15 2011
@@ -16,15 +16,34 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 
-public class DomainServiceLinkToBuilder extends DomainObjectLinkToBuilder {
+public class DomainServiceLinkTo extends DomainObjectLinkTo {
 
-    protected StringBuilder objectsBuf() {
+    private String serviceId;
+
+    @Override
+    public ObjectAdapterLinkTo with(ObjectAdapter objectAdapter) {
+        serviceId = ServiceUtil.id(objectAdapter.getObject());
+        return super.with(objectAdapter);
+    }
+    
+    protected String linkRef() {
         StringBuilder buf = new StringBuilder("services/");
-        String serviceId = ServiceUtil.id(objectAdapter.getObject());
         buf.append(serviceId);
-        return buf;
+        return buf.toString();
+    }
+    
+    @Override
+    protected String linkRel() {
+        return "service";
+    }
+    
+    @Override
+    public LinkBuilder builder() {
+        return super.builder().withKey(serviceId);
     }
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.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/DomainServiceResourceServerside.java?rev=1183125&r1=1183124&r2=1183125&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java Thu Oct 13 21:57:15 2011
@@ -56,7 +56,7 @@ public class DomainServiceResourceServer
         final RendererFactory factory = RendererFactoryRegistry.instance.find(representationType);
         
         final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
-        renderer.usingLinkToBuilder(new DomainServiceLinkToBuilder())
+        renderer.usingLinkToBuilder(new DomainServiceLinkTo())
                 .withSelf("services")
                 .with(serviceAdapters);
         
@@ -81,7 +81,7 @@ public class DomainServiceResourceServer
         final RendererFactory factory = rendererFactoryRegistry.find(representationType);
         final DomainObjectReprRenderer renderer = 
                 (DomainObjectReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
-        renderer.usingLinkToBuilder(new DomainServiceLinkToBuilder())
+        renderer.usingLinkToBuilder(new DomainServiceLinkTo())
                     .includesSelf()
                     .with(serviceAdapter);