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/05 21:47:18 UTC

svn commit: r1179398 [1/2] - in /incubator/isis/trunk/framework/viewer/json: json-applib/src/main/java/org/apache/isis/viewer/json/applib/ json-applib/src/test/java/org/apache/isis/viewer/json/applib/ json-tck/src/test/java/org/apache/isis/viewer/json/...

Author: danhaywood
Date: Wed Oct  5 19:47:17 2011
New Revision: 1179398

URL: http://svn.apache.org/viewvc?rev=1179398&view=rev
Log:
ISIS-109: implemented reasonable support for x-ro-follow-links

Added:
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/ResourceContextTest_getArg.java
Modified:
    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-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.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/ResourceAbstract.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.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/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/DomainObjectResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.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/domainobjects/ObjectActionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarValueReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeFeatureReprBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeReprRenderer.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/domaintypes/DomainTypesReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionParamReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeCollectionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypePropertyReprRenderer.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
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserResourceServerside.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/ResourceContextTest_ensureCompatibleAcceptHeader.java

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -48,6 +48,7 @@ public class RestfulClient {
 
     private final ClientExecutor executor;
     private final ClientRequestFactory clientRequestFactory;
+    private HttpMethod httpMethod;
 
     public RestfulClient(final URI baseUri) {
         this(baseUri, new ApacheHttpClientExecutor(new HttpClient()));
@@ -122,7 +123,7 @@ public class RestfulClient {
         clientRequest.accept(MediaType.APPLICATION_JSON_TYPE);
         clientRequest.setHttpMethod(httpMethod.getJavaxRsMethod());
         
-        return new RestfulRequest(clientRequest);
+        return new RestfulRequest(clientRequest, httpMethod);
     }
     
     /**

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -1,6 +1,7 @@
 package org.apache.isis.viewer.json.applib;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -9,6 +10,8 @@ import javax.ws.rs.core.Response;
 
 import org.jboss.resteasy.client.ClientRequest;
 
+import com.google.common.collect.Maps;
+
 public final class RestfulRequest {
 
     public enum DomainModel {
@@ -35,19 +38,21 @@ public final class RestfulRequest {
     
     public static class QueryParameter<Q> {
 
-        public static QueryParameter<List<List<String>>> FOLLOW_LINKS = new QueryParameter<List<List<String>>>("x-ro-follow-links", Parser.forListOfListOfStrings());
-        public static QueryParameter<Integer> PAGE = new QueryParameter<Integer>("x-ro-page", Parser.forInteger());
-        public static QueryParameter<Integer> PAGE_SIZE = new QueryParameter<Integer>("x-ro-page-size", Parser.forInteger());
-        public static QueryParameter<List<String>> SORT_BY = new QueryParameter<List<String>>("x-ro-sort-by", Parser.forListOfStrings());
-        public static QueryParameter<DomainModel> DOMAIN_MODEL = new QueryParameter<DomainModel>("x-ro-domain-model", DomainModel.parser());
-        public static QueryParameter<Boolean> VALIDATE_ONLY = new QueryParameter<Boolean>("x-ro-validate-only", Parser.forBoolean());
+        public static QueryParameter<List<List<String>>> FOLLOW_LINKS = new QueryParameter<List<List<String>>>("x-ro-follow-links", Parser.forListOfListOfStrings(), Collections.<List<String>>emptyList());
+        public static QueryParameter<Integer> PAGE = new QueryParameter<Integer>("x-ro-page", Parser.forInteger(), 1);
+        public static QueryParameter<Integer> PAGE_SIZE = new QueryParameter<Integer>("x-ro-page-size", Parser.forInteger(), 25);
+        public static QueryParameter<List<String>> SORT_BY = new QueryParameter<List<String>>("x-ro-sort-by", Parser.forListOfStrings(), Collections.<String>emptyList());
+        public static QueryParameter<DomainModel> DOMAIN_MODEL = new QueryParameter<DomainModel>("x-ro-domain-model", DomainModel.parser(), DomainModel.SIMPLE);
+        public static QueryParameter<Boolean> VALIDATE_ONLY = new QueryParameter<Boolean>("x-ro-validate-only", Parser.forBoolean(), false);
         
         private final String name;
         private final Parser<Q> parser;
+        private final Q defaultValue;
         
-        private QueryParameter(String name, Parser<Q> parser) {
+        private QueryParameter(String name, Parser<Q> parser, Q defaultValue) {
             this.name = name;
             this.parser = parser;
+            this.defaultValue = defaultValue;
         }
         
         public String getName() {
@@ -58,10 +63,24 @@ public final class RestfulRequest {
             return parser;
         }
 
+        public void setValue(ClientRequest clientRequest, Q value) {
+            clientRequest.queryParameter(getName(), parser.asString(value));
+        }
+        
         public Q valueOf(Map<?, ?> parameterMap) {
+            if(parameterMap == null) {
+                return defaultValue;
+            }
             @SuppressWarnings("unchecked")
             Map<String, String[]> parameters = (Map<String, String[]>) parameterMap; 
             final String[] values = parameters.get(getName());
+            if(values == null) {
+                return defaultValue;
+            }
+            // special case processing
+            if(values.length == 1) {
+                return getParser().valueOf(values[0]);
+            }
             return getParser().valueOf(values);
         }
     }
@@ -91,9 +110,12 @@ public final class RestfulRequest {
     }
 
     private final ClientRequest clientRequest;
+    private final HttpMethod httpMethod;
+    private final Map<QueryParameter<?>, Object> queryArgs = Maps.newLinkedHashMap();
     
-    public RestfulRequest(ClientRequest clientRequest) {
+    public RestfulRequest(ClientRequest clientRequest, HttpMethod httpMethod) {
         this.clientRequest = clientRequest;
+        this.httpMethod = httpMethod;
     }
 
 
@@ -120,12 +142,19 @@ public final class RestfulRequest {
     }
 
     public <Q> RestfulRequest withArg(RestfulRequest.QueryParameter<Q> queryParam, Q arg) {
-        //return this;
-        throw new RuntimeException("not yet implemented");
+        queryArgs.put(queryParam, arg);
+        return this;
     }
 
     public RestfulResponse<JsonRepresentation> execute() {
         try {
+            if(httpMethod == HttpMethod.GET) {
+                setQueryArgs();
+            }
+            if(httpMethod == HttpMethod.POST) {
+                throw new RuntimeException("not yet implemented");
+            }
+
             Response executeJaxrs = clientRequest.execute();
             return RestfulResponse.ofT(executeJaxrs);
         } catch (Exception ex) {
@@ -133,6 +162,14 @@ public final class RestfulRequest {
         }
     }
 
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    private void setQueryArgs() {
+        for (QueryParameter queryParam : queryArgs.keySet()) {
+            queryParam.setValue(clientRequest, queryArgs.get(queryParam));
+        }
+    }
+
+
     @SuppressWarnings("unchecked")
     public <T extends JsonRepresentation> RestfulResponse<T> executeT() {
         final RestfulResponse<JsonRepresentation> restfulResponse = execute();

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java?rev=1179398&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java Wed Oct  5 19:47:17 2011
@@ -0,0 +1,84 @@
+package org.apache.isis.viewer.json.applib;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.jmock.lib.legacy.ClassImposteriser;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Maps;
+
+public class RestfulRequestQueryParameterTest_valueOf {
+
+    private Map<String,String[]> parameterMap;
+
+    @Before
+    public void setUp() throws Exception {
+        parameterMap = Maps.newHashMap();
+    }
+    
+    @Test
+    public void mapContainsList() {
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        parameterMap.put("x-ro-follow-links", new String[]{"a", "b.c"});
+        List<List<String>> valueOf = queryParameter.valueOf(parameterMap);
+        
+        assertThat(valueOf.size(), is(2));
+        assertThat(valueOf.get(0).size(), is(1));
+        assertThat(valueOf.get(0).get(0), is("a"));
+        assertThat(valueOf.get(1).size(), is(2));
+        assertThat(valueOf.get(1).get(0), is("b"));
+        assertThat(valueOf.get(1).get(1), is("c"));
+    }
+
+    @Test
+    public void mapHasNoKey() {
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        parameterMap.put("something-else", new String[]{"a", "b.c"});
+        List<List<String>> valueOf = queryParameter.valueOf(parameterMap);
+        
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapIsEmpty() {
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        List<List<String>> valueOf = queryParameter.valueOf(parameterMap);
+        
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapIsNull() {
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        List<List<String>> valueOf = queryParameter.valueOf(null);
+        
+        assertThat(valueOf.size(), is(0));
+    }
+
+    @Test
+    public void mapContainsCommaSeparatedList() {
+        
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        parameterMap.put("x-ro-follow-links", new String[]{"a,b.c"});
+        List<List<String>> valueOf = queryParameter.valueOf(parameterMap);
+        
+        assertThat(valueOf.size(), is(2));
+        assertThat(valueOf.get(0).size(), is(1));
+        assertThat(valueOf.get(0).get(0), is("a"));
+        assertThat(valueOf.get(1).size(), is(2));
+        assertThat(valueOf.get(1).get(0), is("b"));
+        assertThat(valueOf.get(1).get(1), is("c"));
+    }
+
+
+
+}

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -1,36 +1,15 @@
 package org.apache.isis.viewer.json.tck.resources.home;
 
-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.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 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.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.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.blocks.Method;
 import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
 import org.apache.isis.viewer.json.applib.homepage.HomePageResource;
 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.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -51,11 +30,11 @@ public class HomePageResourceTest_xrofol
         resource = client.getHomePageResource();
     }
 
-    @Ignore("in progress")
     @Test
     public void xrofollowLinks() throws Exception {
 
-        final RestfulRequest request = client.createRequest(HttpMethod.GET, "/").withArg(QueryParameter.FOLLOW_LINKS, "user");
+        // TODO: this needs to be more generic
+        final RestfulRequest request = client.createRequest(HttpMethod.GET, "/").withArg(QueryParameter.FOLLOW_LINKS, "user,services");
         final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
         
         

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java Wed Oct  5 19:47:17 2011
@@ -19,6 +19,7 @@
 package org.apache.isis.viewer.json.viewer;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 
@@ -57,6 +58,7 @@ public class ResourceContext {
     private final AuthenticationSession authenticationSession;
     private final PersistenceSession persistenceSession;
     private final ObjectAdapterLookup objectAdapterLookup;
+    private List<List<String>> followLinks;
     
     private final static Predicate<MediaType> MEDIA_TYPE_NOT_GENERIC_APPLICATION_JSON = new Predicate<MediaType>() {
         @Override
@@ -72,14 +74,14 @@ public class ResourceContext {
     };
 
     public ResourceContext(
-            final HttpHeaders httpHeaders, final UriInfo uriInfo, final Request request,
-            final HttpServletRequest httpServletRequest, final HttpServletResponse httpServletResponse,
+            RepresentationType representationType, final HttpHeaders httpHeaders, final UriInfo uriInfo,
+            final Request request, final HttpServletRequest httpServletRequest,
+            final HttpServletResponse httpServletResponse, 
             final SecurityContext securityContext, 
             final OidStringifier oidStringifier, 
             final Localization localization, 
             final AuthenticationSession authenticationSession, 
-            final PersistenceSession persistenceSession, 
-            final ObjectAdapterLookup objectAdapterLookup) {
+            final PersistenceSession persistenceSession, final ObjectAdapterLookup objectAdapterLookup) {
 
         this.httpHeaders = httpHeaders;
         this.uriInfo = uriInfo;
@@ -92,9 +94,46 @@ public class ResourceContext {
         this.authenticationSession = authenticationSession;
         this.persistenceSession = persistenceSession;
         this.objectAdapterLookup = objectAdapterLookup;
+        
+        init(representationType);
     }
 
-    public void ensureCompatibleAcceptHeader(RepresentationType representationType) {
+    void init(RepresentationType representationType) {
+        ensureCompatibleAcceptHeader(representationType);
+        this.followLinks = Collections.unmodifiableList(getArg(QueryParameter.FOLLOW_LINKS));
+    }
+
+    public HttpHeaders getHttpHeaders() {
+        return httpHeaders;
+    }
+
+    public <Q> Q getArg(QueryParameter<Q> queryParameter) {
+        return queryParameter.valueOf(getHttpServletRequest().getParameterMap());
+    }
+
+
+    public UriInfo getUriInfo() {
+        return uriInfo;
+    }
+
+    public Request getRequest() {
+        return request;
+    }
+
+    public HttpServletRequest getHttpServletRequest() {
+        return httpServletRequest;
+    }
+
+    public HttpServletResponse getServletResponse() {
+        return httpServletResponse;
+    }
+
+    public SecurityContext getSecurityContext() {
+        return securityContext;
+    }
+
+
+    private void ensureCompatibleAcceptHeader(RepresentationType representationType) {
         if(representationType == null) {
             return;
         }
@@ -132,33 +171,8 @@ public class ResourceContext {
         return profile == null ? acceptedMediaType.isCompatible(producedMediaType) : acceptedMediaType.equals(producedMediaType);
     }
 
-    public HttpHeaders getHttpHeaders() {
-        return httpHeaders;
-    }
-
-    public <Q> Q getArg(QueryParameter<Q> queryParameter) {
-        return queryParameter.valueOf(getHttpServletRequest().getParameterMap());
-    }
-
-
-    public UriInfo getUriInfo() {
-        return uriInfo;
-    }
-
-    public Request getRequest() {
-        return request;
-    }
-
-    public HttpServletRequest getHttpServletRequest() {
-        return httpServletRequest;
-    }
-
-    public HttpServletResponse getServletResponse() {
-        return httpServletResponse;
-    }
-
-    public SecurityContext getSecurityContext() {
-        return securityContext;
+    public List<List<String>> getFollowLinks() {
+        return followLinks;
     }
 
     public String urlFor(String url) {

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.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/PathFollower.java?rev=1179398&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java Wed Oct  5 19:47:17 2011
@@ -0,0 +1,83 @@
+package org.apache.isis.viewer.json.viewer.representations;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Maps;
+
+public final class PathFollower {
+
+    public final static PathFollower initial(List<List<String>> followLinks) {
+        final Map<String, List<String>> map = Maps.newHashMap();
+        for (List<String> list : followLinks) {
+            int size = list.size();
+            if(size == 0) { continue; }
+            String path = list.get(0);
+            list.remove(0);
+            map.put(path, list);
+        }
+        return new PathFollower(map, null, Mode.FINDING_PATH);
+    }
+
+    public final static PathFollower following(List<String> links) {
+        return new PathFollower(null, links, Mode.FOLLOWING_PATH);
+    }
+
+    private static PathFollower terminated() {
+        return new PathFollower(null, null, Mode.TERMINATED);
+    }
+
+
+    private enum Mode {
+        FINDING_PATH,
+        FOLLOWING_PATH,
+        TERMINATED;
+    }
+
+    private final Map<String, List<String>> linkCandidatesByPath;
+    private final List<String> links;
+    private Mode mode;
+
+    private PathFollower(Map<String, List<String>> linkCandidatesByPath, List<String> links, Mode mode) {
+        this.linkCandidatesByPath = linkCandidatesByPath;
+        this.links = links;
+        this.mode = mode;
+    }
+
+    /**
+     * A little algebra...
+     */
+    public PathFollower follow(String path) {
+        if(path == null) {
+            return PathFollower.terminated();
+        }
+        if(mode == Mode.FINDING_PATH) {
+            List<String> remaining = linkCandidatesByPath.get(path);
+            if(remaining != null) {
+                return PathFollower.following(remaining);
+            } else {
+                return PathFollower.terminated();
+            }
+        }
+        if(mode == Mode.FOLLOWING_PATH) {
+            if(links.size() == 0) {
+                return PathFollower.terminated();
+            } else {
+                String firstPath = links.get(0);
+                if(Objects.equal(path, firstPath)) {
+                    List<String> remaining = links.subList(1, links.size());
+                    return PathFollower.following(remaining);
+                } else {
+                    return PathFollower.terminated();
+                }
+            }
+        }
+        return PathFollower.terminated();
+    }
+    
+    public boolean isTerminated() {
+        return mode == Mode.TERMINATED;
+    }
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.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/RendererFactory.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java Wed Oct  5 19:47:17 2011
@@ -8,6 +8,6 @@ public interface RendererFactory {
 
     RepresentationType getRepresentationType();
 
-    ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation);
+    ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation);
     
 }
\ 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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -13,21 +13,34 @@ import org.apache.isis.viewer.json.viewe
 public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>, T> implements ReprRenderer<R, T> {
 
     protected final ResourceContext resourceContext;
+    private final PathFollower pathFollower;
     private final RepresentationType representationType;
     protected final JsonRepresentation representation;
     
     protected boolean includesSelf;
 
-    public ReprRendererAbstract(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
+    public ReprRendererAbstract(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
         this.resourceContext = resourceContext;
+        this.pathFollower = asProvidedElseCreate(pathFollower);
         this.representationType = representationType;
         this.representation = representation;
     }
 
+    private PathFollower asProvidedElseCreate(PathFollower pathFollower) {
+        if(pathFollower != null) {
+            return pathFollower;
+        }
+        return PathFollower.initial(resourceContext.getFollowLinks());
+    }
+
     public ResourceContext getResourceContext() {
         return resourceContext;
     }
 
+    public PathFollower getPathFollower() {
+        return pathFollower;
+    }
+
     @Override
     public RepresentationType getRepresentationType() {
         return representationType;

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.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/ResourceAbstract.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java Wed Oct  5 19:47:17 2011
@@ -48,6 +48,7 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
+import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.util.JsonMapper;
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
@@ -110,11 +111,12 @@ public abstract class ResourceAbstract {
 
     private ResourceContext resourceContext;
 
+    
+
     protected void init(RepresentationType representationType) {
         this.resourceContext =
-            new ResourceContext(httpHeaders, uriInfo, request, httpServletRequest, httpServletResponse, securityContext, 
-                    getOidStringifier(), getLocalization(), getAuthenticationSession(), getPersistenceSession(), getAdapterManager());
-        resourceContext.ensureCompatibleAcceptHeader(representationType);
+            new ResourceContext(representationType, httpHeaders, uriInfo, request, httpServletRequest, httpServletResponse, 
+                    securityContext, getOidStringifier(), getLocalization(), getAuthenticationSession(), getPersistenceSession(), getAdapterManager());
     }
     
     protected ResourceContext getResourceContext() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.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/CapabilitiesReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -3,6 +3,7 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -15,13 +16,13 @@ public class CapabilitiesReprRenderer ex
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new CapabilitiesReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new CapabilitiesReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
     
-    private CapabilitiesReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private CapabilitiesReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
         includesSelf();
     }
 

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -52,7 +52,7 @@ public class CapabilitiesResourceServers
 
         final RendererFactory factory = rendererFactoryRegistry.find(representationType);
         final CapabilitiesReprRenderer renderer = 
-                (CapabilitiesReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (CapabilitiesReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.includesSelf();
         
         return responseOfOk(Caching.ONE_DAY, renderer).build();

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -24,6 +24,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 
 public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbstract<R, ObjectAndMember<T>>, T extends ObjectMember> 
@@ -36,8 +37,8 @@ public abstract class AbstractObjectMemb
     protected T objectMember;
 
 
-    public AbstractObjectMemberReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public AbstractObjectMemberReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
     
     @Override

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -33,6 +33,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RendererFactory;
 import org.apache.isis.viewer.json.viewer.representations.RendererFactoryRegistry;
@@ -51,8 +52,8 @@ public class DomainObjectReprRenderer ex
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new DomainObjectReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new DomainObjectReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
     
@@ -65,8 +66,8 @@ public class DomainObjectReprRenderer ex
     private ObjectAdapterLinkToBuilder linkToBuilder;
     private ObjectAdapter objectAdapter;
 
-    private DomainObjectReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private DomainObjectReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
         usingLinkToBuilder(new DomainObjectLinkToBuilder());
     }
 
@@ -135,7 +136,7 @@ public class DomainObjectReprRenderer ex
                 
                 RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_PROPERTY);
                 final ObjectPropertyReprRenderer renderer = 
-                        (ObjectPropertyReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                        (ObjectPropertyReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
                 
                 renderer.with(new ObjectAndProperty(objectAdapter, property))
                         .usingLinkToBuilder(linkToBuilder)
@@ -148,7 +149,7 @@ public class DomainObjectReprRenderer ex
 
                 RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_COLLECTION);
                 final ObjectCollectionReprRenderer renderer = 
-                        (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                        (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndCollection(objectAdapter, collection))
                     .usingLinkToBuilder(linkToBuilder)
@@ -175,7 +176,7 @@ public class DomainObjectReprRenderer ex
                 
                 RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_ACTION);
                 final ObjectActionReprRenderer renderer = 
-                        (ObjectActionReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                        (ObjectActionReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
                 
                 renderer.with(new ObjectAndAction(objectAdapter, action))
                         .usingLinkToBuilder(linkToBuilder)

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.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/DomainObjectResourceServerside.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.java Wed Oct  5 19:47:17 2011
@@ -75,7 +75,7 @@ public class DomainObjectResourceServers
                 rendererFactoryRegistry.find(representationType);
         
         final DomainObjectReprRenderer renderer = 
-                (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(objectAdapter);
         
         ResponseBuilder respBuilder = responseOfOk(Caching.NONE, renderer);
@@ -200,7 +200,7 @@ public class DomainObjectResourceServers
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_COLLECTION);
         final ObjectCollectionReprRenderer renderer = 
-                (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
 
         renderer.with(new ObjectAndCollection(objectAdapter, collection));
         

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.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/DomainResourceHelper.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.java Wed Oct  5 19:47:17 2011
@@ -86,7 +86,7 @@ public class DomainResourceHelper {
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_PROPERTY);
         final ObjectPropertyReprRenderer renderer = 
-                (ObjectPropertyReprRenderer) factory.newRenderer(resourceContext, JsonRepresentation.newMap());
+                (ObjectPropertyReprRenderer) factory.newRenderer(resourceContext, null, JsonRepresentation.newMap());
         
         renderer.with(new ObjectAndProperty(objectAdapter, property));
         
@@ -103,7 +103,7 @@ public class DomainResourceHelper {
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_ACTION);
         final ObjectActionReprRenderer renderer = 
-                (ObjectActionReprRenderer) factory.newRenderer(resourceContext, JsonRepresentation.newMap());
+                (ObjectActionReprRenderer) factory.newRenderer(resourceContext, null, JsonRepresentation.newMap());
         
         renderer.with(new ObjectAndAction(serviceAdapter, action))
                 .withSelf()
@@ -238,7 +238,7 @@ public class DomainResourceHelper {
                     .collection(returnedAdapter);
 
             final RendererFactory factory = rendererFactoryRegistry.find(RepresentationType.LIST);
-            final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(resourceContext, representation);
+            final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(resourceContext, null, representation);
             renderer.with(collectionAdapters);
             
             return ResourceAbstract.responseOfOk(Caching.NONE, renderer).build();
@@ -250,13 +250,13 @@ public class DomainResourceHelper {
             
             final RendererFactory factory = rendererFactoryRegistry.find(RepresentationType.SCALAR_VALUE);
 
-            ScalarValueReprRenderer renderer = (ScalarValueReprRenderer) factory.newRenderer(resourceContext, representation);
+            ScalarValueReprRenderer renderer = (ScalarValueReprRenderer) factory.newRenderer(resourceContext, null, representation);
             renderer.with(objectAdapter);
             return ResourceAbstract.responseOfOk(Caching.NONE, renderer).build();
         }
 
         final RendererFactory factory = rendererFactoryRegistry.find(RepresentationType.DOMAIN_OBJECT);
-        final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) factory.newRenderer(resourceContext, representation);
+        final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) factory.newRenderer(resourceContext, null, representation);
         renderer.with(returnedAdapter);
         
         ResponseBuilder respBuilder = ResourceAbstract.responseOfOk(Caching.NONE, renderer);

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=1179398&r1=1179397&r2=1179398&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 Wed Oct  5 19:47:17 2011
@@ -55,7 +55,7 @@ public class DomainServiceResourceServer
 
         final RendererFactory factory = RendererFactoryRegistry.instance.find(representationType);
         
-        final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+        final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.usingLinkToBuilder(new DomainServiceLinkToBuilder())
                 .withSelf("services")
                 .with(serviceAdapters);
@@ -80,7 +80,7 @@ public class DomainServiceResourceServer
         
         final RendererFactory factory = rendererFactoryRegistry.find(representationType);
         final DomainObjectReprRenderer renderer = 
-                (DomainObjectReprRenderer) factory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (DomainObjectReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.usingLinkToBuilder(new DomainServiceLinkToBuilder())
                     .includesSelf()
                     .with(serviceAdapter);

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.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/ListReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -22,6 +22,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -34,15 +35,15 @@ public class ListReprRenderer extends Re
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new ListReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new ListReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
     private ObjectAdapterLinkToBuilder objectAdapterLinkToBuilder;
 
-    private ListReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private ListReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
         usingLinkToBuilder(new DomainObjectLinkToBuilder());
     }
     

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.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/ObjectActionReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -26,6 +26,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
 import org.apache.isis.viewer.json.viewer.resources.domaintypes.DomainTypeReprRenderer;
@@ -43,17 +44,15 @@ public class ObjectActionReprRenderer ex
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new ObjectActionReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new ObjectActionReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
-
-    private ObjectActionReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private ObjectActionReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
-
     public JsonRepresentation render() {
         putId();
         putMemberType();

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionReprRenderer.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/ObjectCollectionReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -26,6 +26,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -43,13 +44,13 @@ public class ObjectCollectionReprRendere
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new ObjectCollectionReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new ObjectCollectionReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
-    private ObjectCollectionReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private ObjectCollectionReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
     
     public JsonRepresentation render() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyReprRenderer.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/ObjectPropertyReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -25,6 +25,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
 import org.apache.isis.viewer.json.viewer.resources.domaintypes.DomainTypeReprRenderer;
@@ -41,14 +42,14 @@ public class ObjectPropertyReprRenderer 
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new ObjectPropertyReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new ObjectPropertyReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
     
 
-    private ObjectPropertyReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private ObjectPropertyReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     public JsonRepresentation render() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarValueReprRenderer.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/ScalarValueReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarValueReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarValueReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -23,6 +23,7 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -35,13 +36,13 @@ public class ScalarValueReprRenderer ext
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new ScalarValueReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new ScalarValueReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
-    private ScalarValueReprRenderer(final ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private ScalarValueReprRenderer(final ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     public ScalarValueReprRenderer with(final ObjectAdapter objectAdapter) {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeFeatureReprBuilder.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/domaintypes/AbstractTypeFeatureReprBuilder.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeFeatureReprBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeFeatureReprBuilder.java Wed Oct  5 19:47:17 2011
@@ -22,6 +22,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 import org.apache.isis.viewer.json.viewer.resources.domainobjects.MemberType;
@@ -32,8 +33,8 @@ public abstract class AbstractTypeFeatur
     protected MemberType memberType;
     protected T objectFeature;
 
-    public AbstractTypeFeatureReprBuilder(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public AbstractTypeFeatureReprBuilder(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     public ObjectSpecification getObjectSpecification() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeReprRenderer.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/domaintypes/DomainTypeReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -20,6 +20,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
@@ -33,8 +34,8 @@ public class DomainTypeReprRenderer exte
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new DomainTypeReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new DomainTypeReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
@@ -46,8 +47,8 @@ public class DomainTypeReprRenderer exte
 
     private ObjectSpecification objectSpecification;
 
-    public DomainTypeReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public DomainTypeReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     @Override

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.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/domaintypes/DomainTypeResourceServerside.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java Wed Oct  5 19:47:17 2011
@@ -63,7 +63,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
         
         final DomainTypesReprRenderer renderer = 
-                (DomainTypesReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (DomainTypesReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(allSpecifications).includesSelf();
         
         return responseOfOk(Caching.ONE_DAY, renderer).build();
@@ -83,7 +83,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
 
         final DomainTypeReprRenderer renderer = 
-                (DomainTypeReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (DomainTypeReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(objectSpec).includesSelf();
 
         return responseOfOk(Caching.ONE_DAY, renderer).build();
@@ -113,7 +113,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
         
         final TypePropertyReprRenderer renderer = 
-                (TypePropertyReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (TypePropertyReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(new SpecAndProperty(objectSpec, property)).includesSelf();
 
         return responseOfOk(Caching.ONE_DAY, renderer).build();
@@ -143,7 +143,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
         
         final TypeCollectionReprRenderer renderer = 
-                (TypeCollectionReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (TypeCollectionReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(new SpecAndCollection(objectSpec, collection)).includesSelf();
 
         return responseOfOk(Caching.ONE_DAY, renderer).build();
@@ -173,7 +173,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
         
         final TypeActionReprRenderer renderer = 
-                (TypeActionReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (TypeActionReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(new SpecAndAction(objectSpec, action)).includesSelf();
 
         return responseOfOk(Caching.ONE_DAY, renderer).build();
@@ -206,7 +206,7 @@ public class DomainTypeResourceServersid
                 rendererFactoryRegistry.find(representationType);
         
         final TypeActionParamReprRenderer renderer = 
-                (TypeActionParamReprRenderer) rendererFactory.newRenderer(getResourceContext(), JsonRepresentation.newMap());
+                (TypeActionParamReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.with(new SpecAndActionParam(objectSpec, actionParam)).includesSelf();
 
         return responseOfOk(Caching.ONE_DAY, renderer).build();

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypesReprRenderer.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/domaintypes/DomainTypesReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypesReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypesReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -6,6 +6,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
@@ -21,13 +22,13 @@ public class DomainTypesReprRenderer ext
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new DomainTypesReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new DomainTypesReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
-    private DomainTypesReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    private DomainTypesReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     @Override

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionParamReprRenderer.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/domaintypes/TypeActionParamReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionParamReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionParamReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -22,6 +22,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -35,8 +36,8 @@ public class TypeActionParamReprRenderer
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new TypeActionParamReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new TypeActionParamReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
@@ -49,8 +50,8 @@ public class TypeActionParamReprRenderer
         return LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.TYPE_ACTION_PARAMETER, url);
     }
 
-    public TypeActionParamReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public TypeActionParamReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionReprRenderer.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/domaintypes/TypeActionReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -21,6 +21,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -34,8 +35,8 @@ public class TypeActionReprRenderer exte
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new TypeActionReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new TypeActionReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
@@ -46,8 +47,8 @@ public class TypeActionReprRenderer exte
         return LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.TYPE_ACTION, url);
     }
 
-    public TypeActionReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public TypeActionReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeCollectionReprRenderer.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/domaintypes/TypeCollectionReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeCollectionReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeCollectionReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -21,6 +21,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -34,8 +35,8 @@ public class TypeCollectionReprRenderer 
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new TypeCollectionReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new TypeCollectionReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
@@ -46,8 +47,8 @@ public class TypeCollectionReprRenderer 
         return LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.TYPE_COLLECTION, url);
     }
 
-    public TypeCollectionReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public TypeCollectionReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     public JsonRepresentation render() {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypePropertyReprRenderer.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/domaintypes/TypePropertyReprRenderer.java?rev=1179398&r1=1179397&r2=1179398&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypePropertyReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypePropertyReprRenderer.java Wed Oct  5 19:47:17 2011
@@ -21,6 +21,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.PathFollower;
 import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -34,8 +35,8 @@ public class TypePropertyReprRenderer ex
         }
 
         @Override
-        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, JsonRepresentation representation) {
-            return new TypePropertyReprRenderer(resourceContext, getRepresentationType(), representation);
+        public ReprRenderer<?,?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
+            return new TypePropertyReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
         }
     }
 
@@ -46,8 +47,8 @@ public class TypePropertyReprRenderer ex
         return LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.TYPE_PROPERTY, url);
     }
 
-    public TypePropertyReprRenderer(ResourceContext resourceContext, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, representationType, representation);
+    public TypePropertyReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, pathFollower, representationType, representation);
     }
 
     public JsonRepresentation render() {