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 2014/10/09 13:23:21 UTC

[1/4] git commit: ISIS-917: first cut at a pluggable representations service for RO.

Repository: isis
Updated Branches:
  refs/heads/ISIS-917 bfece661b -> 6907534b4


ISIS-917: first cut at a pluggable representations service for RO.

Fix for NPE when app runs (previous commit lied), tests still failing.


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

Branch: refs/heads/ISIS-917
Commit: 064c42e921a3fafbc5d83960b4e31e3715d0aa3c
Parents: bfece66
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Oct 8 12:06:31 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Oct 8 12:06:31 2014 +0100

----------------------------------------------------------------------
 .../server/resources/ResponseGeneratorService.java               | 4 ----
 1 file changed, 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/064c42e9/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
index 796f537..dcddc6d 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
@@ -58,11 +58,7 @@ public class ResponseGeneratorService {
 
         final ResourceContext resourceContext = responseContext.getResourceContext();
         final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
 
-        resourceContext.canEagerlyRender(null);
         final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(resourceContext, null, JsonRepresentation.newMap());
         renderer.with(objectAdapter).includesSelf();
 


[4/4] git commit: ISIS-917: further refactorings to simplify the API of the (newly rechristened) RepresentationService.

Posted by da...@apache.org.
ISIS-917: further refactorings to simplify the API of the (newly rechristened) RepresentationService.


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

Branch: refs/heads/ISIS-917
Commit: 6907534b421daa083cd5b96b9a0a476e64c2e8e9
Parents: 9af7833
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Oct 9 12:23:14 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Oct 9 12:23:14 2014 +0100

----------------------------------------------------------------------
 .../ServicesInstallerFromAnnotation.java        |   3 +-
 .../AbstractObjectMemberRepresentation.java     |   2 +-
 .../restfulobjects/rendering/Caching.java       |  43 +++
 .../rendering/HasHttpStatusCode.java            |  26 ++
 .../rendering/RendererContext.java              |  10 +-
 .../restfulobjects/rendering/Responses.java     |  64 +++++
 .../RestfulObjectsApplicationException.java     |  69 +++++
 .../AbstractObjectMemberReprRenderer.java       |   9 +
 .../domainobjects/ActionResultReprRenderer.java |   4 +
 .../rendering/domainobjects/MemberReprMode.java |  29 ++
 .../domainobjects/ObjectActionReprRenderer.java |  13 +-
 .../ObjectCollectionReprRenderer.java           |  17 +-
 .../ObjectPropertyReprRenderer.java             |  12 +-
 .../service/RepresentationService.java          |  61 +++++
 .../RepresentationServiceForRestfulObjects.java | 146 ++++++++++
 .../rendering/util/JsonWriterUtil.java          |  41 +++
 .../restfulobjects/rendering/util/Util.java     | 107 ++++++++
 .../server/HasHttpStatusCode.java               |  26 --
 .../restfulobjects/server/ResourceContext.java  |   8 +-
 .../RestfulObjectsApplicationException.java     |  56 +---
 ...estfulObjectsApplicationExceptionMapper.java |   2 +
 .../DomainObjectResourceServerside.java         |  27 +-
 .../server/resources/DomainResourceHelper.java  | 235 +++++++++++++---
 .../DomainServiceResourceServerside.java        |   4 +-
 .../resources/DomainTypeResourceServerside.java |   5 +-
 .../resources/HomePageResourceServerside.java   |   4 +-
 .../server/resources/JsonParserHelper.java      |  54 ++--
 .../server/resources/ObjectActionArgHelper.java |  12 +-
 .../resources/ObjectAdapterAccessHelper.java    |  39 +--
 .../server/resources/ResourceAbstract.java      |  54 +---
 .../resources/ResponseGeneratorService.java     | 269 -------------------
 .../server/resources/Responses.java             |  64 -----
 .../resources/UserResourceServerside.java       |   4 +-
 .../restfulobjects/server/resources/Util.java   | 124 ---------
 .../resources/VersionResourceServerside.java    |   4 +-
 .../server/util/NOTUSED_PathUtils.java          |  40 +++
 .../restfulobjects/server/util/OidUtils.java    |  19 +-
 .../restfulobjects/server/util/PathUtils.java   |  40 ---
 .../server/util/UrlParserUtils.java             |  20 +-
 ...ontextTest_ensureCompatibleAcceptHeader.java |   1 +
 ...ulObjectsApplicationExceptionMapperTest.java |   1 +
 .../DomainResourceHelperTest_readBodyAsMap.java |   3 +-
 .../server/resources/JsonParserHelpTest.java    |  36 +++
 .../server/util/UrlParserUtilsTest.java         |  13 +-
 .../webapp/CustomRepresentationService.java     |  32 +++
 .../webapp/CustomResponseGeneratorService.java  |  32 ---
 .../src/main/webapp/WEB-INF/isis.properties     |   2 +-
 47 files changed, 1080 insertions(+), 806 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index e325c06..8b2400b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -64,8 +64,7 @@ public class ServicesInstallerFromAnnotation extends InstallerAbstract implement
                                          ",org.apache.isis.core.metamodel.services" +
                                          ",org.apache.isis.core.runtime.services" +
                                          ",org.apache.isis.objectstore.jdo.applib.service" +
-                                         ",org.apache.isis.viewer.restfulobjects.server.resources" +
-                                         ",org.apache.isis.viewer.restfulobjects.rendering.eventserializer" +
+                                         ",org.apache.isis.viewer.restfulobjects.rendering.service" +
                                          ",org.apache.isis.objectstore.jdo.datanucleus.service.support" +
                                          ",org.apache.isis.objectstore.jdo.datanucleus.service.eventbus";
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/AbstractObjectMemberRepresentation.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/AbstractObjectMemberRepresentation.java b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/AbstractObjectMemberRepresentation.java
index d2de410..fc0c74f 100644
--- a/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/AbstractObjectMemberRepresentation.java
+++ b/core/viewer-restfulobjects-applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/AbstractObjectMemberRepresentation.java
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.viewer.restfulobjects.applib.domainobjects;
 
-import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
 import org.codehaus.jackson.JsonNode;
+import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
 
 public abstract class AbstractObjectMemberRepresentation extends DomainRepresentation {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Caching.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Caching.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Caching.java
new file mode 100644
index 0000000..345861d
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Caching.java
@@ -0,0 +1,43 @@
+/*
+ *  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 javax.ws.rs.core.CacheControl;
+
+public enum Caching {
+
+    ONE_DAY(24 * 60 * 60),
+    ONE_HOUR(60 * 60),
+    NONE(0);
+
+    private final CacheControl cacheControl;
+
+    Caching(final int maxAge) {
+        this.cacheControl = new CacheControl();
+        if (maxAge > 0) {
+            cacheControl.setMaxAge(maxAge);
+        } else {
+            cacheControl.setNoCache(true);
+        }
+    }
+
+    public CacheControl getCacheControl() {
+        return cacheControl;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/HasHttpStatusCode.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/HasHttpStatusCode.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/HasHttpStatusCode.java
new file mode 100644
index 0000000..cb35092
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/HasHttpStatusCode.java
@@ -0,0 +1,26 @@
+/*
+ *  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.applib.client.RestfulResponse.HttpStatusCode;
+
+public interface HasHttpStatusCode {
+
+    HttpStatusCode getHttpStatusCode();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 6b8a7f5..6af0f9f 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
@@ -19,14 +19,12 @@
 package org.apache.isis.viewer.restfulobjects.rendering;
 
 import java.util.List;
-
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
 
@@ -38,13 +36,11 @@ public interface RendererContext {
     
     public IsisConfiguration getConfiguration();
     
-    public AdapterManager getAdapterManager();
-
     public PersistenceSession getPersistenceSession();
-    
-    public List<List<String>> getFollowLinks();
-    
+
     public Where getWhere();
+
+    public List<List<String>> getFollowLinks();
     
     public Localization getLocalization();
     

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java
new file mode 100644
index 0000000..e4420c1
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/Responses.java
@@ -0,0 +1,64 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restfulobjects.rendering;
+
+import java.util.Date;
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.rendering.util.JsonWriterUtil;
+
+public final class Responses {
+
+    private Responses(){}
+
+    public static Response.ResponseBuilder ofNoContent() {
+        return of(RestfulResponse.HttpStatusCode.NO_CONTENT);
+    }
+
+    public static Response.ResponseBuilder ofOk(final ReprRenderer<?, ?> renderer, final Caching caching) {
+        return ofOk(renderer, caching, null);
+    }
+
+    public static Response.ResponseBuilder ofOk(final ReprRenderer<?, ?> renderer, final Caching caching, final Version version) {
+        final MediaType mediaType = renderer.getMediaType();
+        final Response.ResponseBuilder response = of(RestfulResponse.HttpStatusCode.OK).type(mediaType).cacheControl(caching.getCacheControl()).entity(JsonWriterUtil.jsonFor(renderer.render()));
+        return addLastModifiedAndETagIfAvailable(response, version);
+    }
+
+    protected static Response.ResponseBuilder of(final RestfulResponse.HttpStatusCode httpStatusCode) {
+        return Response.status(httpStatusCode.getJaxrsStatusType()).type(MediaType.APPLICATION_JSON_TYPE);
+    }
+
+    public static Response.ResponseBuilder addLastModifiedAndETagIfAvailable(final Response.ResponseBuilder responseBuilder, final Version version) {
+        if (version != null && version.getTime() != null) {
+            final Date time = version.getTime();
+            responseBuilder.lastModified(time);
+            responseBuilder.tag(asETag(time));
+        }
+        return responseBuilder;
+    }
+
+    private static EntityTag asETag(final Date time) {
+        final String utcTime = ISODateTimeFormat.basicDateTime().print(new DateTime(time));
+        return new EntityTag(utcTime, true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RestfulObjectsApplicationException.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RestfulObjectsApplicationException.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RestfulObjectsApplicationException.java
new file mode 100644
index 0000000..77e3765
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RestfulObjectsApplicationException.java
@@ -0,0 +1,69 @@
+/*
+ *  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.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
+
+public class RestfulObjectsApplicationException extends RuntimeException implements HasHttpStatusCode {
+
+    public static final RestfulObjectsApplicationException create(final HttpStatusCode httpStatusCode) {
+        return createWithCause(httpStatusCode, null);
+    }
+
+    public static RestfulObjectsApplicationException createWithMessage(final HttpStatusCode httpStatusCode, final String message, final Object... args) {
+        return createWithCauseAndMessage(httpStatusCode, (Exception) null, message, args);
+    }
+
+    public static RestfulObjectsApplicationException createWithCause(final HttpStatusCode httpStatusCode, final Exception cause) {
+        return createWithCauseAndMessage(httpStatusCode, cause, null);
+    }
+
+    public static RestfulObjectsApplicationException createWithCauseAndMessage(final HttpStatusCode httpStatusCode, final Exception cause, final String message, final Object... args) {
+        return new RestfulObjectsApplicationException(httpStatusCode, formatString(message, args), cause, null);
+    }
+
+    public static RestfulObjectsApplicationException createWithBody(final HttpStatusCode httpStatusCode, final JsonRepresentation body, final String message, final Object... args) {
+        return new RestfulObjectsApplicationException(httpStatusCode, formatString(message, args), null, body);
+    }
+
+    private static String formatString(final String formatStr, final Object... args) {
+        return formatStr != null ? String.format(formatStr, args) : null;
+    }
+
+    private static final long serialVersionUID = 1L;
+    private final HttpStatusCode httpStatusCode;
+    private final JsonRepresentation body;
+
+    protected RestfulObjectsApplicationException(final HttpStatusCode httpStatusCode, final String message, final Throwable cause, final JsonRepresentation body) {
+        super(message, cause);
+        this.httpStatusCode = httpStatusCode;
+        this.body = body;
+    }
+
+    @Override
+    public HttpStatusCode getHttpStatusCode() {
+        return httpStatusCode;
+    }
+
+    public JsonRepresentation getBody() {
+        return body;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index c2d2622..d7f187c 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -33,6 +33,7 @@ import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
 
 public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbstract<R, ObjectAndMember<T>>, T extends ObjectMember> extends ReprRendererAbstract<R, ObjectAndMember<T>> {
 
+
     protected enum Mode {
         INLINE, FOLLOWED, STANDALONE, MUTATED, ARGUMENTS, EVENT_SERIALIZATION;
 
@@ -179,6 +180,14 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
         }
     }
 
+    public void withMemberMode(MemberReprMode memberMode) {
+        if(memberMode == MemberReprMode.WRITE) {
+            this.asMutated();
+        } else {
+            this.asStandalone();
+        }
+    }
+
     private void addLinkToSelf() {
         getLinks().arrayAdd(linkTo.memberBuilder(Rel.SELF, objectMemberType, objectMember).build());
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
index e5df49a..dabdf02 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
@@ -50,6 +50,10 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
         INCLUDED, EXCLUDED
     }
 
+    public ActionResultReprRenderer(final RendererContext rendererContext, final SelfLink selfLink) {
+        this(rendererContext, null, selfLink, JsonRepresentation.newMap());
+    }
+
     public ActionResultReprRenderer(final RendererContext rendererContext, final LinkFollowSpecs linkFollower, final SelfLink selfLink, final JsonRepresentation representation) {
         super(rendererContext, linkFollower, RepresentationType.ACTION_RESULT, representation);
         this.selfLink = selfLink;

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberReprMode.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberReprMode.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberReprMode.java
new file mode 100644
index 0000000..aa90aa0
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/MemberReprMode.java
@@ -0,0 +1,29 @@
+/*
+ *  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;
+
+/**
+ * Some representations may vary according to whether the member is to be represented for read
+ * (render the state of the property or collection) or for write (render additional hypermedia controls to allow
+ * the property to be modified/cleared, or the collection to be added to/removed from).
+*/
+public enum MemberReprMode {
+    READ,
+    WRITE;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
index 187c448..84d512d 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
@@ -18,7 +18,9 @@ package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.List;
 import java.util.Map;
-
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.codehaus.jackson.node.NullNode;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -32,13 +34,12 @@ import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.ActionDescriptionReprRenderer;
 
-import org.codehaus.jackson.node.NullNode;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
 public class ObjectActionReprRenderer extends AbstractObjectMemberReprRenderer<ObjectActionReprRenderer, ObjectAction> {
 
+    public ObjectActionReprRenderer(RendererContext rendererContext) {
+        this(rendererContext, null, null, JsonRepresentation.newMap());
+    }
+
     public ObjectActionReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollowSpecs, String actionId, final JsonRepresentation representation) {
         super(resourceContext, linkFollowSpecs, actionId, RepresentationType.OBJECT_ACTION, representation, Where.OBJECT_FORMS);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
index 4639386..7f09c09 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
@@ -18,7 +18,7 @@ package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.List;
 import java.util.Map;
-
+import com.google.common.collect.Lists;
 import org.apache.isis.applib.annotation.Render.Type;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -34,12 +34,19 @@ import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.CollectionDescriptionReprRenderer;
 
-import com.google.common.collect.Lists;
-
 public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRenderer<ObjectCollectionReprRenderer, OneToManyAssociation> {
 
-    public ObjectCollectionReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final String collectionId, final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, collectionId, RepresentationType.OBJECT_COLLECTION, representation, Where.PARENTED_TABLES);
+    public ObjectCollectionReprRenderer(
+            final RendererContext resourceContext) {
+        this(resourceContext, null, null, JsonRepresentation.newMap());
+    }
+
+    public ObjectCollectionReprRenderer(
+            final RendererContext resourceContext,
+            final LinkFollowSpecs linkFollowSpecs,
+            final String collectionId,
+            final JsonRepresentation representation) {
+        super(resourceContext, linkFollowSpecs, collectionId, RepresentationType.OBJECT_COLLECTION, representation, Where.PARENTED_TABLES);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index f59181e..09e329f 100644
--- a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -41,7 +41,16 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.PropertyDescr
 
 public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer<ObjectPropertyReprRenderer, OneToOneAssociation> {
 
-    public ObjectPropertyReprRenderer(final RendererContext resourceContext, final LinkFollowSpecs linkFollower, final String propertyId, final JsonRepresentation representation) {
+    public ObjectPropertyReprRenderer(
+            final RendererContext resourceContext) {
+        this(resourceContext, null, null, JsonRepresentation.newMap());
+    }
+
+    public ObjectPropertyReprRenderer(
+            final RendererContext resourceContext,
+            final LinkFollowSpecs linkFollower,
+            final String propertyId,
+            final JsonRepresentation representation) {
         super(resourceContext, linkFollower, propertyId, RepresentationType.OBJECT_PROPERTY, representation, Where.OBJECT_FORMS);
     }
 
@@ -211,4 +220,5 @@ public class ObjectPropertyReprRenderer extends AbstractObjectMemberReprRenderer
         // none
     }
 
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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
new file mode 100644
index 0000000..0362160
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationService.java
@@ -0,0 +1,61 @@
+/**
+ *  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 javax.ws.rs.core.Response;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.*;
+
+/**
+ * This interface is EXPERIMENTAL and may change in the future.
+ */
+public interface RepresentationService {
+
+    @Programmatic
+    Response objectRepresentation(
+            Context resourceContext,
+            ObjectAdapter objectAdapter);
+
+    @Programmatic
+    Response propertyDetails(
+            Context rendererContext,
+            ObjectAndProperty objectAndProperty,
+            MemberReprMode memberReprMode);
+
+    @Programmatic
+    Response collectionDetails(
+            Context rendererContext,
+            ObjectAndCollection objectAndCollection,
+            MemberReprMode memberReprMode);
+
+    @Programmatic
+    Response actionPrompt(
+            Context rendererContext,
+            ObjectAndAction objectAndAction);
+
+    @Programmatic
+    Response actionResult(
+            Context rendererContext,
+            ObjectAndActionInvocation objectAndActionInvocation,
+            ActionResultReprRenderer.SelfLink selfLink);
+
+    public static interface Context extends RendererContext {
+        ObjectAdapterLinkTo getAdapterLinkTo();
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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
new file mode 100644
index 0000000..0691684
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/RepresentationServiceForRestfulObjects.java
@@ -0,0 +1,146 @@
+/**
+ *  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 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.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.*;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer.SelfLink;
+
+@DomainService
+public class RepresentationServiceForRestfulObjects implements RepresentationService {
+
+    private static final DateFormat ETAG_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+
+    // //////////////////////////////////////////////////////////////
+    // objectRepresentation
+    // //////////////////////////////////////////////////////////////
+
+    @Override
+    @Programmatic
+    public Response objectRepresentation(
+            final Context resourceContext,
+            final ObjectAdapter objectAdapter) {
+        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(resourceContext, null, JsonRepresentation.newMap());
+        renderer.with(objectAdapter).includesSelf();
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+
+        final Version version = objectAdapter.getVersion();
+        if (version != null && version.getTime() != null) {
+            responseBuilder.tag(ETAG_FORMAT.format(version.getTime()));
+        }
+        return buildResponse(responseBuilder);
+    }
+
+    // //////////////////////////////////////////////////////////////
+    // propertyDetails
+    // //////////////////////////////////////////////////////////////
+
+
+    @Override
+    @Programmatic
+    public Response propertyDetails(
+            final Context rendererContext,
+            final ObjectAndProperty objectAndProperty,
+            final MemberReprMode memberReprMode) {
+
+        final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(rendererContext);
+        renderer.with(objectAndProperty)
+                .usingLinkTo(rendererContext.getAdapterLinkTo())
+                .withMemberMode(memberReprMode);
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+        return buildResponse(responseBuilder);
+    }
+
+    // //////////////////////////////////////////////////////////////
+    // collectionDetails
+    // //////////////////////////////////////////////////////////////
+
+    @Override
+    @Programmatic
+    public Response collectionDetails(
+            final Context rendererContext,
+            final ObjectAndCollection objectAndCollection,
+            final MemberReprMode memberReprMode) {
+
+        final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(rendererContext);
+        renderer.with(objectAndCollection)
+                .usingLinkTo(rendererContext.getAdapterLinkTo())
+                .withMemberMode(memberReprMode);
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+        return buildResponse(responseBuilder);
+    }
+
+    // //////////////////////////////////////////////////////////////
+    // action Prompt
+    // //////////////////////////////////////////////////////////////
+
+    @Override
+    @Programmatic
+    public Response actionPrompt(
+            final Context rendererContext,
+            final ObjectAndAction objectAndAction) {
+
+        final ObjectActionReprRenderer renderer = new ObjectActionReprRenderer(rendererContext);
+        renderer.with(objectAndAction)
+                .usingLinkTo(rendererContext.getAdapterLinkTo())
+                .asStandalone();
+
+        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
+        return buildResponse(responseBuilder);
+    }
+
+    // //////////////////////////////////////////////////////////////
+    // action Result
+    // //////////////////////////////////////////////////////////////
+
+    @Override
+    @Programmatic
+    public Response actionResult(
+            final Context rendererContext,
+            final ObjectAndActionInvocation objectAndActionInvocation,
+            final SelfLink selfLink) {
+
+        final ActionResultReprRenderer renderer = new ActionResultReprRenderer(rendererContext, selfLink);
+        renderer.with(objectAndActionInvocation)
+                .using(rendererContext.getAdapterLinkTo());
+
+        final ResponseBuilder respBuilder = Responses.ofOk(renderer, Caching.NONE);
+        Responses.addLastModifiedAndETagIfAvailable(respBuilder, objectAndActionInvocation.getObjectAdapter().getVersion());
+        return buildResponse(respBuilder);
+    }
+
+    /**
+     * Overridable to allow further customization.
+     */
+    protected Response buildResponse(final ResponseBuilder responseBuilder) {
+        return responseBuilder.build();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
new file mode 100644
index 0000000..df90789
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/JsonWriterUtil.java
@@ -0,0 +1,41 @@
+/*
+ *  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.util;
+
+import java.io.IOException;
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
+
+public final class JsonWriterUtil {
+
+    private JsonWriterUtil(){}
+
+    public static String jsonFor(final Object object) {
+        try {
+            return JsonMapper.instance().write(object);
+        } catch (final JsonGenerationException e) {
+            throw new RuntimeException(e);
+        } catch (final JsonMappingException e) {
+            throw new RuntimeException(e);
+        } catch (final IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/Util.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/Util.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/Util.java
new file mode 100644
index 0000000..341b2ac
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/util/Util.java
@@ -0,0 +1,107 @@
+/**
+ *  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.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import com.google.common.base.Charsets;
+import com.google.common.io.ByteStreams;
+import org.codehaus.jackson.JsonParseException;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+
+public final class Util {
+
+    private Util(){}
+
+    // //////////////////////////////////////////////////////////////
+    // parsing
+    // //////////////////////////////////////////////////////////////
+
+    /**
+     * Parse {@link java.io.InputStream} to String, else throw exception
+     */
+    public static String asStringUtf8(final InputStream body) {
+        try {
+            final byte[] byteArray = ByteStreams.toByteArray(body);
+            return new String(byteArray, Charsets.UTF_8);
+        } catch (final IOException e) {
+            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not read body");
+        }
+    }
+
+    /**
+     * Parse (body) string to {@link org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation}, else throw exception
+     */
+    public static JsonRepresentation readAsMap(final String body) {
+        if (body == null) {
+            return JsonRepresentation.newMap();
+        }
+        final String bodyTrimmed = body.trim();
+        if (bodyTrimmed.isEmpty()) {
+            return JsonRepresentation.newMap();
+        }
+        return read(bodyTrimmed, "body");
+    }
+
+    /**
+     * Parse (query) string to {@link org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation}, else throw exception
+     */
+    public static JsonRepresentation readQueryStringAsMap(final String queryString) {
+        if (queryString == null) {
+            return JsonRepresentation.newMap();
+        }
+        final String queryStringTrimmed = queryString.trim();
+        if (queryStringTrimmed.isEmpty()) {
+            return JsonRepresentation.newMap();
+        }
+        return read(queryStringTrimmed, "query string");
+    }
+
+    /**
+     * REVIEW - looks similar to above methods, but now unused; can it be deleted?
+     */
+    public static JsonRepresentation readParameterMapAsMap(final Map<String, String[]> parameterMap) {
+        final JsonRepresentation map = JsonRepresentation.newMap();
+        for (final Map.Entry<String, String[]> parameter : parameterMap.entrySet()) {
+            map.mapPut(parameter.getKey(), parameter.getValue()[0]);
+        }
+        return map;
+    }
+
+    private static JsonRepresentation read(final String args, final String argsNature) {
+        try {
+            final JsonRepresentation jsonRepr = JsonMapper.instance().read(args);
+            if (!jsonRepr.isMap()) {
+                throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, "could not read %s as a JSON map", argsNature);
+            }
+            return jsonRepr;
+        } catch (final JsonParseException e) {
+            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not parse %s", argsNature);
+        } catch (final JsonMappingException e) {
+            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not read %s as JSON", argsNature);
+        } catch (final IOException e) {
+            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not parse %s", argsNature);
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/HasHttpStatusCode.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/HasHttpStatusCode.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/HasHttpStatusCode.java
deleted file mode 100644
index 13cc919..0000000
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/HasHttpStatusCode.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  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.server;
-
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
-
-public interface HasHttpStatusCode {
-
-    HttpStatusCode getHttpStatusCode();
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 efa2d7a..46b602a 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
@@ -41,7 +41,8 @@ import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.Domain
 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.RendererContext;
-import org.apache.isis.viewer.restfulobjects.server.resources.Util;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
 public class ResourceContext implements RendererContext {
 
@@ -118,8 +119,8 @@ public class ResourceContext implements RendererContext {
     private void ensureDomainModelQueryParamSupported() {
         final DomainModel domainModel = getArg(RequestParameter.DOMAIN_MODEL);
         if(domainModel != DomainModel.FORMAL) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.BAD_REQUEST,  
-                                           "x-ro-domain-model of '%s' is not supported", domainModel);
+            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.BAD_REQUEST,
+                    "x-ro-domain-model of '%s' is not supported", domainModel);
         }
     }
 
@@ -238,7 +239,6 @@ public class ResourceContext implements RendererContext {
     }
 
 
-    
     public Localization getLocalization() {
         return localization;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationException.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationException.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationException.java
index 01948f7..7f0d36e 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationException.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationException.java
@@ -19,51 +19,19 @@
 package org.apache.isis.viewer.restfulobjects.server;
 
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 
-public class RestfulObjectsApplicationException extends RuntimeException implements HasHttpStatusCode {
-
-    public static final RestfulObjectsApplicationException create(final HttpStatusCode httpStatusCode) {
-        return createWithCause(httpStatusCode, null);
-    }
-
-    public static RestfulObjectsApplicationException createWithMessage(final HttpStatusCode httpStatusCode, final String message, final Object... args) {
-        return createWithCauseAndMessage(httpStatusCode, (Exception) null, message, args);
-    }
-
-    public static RestfulObjectsApplicationException createWithCause(final HttpStatusCode httpStatusCode, final Exception cause) {
-        return createWithCauseAndMessage(httpStatusCode, cause, null);
-    }
-
-    public static RestfulObjectsApplicationException createWithCauseAndMessage(final HttpStatusCode httpStatusCode, final Exception cause, final String message, final Object... args) {
-        return new RestfulObjectsApplicationException(httpStatusCode, formatString(message, args), cause, null);
-    }
-
-    public static RestfulObjectsApplicationException createWithBody(final HttpStatusCode httpStatusCode, final JsonRepresentation body, final String message, final Object... args) {
-        return new RestfulObjectsApplicationException(httpStatusCode, formatString(message, args), null, body);
-    }
-
-    private static String formatString(final String formatStr, final Object... args) {
-        return formatStr != null ? String.format(formatStr, args) : null;
-    }
-
-    private static final long serialVersionUID = 1L;
-    private final HttpStatusCode httpStatusCode;
-    private final JsonRepresentation body;
-
-    private RestfulObjectsApplicationException(final HttpStatusCode httpStatusCode, final String message, final Throwable cause, final JsonRepresentation body) {
-        super(message, cause);
-        this.httpStatusCode = httpStatusCode;
-        this.body = body;
-    }
-
-    @Override
-    public HttpStatusCode getHttpStatusCode() {
-        return httpStatusCode;
-    }
+/**
+ * For backward compatibility only.
+ */
+@Deprecated
+public class RestfulObjectsApplicationException extends org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException {
 
-    public JsonRepresentation getBody() {
-        return body;
+    public RestfulObjectsApplicationException(
+            final RestfulResponse.HttpStatusCode httpStatusCode,
+            final String message,
+            final Throwable cause,
+            final JsonRepresentation body) {
+        super(httpStatusCode, message, cause, body);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
index 0c9eb4b..4236704 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapper.java
@@ -33,6 +33,8 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
+import org.apache.isis.viewer.restfulobjects.rendering.HasHttpStatusCode;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 //@Path("/") // FIXME: workaround for TomEE ... but breaks the RestEasy TCK tests so commented out:-(
 @Provider

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 9d63296..895a250 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
@@ -35,7 +35,9 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainObjectResource;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberReprMode;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
 @Path("/objects")
 public class DomainObjectResourceServerside extends ResourceAbstract implements DomainObjectResource {
@@ -163,7 +165,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
 
-        return helper.propertyDetails(propertyId, ResponseGeneratorService.MemberMode.NOT_MUTATING, Caching.NONE);
+        return helper.propertyDetails(
+                propertyId,
+                MemberReprMode.READ
+        );
     }
 
     @Override
@@ -192,7 +197,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         property.set(objectAdapter, argAdapter);
 
-        return helper.propertyDetails(propertyId, ResponseGeneratorService.MemberMode.MUTATING, Caching.NONE);
+        return helper.propertyDetails(
+                propertyId,
+                MemberReprMode.WRITE
+        );
     }
 
     @Override
@@ -216,7 +224,10 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         property.set(objectAdapter, null);
 
-        return helper.propertyDetails(propertyId, ResponseGeneratorService.MemberMode.MUTATING, Caching.NONE);
+        return helper.propertyDetails(
+                propertyId,
+                MemberReprMode.WRITE
+        );
     }
 
     @Override
@@ -238,7 +249,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
         final ObjectAdapter objectAdapter = getObjectAdapterElseThrowNotFound(domainType, instanceId);
         final DomainResourceHelper helper = getDomainResourceHelper(objectAdapter);
 
-        return helper.collectionDetails(collectionId, ResponseGeneratorService.MemberMode.NOT_MUTATING, Caching.NONE);
+        return helper.collectionDetails(collectionId, MemberReprMode.READ);
     }
 
     @Override
@@ -271,7 +282,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         collection.addElement(objectAdapter, argAdapter);
 
-        return helper.collectionDetails(collectionId, ResponseGeneratorService.MemberMode.MUTATING, Caching.NONE);
+        return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }
 
     @Override
@@ -304,7 +315,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         collection.addElement(objectAdapter, argAdapter);
 
-        return helper.collectionDetails(collectionId, ResponseGeneratorService.MemberMode.MUTATING, Caching.NONE);
+        return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }
 
     @Override
@@ -331,7 +342,7 @@ public class DomainObjectResourceServerside extends ResourceAbstract implements
 
         collection.removeElement(objectAdapter, argAdapter);
 
-        return helper.collectionDetails(collectionId, ResponseGeneratorService.MemberMode.MUTATING, Caching.NONE);
+        return helper.collectionDetails(collectionId, MemberReprMode.WRITE);
     }
 
     // //////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 db04307..9b623ba 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
@@ -16,19 +16,87 @@
  */
 package org.apache.isis.viewer.restfulobjects.server.resources;
 
+import java.util.List;
 import javax.ws.rs.core.Response;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectLinkTo;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectAdapterLinkTo;
+import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.*;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService;
 import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.resources.ResourceAbstract.Caching;
 
-public class DomainResourceHelper implements ResponseGeneratorService.ResponseContext {
+public class DomainResourceHelper {
 
-    private final ResponseGeneratorService generatorService;
+    static class RepresentationServiceContextAdapter implements RepresentationService.Context {
+
+        private final RendererContext rendererContext;
+        private final ObjectAdapterLinkTo adapterLinkTo;
+
+        RepresentationServiceContextAdapter(final RendererContext rendererContext, final ObjectAdapterLinkTo adapterLinkTo) {
+            this.rendererContext = rendererContext;
+            this.adapterLinkTo = adapterLinkTo;
+        }
+
+        @Override
+        public ObjectAdapterLinkTo getAdapterLinkTo() {
+            return adapterLinkTo;
+        }
+
+        @Override
+        public String urlFor(String url) {
+            return rendererContext.urlFor(url);
+        }
+
+        @Override
+        public AuthenticationSession getAuthenticationSession() {
+            return rendererContext.getAuthenticationSession();
+        }
+
+        @Override
+        public IsisConfiguration getConfiguration() {
+            return rendererContext.getConfiguration();
+        }
+
+        @Override
+        public PersistenceSession getPersistenceSession() {
+            return rendererContext.getPersistenceSession();
+        }
+
+        @Override
+        public Where getWhere() {
+            return rendererContext.getWhere();
+        }
+
+        @Override
+        public List<List<String>> getFollowLinks() {
+            return rendererContext.getFollowLinks();
+        }
+
+        @Override
+        public Localization getLocalization() {
+            return rendererContext.getLocalization();
+        }
+
+        @Override
+        public boolean canEagerlyRender(ObjectAdapter objectAdapter) {
+            return rendererContext.canEagerlyRender(objectAdapter);
+        }
+    }
+
+    private final RepresentationService representationService;
+    private RepresentationServiceContextAdapter representationServiceContext;
 
     public DomainResourceHelper(final ResourceContext resourceContext, final ObjectAdapter objectAdapter) {
         this.resourceContext = resourceContext;
@@ -36,75 +104,166 @@ public class DomainResourceHelper implements ResponseGeneratorService.ResponseCo
 
         using(new DomainObjectLinkTo());
 
-        generatorService = lookupService(ResponseGeneratorService.class);
+        representationService = lookupService(RepresentationService.class);
     }
 
-    public DomainResourceHelper using(final ObjectAdapterLinkTo linkTo) {
-        adapterLinkTo = linkTo;
-        adapterLinkTo.usingUrlBase(resourceContext).with(objectAdapter);
-        return this;
-    }
+    public DomainResourceHelper using(final ObjectAdapterLinkTo adapterLinkTo) {
 
-    //region > ResponseContext impl
+        representationServiceContext = new RepresentationServiceContextAdapter(resourceContext, adapterLinkTo);
 
-    private final ResourceContext resourceContext;
-    private final ObjectAdapter objectAdapter;
-    private ObjectAdapterLinkTo adapterLinkTo;
+        adapterLinkTo.usingUrlBase(resourceContext)
+                     .with(objectAdapter);
 
-    @Override
-    public ResourceContext getResourceContext() {
-        return resourceContext;
+        return this;
     }
 
-    @Override
-    public ObjectAdapter getObjectAdapter() {
-        return objectAdapter;
-    }
+    private final ResourceContext resourceContext;
+    private final ObjectAdapter objectAdapter;
 
-    @Override
-    public ObjectAdapterLinkTo getAdapterLinkTo() {
-        return adapterLinkTo;
-    }
-    //endregion
 
+    // //////////////////////////////////////
+    // Helpers (resource delegate here)
+    // //////////////////////////////////////
 
+    /**
+     * Simply delegates to the {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to
+     * render a representation of the object.
+     */
     public Response objectRepresentation() {
-        return generatorService.objectRepresentation(this);
+        return representationService.objectRepresentation(representationServiceContext, objectAdapter);
     }
 
+    /**
+     * Obtains the property (checking it is visible) of the object and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of that property.
+     */
     public Response propertyDetails(
             final String propertyId,
-            final ResponseGeneratorService.MemberMode memberMode,
-            final Caching caching) {
-        return generatorService.propertyDetails(this, propertyId, memberMode, caching);
+            final MemberReprMode memberMode) {
+
+        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(propertyId, ObjectAdapterAccessHelper.Intent.ACCESS);
+
+        return representationService.propertyDetails(representationServiceContext, new ObjectAndProperty(objectAdapter, property), memberMode);
     }
 
+
+    /**
+     * Obtains the collection (checking it is visible) of the object and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of that collection.
+     */
     public Response collectionDetails(
             final String collectionId,
-            final ResponseGeneratorService.MemberMode memberMode,
-            final Caching caching) {
+            final MemberReprMode memberMode) {
+
+        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final OneToManyAssociation collection = accessHelper.getCollectionThatIsVisibleForIntent(collectionId, ObjectAdapterAccessHelper.Intent.ACCESS);
 
-        return generatorService.collectionDetails(this, collectionId, memberMode, caching);
+        return representationService.collectionDetails(representationServiceContext, new ObjectAndCollection(objectAdapter, collection), memberMode);
     }
 
+
+    /**
+     * Obtains the action details (arguments etc), checking it is visible, of the object and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of that object's action (arguments).
+     */
     public Response actionPrompt(final String actionId) {
 
-        return generatorService.actionPrompt(this, actionId);
+        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.ACCESS);
+
+        return representationService.actionPrompt(representationServiceContext, new ObjectAndAction(objectAdapter, action));
     }
 
+    /**
+     * Invokes the action for the object  (checking it is visible) and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of the result of that action.
+     *
+     * <p>
+     *     The action must have {@link org.apache.isis.applib.annotation.ActionSemantics.Of#SAFE safe} semantics
+     *     otherwise an error response is thrown.
+     * </p>
+     */
     public Response invokeActionQueryOnly(final String actionId, final JsonRepresentation arguments) {
 
-        return generatorService.invokeActionQueryOnly(this, actionId, arguments);
+        final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
+
+        final ActionSemantics.Of actionSemantics = action.getSemantics();
+        if (actionSemantics != ActionSemantics.Of.SAFE) {
+            throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.METHOD_NOT_ALLOWED, "Method not allowed; action '%s' is not query only", action.getId());
+        }
+
+        return invokeActionUsingAdapters(action, arguments, ActionResultReprRenderer.SelfLink.INCLUDED);
     }
 
+    /**
+     * Invokes the action for the object  (checking it is visible) and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of the result of that action.
+     *
+     * <p>
+     *     The action must have {@link org.apache.isis.applib.annotation.ActionSemantics.Of#IDEMPOTENT idempotent}
+     *     semantics otherwise an error response is thrown.
+     * </p>
+     */
     public Response invokeActionIdempotent(final String actionId, final JsonRepresentation arguments) {
 
-        return generatorService.invokeActionIdempotent(this, actionId, arguments);
+        final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
+
+        final ActionSemantics.Of actionSemantics = action.getSemantics();
+        if (!actionSemantics.isIdempotentInNature()) {
+            throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.METHOD_NOT_ALLOWED, "Method not allowed; action '%s' is not idempotent", action.getId());
+        }
+        return invokeActionUsingAdapters(action, arguments, ActionResultReprRenderer.SelfLink.EXCLUDED);
     }
 
+    /**
+     * Invokes the action for the object  (checking it is visible) and then delegates to the
+     * {@link org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationService} to render a representation
+     * of the result of that action.
+     */
     public Response invokeAction(final String actionId, final JsonRepresentation arguments) {
 
-        return generatorService.invokeAction(this, actionId, arguments);
+        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(representationServiceContext, objectAdapter);
+
+        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
+
+        return invokeActionUsingAdapters(action, arguments, ActionResultReprRenderer.SelfLink.EXCLUDED);
+    }
+
+
+    private Response invokeActionUsingAdapters(
+            final ObjectAction action,
+            final JsonRepresentation arguments,
+            final ActionResultReprRenderer.SelfLink selfLink) {
+
+        final RepresentationService.Context rendererContext = representationServiceContext;
+        final ObjectAdapter objectAdapter = this.objectAdapter;
+
+        final ObjectActionArgHelper argHelper = new ObjectActionArgHelper(rendererContext, objectAdapter, action);
+
+        final List<ObjectAdapter> argAdapters = argHelper.parseAndValidateArguments(arguments);
+
+        // invoke
+        final ObjectAdapter[] argArray2 = argAdapters.toArray(new ObjectAdapter[0]);
+        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray2);
+
+        final ObjectAndActionInvocation objectAndActionInvocation =
+                new ObjectAndActionInvocation(this.objectAdapter, action, arguments, returnedAdapter);
+
+        // response
+        return representationService.actionResult(representationServiceContext, objectAndActionInvocation, selfLink);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 d0ecc93..3c7ffa2 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
@@ -29,9 +29,11 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 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.domainobjects.DomainObjectReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainServiceLinkTo;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 @Path("/services")
 public class DomainServiceResourceServerside extends ResourceAbstract implements DomainServiceResource {

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 46700c3..1135ba9 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
@@ -45,7 +45,9 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.domaintypes.DomainTypeResource;
 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.domaintypes.ActionDescriptionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.ActionParameterDescriptionReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.CollectionDescriptionReprRenderer;
@@ -57,7 +59,8 @@ 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.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.server.util.UrlParserUtils;
 
 /**

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/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 72fef2b..675acff 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
@@ -31,7 +31,9 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.homepage.HomePageResource;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.Caching;
+import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 public class HomePageResourceServerside extends ResourceAbstract implements HomePageResource {
 


[2/4] git commit: ISIS-917: fixing TCK tests for RO viewer post-refactoring.

Posted by da...@apache.org.
ISIS-917: fixing TCK tests for RO viewer post-refactoring.


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

Branch: refs/heads/ISIS-917
Commit: 9af78330bf092df7736997b92f8a1fb576174d4e
Parents: 064c42e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Oct 8 16:55:53 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Oct 8 16:55:53 2014 +0100

----------------------------------------------------------------------
 ..._givenDisabledMembers_thenRepresentation_ok.java |  2 +-
 ...ivenEntityWithActions_thenRepresentation_ok.java |  2 +-
 ...yWithCollections_thenRepresentation_ok_TODO.java |  2 +-
 ...ut_whenArgsValid_thenMultiplePropertyUpdate.java |  4 ++--
 .../oid/property/Get_thenRepresentation_ok.java     | 10 +++++-----
 .../Get_thenResponseHeaders_ContentLength_ok.java   |  2 +-
 .../domainobject/oid/property/Get_then_200_ok.java  |  2 +-
 .../Get_whenQueryArg_xRoDomainModel_ok.java         |  2 +-
 .../oid/property/Post_then_405_bad.java             |  2 +-
 .../domainobject/oid/property/Put_then_200_ok.java  |  2 +-
 ...henArgValid_thenPrimitivePropertyUpdated_ok.java | 16 ++++++++--------
 .../Delete_givenObjectResource_then_405_bad.java    |  2 +-
 .../id/action/Get_thenRepresentation_ok.java        |  8 ++++----
 .../id/action/Get_thenResponseCode_200_ok.java      |  2 +-
 .../Get_thenResponseHeaders_ContentLength_ok.java   |  2 +-
 .../action/Get_whenQueryArg_xRoDomainModel_ok.java  |  2 +-
 .../Post_givenObjectResource_then_405_bad.java      |  2 +-
 .../Put_givenObjectResource_then_405_bad.java       |  2 +-
 ...ost_whenInvokeArgWithObjectReference_thenOK.java |  6 +++---
 19 files changed, 36 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenDisabledMembers_thenRepresentation_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenDisabledMembers_thenRepresentation_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenDisabledMembers_thenRepresentation_ok.java
index 66590fc..7d87dad 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenDisabledMembers_thenRepresentation_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenDisabledMembers_thenRepresentation_ok.java
@@ -58,7 +58,7 @@ public class Get_givenDisabledMembers_thenRepresentation_ok {
     public void domainObjectWithDisabledMembers() throws Exception {
 
         // given, when
-        final DomainObjectRepresentation domainObjectRepr = givenDomainObjectRepresentationFor("BSRL","74");
+        final DomainObjectRepresentation domainObjectRepr = givenDomainObjectRepresentationFor("BSRL","75");
 
         // property ('visibleButNotEditableProperty')
         final JsonRepresentation properties = domainObjectRepr.getProperties();

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithActions_thenRepresentation_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithActions_thenRepresentation_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithActions_thenRepresentation_ok.java
index 8bc9a1e..a107a4f 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithActions_thenRepresentation_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithActions_thenRepresentation_ok.java
@@ -57,7 +57,7 @@ public class Get_givenEntityWithActions_thenRepresentation_ok {
     public void thenMembers() throws Exception {
 
         // when
-        final Response jaxrsResponse = domainObjectResource.object("RTNE","77");
+        final Response jaxrsResponse = domainObjectResource.object("RTNE","78");
         final RestfulResponse<DomainObjectRepresentation> restfulResponse = RestfulResponse.ofT(jaxrsResponse);
         assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithCollections_thenRepresentation_ok_TODO.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithCollections_thenRepresentation_ok_TODO.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithCollections_thenRepresentation_ok_TODO.java
index 3c6eca1..0ea7f76 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithCollections_thenRepresentation_ok_TODO.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Get_givenEntityWithCollections_thenRepresentation_ok_TODO.java
@@ -56,7 +56,7 @@ public class Get_givenEntityWithCollections_thenRepresentation_ok_TODO {
     public void thenCollections() throws Exception {
 
         // when
-        final Response jaxrsResponse = domainObjectResource.object("PRMV","42");
+        final Response jaxrsResponse = domainObjectResource.object("PRMV","43");
         final RestfulResponse<DomainObjectRepresentation> restfulResponse = RestfulResponse.ofT(jaxrsResponse);
         assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
index 8c72794..7e53275 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/Put_whenArgsValid_thenMultiplePropertyUpdate.java
@@ -76,7 +76,7 @@ public class Put_whenArgsValid_thenMultiplePropertyUpdate {
     @Test
     public void primitivePropertiesUpdated() throws Exception {
         
-        final DomainObjectRepresentation domainObjectRepr = getObjectRepr("PRMV", "42");
+        final DomainObjectRepresentation domainObjectRepr = getObjectRepr("PRMV", "43");
         
         final LinkRepresentation updateLink = domainObjectRepr.getLinkWithRel(Rel.UPDATE);
         
@@ -156,7 +156,7 @@ public class Put_whenArgsValid_thenMultiplePropertyUpdate {
     @Test
     public void jodaPropertiesUpdated() throws Exception {
         
-        final DomainObjectRepresentation domainObjectRepr = getObjectRepr("JODA", "82");
+        final DomainObjectRepresentation domainObjectRepr = getObjectRepr("JODA", "83");
         
         final LinkRepresentation updateLink = domainObjectRepr.getLinkWithRel(Rel.UPDATE);
         

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenRepresentation_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenRepresentation_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenRepresentation_ok.java
index f0a302c..60968e3 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenRepresentation_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenRepresentation_ok.java
@@ -60,7 +60,7 @@ public class Get_thenRepresentation_ok {
     public void representation() throws Exception {
 
         // when
-        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","67", "anInt");
+        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","68", "anInt");
         final RestfulResponse<ObjectPropertyRepresentation> idPropertyJsonResp = RestfulResponse.ofT(idPropertyResp);
         assertThat(idPropertyJsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
 
@@ -73,7 +73,7 @@ public class Get_thenRepresentation_ok {
         final LinkRepresentation selfLink = propertyRepr.getLinkWithRel(Rel.SELF);
         assertThat(selfLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.GET)
-                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/67/properties/anInt"))
+                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/68/properties/anInt"))
                                 .returning(HttpStatusCode.OK)
                                 .build());
 
@@ -81,7 +81,7 @@ public class Get_thenRepresentation_ok {
         final LinkRepresentation upLink = propertyRepr.getLinkWithRel(Rel.UP);
         assertThat(upLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.GET)
-                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/67"))
+                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/68"))
                                 .returning(HttpStatusCode.OK)
                                 .type(RepresentationType.DOMAIN_OBJECT.getMediaType())
                                 .title("default-name")
@@ -92,7 +92,7 @@ public class Get_thenRepresentation_ok {
         assertThat(modifyLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.PUT)
                                 .type(RepresentationType.OBJECT_PROPERTY.getMediaType())
-                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/67/properties/anInt"))
+                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/68/properties/anInt"))
                                 .build());
 
         assertThat(modifyLink.getArguments(), is(not(nullValue())));
@@ -104,7 +104,7 @@ public class Get_thenRepresentation_ok {
         assertThat(clearLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.DELETE)
                                 .type(RepresentationType.OBJECT_PROPERTY.getMediaType())
-                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/67/properties/anInt"))
+                                .href(endsWith("/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/68/properties/anInt"))
                                 .build());
 
         // described by link

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenResponseHeaders_ContentLength_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenResponseHeaders_ContentLength_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenResponseHeaders_ContentLength_ok.java
index d201d23..e7c8614 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenResponseHeaders_ContentLength_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_thenResponseHeaders_ContentLength_ok.java
@@ -54,7 +54,7 @@ public class Get_thenResponseHeaders_ContentLength_ok {
     public void propertyDetails() throws Exception {
 
         // when
-        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","67", "anInt");
+        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","68", "anInt");
         //given
         final RestfulResponse<ObjectPropertyRepresentation> idPropertyJsonResp = RestfulResponse.ofT(idPropertyResp);
         //then

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_then_200_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_then_200_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_then_200_ok.java
index 9f6e1ad..275e202 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_then_200_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_then_200_ok.java
@@ -54,7 +54,7 @@ public class Get_then_200_ok {
     public void propertyDetails() throws Exception {
 
         // when
-        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","67", "anInt");
+        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","68", "anInt");
         final RestfulResponse<ObjectPropertyRepresentation> idPropertyJsonResp = RestfulResponse.ofT(idPropertyResp);
         assertThat(idPropertyJsonResp.getStatus(), is(HttpStatusCode.OK));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_whenQueryArg_xRoDomainModel_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_whenQueryArg_xRoDomainModel_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_whenQueryArg_xRoDomainModel_ok.java
index 59e5486..8f87283 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_whenQueryArg_xRoDomainModel_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Get_whenQueryArg_xRoDomainModel_ok.java
@@ -45,7 +45,7 @@ public class Get_whenQueryArg_xRoDomainModel_ok {
     public void setUp() throws Exception {
         final WebServer webServer = webServerRule.getWebServer();
         client = new RestfulClient(webServer.getBase());
-        request = client.createRequest(RestfulHttpMethod.GET, "/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/67/properties/anInt");
+        request = client.createRequest(RestfulHttpMethod.GET, "/objects/org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity/68/properties/anInt");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Post_then_405_bad.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Post_then_405_bad.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Post_then_405_bad.java
index 5e09219..fe7dd9c 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Post_then_405_bad.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Post_then_405_bad.java
@@ -56,7 +56,7 @@ public class Post_then_405_bad {
     public void representation() throws Exception {
 
         // given
-        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","67", "anInt");
+        final Response idPropertyResp = domainObjectResource.propertyDetails("org.apache.isis.core.tck.dom.defaults.WithDefaultsEntity","68", "anInt");
         final RestfulResponse<ObjectPropertyRepresentation> idPropertyJsonResp = RestfulResponse.ofT(idPropertyResp);
         final ObjectPropertyRepresentation propertyRepr = idPropertyJsonResp.getEntity();
         final LinkRepresentation selfLink = propertyRepr.getLinkWithRel(Rel.SELF);

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_then_200_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_then_200_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_then_200_ok.java
index 859d0e4..d8bf6b9 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_then_200_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_then_200_ok.java
@@ -79,7 +79,7 @@ public class Put_then_200_ok {
 
         // given
         final int i = 999999;
-        final Response domainObjectResp = domainObjectResource.propertyDetails("PRMV", "42", "intProperty");
+        final Response domainObjectResp = domainObjectResource.propertyDetails("PRMV", "43", "intProperty");
         final RestfulResponse<ObjectPropertyRepresentation> domainObjectJsonResp = RestfulResponse.ofT(domainObjectResp);
         assertThat(domainObjectJsonResp.getStatus().getFamily(), is(Response.Status.Family.SUCCESSFUL));
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_whenArgValid_thenPrimitivePropertyUpdated_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_whenArgValid_thenPrimitivePropertyUpdated_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_whenArgValid_thenPrimitivePropertyUpdated_ok.java
index 6f77937..8759e66 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_whenArgValid_thenPrimitivePropertyUpdated_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobject/oid/property/Put_whenArgValid_thenPrimitivePropertyUpdated_ok.java
@@ -73,49 +73,49 @@ public class Put_whenArgValid_thenPrimitivePropertyUpdated_ok {
 
         // byte
         final byte b = (byte)99;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "byteProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "byteProperty");
         argRepr = modifyLink.getArguments().mapPut("value", b);
         assertThat(followedRepr(modifyLink,argRepr).getByte("value"), is(b));
         
         // char
         final char c = 'b';
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "charProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "charProperty");
         argRepr = modifyLink.getArguments().mapPut("value", c);
         assertThat(followedRepr(modifyLink,argRepr).getChar("value"), is(c));
 
         // double
         final double d = 12345.678;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "doubleProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "doubleProperty");
         argRepr = modifyLink.getArguments().mapPut("value", d);
         assertThat(followedRepr(modifyLink,argRepr).getDouble("value"), is(d));
 
         // float
         final float f = 54321.123F;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "floatProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "floatProperty");
         argRepr = modifyLink.getArguments().mapPut("value", f);
         assertThat(followedRepr(modifyLink,argRepr).getFloat("value"), is(f));
         
         // int
         final int i = 999999;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "intProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "intProperty");
         argRepr = modifyLink.getArguments().mapPut("value", i);
         assertThat(followedRepr(modifyLink,argRepr).getInt("value"), is(i));
         
         // long
         final long l = 99999999999L;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "longProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "longProperty");
         argRepr = modifyLink.getArguments().mapPut("value", l);
         assertThat(followedRepr(modifyLink,argRepr).getLong("value"), is(l));
         
         // short
         final short s = (short)999;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "shortProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "shortProperty");
         argRepr = modifyLink.getArguments().mapPut("value", s);
         assertThat(followedRepr(modifyLink,argRepr).getShort("value"), is(s));
         
         // boolean
         final boolean z = false;
-        modifyLink = getObjectPropertyReprModifyLink("PRMV", "42", "booleanProperty");
+        modifyLink = getObjectPropertyReprModifyLink("PRMV", "43", "booleanProperty");
         argRepr = modifyLink.getArguments().mapPut("value", z);
         assertThat(followedRepr(modifyLink,argRepr).getBoolean("value"), is(z));
         

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Delete_givenObjectResource_then_405_bad.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Delete_givenObjectResource_then_405_bad.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Delete_givenObjectResource_then_405_bad.java
index 09204e4..44f460f 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Delete_givenObjectResource_then_405_bad.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Delete_givenObjectResource_then_405_bad.java
@@ -55,7 +55,7 @@ public class Delete_givenObjectResource_then_405_bad {
     public void representation() throws Exception {
 
         // given
-        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
         final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);
         final ObjectActionRepresentation actionPromptRepr = actionPromptJsonResp.getEntity();
         final LinkRepresentation selfLink = actionPromptRepr.getLinkWithRel(Rel.SELF);

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenRepresentation_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenRepresentation_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenRepresentation_ok.java
index c915614..b08c954 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenRepresentation_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenRepresentation_ok.java
@@ -59,7 +59,7 @@ public class Get_thenRepresentation_ok {
     public void representation() throws Exception {
 
         // when
-        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
         final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);
         assertThat(actionPromptJsonResp.getStatus().getFamily(), is(Family.SUCCESSFUL));
 
@@ -72,14 +72,14 @@ public class Get_thenRepresentation_ok {
         final LinkRepresentation selfLink = actionPromptRepr.getLinkWithRel(Rel.SELF);
         assertThat(selfLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.GET)
-                                .href(endsWith("/objects/RTNE/77/actions/contains"))
+                                .href(endsWith("/objects/RTNE/78/actions/contains"))
                                 .returning(HttpStatusCode.OK));
 
         // up link
         final LinkRepresentation upLink = actionPromptRepr.getLinkWithRel(Rel.UP);
         assertThat(upLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.GET)
-                                .href(endsWith("/objects/RTNE/77"))
+                                .href(endsWith("/objects/RTNE/78"))
                                 .returning(HttpStatusCode.OK)
                                 .type(RepresentationType.DOMAIN_OBJECT.getMediaType())
                                 .title("Untitled Actions Entity"));
@@ -88,7 +88,7 @@ public class Get_thenRepresentation_ok {
         final LinkRepresentation invokeLink = actionPromptRepr.getLinkWithRel(Rel.INVOKE);
         assertThat(invokeLink, isLink(client)
                                 .httpMethod(RestfulHttpMethod.GET)
-                                .href(endsWith("/objects/RTNE/77/actions/contains/invoke")));
+                                .href(endsWith("/objects/RTNE/78/actions/contains/invoke")));
 
         assertThat(invokeLink.getArguments(), is(not(nullValue())));
         assertThat(invokeLink.getArguments().isArray(), is(false));

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseCode_200_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseCode_200_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseCode_200_ok.java
index 5f4b467..cf51675 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseCode_200_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseCode_200_ok.java
@@ -52,7 +52,7 @@ public class Get_thenResponseCode_200_ok {
     public void actionPrompt() throws Exception {
 
         // when
-        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
         final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);
         assertThat(actionPromptJsonResp.getStatus(), is(HttpStatusCode.OK));
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseHeaders_ContentLength_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseHeaders_ContentLength_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseHeaders_ContentLength_ok.java
index 29d3e67..1f9a112 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseHeaders_ContentLength_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_thenResponseHeaders_ContentLength_ok.java
@@ -52,7 +52,7 @@ public class Get_thenResponseHeaders_ContentLength_ok {
     @Test
     public void ok() throws Exception {
         // given
-    	final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+    	final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
 
         // when
     	final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_whenQueryArg_xRoDomainModel_ok.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_whenQueryArg_xRoDomainModel_ok.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_whenQueryArg_xRoDomainModel_ok.java
index 80aefee..6bcce0c 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_whenQueryArg_xRoDomainModel_ok.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Get_whenQueryArg_xRoDomainModel_ok.java
@@ -46,7 +46,7 @@ public class Get_whenQueryArg_xRoDomainModel_ok {
     public void setUp() throws Exception {
         final WebServer webServer = webServerRule.getWebServer();
         client = new RestfulClient(webServer.getBase());
-        request = client.createRequest(RestfulHttpMethod.GET, "/objects/RTNE/77/actions/contains");
+        request = client.createRequest(RestfulHttpMethod.GET, "/objects/RTNE/78/actions/contains");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Post_givenObjectResource_then_405_bad.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Post_givenObjectResource_then_405_bad.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Post_givenObjectResource_then_405_bad.java
index ad15699..2917e30 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Post_givenObjectResource_then_405_bad.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Post_givenObjectResource_then_405_bad.java
@@ -55,7 +55,7 @@ public class Post_givenObjectResource_then_405_bad {
     public void representation() throws Exception {
 
         // given
-        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
         final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);
         final ObjectActionRepresentation actionPromptRepr = actionPromptJsonResp.getEntity();
         final LinkRepresentation selfLink = actionPromptRepr.getLinkWithRel(Rel.SELF);

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Put_givenObjectResource_then_405_bad.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Put_givenObjectResource_then_405_bad.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Put_givenObjectResource_then_405_bad.java
index 26978e4..83c086a 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Put_givenObjectResource_then_405_bad.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/Put_givenObjectResource_then_405_bad.java
@@ -55,7 +55,7 @@ public class Put_givenObjectResource_then_405_bad {
     public void representation() throws Exception {
 
         // given
-        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "77", "contains");
+        final Response actionPromptResp = domainObjectResource.actionPrompt("RTNE", "78", "contains");
         final RestfulResponse<ObjectActionRepresentation> actionPromptJsonResp = RestfulResponse.ofT(actionPromptResp);
         final ObjectActionRepresentation actionPromptRepr = actionPromptJsonResp.getEntity();
         final LinkRepresentation selfLink = actionPromptRepr.getLinkWithRel(Rel.SELF);

http://git-wip-us.apache.org/repos/asf/isis/blob/9af78330/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Post_whenInvokeArgWithObjectReference_thenOK.java
----------------------------------------------------------------------
diff --git a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Post_whenInvokeArgWithObjectReference_thenOK.java b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Post_whenInvokeArgWithObjectReference_thenOK.java
index 28bdebe..2c1fc94 100644
--- a/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Post_whenInvokeArgWithObjectReference_thenOK.java
+++ b/core/tck/tck-viewer-restfulobjects/src/test/java/org/apache/isis/viewer/restfulobjects/tck/domainobjectorservice/id/action/invoke/Post_whenInvokeArgWithObjectReference_thenOK.java
@@ -73,7 +73,7 @@ public class Post_whenInvokeArgWithObjectReference_thenOK {
 
         // given
         RestfulResponse<ObjectCollectionRepresentation> childrenRestfulResponse = 
-                RestfulResponse.ofT(objectResource.accessCollection("PRNT", "52", "children"));
+                RestfulResponse.ofT(objectResource.accessCollection("PRNT", "53", "children"));
         ObjectCollectionRepresentation childrenRepr = childrenRestfulResponse.getEntity();
 
         JsonRepresentation collValue = childrenRepr.getValue();
@@ -85,7 +85,7 @@ public class Post_whenInvokeArgWithObjectReference_thenOK {
         
         // when
         final RestfulResponse<ObjectActionRepresentation> removeChildRestfulResponse = 
-                RestfulResponse.ofT(objectResource.actionPrompt("PRNT", "52", "removeChild"));
+                RestfulResponse.ofT(objectResource.actionPrompt("PRNT", "53", "removeChild"));
         final ObjectActionRepresentation removeChildRepr = removeChildRestfulResponse.getEntity();
         
         LinkRepresentation invokeLinkRepr = removeChildRepr.getLinkWithRel(Rel.INVOKE);
@@ -100,7 +100,7 @@ public class Post_whenInvokeArgWithObjectReference_thenOK {
 
         // then
         childrenRestfulResponse = 
-                RestfulResponse.ofT(objectResource.accessCollection("PRNT", "52", "children"));
+                RestfulResponse.ofT(objectResource.accessCollection("PRNT", "53", "children"));
         childrenRepr = childrenRestfulResponse.getEntity();
 
         collValue = childrenRepr.getValue();


[3/4] ISIS-917: further refactorings to simplify the API of the (newly rechristened) RepresentationService.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelper.java
index 97cce01..15a65da 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelper.java
@@ -16,15 +16,18 @@
  */
 package org.apache.isis.viewer.restfulobjects.server.resources;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.JsonValueEncoder;
-import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.server.util.OidUtils;
-import org.apache.isis.viewer.restfulobjects.server.util.UrlParserUtils;
 
 /**
  * Utility class that encapsulates the logic for parsing some content (JSON, or a simple string that is JSON)
@@ -33,26 +36,21 @@ import org.apache.isis.viewer.restfulobjects.server.util.UrlParserUtils;
  */
 public class JsonParserHelper {
 
-    static enum Intent {
-        ACCESS, MUTATE;
+    private final static Pattern OBJECT_OID = Pattern.compile(".*objects\\/([^/]+)\\/(.+)");
 
-        public boolean isMutate() {
-            return this == MUTATE;
-        }
-    }
-
-    private final ResourceContext resourceContext;
+    private final RendererContext rendererContext;
     private final ObjectSpecification objectSpec;
 
-    public JsonParserHelper(ResourceContext resourceContext, ObjectSpecification objectSpecification) {
+    public JsonParserHelper(
+            final RendererContext rendererContext, ObjectSpecification objectSpecification) {
         this.objectSpec = objectSpecification;
-        this.resourceContext = resourceContext;
+        this.rendererContext = rendererContext;
     }
 
 
     /**
      * @param bodyAsString
-     *            - as per {@link Util#asStringUtf8(java.io.InputStream)}
+     *            - as per {@link org.apache.isis.viewer.restfulobjects.rendering.util.Util#asStringUtf8(java.io.InputStream)}
      * @return
      */
     ObjectAdapter parseAsMapWithSingleValue(final String bodyAsString) {
@@ -63,7 +61,7 @@ public class JsonParserHelper {
     ObjectAdapter parseAsMapWithSingleValue(final JsonRepresentation arguments) {
         final JsonRepresentation representation = arguments.getRepresentation("value");
         if (arguments.size() != 1 || representation == null) {
-            throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, "Body should be a map with a single key 'value' whose value represents an instance of type '%s'", Util.resourceFor(objectSpec));
+            throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, "Body should be a map with a single key 'value' whose value represents an instance of type '%s'", resourceFor(objectSpec));
         }
 
         return objectAdapterFor(arguments);
@@ -122,14 +120,14 @@ public class JsonParserHelper {
             argRepr.mapPut("invalidReason", reason);
             throw new IllegalArgumentException(reason);
         }
-        final String oidFromHref = UrlParserUtils.encodedOidFromLink(argValueRepr);
+        final String oidFromHref = encodedOidFromLink(argValueRepr);
         if (oidFromHref == null) {
             final String reason = "Could not parse 'href' to identify the object's OID";
             argRepr.mapPut("invalidReason", reason);
             throw new IllegalArgumentException(reason);
         }
 
-        final ObjectAdapter objectAdapter = OidUtils.getObjectAdapterElseNull(resourceContext, oidFromHref);
+        final ObjectAdapter objectAdapter = OidUtils.getObjectAdapterElseNull(rendererContext, oidFromHref);
         if (objectAdapter == null) {
             final String reason = "'href' does not reference a known entity";
             argRepr.mapPut("invalidReason", reason);
@@ -138,4 +136,26 @@ public class JsonParserHelper {
         return objectAdapter;
     }
 
+    static String encodedOidFromLink(final JsonRepresentation link) {
+        final String href = link.getString("href");
+
+        final Matcher matcher = OBJECT_OID.matcher(href);
+        if (!matcher.matches()) {
+            return null;
+        }
+        String domainType = matcher.group(1);
+        String instanceId = matcher.group(2);
+        return getOidMarshaller().joinAsOid(domainType, instanceId);
+    }
+
+    private static String resourceFor(final ObjectSpecification objectSpec) {
+        // TODO: should return a string in the form
+        // http://localhost:8080/types/xxx
+        return objectSpec.getFullIdentifier();
+    }
+
+    private static OidMarshaller getOidMarshaller() {
+        return new OidMarshaller();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectActionArgHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectActionArgHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectActionArgHelper.java
index 1d807a5..7bb3fa2 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectActionArgHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectActionArgHelper.java
@@ -26,8 +26,8 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
-import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 /**
  * Utility class that encapsulates the logic for parsing arguments to be invoked by an 
@@ -35,15 +35,15 @@ import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationExc
  */
 public class ObjectActionArgHelper {
 
-    private final ResourceContext resourceContext;
+    private final RendererContext rendererContext;
     private final ObjectAdapter objectAdapter;
     private final ObjectAction action;
 
     public ObjectActionArgHelper(
-            final ResourceContext resourceContext,
+            final RendererContext rendererContext,
             final ObjectAdapter objectAdapter,
             final ObjectAction action) {
-        this.resourceContext = resourceContext;
+        this.rendererContext = rendererContext;
         this.objectAdapter = objectAdapter;
         this.action = action;
     }
@@ -58,7 +58,7 @@ public class ObjectActionArgHelper {
             final JsonRepresentation argRepr = argList.get(i);
             final ObjectSpecification paramSpec = parameters.get(i).getSpecification();
             try {
-                final ObjectAdapter argAdapter = new JsonParserHelper(resourceContext, paramSpec).objectAdapterFor(argRepr);
+                final ObjectAdapter argAdapter = new JsonParserHelper(rendererContext, paramSpec).objectAdapterFor(argRepr);
                 argAdapters.add(argAdapter);
 
                 // validate individual arg

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterAccessHelper.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterAccessHelper.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterAccessHelper.java
index 6b17816..f979b81 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterAccessHelper.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ObjectAdapterAccessHelper.java
@@ -23,9 +23,9 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.*;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberType;
-import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 /**
  * Utility class that encapsulates the logic for checking access to the specified
@@ -33,6 +33,11 @@ import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationExc
  */
 public class ObjectAdapterAccessHelper {
 
+    public static void throwNotFoundException(final String memberId, final MemberType memberType) {
+        final String memberTypeStr = memberType.name().toLowerCase();
+        throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.NOT_FOUND, "%s '%s' either does not exist or is not visible", memberTypeStr, memberId);
+    }
+
     static enum Intent {
         ACCESS, MUTATE;
 
@@ -42,17 +47,17 @@ public class ObjectAdapterAccessHelper {
     }
 
     private final ObjectAdapter objectAdapter;
-    private final ResourceContext resourceContext;
+    private final RendererContext rendererContext;
 
-    public ObjectAdapterAccessHelper(ResourceContext resourceContext, ObjectAdapter objectAdapter) {
+    public ObjectAdapterAccessHelper(RendererContext rendererContext, ObjectAdapter objectAdapter) {
         this.objectAdapter = objectAdapter;
-        this.resourceContext = resourceContext;
+        this.rendererContext = rendererContext;
     }
 
     public OneToOneAssociation getPropertyThatIsVisibleForIntent(
             final String propertyId, final Intent intent) {
 
-        final Where where = resourceContext.getWhere();
+        final Where where = rendererContext.getWhere();
 
         final ObjectAssociation association;
         try {
@@ -60,12 +65,12 @@ public class ObjectAdapterAccessHelper {
             association = specification.getAssociation(propertyId);
         } catch(Exception ex) {
             // fall through
-            Util.throwNotFoundException(propertyId, MemberType.PROPERTY);
+            throwNotFoundException(propertyId, MemberType.PROPERTY);
             return null; // to keep compiler happy.
         }
 
         if (association == null || !association.isOneToOneAssociation()) {
-            Util.throwNotFoundException(propertyId, MemberType.PROPERTY);
+            throwNotFoundException(propertyId, MemberType.PROPERTY);
         }
 
         final OneToOneAssociation property = (OneToOneAssociation) association;
@@ -75,18 +80,18 @@ public class ObjectAdapterAccessHelper {
     public OneToManyAssociation getCollectionThatIsVisibleForIntent(
             final String collectionId, final Intent intent) {
 
-        final Where where = resourceContext.getWhere();
+        final Where where = rendererContext.getWhere();
         final ObjectAssociation association;
         try {
             final ObjectSpecification specification = objectAdapter.getSpecification();
             association = specification.getAssociation(collectionId);
         } catch(Exception ex) {
             // fall through
-            Util.throwNotFoundException(collectionId, MemberType.COLLECTION);
+            throwNotFoundException(collectionId, MemberType.COLLECTION);
             return null; // to keep compiler happy.
         }
         if (association == null || !association.isOneToManyAssociation()) {
-            Util.throwNotFoundException(collectionId, MemberType.COLLECTION);
+            throwNotFoundException(collectionId, MemberType.COLLECTION);
         }
         final OneToManyAssociation collection = (OneToManyAssociation) association;
         return memberThatIsVisibleForIntent(collection, MemberType.COLLECTION, intent);
@@ -95,18 +100,18 @@ public class ObjectAdapterAccessHelper {
     public ObjectAction getObjectActionThatIsVisibleForIntent(
             final String actionId, final Intent intent) {
 
-        final Where where = resourceContext.getWhere();
+        final Where where = rendererContext.getWhere();
 
         final ObjectAction action;
         try {
             final ObjectSpecification specification = objectAdapter.getSpecification();
             action = specification.getObjectAction(actionId);
         } catch(Exception ex) {
-            Util.throwNotFoundException(actionId, MemberType.ACTION);
+            throwNotFoundException(actionId, MemberType.ACTION);
             return null; // to keep compiler happy.
         }
         if (action == null) {
-            Util.throwNotFoundException(actionId, MemberType.ACTION);
+            throwNotFoundException(actionId, MemberType.ACTION);
         }
         return memberThatIsVisibleForIntent(action, MemberType.ACTION, intent);
     }
@@ -114,12 +119,12 @@ public class ObjectAdapterAccessHelper {
     public <T extends ObjectMember> T memberThatIsVisibleForIntent(
             final T objectMember, final MemberType memberType, final Intent intent) {
 
-        final Where where = resourceContext.getWhere();
+        final Where where = rendererContext.getWhere();
 
         final String memberId = objectMember.getId();
-        final AuthenticationSession authenticationSession = resourceContext.getAuthenticationSession();
+        final AuthenticationSession authenticationSession = rendererContext.getAuthenticationSession();
         if (objectMember.isVisible(authenticationSession, objectAdapter, where).isVetoed()) {
-            Util.throwNotFoundException(memberId, memberType);
+            throwNotFoundException(memberId, memberType);
         }
         if (intent.isMutate()) {
             final Consent usable = objectMember.isUsable(authenticationSession, objectAdapter, where);

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
index 7855b71..3bac4b4 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResourceAbstract.java
@@ -18,14 +18,11 @@
  */
 package org.apache.isis.viewer.restfulobjects.server.resources;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.*;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -35,46 +32,19 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.server.util.OidUtils;
 import org.apache.isis.viewer.restfulobjects.server.util.UrlDecoderUtils;
 
 public abstract class ResourceAbstract {
 
-
-    protected final static JsonMapper jsonMapper = JsonMapper.instance();
-
-    public enum Caching {
-        ONE_DAY(24 * 60 * 60), ONE_HOUR(60 * 60), NONE(0);
-
-        private final CacheControl cacheControl;
-
-        private Caching(final int maxAge) {
-            this.cacheControl = new CacheControl();
-            if (maxAge > 0) {
-                cacheControl.setMaxAge(maxAge);
-            } else {
-                cacheControl.setNoCache(true);
-            }
-        }
-
-        public CacheControl getCacheControl() {
-            return cacheControl;
-        }
-    }
-
-    // nb: SET is excluded; we simply flatten contributed actions.
-    public final static ActionType[] ACTION_TYPES = { ActionType.USER, ActionType.DEBUG, ActionType.EXPLORATION };
-
     @Context
     HttpHeaders httpHeaders;
 
@@ -138,29 +108,9 @@ public abstract class ResourceAbstract {
     }
 
     // //////////////////////////////////////////////////////////////
-    // Rendering
-    // //////////////////////////////////////////////////////////////
-
-    protected static String jsonFor(final Object object) {
-        try {
-            return jsonMapper.write(object);
-        } catch (final JsonGenerationException e) {
-            throw new RuntimeException(e);
-        } catch (final JsonMappingException e) {
-            throw new RuntimeException(e);
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    // //////////////////////////////////////////////////////////////
     // Isis integration
     // //////////////////////////////////////////////////////////////
 
-    protected ObjectSpecification getSpecification(final String specFullName) {
-        return getSpecificationLoader().loadSpecification(specFullName);
-    }
-
     protected ObjectAdapter getObjectAdapterElseThrowNotFound(String domainType, final String instanceId) {
         ObjectAdapter objectAdapter = getObjectAdapterElseNull(domainType, instanceId);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
deleted file mode 100644
index dcddc6d..0000000
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/ResponseGeneratorService.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- *  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.server.resources;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.List;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.applib.annotation.DomainService;
-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.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.*;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer.SelfLink;
-import org.apache.isis.viewer.restfulobjects.server.ResourceContext;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
-import org.apache.isis.viewer.restfulobjects.server.resources.ResourceAbstract.Caching;
-
-@DomainService
-public class ResponseGeneratorService {
-
-    private static final DateFormat ETAG_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
-
-    public static interface ResponseContext {
-        public ResourceContext getResourceContext();
-        public ObjectAdapter getObjectAdapter();
-        public ObjectAdapterLinkTo getAdapterLinkTo();
-    }
-
-
-    // //////////////////////////////////////////////////////////////
-    // objectRepresentation
-    // //////////////////////////////////////////////////////////////
-
-    @Programmatic
-    public Response objectRepresentation(final ResponseContext responseContext) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-
-        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(resourceContext, null, JsonRepresentation.newMap());
-        renderer.with(objectAdapter).includesSelf();
-
-        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-
-        final Version version = objectAdapter.getVersion();
-        if (version != null && version.getTime() != null) {
-            responseBuilder.tag(ETAG_FORMAT.format(version.getTime()));
-        }
-        return buildResponse(responseBuilder);
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // propertyDetails
-    // //////////////////////////////////////////////////////////////
-
-    public enum MemberMode {
-        NOT_MUTATING {
-            @Override
-            public void apply(final AbstractObjectMemberReprRenderer<?, ?> renderer) {
-                renderer.asStandalone();
-            }
-        },
-        MUTATING {
-            @Override
-            public void apply(final AbstractObjectMemberReprRenderer<?, ?> renderer) {
-                renderer.asMutated();
-            }
-        };
-
-        public abstract void apply(AbstractObjectMemberReprRenderer<?, ?> renderer);
-    }
-
-    @Programmatic
-    public Response propertyDetails(
-            final ResponseContext responseContext,
-            final String propertyId, final MemberMode memberMode, final Caching caching) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final OneToOneAssociation property = accessHelper.getPropertyThatIsVisibleForIntent(propertyId, ObjectAdapterAccessHelper.Intent.ACCESS);
-
-        final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(resourceContext, null, null, JsonRepresentation.newMap());
-
-        renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(adapterLinkTo);
-
-        memberMode.apply(renderer);
-
-        return Responses.ofOk(renderer, caching).build();
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // collectionDetails
-    // //////////////////////////////////////////////////////////////
-
-    @Programmatic
-    public Response collectionDetails(
-            final ResponseContext responseContext,
-            final String collectionId, final MemberMode memberMode, final Caching caching) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final OneToManyAssociation collection = accessHelper.getCollectionThatIsVisibleForIntent(collectionId, ObjectAdapterAccessHelper.Intent.ACCESS);
-
-        final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(resourceContext, null, null, JsonRepresentation.newMap());
-
-        renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(adapterLinkTo);
-
-        memberMode.apply(renderer);
-
-        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, caching);
-        return buildResponse(responseBuilder);
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // action Prompt
-    // //////////////////////////////////////////////////////////////
-
-    @Programmatic
-    public Response actionPrompt(
-            final ResponseContext responseContext,
-            final String actionId) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.ACCESS);
-
-        final ObjectActionReprRenderer renderer = new ObjectActionReprRenderer(resourceContext, null, null, JsonRepresentation.newMap());
-
-        renderer.with(new ObjectAndAction(objectAdapter, action)).usingLinkTo(adapterLinkTo).asStandalone();
-
-        final ResponseBuilder responseBuilder = Responses.ofOk(renderer, Caching.NONE);
-        return buildResponse(responseBuilder);
-    }
-
-    // //////////////////////////////////////////////////////////////
-    // invoke action
-    // //////////////////////////////////////////////////////////////
-
-    @Programmatic
-    public Response invokeActionQueryOnly(
-            final ResponseContext responseContext,
-            final String actionId, final JsonRepresentation arguments) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
-
-        final ActionSemantics.Of actionSemantics = action.getSemantics();
-        if (actionSemantics != ActionSemantics.Of.SAFE) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "Method not allowed; action '%s' is not query only", action.getId());
-        }
-
-        final ResponseBuilder responseBuilder = invokeActionUsingAdapters(responseContext, action, arguments, SelfLink.INCLUDED);
-        return buildResponse(responseBuilder);
-    }
-
-    @Programmatic
-    public Response invokeActionIdempotent(
-            final ResponseContext responseContext,
-            final String actionId, final JsonRepresentation arguments) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-
-        final ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
-
-        final ActionSemantics.Of actionSemantics = action.getSemantics();
-        if (!actionSemantics.isIdempotentInNature()) {
-            throw RestfulObjectsApplicationException.createWithMessage(HttpStatusCode.METHOD_NOT_ALLOWED, "Method not allowed; action '%s' is not idempotent", action.getId());
-        }
-        final ResponseBuilder responseBuilder = invokeActionUsingAdapters(responseContext, action, arguments, SelfLink.EXCLUDED);
-        return buildResponse(responseBuilder);
-    }
-
-    @Programmatic
-    public Response invokeAction(
-            final ResponseContext responseContext,
-            final String actionId, final JsonRepresentation arguments) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-
-        ObjectAdapterAccessHelper accessHelper = new ObjectAdapterAccessHelper(resourceContext, objectAdapter);
-
-        final ObjectAction action = accessHelper.getObjectActionThatIsVisibleForIntent(actionId, ObjectAdapterAccessHelper.Intent.MUTATE);
-
-        final ResponseBuilder responseBuilder = invokeActionUsingAdapters(responseContext, action, arguments, SelfLink.EXCLUDED);
-        return buildResponse(responseBuilder);
-    }
-
-    /**
-     * Overridable to allow further customization.
-     */
-    protected Response buildResponse(final ResponseBuilder responseBuilder) {
-        return responseBuilder.build();
-    }
-
-    //region > helpers
-    private ResponseBuilder invokeActionUsingAdapters(
-            final ResponseContext responseContext,
-            final ObjectAction action, final JsonRepresentation arguments, SelfLink selfLink) {
-
-        final ResourceContext resourceContext = responseContext.getResourceContext();
-        final ObjectAdapter objectAdapter = responseContext.getObjectAdapter();
-        final ObjectAdapterLinkTo adapterLinkTo = responseContext.getAdapterLinkTo();
-
-        final ObjectActionArgHelper argHelper = new ObjectActionArgHelper(resourceContext, objectAdapter, action);
-
-        final List<ObjectAdapter> argAdapters = argHelper.parseAndValidateArguments(arguments);
-
-        // invoke
-        final ObjectAdapter[] argArray2 = argAdapters.toArray(new ObjectAdapter[0]);
-        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray2);
-
-        // response
-        final ActionResultReprRenderer renderer = new ActionResultReprRenderer(resourceContext, null, selfLink, JsonRepresentation.newMap());
-
-        renderer.with(new ObjectAndActionInvocation(objectAdapter, action, arguments, returnedAdapter)).using(adapterLinkTo);
-
-        final ResponseBuilder respBuilder = Responses.ofOk(renderer, Caching.NONE);
-
-        final Version version = objectAdapter.getVersion();
-        Responses.addLastModifiedAndETagIfAvailable(respBuilder, version);
-
-        return respBuilder;
-    }
-    //endregion
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Responses.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Responses.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Responses.java
deleted file mode 100644
index da3bef2..0000000
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Responses.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- *  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.server.resources;
-
-import java.util.Date;
-import javax.ws.rs.core.EntityTag;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
-import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRenderer;
-
-public final class Responses {
-
-    private Responses(){}
-
-    public static Response.ResponseBuilder ofNoContent() {
-        return of(RestfulResponse.HttpStatusCode.NO_CONTENT);
-    }
-
-    public static Response.ResponseBuilder ofOk(final ReprRenderer<?, ?> renderer, final ResourceAbstract.Caching caching) {
-        return ofOk(renderer, caching, null);
-    }
-
-    public static Response.ResponseBuilder ofOk(final ReprRenderer<?, ?> renderer, final ResourceAbstract.Caching caching, final Version version) {
-        final MediaType mediaType = renderer.getMediaType();
-        final Response.ResponseBuilder response = of(RestfulResponse.HttpStatusCode.OK).type(mediaType).cacheControl(caching.getCacheControl()).entity(ResourceAbstract.jsonFor(renderer.render()));
-        return addLastModifiedAndETagIfAvailable(response, version);
-    }
-
-    protected static Response.ResponseBuilder of(final RestfulResponse.HttpStatusCode httpStatusCode) {
-        return Response.status(httpStatusCode.getJaxrsStatusType()).type(MediaType.APPLICATION_JSON_TYPE);
-    }
-
-    public static Response.ResponseBuilder addLastModifiedAndETagIfAvailable(final Response.ResponseBuilder responseBuilder, final Version version) {
-        if (version != null && version.getTime() != null) {
-            final Date time = version.getTime();
-            responseBuilder.lastModified(time);
-            responseBuilder.tag(asETag(time));
-        }
-        return responseBuilder;
-    }
-
-    private static EntityTag asETag(final Date time) {
-        final String utcTime = ISODateTimeFormat.basicDateTime().print(new DateTime(time));
-        return new EntityTag(utcTime, true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
index e226fa0..9d1b0c6 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
@@ -28,7 +28,9 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.user.UserResource;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.Caching;
+import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 public class UserResourceServerside extends ResourceAbstract implements UserResource {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Util.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Util.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Util.java
deleted file mode 100644
index 4af8803..0000000
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/Util.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- *  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.server.resources;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-import com.google.common.base.Charsets;
-import com.google.common.io.ByteStreams;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
-import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.MemberType;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
-
-public final class Util {
-
-    private Util(){}
-
-    // //////////////////////////////////////////////////////////////
-    // parsing
-    // //////////////////////////////////////////////////////////////
-
-    /**
-     * Parse {@link java.io.InputStream} to String, else throw exception
-     */
-    public static String asStringUtf8(final InputStream body) {
-        try {
-            final byte[] byteArray = ByteStreams.toByteArray(body);
-            return new String(byteArray, Charsets.UTF_8);
-        } catch (final IOException e) {
-            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not read body");
-        }
-    }
-
-    /**
-     * Parse (body) string to {@link org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation}, else throw exception
-     */
-    public static JsonRepresentation readAsMap(final String body) {
-        if (body == null) {
-            return JsonRepresentation.newMap();
-        }
-        final String bodyTrimmed = body.trim();
-        if (bodyTrimmed.isEmpty()) {
-            return JsonRepresentation.newMap();
-        }
-        return read(bodyTrimmed, "body");
-    }
-
-    /**
-     * Parse (query) string to {@link org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation}, else throw exception
-     */
-    public static JsonRepresentation readQueryStringAsMap(final String queryString) {
-        if (queryString == null) {
-            return JsonRepresentation.newMap();
-        }
-        final String queryStringTrimmed = queryString.trim();
-        if (queryStringTrimmed.isEmpty()) {
-            return JsonRepresentation.newMap();
-        }
-        return read(queryStringTrimmed, "query string");
-    }
-
-    /**
-     * REVIEW - looks similar to above methods, but now unused; can it be deleted?
-     */
-    public static JsonRepresentation readParameterMapAsMap(final Map<String, String[]> parameterMap) {
-        final JsonRepresentation map = JsonRepresentation.newMap();
-        for (final Map.Entry<String, String[]> parameter : parameterMap.entrySet()) {
-            map.mapPut(parameter.getKey(), parameter.getValue()[0]);
-        }
-        return map;
-    }
-
-    private static JsonRepresentation read(final String args, final String argsNature) {
-        try {
-            final JsonRepresentation jsonRepr = JsonMapper.instance().read(args);
-            if (!jsonRepr.isMap()) {
-                throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, "could not read %s as a JSON map", argsNature);
-            }
-            return jsonRepr;
-        } catch (final JsonParseException e) {
-            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not parse %s", argsNature);
-        } catch (final JsonMappingException e) {
-            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not read %s as JSON", argsNature);
-        } catch (final IOException e) {
-            throw RestfulObjectsApplicationException.createWithCauseAndMessage(RestfulResponse.HttpStatusCode.BAD_REQUEST, e, "could not parse %s", argsNature);
-        }
-    }
-
-
-    // //////////////////////////////////////////////////////////////
-    // misc
-    // //////////////////////////////////////////////////////////////
-
-    static String resourceFor(final ObjectSpecification objectSpec) {
-        // TODO: should return a string in the form
-        // http://localhost:8080/types/xxx
-        return objectSpec.getFullIdentifier();
-    }
-
-
-    public static void throwNotFoundException(final String memberId, final MemberType memberType) {
-        final String memberTypeStr = memberType.name().toLowerCase();
-        throw RestfulObjectsApplicationException.createWithMessage(RestfulResponse.HttpStatusCode.NOT_FOUND, "%s '%s' either does not exist or is not visible", memberTypeStr, memberId);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/VersionResourceServerside.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/VersionResourceServerside.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/VersionResourceServerside.java
index 3e78a9c..c2d3da9 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/VersionResourceServerside.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/VersionResourceServerside.java
@@ -32,7 +32,9 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.version.VersionResource;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.Caching;
+import org.apache.isis.viewer.restfulobjects.rendering.Responses;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 /**
  * Implementation note: it seems to be necessary to annotate the implementation

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/NOTUSED_PathUtils.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/NOTUSED_PathUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/NOTUSED_PathUtils.java
new file mode 100644
index 0000000..cf7d080
--- /dev/null
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/NOTUSED_PathUtils.java
@@ -0,0 +1,40 @@
+/*
+ *  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.server.util;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+public final class NOTUSED_PathUtils {
+
+    private NOTUSED_PathUtils() {
+    }
+
+    public static String combine(final HttpServletRequest request, final String... pathElements) {
+        final StringBuilder buf = new StringBuilder(request.getContextPath());
+        for (final String pathElement : pathElements) {
+            if (!pathElement.startsWith("/")) {
+                buf.append("/");
+            }
+            buf.append(pathElement);
+        }
+        return buf.toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
index d55ba71..a4856ba 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
@@ -39,22 +39,27 @@ public final class OidUtils {
     /**
      * @return {@code null} if not persistent and not a view model.
      */
-    public static ObjectAdapter getObjectAdapterElseNull(final RendererContext resourceContext,
-                                                         final String domainType, final String instanceIdEncoded) {
+    public static ObjectAdapter getObjectAdapterElseNull(
+            final RendererContext rendererContext,
+            final String domainType, final String instanceIdEncoded) {
         final String instanceIdUnencoded = UrlDecoderUtils.urlDecode(instanceIdEncoded);
         String oidStrUnencoded = getOidMarshaller().joinAsOid(domainType, instanceIdUnencoded);
-        return getObjectAdapter(resourceContext, oidStrUnencoded);
+        return getObjectAdapter(rendererContext, oidStrUnencoded);
     }
 
     /**
      * see {@link #getObjectAdapterElseNull(org.apache.isis.viewer.restfulobjects.rendering.RendererContext, String, String)}
      */
-    public static ObjectAdapter getObjectAdapterElseNull(final RendererContext resourceContext, final String oidStrEncoded) {
+    public static ObjectAdapter getObjectAdapterElseNull(
+            final RendererContext rendererContext,
+            final String oidStrEncoded) {
         String oidStrUnencoded = UrlDecoderUtils.urlDecode(oidStrEncoded);
-        return getObjectAdapter(resourceContext, oidStrUnencoded);
+        return getObjectAdapter(rendererContext, oidStrUnencoded);
     }
 
-    private static ObjectAdapter getObjectAdapter(RendererContext resourceContext, String oidStrUnencoded) {
+    private static ObjectAdapter getObjectAdapter(
+            final RendererContext rendererContext,
+            final String oidStrUnencoded) {
         RootOidDefault rootOid = RootOidDefault.deString(oidStrUnencoded, getOidMarshaller());
         final ObjectSpecId specId = rootOid.getObjectSpecId();
 
@@ -65,7 +70,7 @@ public final class OidUtils {
         }
 
         // TODO: the logic to figure out which PersistenceSession API to call should be pushed down into PersistenceSession itself.
-        final PersistenceSession persistenceSession = resourceContext.getPersistenceSession();
+        final PersistenceSession persistenceSession = rendererContext.getPersistenceSession();
 
         if(spec.containsFacet(ViewModelFacet.class)) {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/PathUtils.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/PathUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/PathUtils.java
deleted file mode 100644
index 2410679..0000000
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/PathUtils.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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.server.util;
-
-import javax.servlet.http.HttpServletRequest;
-
-
-public final class PathUtils {
-
-    private PathUtils() {
-    }
-
-    public static String combine(final HttpServletRequest request, final String... pathElements) {
-        final StringBuilder buf = new StringBuilder(request.getContextPath());
-        for (final String pathElement : pathElements) {
-            if (!pathElement.startsWith("/")) {
-                buf.append("/");
-            }
-            buf.append(pathElement);
-        }
-        return buf.toString();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtils.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtils.java
index 4921a1b..ec7f71c 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtils.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtils.java
@@ -20,26 +20,13 @@ package org.apache.isis.viewer.restfulobjects.server.util;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
 public final class UrlParserUtils {
 
-    private final static Pattern OBJECT_OID = Pattern.compile(".*objects\\/([^/]+)\\/(.+)");;
-    private final static Pattern DOMAIN_TYPE = Pattern.compile(".*domain-types\\/([^/]+).*");;
+    private UrlParserUtils(){}
 
-    public final static String encodedOidFromLink(final JsonRepresentation link) {
-        final String href = link.getString("href");
-        
-        final Matcher matcher = OBJECT_OID.matcher(href);
-        if (!matcher.matches()) {
-            return null;
-        }
-        String domainType = matcher.group(1);
-        String instanceId = matcher.group(2);
-        return getOidMarshaller().joinAsOid(domainType, instanceId);
-    }
+    private final static Pattern DOMAIN_TYPE = Pattern.compile(".*domain-types\\/([^/]+).*");;
 
     public final static String domainTypeFrom(final JsonRepresentation link) {
         return domainTypeFrom(link.getString("href"));
@@ -53,8 +40,5 @@ public final class UrlParserUtils {
         return matcher.group(1);
     }
 
-    private static OidMarshaller getOidMarshaller() {
-        return new OidMarshaller();
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/ResourceContextTest_ensureCompatibleAcceptHeader.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/ResourceContextTest_ensureCompatibleAcceptHeader.java b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/ResourceContextTest_ensureCompatibleAcceptHeader.java
index f83eb59..824db47 100644
--- a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/ResourceContextTest_ensureCompatibleAcceptHeader.java
+++ b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/ResourceContextTest_ensureCompatibleAcceptHeader.java
@@ -32,6 +32,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapperTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapperTest.java b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapperTest.java
index b900a62..8dae5e9 100644
--- a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapperTest.java
+++ b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/RestfulObjectsApplicationExceptionMapperTest.java
@@ -31,6 +31,7 @@ import org.junit.Test;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 
 public class RestfulObjectsApplicationExceptionMapperTest {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelperTest_readBodyAsMap.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelperTest_readBodyAsMap.java b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelperTest_readBodyAsMap.java
index c694d49..b119ba9 100644
--- a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelperTest_readBodyAsMap.java
+++ b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/DomainResourceHelperTest_readBodyAsMap.java
@@ -24,7 +24,8 @@ import static org.junit.Assert.assertThat;
 import org.junit.Test;
 
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
-import org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
+import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
 public class DomainResourceHelperTest_readBodyAsMap {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelpTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelpTest.java b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelpTest.java
new file mode 100644
index 0000000..8d64a93
--- /dev/null
+++ b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/resources/JsonParserHelpTest.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.server.resources;
+
+import org.junit.Test;
+import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
+
+import static org.junit.Assert.assertEquals;
+
+public class JsonParserHelpTest {
+
+    @Test
+    public void oidFromLink() throws Exception {
+        final JsonRepresentation link = JsonRepresentation.newMap();
+        link.mapPut("href", "http://localhost/objects/OID/1");
+        final String oidFromHref = JsonParserHelper.encodedOidFromLink(link);
+        assertEquals("OID:1", oidFromHref);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtilsTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtilsTest.java b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtilsTest.java
index edbff05..b659df4 100644
--- a/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtilsTest.java
+++ b/core/viewer-restfulobjects-server/src/test/java/org/apache/isis/viewer/restfulobjects/server/util/UrlParserUtilsTest.java
@@ -18,21 +18,12 @@
  */
 package org.apache.isis.viewer.restfulobjects.server.util;
 
-import static org.junit.Assert.assertEquals;
-
 import org.junit.Test;
-
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
-public class UrlParserUtilsTest {
+import static org.junit.Assert.assertEquals;
 
-    @Test
-    public void oidFromLink() throws Exception {
-        final JsonRepresentation link = JsonRepresentation.newMap();
-        link.mapPut("href", "http://localhost/objects/OID/1");
-        final String oidFromHref = UrlParserUtils.encodedOidFromLink(link);
-        assertEquals("OID:1", oidFromHref);
-    }
+public class UrlParserUtilsTest {
 
     @Test
     public void domainTypeFromLink() throws Exception {

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/example/application/todoapp/webapp/src/main/java/webapp/CustomRepresentationService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/java/webapp/CustomRepresentationService.java b/example/application/todoapp/webapp/src/main/java/webapp/CustomRepresentationService.java
new file mode 100644
index 0000000..9cf70af
--- /dev/null
+++ b/example/application/todoapp/webapp/src/main/java/webapp/CustomRepresentationService.java
@@ -0,0 +1,32 @@
+/*
+ *  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 webapp;
+
+import javax.ws.rs.core.Response;
+import org.apache.isis.viewer.restfulobjects.rendering.service.RepresentationServiceForRestfulObjects;
+
+public class CustomRepresentationService extends RepresentationServiceForRestfulObjects {
+
+    @Override
+    protected Response buildResponse(Response.ResponseBuilder responseBuilder) {
+        responseBuilder.header("X-ResponseGeneratedBy", getClass().getCanonicalName());
+        return super.buildResponse(responseBuilder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/example/application/todoapp/webapp/src/main/java/webapp/CustomResponseGeneratorService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/java/webapp/CustomResponseGeneratorService.java b/example/application/todoapp/webapp/src/main/java/webapp/CustomResponseGeneratorService.java
deleted file mode 100644
index 7fb1c9a..0000000
--- a/example/application/todoapp/webapp/src/main/java/webapp/CustomResponseGeneratorService.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  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 webapp;
-
-import javax.ws.rs.core.Response;
-import org.apache.isis.viewer.restfulobjects.server.resources.ResponseGeneratorService;
-
-public class CustomResponseGeneratorService extends ResponseGeneratorService {
-
-    @Override
-    protected Response buildResponse(Response.ResponseBuilder responseBuilder) {
-        responseBuilder.header("X-ResponseGeneratedBy", getClass().getCanonicalName());
-        return super.buildResponse(responseBuilder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6907534b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
index 2b70530..11f9141 100644
--- a/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/todoapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -149,7 +149,7 @@ isis.services = \
                 org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
                 #,\
                 1:webapp.CustomMementoService,\
-                1:webapp.CustomResponseGeneratorService
+                1:webapp.CustomRepresentationService
 
 
 # Specify the (optional) test fixtures