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 2015/11/29 13:22:50 UTC

[2/2] isis git commit: ISIS-1273: refactored RepresentationService impl ...

ISIS-1273: refactored RepresentationService impl ...

... as a default fallback impl of ContentNegotiationService


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

Branch: refs/heads/master
Commit: 587a8bd622c9511389b92102c4308f6dd0dfabab
Parents: 651fb1b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Nov 29 12:22:24 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Nov 29 12:22:41 2015 +0000

----------------------------------------------------------------------
 .../src/main/asciidoc/documentation.adoc        |   3 +
 .../rendering/RendererContext.java              |  18 +-
 .../rendering/RendererContext4.java             |   3 +-
 .../rendering/RendererContext5.java             |   4 +-
 .../rendering/RendererContext6.java             |  33 +++
 .../ObjectAndActionInvocation.java              |  12 +-
 .../domainobjects/ObjectAndCollection2.java     |  39 +++
 .../domainobjects/ObjectAndProperty2.java       |  36 +++
 ...NegotiationServiceForRestfulObjectsV1_0.java | 173 +++++++++++++
 .../service/RepresentationService.java          |  38 +--
 .../RepresentationServiceForRestfulObjects.java | 255 +++++++------------
 .../conneg/ContentNegotiationService.java       |   2 -
 .../restfulobjects/server/ResourceContext.java  |  19 +-
 .../DomainObjectResourceServerside.java         |  73 +++---
 .../server/resources/DomainResourceHelper.java  |  44 ++--
 .../DomainServiceResourceServerside.java        |  41 ++-
 .../resources/DomainTypeResourceServerside.java |  19 +-
 .../resources/HomePageResourceServerside.java   |   3 +-
 .../server/resources/ResourceAbstract.java      |  20 +-
 .../resources/UserResourceServerside.java       |   5 +-
 .../resources/VersionResourceServerside.java    |   3 +-
 ...ontextTest_ensureCompatibleAcceptHeader.java |   2 +-
 .../server/ResourceContextTest_getArg.java      |   4 +-
 23 files changed, 565 insertions(+), 284 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/adocs/documentation/src/main/asciidoc/documentation.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/documentation.adoc b/adocs/documentation/src/main/asciidoc/documentation.adoc
index 88b25e5..4ef5b1c 100644
--- a/adocs/documentation/src/main/asciidoc/documentation.adoc
+++ b/adocs/documentation/src/main/asciidoc/documentation.adoc
@@ -144,6 +144,9 @@ tools (not ASF):
 * link:release-notes.html[Release Notes]
 * link:migration-notes.html[Migration Notes]
 
+*Get involved!*
+
+* Our link:https://issues.apache.org/jira/secure/RapidBoard.jspa?rapidView=87[*Kanban board*] maps out the JIRA issues we are looking to tackle in the next few releases
 
 |====
 

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
index 3ee6991..7477085 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext.java
@@ -32,25 +32,25 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjec
 
 public interface RendererContext {
 
-    public String urlFor(final String url);
+    String urlFor(final String url);
 
-    public AuthenticationSession getAuthenticationSession();
+    AuthenticationSession getAuthenticationSession();
 
-    public IsisConfiguration getConfiguration();
+    IsisConfiguration getConfiguration();
     
-    public PersistenceSession getPersistenceSession();
+    PersistenceSession getPersistenceSession();
 
     /**
      * @deprecated - replaced by {@link #getPersistenceSession()}.
      */
     @Deprecated
-    public AdapterManager getAdapterManager();
+    AdapterManager getAdapterManager();
 
-    public Where getWhere();
+    Where getWhere();
 
-    public List<List<String>> getFollowLinks();
+    List<List<String>> getFollowLinks();
 
-    public Localization getLocalization();
+    Localization getLocalization();
 
     boolean honorUiHints();
 
@@ -71,6 +71,6 @@ public interface RendererContext {
      * @param objectAdapter - the object proposed to be rendered eagerly 
      * @return whether this adapter has already been rendered (implying the caller should not render the value).
      */
-    public boolean canEagerlyRender(ObjectAdapter objectAdapter);
+    boolean canEagerlyRender(ObjectAdapter objectAdapter);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext4.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext4.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext4.java
index f8ffe58..129f1a0 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext4.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext4.java
@@ -19,13 +19,12 @@
 package org.apache.isis.viewer.restfulobjects.rendering;
 
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.runtime.system.DeploymentType;
 
 /**
  * TODO: roll-up in the future (introduced only so that API does not break)
  */
 public interface RendererContext4 extends RendererContext3 {
 
-    public InteractionInitiatedBy getInteractionInitiatedBy();
+    InteractionInitiatedBy getInteractionInitiatedBy();
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
index 76b8b95..8233ea9 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoader;
  */
 public interface RendererContext5 extends RendererContext4 {
 
-    public SpecificationLoader getSpecificationLoader();
-    public ServicesInjector getServicesInjector();
+    SpecificationLoader getSpecificationLoader();
+    ServicesInjector getServicesInjector();
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext6.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext6.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext6.java
new file mode 100644
index 0000000..febbaed
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext6.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering;
+
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
+
+/**
+ * TODO: roll-up in the future (introduced only so that API does not break)
+ */
+public interface RendererContext6 extends RendererContext5 {
+
+    /**
+     * Applies only when rendering a domain object.
+     */
+    RepresentationService.Intent getIntent();
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
index 10795a2..a8c16fb 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
@@ -28,12 +28,19 @@ public class ObjectAndActionInvocation {
     private final ObjectAction action;
     private final JsonRepresentation arguments;
     private final ObjectAdapter returnedAdapter;
+    private final ActionResultReprRenderer.SelfLink selfLink;
 
-    public ObjectAndActionInvocation(final ObjectAdapter objectAdapter, final ObjectAction action, final JsonRepresentation arguments, final ObjectAdapter returnedAdapter) {
+    public ObjectAndActionInvocation(
+            final ObjectAdapter objectAdapter,
+            final ObjectAction action,
+            final JsonRepresentation arguments,
+            final ObjectAdapter returnedAdapter,
+            final ActionResultReprRenderer.SelfLink selfLink) {
         this.objectAdapter = objectAdapter;
         this.action = action;
         this.arguments = arguments;
         this.returnedAdapter = returnedAdapter;
+        this.selfLink = selfLink;
     }
 
     public ObjectAdapter getObjectAdapter() {
@@ -52,4 +59,7 @@ public class ObjectAndActionInvocation {
         return returnedAdapter;
     }
 
+    public ActionResultReprRenderer.SelfLink getSelfLink() {
+        return selfLink;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndCollection2.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndCollection2.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndCollection2.java
new file mode 100644
index 0000000..3666609
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndCollection2.java
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+
+public class ObjectAndCollection2 extends ObjectAndCollection {
+
+    private final MemberReprMode memberReprMode;
+
+    public ObjectAndCollection2(
+            final ObjectAdapter objectAdapter,
+            final OneToManyAssociation collection,
+            final MemberReprMode memberReprMode) {
+        super(objectAdapter, collection);
+        this.memberReprMode = memberReprMode;
+    }
+
+    public MemberReprMode getMemberReprMode() {
+        return memberReprMode;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndProperty2.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndProperty2.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndProperty2.java
new file mode 100644
index 0000000..a827402
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndProperty2.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+
+public class ObjectAndProperty2 extends ObjectAndProperty {
+
+    private final MemberReprMode memberReprMode;
+
+    public ObjectAndProperty2(final ObjectAdapter objectAdapter, final OneToOneAssociation property, final MemberReprMode memberReprMode) {
+        super(objectAdapter, property);
+        this.memberReprMode = memberReprMode;
+    }
+
+    public MemberReprMode getMemberReprMode() {
+        return memberReprMode;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/ContentNegotiationServiceForRestfulObjectsV1_0.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/ContentNegotiationServiceForRestfulObjectsV1_0.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/ContentNegotiationServiceForRestfulObjectsV1_0.java
new file mode 100644
index 0000000..b6e218a
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/ContentNegotiationServiceForRestfulObjectsV1_0.java
@@ -0,0 +1,173 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering.service;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.rendering.Caching;
+import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectActionReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndAction;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndActionInvocation;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndCollection;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndCollection2;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty2;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectCollectionReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectPropertyReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationService;
+
+@DomainService(
+        nature = NatureOfService.DOMAIN
+)
+@DomainServiceLayout(
+        menuOrder = "" + Integer.MAX_VALUE // default
+)
+public class ContentNegotiationServiceForRestfulObjectsV1_0 implements ContentNegotiationService {
+
+    private static final DateFormat ETAG_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+
+    @PostConstruct
+    public void init(final Map<String, String> properties) {
+
+    }
+
+    @PreDestroy
+    public void shutdown() {
+    }
+
+    @Override
+    public ResponseBuilder buildResponse(
+            final RepresentationService.Context2 renderContext2,
+            final ObjectAdapter objectAdapter) {
+
+        final DomainObjectReprRenderer renderer =
+                new DomainObjectReprRenderer(renderContext2, null, JsonRepresentation.newMap());
+        renderer.with(objectAdapter).includesSelf();
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+
+        if(renderContext2 instanceof RepresentationService.Context6) {
+            final RepresentationService.Context6 context6 = (RepresentationService.Context6) renderContext2;
+            final RepresentationService.Intent intent = context6.getIntent();
+            if(intent == RepresentationService.Intent.JUST_CREATED) {
+                responseBuilder.status(Response.Status.CREATED);
+            }
+        }
+
+        final Version version = objectAdapter.getVersion();
+        if (version != null && version.getTime() != null) {
+            responseBuilder.tag(ETAG_FORMAT.format(version.getTime()));
+        }
+
+        return responseBuilder(responseBuilder);
+    }
+
+    @Override
+    public ResponseBuilder buildResponse(
+            final RepresentationService.Context2 renderContext2,
+            final ObjectAndProperty objectAndProperty) {
+
+        final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(renderContext2);
+        renderer.with(objectAndProperty)
+                .usingLinkTo(renderContext2.getAdapterLinkTo());
+
+        if(objectAndProperty instanceof ObjectAndProperty2) {
+            final ObjectAndProperty2 objectAndProperty2 = (ObjectAndProperty2) objectAndProperty;
+            renderer
+                .withMemberMode(objectAndProperty2.getMemberReprMode());
+
+        }
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+        return responseBuilder;
+    }
+
+    @Override
+    public ResponseBuilder buildResponse(
+            final RepresentationService.Context2 renderContext2,
+            final ObjectAndCollection objectAndCollection) {
+
+        final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(renderContext2);
+        renderer.with(objectAndCollection)
+                .usingLinkTo(renderContext2.getAdapterLinkTo());
+
+        if(objectAndCollection instanceof ObjectAndCollection2) {
+            final ObjectAndCollection2 objectAndCollection2 = (ObjectAndCollection2) objectAndCollection;
+
+            renderer.withMemberMode(objectAndCollection2.getMemberReprMode());
+        }
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+
+        return responseBuilder(responseBuilder);
+    }
+
+    @Override
+    public ResponseBuilder buildResponse(
+            final RepresentationService.Context2 renderContext2,
+            final ObjectAndAction objectAndAction) {
+
+        final ObjectActionReprRenderer renderer = new ObjectActionReprRenderer(renderContext2);
+        renderer.with(objectAndAction)
+                .usingLinkTo(renderContext2.getAdapterLinkTo())
+                .asStandalone();
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+
+        return responseBuilder(responseBuilder);
+    }
+
+    @Override
+    public ResponseBuilder buildResponse(
+            final RepresentationService.Context2 renderContext2,
+            final ObjectAndActionInvocation objectAndActionInvocation) {
+
+        final ActionResultReprRenderer renderer = new ActionResultReprRenderer(renderContext2, objectAndActionInvocation.getSelfLink());
+        renderer.with(objectAndActionInvocation)
+                .using(renderContext2.getAdapterLinkTo());
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+        Responses.addLastModifiedAndETagIfAvailable(responseBuilder, objectAndActionInvocation.getObjectAdapter().getVersion());
+
+        return responseBuilder(responseBuilder);
+    }
+
+    /**
+     * For easy subclassing to further customize, eg additional headers
+     */
+    protected ResponseBuilder responseBuilder(final ResponseBuilder responseBuilder) {
+        return responseBuilder;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
index 30fa1b7..1f2e720 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
@@ -20,15 +20,12 @@ import javax.ws.rs.core.Response;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext2;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext3;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext4;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext5;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext6;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberReprMode;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAdapterLinkTo;
@@ -47,15 +44,23 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndPr
  */
 public interface RepresentationService {
 
-    public enum Intent {
+    /**
+     * As returned by {@link RendererContext6#getIntent()}, applies only to the representation of
+     * domain objects.
+     */
+    enum Intent {
         /**
-         * ie return a 201
+         * object just created, ie return a 201
          */
         JUST_CREATED,
         /**
-         * ie return a 200
+         * object already persistent, ie return a 200
+         */
+        ALREADY_PERSISTENT,
+        /**
+         * representation is not of a domain object, so does not apply.
          */
-        ALREADY_PERSISTENT
+        NOT_APPLICABLE
     }
 
     /**
@@ -96,20 +101,17 @@ public interface RepresentationService {
             ObjectAndActionInvocation objectAndActionInvocation,
             ActionResultReprRenderer.SelfLink selfLink);
 
-    public static interface Context extends RendererContext {
+    interface Context extends RendererContext {
         ObjectAdapterLinkTo getAdapterLinkTo();
     }
-    public static interface Context2 extends Context, RendererContext2 {
-        ObjectAdapterLinkTo getAdapterLinkTo();
+    interface Context2 extends Context, RendererContext2 {
+    }
+    interface Context3 extends Context2, RendererContext3 {
     }
-    public static interface Context3 extends Context2, RendererContext3 {
-        DeploymentType getDeploymentType();
+    interface Context4 extends Context3, RendererContext4 {
     }
-    public static interface Context4 extends Context3, RendererContext4 {
-        InteractionInitiatedBy getInteractionInitiatedBy();
+    interface Context5 extends Context4, RendererContext5 {
     }
-    public static interface Context5 extends Context4, RendererContext5 {
-        public SpecificationLoader getSpecificationLoader();
-        public ServicesInjector getServicesInjector();
+    interface Context6 extends Context5, RendererContext6 {
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java
index 7ca8374..4beba01 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java
@@ -16,32 +16,26 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.service;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.List;
+import java.util.Map;
 
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
+import com.google.common.base.Function;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.rendering.Caching;
-import org.apache.isis.viewer.restfulobjects.rendering.Responses;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer.SelfLink;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberReprMode;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectActionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndAction;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndActionInvocation;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndCollection;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectCollectionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectPropertyReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNegotiationService;
 
 @DomainService(
@@ -49,67 +43,44 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.ContentNeg
 )
 public class RepresentationServiceForRestfulObjects implements RepresentationService {
 
-    private static final DateFormat ETAG_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
 
-    // //////////////////////////////////////////////////////////////
-    // objectRepresentation
-    // //////////////////////////////////////////////////////////////
+    @PostConstruct
+    public void init(final Map<String, String> properties) {
+
+    }
+
 
     @Override
     @Programmatic
     public Response objectRepresentation(
             final Context rendererContext,
             final ObjectAdapter objectAdapter) {
-        return objectRepresentation(rendererContext, objectAdapter, Intent.ALREADY_PERSISTENT);
+
+        final Context2 renderContext2 = asContext2(rendererContext);
+        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
+            @Override
+            public ResponseBuilder apply(final ContentNegotiationService connegService) {
+                return connegService.buildResponse(renderContext2, objectAdapter);
+            }
+        });
+
+        assertContentNegotiationServiceHandled(responseBuilder);
+        return buildResponse(responseBuilder);
     }
 
+    /**
+     * @deprecated - use {@link #objectRepresentation(Context, ObjectAdapter, Intent)}
+     */
+    @Deprecated
     @Override
     @Programmatic
     public Response objectRepresentation(
             final Context rendererContext,
             final ObjectAdapter objectAdapter,
-            final Intent intent) {
-
-        ResponseBuilder responseBuilder = null;
-
-        if(rendererContext instanceof Context2) {
-            final Context2 renderContext2 = (Context2) rendererContext;
-
-            final List<ContentNegotiationService> contentNegotiationServices =
-                    lookupService(renderContext2, ContentNegotiationService.class);
-            for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
-                responseBuilder = contentNegotiationService.buildResponse(renderContext2, objectAdapter);
-                if(responseBuilder != null) {
-                    break;
-                }
-            }
-        }
-
-        if (responseBuilder == null) {
-            // fall through
-            final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(rendererContext, null, JsonRepresentation.newMap());
-
-            renderer.with(objectAdapter).includesSelf();
-
-            responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-
-            final Version version = objectAdapter.getVersion();
-            if (version != null && version.getTime() != null) {
-                responseBuilder.tag(ETAG_FORMAT.format(version.getTime()));
-            }
-        }
-
-        if(intent == Intent.JUST_CREATED) {
-            responseBuilder.status(Response.Status.CREATED);
-        }
-
-        return buildResponse(responseBuilder);
+            final Intent unused) {
+        return objectRepresentation(rendererContext, objectAdapter);
     }
 
-    // //////////////////////////////////////////////////////////////
-    // propertyDetails
-    // //////////////////////////////////////////////////////////////
-
 
     @Override
     @Programmatic
@@ -118,38 +89,18 @@ public class RepresentationServiceForRestfulObjects implements RepresentationSer
             final ObjectAndProperty objectAndProperty,
             final MemberReprMode memberReprMode) {
 
-        ResponseBuilder responseBuilder = null;
-
-        if(rendererContext instanceof Context2) {
-            final Context2 renderContext2 = (Context2) rendererContext;
-
-            final List<ContentNegotiationService> contentNegotiationServices =
-                    lookupService(renderContext2, ContentNegotiationService.class);
-            for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
-                responseBuilder = contentNegotiationService.buildResponse(renderContext2, objectAndProperty);
-                if(responseBuilder != null) {
-                    break;
-                }
+        final Context2 renderContext2 = asContext2(rendererContext);
+        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
+            @Override
+            public ResponseBuilder apply(final ContentNegotiationService connegService) {
+                return connegService.buildResponse(renderContext2, objectAndProperty);
             }
-        }
-
-        if(responseBuilder == null) {
-            // fall through
-
-            final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(rendererContext);
-            renderer.with(objectAndProperty)
-                    .usingLinkTo(rendererContext.getAdapterLinkTo())
-                    .withMemberMode(memberReprMode);
-
-            responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-        }
+        });
 
+        assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
     }
 
-    // //////////////////////////////////////////////////////////////
-    // collectionDetails
-    // //////////////////////////////////////////////////////////////
 
     @Override
     @Programmatic
@@ -158,38 +109,20 @@ public class RepresentationServiceForRestfulObjects implements RepresentationSer
             final ObjectAndCollection objectAndCollection,
             final MemberReprMode memberReprMode) {
 
-        ResponseBuilder responseBuilder = null;
-
-        if(rendererContext instanceof Context2) {
-            final Context2 renderContext2 = (Context2) rendererContext;
-
-            final List<ContentNegotiationService> contentNegotiationServices =
-                    lookupService(renderContext2, ContentNegotiationService.class);
-            for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
-                responseBuilder = contentNegotiationService.buildResponse(renderContext2, objectAndCollection);
-                if(responseBuilder != null) {
-                    break;
-                }
+        final Context2 renderContext2 = asContext2(rendererContext);
+        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
+            @Override
+            public ResponseBuilder apply(final ContentNegotiationService connegService) {
+                return connegService.buildResponse(renderContext2, objectAndCollection);
             }
-        }
-
-        if(responseBuilder == null) {
-            // fall through
-            final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(rendererContext);
-            renderer.with(objectAndCollection)
-                    .usingLinkTo(rendererContext.getAdapterLinkTo())
-                    .withMemberMode(memberReprMode);
-
-            responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-        }
-
+        });
 
+        assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
     }
 
-    // //////////////////////////////////////////////////////////////
-    // action Prompt
-    // //////////////////////////////////////////////////////////////
+
+
 
     @Override
     @Programmatic
@@ -197,38 +130,18 @@ public class RepresentationServiceForRestfulObjects implements RepresentationSer
             final Context rendererContext,
             final ObjectAndAction objectAndAction) {
 
-        ResponseBuilder responseBuilder = null;
-
-        if(rendererContext instanceof Context2) {
-            final Context2 renderContext2 = (Context2) rendererContext;
-
-            final List<ContentNegotiationService> contentNegotiationServices =
-                    lookupService(renderContext2, ContentNegotiationService.class);
-            for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
-                responseBuilder = contentNegotiationService.buildResponse(renderContext2, objectAndAction);
-                if(responseBuilder != null) {
-                    break;
-                }
+        final Context2 renderContext2 = asContext2(rendererContext);
+        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
+            @Override
+            public ResponseBuilder apply(final ContentNegotiationService connegService) {
+                return connegService.buildResponse(renderContext2, objectAndAction);
             }
-        }
-
-        if(responseBuilder == null) {
-            // fall through
-            final ObjectActionReprRenderer renderer = new ObjectActionReprRenderer(rendererContext);
-            renderer.with(objectAndAction)
-                    .usingLinkTo(rendererContext.getAdapterLinkTo())
-                    .asStandalone();
-
-            responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-        }
-
+        });
 
+        assertContentNegotiationServiceHandled(responseBuilder);
         return buildResponse(responseBuilder);
     }
 
-    // //////////////////////////////////////////////////////////////
-    // action Result
-    // //////////////////////////////////////////////////////////////
 
     @Override
     @Programmatic
@@ -237,43 +150,65 @@ public class RepresentationServiceForRestfulObjects implements RepresentationSer
             final ObjectAndActionInvocation objectAndActionInvocation,
             final SelfLink selfLink) {
 
-        ResponseBuilder responseBuilder = null;
+        final Context2 renderContext2 = asContext2(rendererContext);
+        final ResponseBuilder responseBuilder = buildResponse(new Function<ContentNegotiationService, ResponseBuilder>() {
+            @Override
+            public ResponseBuilder apply(final ContentNegotiationService connegService) {
+                return connegService.buildResponse(renderContext2, objectAndActionInvocation);
+            }
+        });
 
-        if(rendererContext instanceof Context2) {
-            final Context2 renderContext2 = (Context2) rendererContext;
+        assertContentNegotiationServiceHandled(responseBuilder);
+        return buildResponse(responseBuilder);
+    }
 
-            final List<ContentNegotiationService> contentNegotiationServices =
-                    lookupService(renderContext2, ContentNegotiationService.class);
-            for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
-                responseBuilder = contentNegotiationService.buildResponse(renderContext2, objectAndActionInvocation);
-                if(responseBuilder != null) {
-                    break;
-                }
-            }
+    private Context2 asContext2(final Context rendererContext) {
+        if (rendererContext instanceof Context2) {
+            final Context2 context = (Context2) rendererContext;
+            return context;
         }
+        throw new IllegalArgumentException(String.format(
+                "The %s requires that the context to implement %s",
+                RepresentationServiceForRestfulObjects.class.getSimpleName(), Context2.class.getName()));
+    }
 
+    void assertContentNegotiationServiceHandled(final ResponseBuilder responseBuilder) {
         if (responseBuilder == null) {
-            // fall through
-            final ActionResultReprRenderer renderer = new ActionResultReprRenderer(rendererContext, selfLink);
-            renderer.with(objectAndActionInvocation)
-                    .using(rendererContext.getAdapterLinkTo());
-
-            responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-            Responses.addLastModifiedAndETagIfAvailable(responseBuilder, objectAndActionInvocation.getObjectAdapter().getVersion());
+            throw new IllegalStateException("Could not locate " + ContentNegotiationService.class.getSimpleName() + " to handle request");
         }
-
-        return buildResponse(responseBuilder);
     }
 
-    protected <T> List<T> lookupService(final Context2 renderContext2, final Class<T> serviceClass) {
-        return renderContext2.getPersistenceSession().getServicesInjector().lookupServices(serviceClass);
+    /**
+     * Iterates over all {@link #contentNegotiationServices injected} {@link ContentNegotiationService}s to find one
+     * that returns a {@link ResponseBuilder} using the provided function.
+     *
+     * <p>
+     *     There will always be at least one such service, namely the
+     *     {@link ContentNegotiationServiceForRestfulObjectsV1_0}.
+     * </p>
+     *
+     * @param connegServiceBuildResponse - the function to ask of the {@link ContentNegotiationService}.
+     */
+    ResponseBuilder buildResponse(
+            final Function<ContentNegotiationService, ResponseBuilder> connegServiceBuildResponse) {
+        ResponseBuilder responseBuilder = null;
+        for (final ContentNegotiationService contentNegotiationService : contentNegotiationServices) {
+            responseBuilder = connegServiceBuildResponse.apply(contentNegotiationService);
+            if(responseBuilder != null) {
+                return responseBuilder;
+            }
+        }
+        return null;
     }
 
     /**
-     * Overridable to allow further customization.
+     * Overriddable to allow further customization.
      */
     protected Response buildResponse(final ResponseBuilder responseBuilder) {
         return responseBuilder.build();
     }
 
+
+    @Inject
+    List<ContentNegotiationService> contentNegotiationServices;
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationService.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationService.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationService.java
index f6b1352..dcce78c 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationService.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationService.java
@@ -34,11 +34,9 @@ import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationSer
 
 public interface ContentNegotiationService {
 
-    @Programmatic
     @PostConstruct
     public void init(Map<String, String> properties);
 
-    @Programmatic
     @PreDestroy
     public void shutdown();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index 149d638..f739491 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -52,11 +52,12 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererContext5;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext6;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
-public class ResourceContext implements RendererContext5 {
+public class ResourceContext implements RendererContext6 {
 
     private final HttpHeaders httpHeaders;
     private final UriInfo uriInfo;
@@ -77,6 +78,7 @@ public class ResourceContext implements RendererContext5 {
     private List<List<String>> followLinks;
 
     private final Where where;
+    private final RepresentationService.Intent intent;
     private final InteractionInitiatedBy interactionInitiatedBy;
     private final String urlUnencodedQueryString;
 
@@ -91,6 +93,7 @@ public class ResourceContext implements RendererContext5 {
             final UriInfo uriInfo,
             final Request request,
             final Where where,
+            final RepresentationService.Intent intent,
             final String urlUnencodedQueryStringIfAny,
             final HttpServletRequest httpServletRequest,
             final HttpServletResponse httpServletResponse,
@@ -108,6 +111,8 @@ public class ResourceContext implements RendererContext5 {
         this.providers = providers;
         this.uriInfo = uriInfo;
         this.request = request;
+        this.where = where;
+        this.intent = intent;
         this.urlUnencodedQueryString = urlUnencodedQueryStringIfAny;
         this.httpServletRequest = httpServletRequest;
         this.httpServletResponse = httpServletResponse;
@@ -118,7 +123,6 @@ public class ResourceContext implements RendererContext5 {
         this.authenticationSession = authenticationSession;
         this.persistenceSession = persistenceSession;
         this.specificationLoader = specificationLoader;
-        this.where = where;
         this.deploymentType = deploymentType;
         this.interactionInitiatedBy = interactionInitiatedBy;
 
@@ -330,6 +334,14 @@ public class ResourceContext implements RendererContext5 {
         return where;
     }
 
+    /**
+     * Only applies to rendering of objects
+     * @return
+     */
+    @Override
+    public RepresentationService.Intent getIntent() {
+        return intent;
+    }
 
     //region > canEagerlyRender
     private Set<Oid> rendered = Sets.newHashSet();
@@ -400,5 +412,4 @@ public class ResourceContext implements RendererContext5 {
         return getUriInfo().getBaseUri().toString() + url;
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
index 75691d9..8948555 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainObjectResourceServerside.java
@@ -68,7 +68,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     })
     public Response persist(@PathParam("domainType") String domainType, final InputStream object) {
 
-        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS);
+        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.JUST_CREATED);
 
         final String objectStr = Util.asStringUtf8(object);
         final JsonRepresentation objectRepr = Util.readAsMap(objectStr);
@@ -100,7 +100,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         }
         getResourceContext().getPersistenceSession().makePersistentInTransaction(objectAdapter);
 
-        return getDomainResourceHelper(objectAdapter).objectRepresentation(RepresentationService.Intent.JUST_CREATED);
+        return newDomainResourceHelper(objectAdapter).objectRepresentation(RepresentationService.Intent.JUST_CREATED);
     }
 
 
@@ -118,15 +118,11 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response object(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId) {
-        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS);
+        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
 
-        return getDomainResourceHelper(objectAdapter).objectRepresentation();
-    }
-
-    private DomainResourceHelper getDomainResourceHelper(final ObjectAdapter objectAdapter) {
-        return new DomainResourceHelper(getResourceContext(), objectAdapter);
+        return newDomainResourceHelper(objectAdapter).objectRepresentation();
     }
 
 
@@ -141,7 +137,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     @PrettyPrinting
     public Response object(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, final InputStream object) {
 
-        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS);
+        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT);
 
         final String objectStr = Util.asStringUtf8(object);
         final JsonRepresentation argRepr = Util.readAsMap(objectStr);
@@ -161,7 +157,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             throw RestfulObjectsApplicationException.createWithBody(HttpStatusCode.BAD_REQUEST, argRepr, validity.getReason());
         }
 
-        return getDomainResourceHelper(objectAdapter).objectRepresentation();
+        return newDomainResourceHelper(objectAdapter).objectRepresentation();
     }
 
     @Override
@@ -188,10 +184,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response propertyDetails(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) {
-        init(RepresentationType.OBJECT_PROPERTY, Where.OBJECT_FORMS);
+        init(RepresentationType.OBJECT_PROPERTY, Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
 
         return helper.propertyDetails(
                 propertyId,
@@ -208,10 +204,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response modifyProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId, final InputStream body) {
-        init(Where.OBJECT_FORMS);
+        init(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
         final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter);
 
         final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(propertyId,
@@ -245,10 +241,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response clearProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId) {
-        init(Where.OBJECT_FORMS);
+        init(Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
         final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter);
 
         final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(
@@ -286,11 +282,11 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response accessCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId) {
-        init(RepresentationType.OBJECT_COLLECTION, Where.PARENTED_TABLES);
+        init(RepresentationType.OBJECT_COLLECTION, Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
 
-        return getDomainResourceHelper(objectAdapter).collectionDetails(collectionId, MemberReprMode.READ);
+        return newDomainResourceHelper(objectAdapter).collectionDetails(collectionId, MemberReprMode.READ);
     }
 
     @Override
@@ -302,10 +298,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response addToSet(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream body) {
-        init(Where.PARENTED_TABLES);
+        init(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
         final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter);
 
         final OneToManyAssociation collection = accessHelper.getCollectionThatIsVisibleForIntent(
@@ -339,10 +335,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response addToList(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream body) {
-        init(Where.PARENTED_TABLES);
+        init(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
         final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter);
 
         final OneToManyAssociation collection = accessHelper.getCollectionThatIsVisibleForIntent(
@@ -376,10 +372,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_XML_ERROR
     })
     public Response removeFromCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId) {
-        init(Where.PARENTED_TABLES);
+        init(Where.PARENTED_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
         final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(getResourceContext(), objectAdapter);
 
         final OneToManyAssociation collection = accessHelper.getCollectionThatIsVisibleForIntent(
@@ -413,10 +409,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response actionPrompt(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId) {
-        init(RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS);
+        init(RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
 
         return helper.actionPrompt(actionId);
     }
@@ -456,12 +452,12 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             final @QueryParam("x-isis-querystring") String xIsisUrlEncodedQueryString) {
 
         final String urlUnencodedQueryString = UrlEncodingUtils.urlDecodeNullSafe(xIsisUrlEncodedQueryString != null? xIsisUrlEncodedQueryString: httpServletRequest.getQueryString());
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, urlUnencodedQueryString);
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE, urlUnencodedQueryString);
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
 
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
 
         return helper.invokeActionQueryOnly(actionId, arguments);
     }
@@ -481,12 +477,12 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             final @PathParam("actionId") String actionId,
             final InputStream body) {
 
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, body);
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE, body);
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
         
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
 
         return helper.invokeActionIdempotent(actionId, arguments);
     }
@@ -500,13 +496,18 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
             MediaType.APPLICATION_XML, RestfulMediaType.APPLICATION_XML_ACTION_RESULT, RestfulMediaType.APPLICATION_XML_ERROR
     })
     @PrettyPrinting
-    public Response invokeAction(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId, final InputStream body) {
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, body);
+    public Response invokeAction(
+            @PathParam("domainType") String domainType,
+            @PathParam("instanceId") final String instanceId,
+            @PathParam("actionId") final String actionId,
+            final InputStream body) {
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE,
+                body);
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
         
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
-        final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
+        final DomainResourceHelper helper = newDomainResourceHelper(objectAdapter);
 
         return helper.invokeAction(actionId, arguments);
     }
@@ -516,4 +517,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.METHOD_NOT_ALLOWED, "Deleting an action invocation resource is not allowed.");
     }
 
+
+    private DomainResourceHelper newDomainResourceHelper(final ObjectAdapter objectAdapter) {
+        return new DomainResourceHelper(getResourceContext(), objectAdapter);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
index da73995..abc56ef 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelper.java
@@ -38,7 +38,7 @@ import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererContext5;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext6;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectLinkTo;
@@ -47,22 +47,24 @@ import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAdapt
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndAction;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndActionInvocation;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndCollection;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAndProperty2;
 import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
 
 public class DomainResourceHelper {
 
-    static class RepresentationServiceContextAdapter implements RepresentationService.Context5 {
+    static class RepresentationServiceContextAdapter implements RepresentationService.Context6 {
 
-        private final RendererContext5 rendererContext;
+        private final RendererContext6 rendererContext;
         private final ObjectAdapterLinkTo adapterLinkTo;
+        private RepresentationService.Intent intent;
 
         RepresentationServiceContextAdapter(
-                final RendererContext5 rendererContext,
+                final RendererContext6 rendererContext,
                 final ObjectAdapterLinkTo adapterLinkTo) {
             this.rendererContext = rendererContext;
             this.adapterLinkTo = adapterLinkTo;
+            this.intent = rendererContext.getIntent();
         }
 
         @Override
@@ -179,28 +181,34 @@ public class DomainResourceHelper {
         public ServicesInjector getServicesInjector() {
             return rendererContext.getServicesInjector();
         }
+
+        @Override
+        public RepresentationService.Intent getIntent() {
+            return intent;
+        }
     }
 
+    private final RepresentationServiceContextAdapter representationServiceContext;
     private final RepresentationService representationService;
-    private RepresentationServiceContextAdapter representationServiceContext;
 
     public DomainResourceHelper(final ResourceContext resourceContext, final ObjectAdapter objectAdapter) {
-        this.resourceContext = resourceContext;
-        this.objectAdapter = objectAdapter;
-
-        using(new DomainObjectLinkTo());
-
-        representationService = lookupService(RepresentationService.class);
+        this(resourceContext, objectAdapter, new DomainObjectLinkTo());
     }
 
-    public DomainResourceHelper using(final ObjectAdapterLinkTo adapterLinkTo) {
+    public DomainResourceHelper(
+            final ResourceContext resourceContext,
+            final ObjectAdapter objectAdapter,
+            final ObjectAdapterLinkTo adapterLinkTo) {
+
+        this.resourceContext = resourceContext;
+        this.objectAdapter = objectAdapter;
 
         representationServiceContext = new RepresentationServiceContextAdapter(resourceContext, adapterLinkTo);
 
-        adapterLinkTo.usingUrlBase(resourceContext)
-                     .with(objectAdapter);
+        adapterLinkTo.usingUrlBase(this.resourceContext)
+                     .with(this.objectAdapter);
 
-        return this;
+        representationService = lookupService(RepresentationService.class);
     }
 
     private final ResourceContext resourceContext;
@@ -245,7 +253,7 @@ public class DomainResourceHelper {
 
         final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(propertyId, ObjectAdapterAccessHelper.Intent.ACCESS);
 
-        return representationService.propertyDetails(representationServiceContext, new ObjectAndProperty(objectAdapter, property), memberMode);
+        return representationService.propertyDetails(representationServiceContext, new ObjectAndProperty2(objectAdapter, property, memberMode), memberMode);
     }
 
 
@@ -359,7 +367,7 @@ public class DomainResourceHelper {
         final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray2, InteractionInitiatedBy.USER);
 
         final ObjectAndActionInvocation objectAndActionInvocation =
-                new ObjectAndActionInvocation(this.objectAdapter, action, arguments, returnedAdapter);
+                new ObjectAndActionInvocation(objectAdapter, action, arguments, returnedAdapter, selfLink);
 
         // response
         return representationService.actionResult(representationServiceContext, objectAndActionInvocation, selfLink);

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
index 62c1268..4fcad7f 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainServiceResourceServerside.java
@@ -18,12 +18,22 @@ package org.apache.isis.viewer.restfulobjects.server.resources;
 
 import java.io.InputStream;
 import java.util.List;
-import javax.ws.rs.*;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.url.UrlEncodingUtils;
@@ -37,9 +47,10 @@ import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainServiceResource;
 import org.apache.isis.viewer.restfulobjects.rendering.Caching;
 import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainServiceLinkTo;
-import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.rendering.service.conneg.PrettyPrinting;
 
 @Path("/services")
@@ -66,7 +77,7 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
     @Path("/")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_ERROR })
     public Response services() {
-        init(RepresentationType.LIST, Where.STANDALONE_TABLES);
+        init(RepresentationType.LIST, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE);
 
         final List<ObjectAdapter> serviceAdapters =
                 Lists.newArrayList(
@@ -109,7 +120,7 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response service(@PathParam("serviceId") final String serviceId) {
-        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS);
+        init(RepresentationType.DOMAIN_OBJECT, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT);
 
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
 
@@ -150,10 +161,10 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response actionPrompt(@PathParam("serviceId") final String serviceId, @PathParam("actionId") final String actionId) {
-        init(RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS);
+        init(RepresentationType.OBJECT_ACTION, Where.OBJECT_FORMS, RepresentationService.Intent.ALREADY_PERSISTENT);
 
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+        final DomainResourceHelper helper = newDomainResourceHelper(serviceAdapter);
 
         return helper.actionPrompt(actionId);
     }
@@ -192,13 +203,13 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
 
 
         final String urlUnencodedQueryString = UrlEncodingUtils.urlDecodeNullSafe(xIsisUrlEncodedQueryString != null? xIsisUrlEncodedQueryString: httpServletRequest.getQueryString());
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, urlUnencodedQueryString);
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE, urlUnencodedQueryString);
 
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
         
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+        final DomainResourceHelper helper = newDomainResourceHelper(serviceAdapter);
 
         return helper.invokeActionQueryOnly(actionId, arguments);
     }
@@ -217,17 +228,16 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
             final @PathParam("serviceId") String serviceId,
             final @PathParam("actionId") String actionId,
             final InputStream body) {
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, body);
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE, body);
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
         
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+        final DomainResourceHelper helper = newDomainResourceHelper(serviceAdapter);
 
         return helper.invokeActionIdempotent(actionId, arguments);
     }
 
-
     @Override
     @POST
     @Path("/{serviceId}/actions/{actionId}/invoke")
@@ -238,12 +248,12 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
     })
     @PrettyPrinting
     public Response invokeAction(@PathParam("serviceId") final String serviceId, @PathParam("actionId") final String actionId, final InputStream body) {
-        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, body);
+        init(RepresentationType.ACTION_RESULT, Where.STANDALONE_TABLES, RepresentationService.Intent.NOT_APPLICABLE, body);
 
         final JsonRepresentation arguments = getResourceContext().getQueryStringAsJsonRepr();
         
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+        final DomainResourceHelper helper = newDomainResourceHelper(serviceAdapter);
 
         return helper.invokeAction(actionId, arguments);
     }
@@ -253,4 +263,9 @@ public class DomainServiceResourceServerside extends ResourceAbstract implements
         throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.METHOD_NOT_ALLOWED, "Deleting an action invocation resource is not allowed.");
     }
 
+    private DomainResourceHelper newDomainResourceHelper(final ObjectAdapter serviceAdapter) {
+        return new DomainResourceHelper(getResourceContext(), serviceAdapter, new DomainServiceLinkTo());
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
index 1135ba9..885bc54 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainTypeResourceServerside.java
@@ -48,6 +48,7 @@ import org.apache.isis.viewer.restfulobjects.applib.util.UrlEncodingUtils;
 import org.apache.isis.viewer.restfulobjects.rendering.Caching;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.ActionDescriptionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.ActionParameterDescriptionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.CollectionDescriptionReprRenderer;
@@ -59,7 +60,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.ParentSpecAnd
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.PropertyDescriptionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.TypeActionResultReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.TypeListReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.server.util.UrlParserUtils;
 
@@ -77,7 +78,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_TYPE_LIST })
     public Response domainTypes() {
         final RepresentationType representationType = RepresentationType.TYPE_LIST;
-        init(representationType, Where.ANYWHERE);
+        init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
 
@@ -93,7 +94,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_TYPE })
     public Response domainType(@PathParam("domainType") final String domainType) {
 
-        init(RepresentationType.DOMAIN_TYPE, Where.ANYWHERE);
+        init(RepresentationType.DOMAIN_TYPE, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectSpecification objectSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType));
 
@@ -109,7 +110,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_PROPERTY_DESCRIPTION })
     public Response typeProperty(@PathParam("domainType") final String domainType, @PathParam("propertyId") final String propertyId) {
         final RepresentationType representationType = RepresentationType.PROPERTY_DESCRIPTION;
-        init(representationType, Where.ANYWHERE);
+        init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectSpecification parentSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType));
         if (parentSpec == null) {
@@ -134,7 +135,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_COLLECTION_DESCRIPTION })
     public Response typeCollection(@PathParam("domainType") final String domainType, @PathParam("collectionId") final String collectionId) {
         final RepresentationType representationType = RepresentationType.COLLECTION_DESCRIPTION;
-        init(representationType, Where.ANYWHERE);
+        init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectSpecification parentSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType));
         if (parentSpec == null) {
@@ -159,7 +160,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_DESCRIPTION })
     public Response typeAction(@PathParam("domainType") final String domainType, @PathParam("actionId") final String actionId) {
         final RepresentationType representationType = RepresentationType.ACTION_DESCRIPTION;
-        init(representationType, Where.ANYWHERE);
+        init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectSpecification parentSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType));
         if (parentSpec == null) {
@@ -184,7 +185,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_PARAMETER_DESCRIPTION })
     public Response typeActionParam(@PathParam("domainType") final String domainType, @PathParam("actionId") final String actionId, @PathParam("paramName") final String paramName) {
         final RepresentationType representationType = RepresentationType.ACTION_PARAMETER_DESCRIPTION;
-        init(representationType, Where.ANYWHERE);
+        init(representationType, Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final ObjectSpecification parentSpec = getSpecificationLoader().lookupBySpecId(ObjectSpecId.of(domainType));
         if (parentSpec == null) {
@@ -218,7 +219,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             @QueryParam("supertype") final String superTypeStr, // simple style
             @QueryParam("args") final String argsUrlEncoded // formal style
             ) {
-        init(Where.ANYWHERE);
+        init(Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final String supertype = domainTypeFor(superTypeStr, argsUrlEncoded, "supertype");
 
@@ -249,7 +250,7 @@ public class DomainTypeResourceServerside extends ResourceAbstract implements Do
             @QueryParam("args") final String argsUrlEncoded // formal style
             ) {
 
-        init(Where.ANYWHERE);
+        init(Where.ANYWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final String subtype = domainTypeFor(subTypeStr, argsUrlEncoded, "subtype");
 

http://git-wip-us.apache.org/repos/asf/isis/blob/587a8bd6/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageResourceServerside.java
index 675acff..e0519b8 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/HomePageResourceServerside.java
@@ -34,13 +34,14 @@ import org.apache.isis.viewer.restfulobjects.applib.homepage.HomePageResource;
 import org.apache.isis.viewer.restfulobjects.rendering.Caching;
 import org.apache.isis.viewer.restfulobjects.rendering.Responses;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 
 public class HomePageResourceServerside extends ResourceAbstract implements HomePageResource {
 
     @Override
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_HOME_PAGE })
     public Response homePage() {
-        init(RepresentationType.HOME_PAGE, Where.NOWHERE);
+        init(RepresentationType.HOME_PAGE, Where.NOWHERE, RepresentationService.Intent.NOT_APPLICABLE);
 
         final HomePageReprRenderer renderer = new HomePageReprRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.includesSelf();