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 2013/02/19 09:06:14 UTC

[4/4] git commit: ISIS-233: working toward RO spec 1.0.0

Updated Branches:
  refs/heads/dan/ISIS-233-ro [created] e5093edb5


ISIS-233: working toward RO spec 1.0.0

* resources now have domainType/instanceId format
* change Rel enum to have prefix
* change Rel enum to specify optional parameters
* change RepresentationType constants
* fix to PathNode for following multiple links
* got rid of ReprRenderFactory and the registry of these completely
* removed transient domain object repr and newTransientInstance action
* throw 406 if mismatch on accept profile param
* can now start the TCK app once more for RO
* fixed some annotations in TCK app, were failing metamodel validator


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

Branch: refs/heads/dan/ISIS-233-ro
Commit: e5093edb5d833f706286e43359b18021fa91e7f8
Parents: a1a7317
Author: Dan Haywood <da...@apache.org>
Authored: Tue Feb 19 08:03:00 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Feb 19 08:03:00 2013 +0000

----------------------------------------------------------------------
 .../restfulobjects/applib/JsonRepresentation.java  |    2 +-
 .../isis/viewer/restfulobjects/applib/Rel.java     |   51 +++--
 .../restfulobjects/applib/RepresentationType.java  |    6 +-
 .../restfulobjects/applib/RestfulMediaType.java    |   30 ++--
 .../applib/domainobjects/DomainObjectResource.java |   64 +++---
 .../domainobjects/DomainServiceResource.java       |    2 +-
 .../applib/domaintypes/DomainTypeResource.java     |   26 +--
 .../applib/homepage/HomePageRepresentation.java    |    7 +-
 .../viewer/restfulobjects/applib/util/Parser.java  |    8 +-
 .../restfulobjects/applib/util/PathNode.java       |   59 ++++--
 .../restfulobjects/applib/util/ParserTest.java     |    2 +-
 .../applib/util/PathNodeTest_equalsHashcode.java   |   24 ++-
 .../applib/util/PathNodeTest_split.java            |   56 +++++
 .../restfulobjects/rendering/LinkBuilder.java      |   16 +-
 .../rendering/RendererFactoryRegistry.java         |   84 --------
 .../rendering/ReprRendererAbstract.java            |   18 +-
 .../rendering/ReprRendererFactoryAbstract.java     |   36 ----
 .../AbstractObjectMemberReprRenderer.java          |    2 +-
 .../domainobjects/ActionResultReprRenderer.java    |   35 +---
 .../domainobjects/DomainObjectLinkTo.java          |   29 +--
 .../domainobjects/DomainObjectReprRenderer.java    |   75 +++----
 .../domainobjects/DomainServiceLinkTo.java         |   22 ++-
 .../rendering/domainobjects/ListReprRenderer.java  |   24 +--
 .../domainobjects/ObjectActionReprRenderer.java    |   35 +---
 .../ObjectCollectionReprRenderer.java              |   27 +--
 .../domainobjects/ObjectPropertyReprRenderer.java  |   29 +--
 .../domainobjects/ScalarValueReprRenderer.java     |   28 ++--
 .../AbstractTypeMemberReprRenderer.java            |    4 +-
 .../domaintypes/ActionDescriptionReprRenderer.java |   26 +--
 .../ActionParameterDescriptionReprRenderer.java    |   26 +--
 .../CollectionDescriptionReprRenderer.java         |   22 +--
 .../domaintypes/DomainTypeReprRenderer.java        |   48 ++----
 .../PropertyDescriptionReprRenderer.java           |   22 +--
 .../domaintypes/TypeActionResultReprRenderer.java  |   17 +--
 .../domaintypes/TypeListReprRenderer.java          |   19 +--
 .../RestfulObjectsSpecEventSerializer.java         |    4 +-
 .../restfulobjects/rendering/util/OidUtils.java    |   20 ++-
 .../rendering/LinkFollowerTest_follow.java         |   47 +++++
 .../restfulobjects/server/ResourceContext.java     |   51 ++----
 .../server/RestfulObjectsApplication.java          |    8 -
 .../server/RuntimeExceptionMapper.java             |    8 +-
 .../resources/DomainObjectResourceServerside.java  |  102 +++++-----
 .../server/resources/DomainResourceHelper.java     |   31 +---
 .../resources/DomainServiceResourceServerside.java |   15 +-
 .../resources/DomainTypeResourceServerside.java    |   78 ++------
 .../server/resources/HomePageReprRenderer.java     |   61 ++----
 .../resources/HomePageResourceServerside.java      |    7 +-
 .../server/resources/ResourceAbstract.java         |   19 +-
 .../server/resources/UserReprRenderer.java         |   18 +--
 .../server/resources/UserResourceServerside.java   |    7 +-
 .../server/resources/VersionReprRenderer.java      |   17 +--
 .../resources/VersionResourceServerside.java       |   10 +-
 .../restfulobjects/server/util/OidUtils.java       |   26 ++-
 .../tck/src/main/webapp/WEB-INF/isis.properties    |   48 ++---
 .../src/main/webapp/WEB-INF/security_file.allow    |   16 --
 .../main/webapp/WEB-INF/security_file.passwords    |   20 --
 .../tck/src/main/webapp/WEB-INF/web.xml            |    4 +-
 .../restfulobjects/tck/IsisWebServerRule.java      |   10 +
 ...eTest_clientAcceptHeader_exceptionHandling.java |  105 ----------
 ...Test_serverSideException_exceptionHandling.java |   72 -------
 ...Test_serverSideException_exceptionHandling.java |   72 +++++++
 .../home/HomePageResourceTest_accept.java          |   79 -------
 .../home/HomePageResourceTest_get_accept.java      |  107 ++++++++++
 ...ePageResourceTest_representationAndHeaders.java |  146 -------------
 ...rceTest_templated_representationAndHeaders.java |  159 +++++++++++++++
 .../home/HomePageResourceTest_xrofollowlinks.java  |   54 +++---
 .../resources/object/DomainObjectResourceTest.java |   32 ++--
 .../core/metamodel/adapter/oid/OidMarshaller.java  |   18 ++
 ...olyInterfaceIdentityStrategySubtype3Entity.java |    2 +-
 .../refs/PolyInterfaceParentEntityRepository.java  |    6 +-
 .../dom/refs/UnidirFkParentEntityRepository.java   |    4 +-
 .../dom/refs/UnidirJoinParentEntityRepository.java |    4 +-
 72 files changed, 1037 insertions(+), 1431 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
index 71de8f9..c3e8fb0 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/JsonRepresentation.java
@@ -1047,7 +1047,7 @@ public class JsonRepresentation {
 
     private JsonNode getNode(final String path) {
         JsonNode jsonNode = this.jsonNode;
-        final String[] keys = path.split("\\.");
+        final List<String> keys = PathNode.split(path);
         for (final String key : keys) {
             final PathNode pathNode = PathNode.parse(key);
             if (!pathNode.getKey().isEmpty()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
index 1d20988..7184f59 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/Rel.java
@@ -24,38 +24,42 @@ public enum Rel {
     SELF("self"), 
     DESCRIBEDBY("describedby"), 
     UP("up"), 
+    PREVIOUS("previous"),
+    NEXT("next"),
     HELP("help"), 
     ICON("icon"),
 
     // Restful Objects namespace
-    ICON16(Spec.REL_PREFIX + "icon16"), 
-    ICON32(Spec.REL_PREFIX + "icon32"), 
-    OBJECT(Spec.REL_PREFIX + "object"), 
-    SERVICE(Spec.REL_PREFIX + "service"), 
-    CHOICE(Spec.REL_PREFIX + "choice"), 
+    ACTION(Spec.REL_PREFIX + "action"), 
+    ACTION_PARAM(Spec.REL_PREFIX + "action-param"), 
+    ADD_TO(Spec.REL_PREFIX + "add-to"), 
+    ATTACHMENT(Spec.REL_PREFIX + "attachment"), 
+    CHOICE(Spec.REL_PREFIX + "choice"),
+    CLEAR(Spec.REL_PREFIX + "clear"), 
+    COLLECTION(Spec.REL_PREFIX + "collection"), 
     DEFAULT(Spec.REL_PREFIX + "default"), 
+    DELETE(Spec.REL_PREFIX + "delete"), 
     DETAILS(Spec.REL_PREFIX + "details"), 
-    MODIFY(Spec.REL_PREFIX + "modify"), 
-    CLEAR(Spec.REL_PREFIX + "clear"), 
-    ADD_TO(Spec.REL_PREFIX + "addto"), 
-    REMOVE_FROM(Spec.REL_PREFIX + "removefrom"), 
+    DOMAIN_TYPE(Spec.REL_PREFIX + "domain-type"),
+    DOMAIN_TYPES(Spec.REL_PREFIX + "domain-types"), 
+    ELEMENT(Spec.REL_PREFIX + "element"), 
+    ELEMENT_TYPE(Spec.REL_PREFIX + "element-type"), 
     INVOKE(Spec.REL_PREFIX + "invoke"), 
+    MODIFY(Spec.REL_PREFIX + "modify"), 
     PERSIST(Spec.REL_PREFIX + "persist"), 
     PROPERTY(Spec.REL_PREFIX + "property"), 
-    COLLECTION(Spec.REL_PREFIX + "collection"), 
-    ACTION(Spec.REL_PREFIX + "action"), 
-    TYPE_ACTION(Spec.REL_PREFIX + "typeaction"), 
-    ACTION_PARAM(Spec.REL_PREFIX + "actionparam"), 
-    RETURN_TYPE(Spec.REL_PREFIX + "returntype"), 
-    ELEMENT_TYPE(Spec.REL_PREFIX + "elementtype"), 
-    VERSION(Spec.REL_PREFIX + "version"), 
-    USER(Spec.REL_PREFIX + "user"), 
+    REMOVE_FROM(Spec.REL_PREFIX + "remove-from"), 
+    RETURN_TYPE(Spec.REL_PREFIX + "return-type"), 
+    SERVICE(Spec.REL_PREFIX + "service"), 
     SERVICES(Spec.REL_PREFIX + "services"), 
-    TYPES(Spec.REL_PREFIX + "types"), 
-    DOMAIN_TYPE(Spec.REL_PREFIX + "domaintype"),
+    UPDATE(Spec.REL_PREFIX + "update"), 
+    USER(Spec.REL_PREFIX + "user"), 
+    VALUE(Spec.REL_PREFIX + "value"), 
+    VERSION(Spec.REL_PREFIX + "version"), 
+    
 
     // implementation specific
-    CONTRIBUTED_BY(Impl.REL_PREFIX + "contributedby");
+    CONTRIBUTED_BY(Impl.REL_PREFIX + "contributed-by");
 
     private final String name;
 
@@ -67,6 +71,13 @@ public enum Rel {
         return name;
     }
 
+    /**
+     * For those {@link Rel}s that also take a param
+     */
+    public String andParam(String paramName, String paramValue) {
+        return name + ";" + paramName + "=" + "\"" + paramValue + "\"";
+    }
+
     private static class Spec {
         final static String REL_PREFIX = "urn:org.restfulobjects:rels/";
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
index 6b04fe3..c0fd7f9 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RepresentationType.java
@@ -28,8 +28,6 @@ import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ListRepresenta
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ObjectActionRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ObjectCollectionRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ObjectPropertyRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ScalarValueRepresentation;
-import org.apache.isis.viewer.restfulobjects.applib.domainobjects.TransientDomainObjectRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domaintypes.ActionDescriptionRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domaintypes.ActionParameterDescriptionRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.domaintypes.CollectionDescriptionRepresentation;
@@ -49,9 +47,7 @@ public enum RepresentationType {
     USER(RestfulMediaType.APPLICATION_JSON_USER, UserRepresentation.class), 
     VERSION(RestfulMediaType.APPLICATION_JSON_VERSION, VersionRepresentation.class), 
     LIST(RestfulMediaType.APPLICATION_JSON_LIST, ListRepresentation.class), 
-    SCALAR_VALUE(RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, ScalarValueRepresentation.class), 
-    DOMAIN_OBJECT(RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, DomainObjectRepresentation.class), 
-    TRANSIENT_DOMAIN_OBJECT(RestfulMediaType.APPLICATION_JSON_TRANSIENT_DOMAIN_OBJECT, TransientDomainObjectRepresentation.class), 
+    DOMAIN_OBJECT(RestfulMediaType.APPLICATION_JSON_OBJECT, DomainObjectRepresentation.class), 
     OBJECT_PROPERTY(RestfulMediaType.APPLICATION_JSON_OBJECT_PROPERTY, ObjectPropertyRepresentation.class), 
     OBJECT_COLLECTION(RestfulMediaType.APPLICATION_JSON_OBJECT_COLLECTION, ObjectCollectionRepresentation.class), 
     OBJECT_ACTION(RestfulMediaType.APPLICATION_JSON_OBJECT_ACTION, ObjectActionRepresentation.class), 

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java
index 81b68b6..5dbd886 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/RestfulMediaType.java
@@ -41,20 +41,22 @@ public final class RestfulMediaType {
     public final static String APPLICATION_JSON_USER = BASE + "user";
     public final static String APPLICATION_JSON_VERSION = BASE + "version";
     public final static String APPLICATION_JSON_LIST = BASE + "list";
-    public final static String APPLICATION_JSON_SCALAR_VALUE = BASE + "scalarvalue";
-    public final static String APPLICATION_JSON_DOMAIN_OBJECT = BASE + "domainobject";
-    public final static String APPLICATION_JSON_TRANSIENT_DOMAIN_OBJECT = BASE + "transient";
-    public final static String APPLICATION_JSON_OBJECT_PROPERTY = BASE + "objectproperty";
-    public final static String APPLICATION_JSON_OBJECT_COLLECTION = BASE + "objectcollection";
-    public final static String APPLICATION_JSON_OBJECT_ACTION = BASE + "objectaction";
-    public final static String APPLICATION_JSON_ACTION_RESULT = BASE + "actionresult";
-    public final static String APPLICATION_JSON_TYPE_LIST = BASE + "typelist";
-    public final static String APPLICATION_JSON_DOMAIN_TYPE = BASE + "domaintype";
-    public final static String APPLICATION_JSON_TYPE_ACTION_RESULT = BASE + "typeactionresult";
-    public final static String APPLICATION_JSON_PROPERTY_DESCRIPTION = BASE + "propertydescription";
-    public final static String APPLICATION_JSON_COLLECTION_DESCRIPTION = BASE + "collectiondescription";
-    public final static String APPLICATION_JSON_ACTION_DESCRIPTION = BASE + "actiondescription";
-    public final static String APPLICATION_JSON_ACTION_PARAMETER_DESCRIPTION = BASE + "actionparameterdescription";
+    public final static String APPLICATION_JSON_OBJECT = BASE + "object";
+    public final static String APPLICATION_JSON_OBJECT_PROPERTY = BASE + "object-property";
+    public final static String APPLICATION_JSON_OBJECT_COLLECTION = BASE + "object-collection";
+    public final static String APPLICATION_JSON_OBJECT_ACTION = BASE + "object-action";
+    public final static String APPLICATION_JSON_ACTION_RESULT = BASE + "action-result";
+    public final static String APPLICATION_JSON_TYPE_LIST = BASE + "type-list";
+    public final static String APPLICATION_JSON_DOMAIN_TYPE = BASE + "domain-type";
+    public final static String APPLICATION_JSON_PROPERTY_DESCRIPTION = BASE + "property-description";
+    public final static String APPLICATION_JSON_COLLECTION_DESCRIPTION = BASE + "collection-description";
+    public final static String APPLICATION_JSON_ACTION_DESCRIPTION = BASE + "action-description";
+    public final static String APPLICATION_JSON_ACTION_PARAMETER_DESCRIPTION = BASE + "action-param-description";
     public final static String APPLICATION_JSON_ERROR = BASE + "error";
+    public final static String APPLICATION_JSON_TYPE_ACTION_RESULT = BASE + "type-action-result";
+
+    // REVIEW: these do not appear in RO spec 1.0.0 
+    // public final static String APPLICATION_JSON_SCALAR_VALUE = BASE + "scalarvalue";
+    // public final static String APPLICATION_JSON_TRANSIENT_DOMAIN_OBJECT = BASE + "transient";
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
index 9c28a32..2bb58f8 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainObjectResource.java
@@ -38,113 +38,113 @@ import org.jboss.resteasy.annotations.ClientResponseType;
 public interface DomainObjectResource {
 
     @POST
-    @Path("/")
+    @Path("/{domainType}")
     @Consumes({ MediaType.WILDCARD })
-    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
+    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response persist(final InputStream object);
+    public Response persist(@PathParam("domainType") String domainType, final InputStream object);
 
     // //////////////////////////////////////////////////////////
     // domain object
     // //////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}")
-    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
+    @Path("/{domainType}/{instanceId}")
+    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response object(@PathParam("oid") final String oidStr);
+    public Response object(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId);
 
     @PUT
-    @Path("/{oid}")
+    @Path("/{domainType}/{instanceId}")
     @Consumes({ MediaType.WILDCARD })
-    @Produces({ RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
+    @Produces({ RestfulMediaType.APPLICATION_JSON_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response object(@PathParam("oid") final String oidStr, final InputStream arguments);
+    public Response object(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, final InputStream arguments);
 
     // //////////////////////////////////////////////////////////
     // domain object property
     // //////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/properties/{propertyId}")
+    @Path("/{domainType}/{instanceId}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT_PROPERTY, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response propertyDetails(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId);
+    public Response propertyDetails(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId);
 
     @PUT
-    @Path("/{oid}/properties/{propertyId}")
+    @Path("/{domainType}/{instanceId}/properties/{propertyId}")
     @Consumes({ MediaType.WILDCARD })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response modifyProperty(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId, final InputStream arguments);
+    public Response modifyProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId, final InputStream arguments);
 
     @DELETE
-    @Path("/{oid}/properties/{propertyId}")
+    @Path("/{domainType}/{instanceId}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response clearProperty(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId);
+    public Response clearProperty(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("propertyId") final String propertyId);
 
     // //////////////////////////////////////////////////////////
     // domain object collection
     // //////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/collections/{collectionId}")
+    @Path("/{domainType}/{instanceId}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT_COLLECTION, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response accessCollection(@PathParam("oid") final String oidStr, @PathParam("collectionId") final String collectionId);
+    public Response accessCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId);
 
     @PUT
-    @Path("/{oid}/collections/{collectionId}")
+    @Path("/{domainType}/{instanceId}/collections/{collectionId}")
     @Consumes({ MediaType.WILDCARD })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR })
-    public Response addToSet(@PathParam("oid") final String oidStr, @PathParam("collectionId") final String collectionId, final InputStream arguments);
+    public Response addToSet(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream arguments);
 
     @POST
-    @Path("/{oid}/collections/{collectionId}")
+    @Path("/{domainType}/{instanceId}/collections/{collectionId}")
     @Consumes({ MediaType.WILDCARD })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response addToList(@PathParam("oid") final String oidStr, @PathParam("collectionId") final String collectionId, final InputStream arguments);
+    public Response addToList(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId, final InputStream arguments);
 
     @DELETE
-    @Path("/{oid}/collections/{collectionId}")
+    @Path("/{domainType}/{instanceId}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response removeFromCollection(@PathParam("oid") final String oidStr, @PathParam("collectionId") final String collectionId);
+    public Response removeFromCollection(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("collectionId") final String collectionId);
 
     // //////////////////////////////////////////////////////////
     // domain object action
     // //////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/actions/{actionId}")
+    @Path("/{domainType}/{instanceId}/actions/{actionId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT_ACTION, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response actionPrompt(@PathParam("oid") final String oidStr, @PathParam("actionId") final String actionId);
+    public Response actionPrompt(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId);
 
     // //////////////////////////////////////////////////////////
     // domain object action invoke
     // //////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{domainType}/{instanceId}/actions/{actionId}/invoke")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response invokeActionQueryOnly(@PathParam("oid") final String oidStr, @PathParam("actionId") final String actionId);
+    public Response invokeActionQueryOnly(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId);
 
     @PUT
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{domainType}/{instanceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.WILDCARD })
-    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
+    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response invokeActionIdempotent(@PathParam("oid") final String oidStr, @PathParam("actionId") final String actionId, final InputStream arguments);
+    public Response invokeActionIdempotent(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId, final InputStream arguments);
 
     @POST
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{domainType}/{instanceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.WILDCARD })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public Response invokeAction(@PathParam("oid") final String oidStr, @PathParam("actionId") final String actionId, final InputStream arguments);
+    public Response invokeAction(@PathParam("domainType") String domainType, @PathParam("instanceId") final String instanceId, @PathParam("actionId") final String actionId, final InputStream arguments);
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainServiceResource.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainServiceResource.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainServiceResource.java
index 853d431..29de6cd 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainServiceResource.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domainobjects/DomainServiceResource.java
@@ -48,7 +48,7 @@ public interface DomainServiceResource {
 
     @GET
     @Path("/{serviceId}")
-    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
+    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
     public Response service(@PathParam("serviceId") final String serviceId);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java
index fd1956d..90c1b70 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/domaintypes/DomainTypeResource.java
@@ -84,26 +84,20 @@ public interface DomainTypeResource {
     @Path("/{domainType}/isSubtypeOf/invoke")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_TYPE_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public abstract Response domainTypeIsSubtypeOf(@PathParam("domainType") final String domainType, @QueryParam("supertype") String superType, // simple
-                                                                                                                                                // style
-            @QueryParam("args") final String argumentsQueryString // formal
-                                                                  // style
-    );
+    public abstract Response domainTypeIsSubtypeOf(
+            @PathParam("domainType") final String domainType, 
+            @QueryParam("supertype") String superType, // simple style
+            @QueryParam("args") final String argumentsQueryString // formal style
+            );
 
     @GET
     @Path("/{domainType}/isSupertypeOf/invoke")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_TYPE_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType = String.class)
-    public abstract Response domainTypeIsSupertypeOf(@PathParam("domainType") final String domainType, @QueryParam("supertype") String superType, // simple
-                                                                                                                                                  // style
-            @QueryParam("args") final String argumentsQueryString // formal
-                                                                  // style
-    );
-
-    @GET
-    @Path("/{domainType}/newTransientInstance/invoke")
-    @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_TYPE_ACTION_RESULT, RestfulMediaType.APPLICATION_JSON_ERROR })
-    @ClientResponseType(entityType = String.class)
-    public Response newTransientInstance(@QueryParam("domainType") final String domainType, @QueryParam("args") final String args);
+    public abstract Response domainTypeIsSupertypeOf(
+            @PathParam("domainType") final String domainType, 
+            @QueryParam("supertype") String superType, // simple style
+            @QueryParam("args") final String argumentsQueryString // formal style
+            );
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/homepage/HomePageRepresentation.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/homepage/HomePageRepresentation.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/homepage/HomePageRepresentation.java
index a1e3e74..3ffd966 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/homepage/HomePageRepresentation.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/homepage/HomePageRepresentation.java
@@ -19,6 +19,7 @@
 package org.apache.isis.viewer.restfulobjects.applib.homepage;
 
 import org.apache.isis.viewer.restfulobjects.applib.LinkRepresentation;
+import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.domainobjects.DomainRepresentation;
 import org.codehaus.jackson.JsonNode;
 
@@ -29,15 +30,15 @@ public class HomePageRepresentation extends DomainRepresentation {
     }
 
     public LinkRepresentation getUser() {
-        return getLinkWithRel("user");
+        return getLinkWithRel(Rel.USER);
     }
 
     public LinkRepresentation getServices() {
-        return getLinkWithRel("services");
+        return getLinkWithRel(Rel.SERVICES);
     }
 
     public LinkRepresentation getVersion() {
-        return getLinkWithRel("version");
+        return getLinkWithRel(Rel.VERSION);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
index 08f8b80..99503ad 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/Parser.java
@@ -20,6 +20,7 @@ package org.apache.isis.viewer.restfulobjects.applib.util;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
@@ -235,7 +236,7 @@ public abstract class Parser<T> {
                 if (str == null) {
                     return Collections.emptyList();
                 }
-                return Lists.newArrayList(Splitter.on(",").split(str));
+                return PathNode.split(str);
             }
 
             @Override
@@ -258,8 +259,7 @@ public abstract class Parser<T> {
                 }
                 final List<List<String>> listOfLists = Lists.newArrayList();
                 for (final String s : str) {
-                    final Iterable<String> split = Splitter.on('.').split(s);
-                    listOfLists.add(Lists.newArrayList(split));
+                    listOfLists.add(PathNode.split(s));
                 }
                 return listOfLists;
             }
@@ -285,7 +285,7 @@ public abstract class Parser<T> {
 
                     @Override
                     public List<String> apply(final String input) {
-                        return Lists.newArrayList(Splitter.on('.').split(input));
+                        return PathNode.split(input);
                     }
                 });
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNode.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNode.java b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNode.java
index a37da71..b9fcaf5 100644
--- a/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNode.java
+++ b/component/viewer/restfulobjects/applib/src/main/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNode.java
@@ -19,6 +19,7 @@
 package org.apache.isis.viewer.restfulobjects.applib.util;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -27,6 +28,7 @@ import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 public class PathNode {
@@ -36,6 +38,33 @@ public class PathNode {
 
     public static final PathNode NULL = new PathNode("", Collections.<String, String> emptyMap());
 
+    public static List<String> split(String path) {
+        List<String> parts = Lists.newArrayList();
+        String curr = null;
+        for (String part : Splitter.on(".").split(path)) {
+            if(curr != null) {
+                if(part.contains("]")) {
+                    curr = curr + "." + part;
+                    parts.add(curr);
+                    curr = null;
+                } else {
+                    curr = curr + "." + part;
+                }
+                continue;
+            }
+            if(!part.contains("[")) {
+                parts.add(part);
+                continue;
+            } 
+            if(part.contains("]")) {
+                parts.add(part);
+            } else {
+                curr = part;
+            }
+        }
+        return parts;
+    }
+
     public static PathNode parse(final String path) {
         final Matcher nodeMatcher = NODE.matcher(path);
         if (!nodeMatcher.matches()) {
@@ -94,39 +123,43 @@ public class PathNode {
         return true;
     }
 
+
     @Override
     public int hashCode() {
         final int prime = 31;
         int result = 1;
+        result = prime * result + ((criteria == null) ? 0 : criteria.hashCode());
         result = prime * result + ((key == null) ? 0 : key.hashCode());
         return result;
     }
 
     @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
+    public boolean equals(Object obj) {
+        if (this == obj)
             return true;
-        }
-        if (obj == null) {
+        if (obj == null)
             return false;
-        }
-        if (getClass() != obj.getClass()) {
+        if (getClass() != obj.getClass())
+            return false;
+        PathNode other = (PathNode) obj;
+        if (criteria == null) {
+            if (other.criteria != null)
+                return false;
+        } else if (!criteria.equals(other.criteria))
             return false;
-        }
-        final PathNode other = (PathNode) obj;
         if (key == null) {
-            if (other.key != null) {
+            if (other.key != null)
                 return false;
-            }
-        } else if (!key.equals(other.key)) {
+        } else if (!key.equals(other.key))
             return false;
-        }
         return true;
     }
-
+    
     @Override
     public String toString() {
         return key + (criteria.isEmpty() ? "" : criteria);
     }
 
+
+    
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/ParserTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/ParserTest.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/ParserTest.java
index 9ae89de..20e98d2 100644
--- a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/ParserTest.java
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/ParserTest.java
@@ -162,7 +162,7 @@ public class ParserTest {
     public void forJaxRsMediaType() {
         final Parser<javax.ws.rs.core.MediaType> parser = Parser.forJaxRsMediaType();
 
-        for (final javax.ws.rs.core.MediaType v : new javax.ws.rs.core.MediaType[] { javax.ws.rs.core.MediaType.APPLICATION_ATOM_XML_TYPE, javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE, javax.ws.rs.core.MediaType.APPLICATION_XHTML_XML_TYPE, javax.ws.rs.core.MediaType.valueOf(RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT) }) {
+        for (final javax.ws.rs.core.MediaType v : new javax.ws.rs.core.MediaType[] { javax.ws.rs.core.MediaType.APPLICATION_ATOM_XML_TYPE, javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE, javax.ws.rs.core.MediaType.APPLICATION_XHTML_XML_TYPE, javax.ws.rs.core.MediaType.valueOf(RestfulMediaType.APPLICATION_JSON_OBJECT) }) {
             final String asString = parser.asString(v);
             final javax.ws.rs.core.MediaType valueOf = parser.valueOf(asString);
             assertThat(v, is(equalTo(valueOf)));

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_equalsHashcode.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_equalsHashcode.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_equalsHashcode.java
index 8cdc5dd..9af1f28 100644
--- a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_equalsHashcode.java
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_equalsHashcode.java
@@ -36,21 +36,41 @@ public class PathNodeTest_equalsHashcode {
     public void oneCriterium() throws Exception {
         final PathNode node = PathNode.parse("a[b=c]");
         final PathNode node2 = PathNode.parse("a");
-        assertEquals(node, node2);
+        assertFalse(node.equals(node2));
     }
 
     @Test
     public void moreThanOneCriterium() throws Exception {
         final PathNode node = PathNode.parse("a[b=c d=e]");
         final PathNode node2 = PathNode.parse("a");
+        assertFalse(node.equals(node2));
+    }
+
+    @Test
+    public void sameCriterium() throws Exception {
+        final PathNode node = PathNode.parse("a[b=c]");
+        final PathNode node2 = PathNode.parse("a[b=c]");
         assertEquals(node, node2);
     }
 
     @Test
-    public void notEqual() throws Exception {
+    public void moreThenOneSameCriterium() throws Exception {
+        final PathNode node = PathNode.parse("a[b=c d=e]");
+        final PathNode node2 = PathNode.parse("a[d=e b=c]");
+        assertEquals(node, node2);
+    }
+    
+    @Test
+    public void notEqualKey() throws Exception {
         final PathNode node = PathNode.parse("a[b=c d=e]");
         final PathNode node2 = PathNode.parse("b");
         assertFalse(node.equals(node2));
     }
 
+    @Test
+    public void notEqualCriterium() throws Exception {
+        final PathNode node = PathNode.parse("a[b=c]");
+        final PathNode node2 = PathNode.parse("a[b=d]");
+        assertFalse(node.equals(node2));
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_split.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_split.java b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_split.java
new file mode 100644
index 0000000..a1a0eca
--- /dev/null
+++ b/component/viewer/restfulobjects/applib/src/test/java/org/apache/isis/viewer/restfulobjects/applib/util/PathNodeTest_split.java
@@ -0,0 +1,56 @@
+/*
+ *  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.applib.util;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import org.junit.Test;
+
+public class PathNodeTest_split {
+
+    @Test
+    public void simple() throws Exception {
+        List<String> parts = PathNode.split("a.b.c");
+        assertThat(parts.size(), is(3));
+    }
+
+    @Test
+    public void withBrackets() throws Exception {
+        List<String> parts = PathNode.split("a[x=y].b[p=q].c");
+        assertThat(parts.size(), is(3));
+    }
+
+    @Test
+    public void withBracketsAndContainedDots() throws Exception {
+        List<String> parts = PathNode.split("a[m.n=s.t].b[p=q].c");
+        assertThat(parts.size(), is(3));
+    }
+
+    @Test
+    public void realistic() throws Exception {
+        List<String> parts = PathNode.split("links[rel=urn.restfulobjects:rels/user]");
+        assertThat(parts.size(), is(1));
+        assertThat(parts.get(0), is("links[rel=urn.restfulobjects:rels/user]"));
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java
index 5cb08eb..84ed1bc 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/LinkBuilder.java
@@ -27,18 +27,18 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
 
 public final class LinkBuilder {
 
-    public static LinkBuilder newBuilder(final RendererContext resourceContext, final Rel rel, final RepresentationType representationType, final String hrefFormat, final Object... hrefArgs) {
+    public static LinkBuilder newBuilder(final RendererContext resourceContext, final String rel, final RepresentationType representationType, final String hrefFormat, final Object... hrefArgs) {
         return newBuilder(resourceContext, rel, representationType.getMediaType(), hrefFormat, hrefArgs);
     }
 
-    public static LinkBuilder newBuilder(final RendererContext resourceContext, final Rel rel, final MediaType mediaType, final String hrefFormat, final Object... hrefArgs) {
+    public static LinkBuilder newBuilder(final RendererContext resourceContext, final String rel, final MediaType mediaType, final String hrefFormat, final Object... hrefArgs) {
         return new LinkBuilder(resourceContext, rel, String.format(hrefFormat, hrefArgs), mediaType);
     }
 
     private final RendererContext resourceContext;
     private final JsonRepresentation representation = JsonRepresentation.newMap();
 
-    private final Rel rel;
+    private final String rel;
     private final String href;
     private final MediaType mediaType;
 
@@ -48,7 +48,7 @@ public final class LinkBuilder {
     private JsonRepresentation value;
     private String id;
 
-    protected LinkBuilder(final RendererContext resourceContext, final Rel rel, final String href, final MediaType mediaType) {
+    protected LinkBuilder(final RendererContext resourceContext, final String rel, final String href, final MediaType mediaType) {
         this.resourceContext = resourceContext;
         this.rel = rel;
         this.href = href;
@@ -70,19 +70,13 @@ public final class LinkBuilder {
         return this;
     }
 
-    public LinkBuilder withId(final String id) {
-        this.id = id;
-        return this;
-    }
-
     public LinkBuilder withValue(final JsonRepresentation value) {
         this.value = value;
         return this;
     }
 
     public JsonRepresentation build() {
-        representation.mapPut("id", id);
-        representation.mapPut("rel", rel.getName());
+        representation.mapPut("rel", rel);
         representation.mapPut("href", resourceContext.urlFor(href));
         representation.mapPut("method", method);
         representation.mapPut("type", mediaType.toString());

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererFactoryRegistry.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererFactoryRegistry.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererFactoryRegistry.java
deleted file mode 100644
index 9a5421e..0000000
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererFactoryRegistry.java
+++ /dev/null
@@ -1,84 +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.rendering;
-
-import java.util.Map;
-
-import javax.ws.rs.core.MediaType;
-
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ActionResultReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ListReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectActionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectCollectionReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ObjectPropertyReprRenderer;
-import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.ScalarValueReprRenderer;
-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;
-import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeReprRenderer;
-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 com.google.common.collect.Maps;
-
-public class RendererFactoryRegistry {
-
-    // TODO: get rid of this horrible singleton
-    public final static RendererFactoryRegistry instance = new RendererFactoryRegistry();
-
-    private final Map<MediaType, RendererFactory> factoryByReprType = Maps.newHashMap();
-
-    RendererFactoryRegistry() {
-        registerDefaults();
-    }
-
-    private void registerDefaults() {
-        register(new DomainObjectReprRenderer.Factory());
-        register(new ObjectPropertyReprRenderer.Factory());
-        register(new ObjectCollectionReprRenderer.Factory());
-        register(new ObjectActionReprRenderer.Factory());
-        register(new ActionResultReprRenderer.Factory());
-        register(new ListReprRenderer.Factory());
-        register(new ScalarValueReprRenderer.Factory());
-        register(new TypeListReprRenderer.Factory());
-        register(new DomainTypeReprRenderer.Factory());
-        register(new PropertyDescriptionReprRenderer.Factory());
-        register(new CollectionDescriptionReprRenderer.Factory());
-        register(new ActionDescriptionReprRenderer.Factory());
-        register(new ActionParameterDescriptionReprRenderer.Factory());
-        register(new TypeActionResultReprRenderer.Factory());
-    }
-
-    public void register(final RendererFactory factory) {
-        final RepresentationType representationType = factory.getRepresentationType();
-        factoryByReprType.put(representationType.getMediaType(), factory);
-    }
-
-    public RendererFactory find(final MediaType mediaType) {
-        return factoryByReprType.get(mediaType);
-    }
-
-    public RendererFactory find(final RepresentationType representationType) {
-        return find(representationType.getMediaType());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
index f1eecfe..1bbf026 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererAbstract.java
@@ -33,22 +33,22 @@ import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeRep
 
 public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>, T> implements ReprRenderer<R, T> {
 
-    protected final RendererContext resourceContext;
+    protected final RendererContext rendererContext;
     private final LinkFollower linkFollower;
     private final RepresentationType representationType;
     protected final JsonRepresentation representation;
 
     protected boolean includesSelf;
 
-    public ReprRendererAbstract(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
-        this.resourceContext = resourceContext;
+    public ReprRendererAbstract(final RendererContext rendererContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
+        this.rendererContext = rendererContext;
         this.linkFollower = asProvidedElseCreate(linkFollower);
         this.representationType = representationType;
         this.representation = representation;
     }
 
-    public RendererContext getResourceContext() {
-        return resourceContext;
+    public RendererContext getRendererContext() {
+        return rendererContext;
     }
 
     public LinkFollower getLinkFollower() {
@@ -59,7 +59,7 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
         if (linkFollower != null) {
             return linkFollower;
         }
-        return LinkFollower.create(resourceContext.getFollowLinks());
+        return LinkFollower.create(rendererContext.getFollowLinks());
     }
 
     @Override
@@ -75,7 +75,7 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
 
     public R withSelf(final String href) {
         if (href != null) {
-            getLinks().arrayAdd(LinkBuilder.newBuilder(resourceContext, Rel.SELF, representationType, href).build());
+            getLinks().arrayAdd(LinkBuilder.newBuilder(rendererContext, Rel.SELF.getName(), representationType, href).build());
         }
         return cast(this);
     }
@@ -107,7 +107,7 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
         if (objectSpec == null) {
             return;
         }
-        final LinkBuilder linkBuilder = DomainTypeReprRenderer.newLinkToBuilder(getResourceContext(), rel, objectSpec);
+        final LinkBuilder linkBuilder = DomainTypeReprRenderer.newLinkToBuilder(getRendererContext(), rel, objectSpec);
         getLinks().arrayAdd(linkBuilder.build());
     }
 
@@ -154,7 +154,7 @@ public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>,
         final JsonRepresentation adapterList = JsonRepresentation.newArray();
         getExtensions().mapPut(key, adapterList);
         for (final ObjectAdapter adapter : adapters) {
-            adapterList.arrayAdd(DomainObjectReprRenderer.newLinkToBuilder(getResourceContext(), Rel.OBJECT, adapter).build());
+            adapterList.arrayAdd(DomainObjectReprRenderer.newLinkToBuilder(getRendererContext(), Rel.VALUE, adapter).build());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererFactoryAbstract.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererFactoryAbstract.java
deleted file mode 100644
index 69477db..0000000
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/ReprRendererFactoryAbstract.java
+++ /dev/null
@@ -1,36 +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.rendering;
-
-import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
-
-public abstract class ReprRendererFactoryAbstract implements RendererFactory {
-
-    private final RepresentationType representationType;
-
-    public ReprRendererFactoryAbstract(final RepresentationType representationType) {
-        this.representationType = representationType;
-    }
-
-    @Override
-    public RepresentationType getRepresentationType() {
-        return representationType;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
index 13713b1..c4d19e0 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/AbstractObjectMemberReprRenderer.java
@@ -89,7 +89,7 @@ public abstract class AbstractObjectMemberReprRenderer<R extends ReprRendererAbs
      * {@link #objectAdapter}).
      */
     public R usingLinkTo(final ObjectAdapterLinkTo linkTo) {
-        this.linkTo = linkTo.usingUrlBase(resourceContext).with(objectAdapter);
+        this.linkTo = linkTo.usingUrlBase(rendererContext).with(objectAdapter);
         return cast(this);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
index d20b2ca..1ee3973 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
@@ -31,11 +31,7 @@ import org.apache.isis.viewer.restfulobjects.applib.domainobjects.ActionResultRe
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollower;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererFactory;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererFactoryRegistry;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererFactoryAbstract;
 
 public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultReprRenderer, ObjectAndActionInvocation> {
 
@@ -46,20 +42,8 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
     private JsonRepresentation arguments;
     private ObjectAdapter returnedAdapter;
 
-    public static class Factory extends ReprRendererFactoryAbstract {
-
-        public Factory() {
-            super(RepresentationType.ACTION_RESULT);
-        }
-
-        @Override
-        public ReprRenderer<?, ?> newRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final JsonRepresentation representation) {
-            return new ActionResultReprRenderer(resourceContext, linkFollower, getRepresentationType(), representation);
-        }
-    }
-
-    private ActionResultReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, representationType, representation);
+    public ActionResultReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final JsonRepresentation representation) {
+        super(resourceContext, linkFollower, RepresentationType.ACTION_RESULT, representation);
     }
 
     @Override
@@ -116,8 +100,7 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
 
             final Collection<ObjectAdapter> collectionAdapters = collectionFacet.collection(returnedAdapter);
 
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.LIST);
-            final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(resourceContext, null, result);
+            final ListReprRenderer renderer = new ListReprRenderer(rendererContext, null, result);
             renderer.with(collectionAdapters).withReturnType(action.getReturnType()).withElementType(returnedAdapter.getElementSpecification());
 
             renderer.render();
@@ -128,9 +111,7 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
         if (encodableFacet != null) {
             // scalar
 
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.SCALAR_VALUE);
-
-            final ScalarValueReprRenderer renderer = (ScalarValueReprRenderer) factory.newRenderer(resourceContext, null, result);
+            final ScalarValueReprRenderer renderer = new ScalarValueReprRenderer(rendererContext, null, result);
             renderer.with(returnedAdapter).withReturnType(action.getReturnType());
 
             renderer.render();
@@ -140,8 +121,7 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
 
         {
             // object
-            final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.DOMAIN_OBJECT);
-            final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) factory.newRenderer(resourceContext, null, result);
+            final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(rendererContext, null, result);
 
             renderer.with(returnedAdapter).includesSelf();
 
@@ -175,9 +155,4 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
         return representation;
     }
 
-    protected RendererFactoryRegistry getRendererFactoryRegistry() {
-        // TODO: yuck
-        return RendererFactoryRegistry.instance;
-    }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectLinkTo.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectLinkTo.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectLinkTo.java
index 0234c87..d48df63 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectLinkTo.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectLinkTo.java
@@ -24,15 +24,16 @@ import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
+import org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils;
 
 public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
 
-    protected RendererContext resourceContext;
+    protected RendererContext rendererContext;
     protected ObjectAdapter objectAdapter;
 
     @Override
     public final DomainObjectLinkTo usingUrlBase(final RendererContext resourceContext) {
-        this.resourceContext = resourceContext;
+        this.rendererContext = resourceContext;
         return this;
     }
 
@@ -49,7 +50,7 @@ public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
 
     @Override
     public LinkBuilder builder(final Rel rel) {
-        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(resourceContext, relElseDefault(rel), RepresentationType.DOMAIN_OBJECT, linkRef());
+        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(rendererContext, relElseDefault(rel).getName(), RepresentationType.DOMAIN_OBJECT, linkRef(new StringBuilder()).toString());
         linkBuilder.withTitle(objectAdapter.titleString());
         return linkBuilder;
     }
@@ -57,19 +58,13 @@ public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
     /**
      * hook method
      */
-    protected String linkRef() {
-        if (resourceContext == null) {
-            throw new IllegalStateException("resourceContext not provided");
-        }
-        if (objectAdapter == null) {
-            throw new IllegalStateException("objectAdapter not provided");
-        }
-        final StringBuilder buf = new StringBuilder("objects/");
-        buf.append(objectAdapter.getOid().enString(getOidMarshaller()));
-        return buf.toString();
+    protected StringBuilder linkRef(StringBuilder buf) {
+        String domainType = OidUtils.getDomainType(objectAdapter);
+        String instanceId = OidUtils.getInstanceId(rendererContext, objectAdapter);
+        return buf.append("objects/").append(domainType).append("/").append(instanceId);
     }
 
-    private Rel relElseDefault(final Rel rel) {
+    protected Rel relElseDefault(final Rel rel) {
         return rel != null ? rel : defaultRel();
     }
 
@@ -77,7 +72,7 @@ public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
      * hook method; used by {@link #builder(Rel)}.
      */
     protected Rel defaultRel() {
-        return Rel.OBJECT;
+        return Rel.VALUE;
     }
 
     @Override
@@ -87,7 +82,7 @@ public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
 
     @Override
     public final LinkBuilder memberBuilder(final Rel rel, final MemberType memberType, final ObjectMember objectMember, final RepresentationType representationType, final String... parts) {
-        final StringBuilder buf = new StringBuilder(linkRef());
+        final StringBuilder buf = linkRef(new StringBuilder());
         buf.append("/").append(memberType.getUrlPart()).append(objectMember.getId());
         for (final String part : parts) {
             if (part == null) {
@@ -96,7 +91,7 @@ public class DomainObjectLinkTo implements ObjectAdapterLinkTo {
             buf.append("/").append(part);
         }
         final String url = buf.toString();
-        return LinkBuilder.newBuilder(resourceContext, rel, representationType, url);
+        return LinkBuilder.newBuilder(rendererContext, rel.getName(), representationType, url);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
index 7185f58..42294aa 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainObjectReprRenderer.java
@@ -20,7 +20,6 @@ import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.facets.object.notpersistable.NotPersistableFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
@@ -41,31 +40,17 @@ import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollower;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererFactory;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererFactoryRegistry;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRenderer;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
-import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererFactoryAbstract;
 import org.apache.isis.viewer.restfulobjects.rendering.domaintypes.DomainTypeReprRenderer;
+import org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils;
 
 public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectReprRenderer, ObjectAdapter> {
 
-    public static class Factory extends ReprRendererFactoryAbstract {
-
-        public Factory() {
-            super(RepresentationType.DOMAIN_OBJECT);
-        }
-
-        @Override
-        public ReprRenderer<?, ?> newRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final JsonRepresentation representation) {
-            return new DomainObjectReprRenderer(resourceContext, linkFollower, getRepresentationType(), representation);
-        }
-    }
-
-    public static LinkBuilder newLinkToBuilder(final RendererContext resourceContext, final Rel rel, final ObjectAdapter elementAdapter) {
-        final String oidStr = ((RootOid) elementAdapter.getOid()).enString(getOidMarshaller());
-        final String url = "objects/" + oidStr;
-        final LinkBuilder builder = LinkBuilder.newBuilder(resourceContext, rel, RepresentationType.DOMAIN_OBJECT, url).withTitle(elementAdapter.titleString());
+    public static LinkBuilder newLinkToBuilder(final RendererContext rendererContext, final Rel rel, final ObjectAdapter objectAdapter) {
+        String domainType = OidUtils.getDomainType(objectAdapter);
+        String instanceId = OidUtils.getInstanceId(rendererContext, objectAdapter);
+        final String url = "objects/" + domainType + "/" + instanceId;
+        final LinkBuilder builder = LinkBuilder.newBuilder(rendererContext, rel.getName(), RepresentationType.DOMAIN_OBJECT, url).withTitle(objectAdapter.titleString());
         return builder;
     }
 
@@ -102,8 +87,8 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     private ObjectAdapter objectAdapter;
     private Mode mode = Mode.REGULAR;
 
-    private DomainObjectReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final RepresentationType representationType, final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, representationType, representation);
+    public DomainObjectReprRenderer(final RendererContext resourceContext, final LinkFollower linkFollower, final JsonRepresentation representation) {
+        super(resourceContext, linkFollower, RepresentationType.DOMAIN_OBJECT, representation);
         usingLinkToBuilder(new DomainObjectLinkTo());
     }
 
@@ -112,7 +97,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
      * generating links in {@link #linkTo(ObjectAdapter)}).
      */
     public DomainObjectReprRenderer usingLinkToBuilder(final ObjectAdapterLinkTo objectAdapterLinkToBuilder) {
-        this.linkToBuilder = objectAdapterLinkToBuilder.usingUrlBase(resourceContext);
+        this.linkToBuilder = objectAdapterLinkToBuilder.usingUrlBase(rendererContext);
         return this;
     }
 
@@ -156,7 +141,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
 
         // described by
         if (mode.includesDescribedBy()) {
-            getLinks().arrayAdd(DomainTypeReprRenderer.newLinkToBuilder(getResourceContext(), Rel.DESCRIBEDBY, objectAdapter.getSpecification()).build());
+            getLinks().arrayAdd(DomainTypeReprRenderer.newLinkToBuilder(getRendererContext(), Rel.DESCRIBEDBY, objectAdapter.getSpecification()).build());
         }
 
         if (!mode.representsArguments()) {
@@ -173,8 +158,16 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         return representation;
     }
 
+    private String getDomainType() {
+        return org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils.getDomainType(objectAdapter);
+    }
+
+    private String getInstanceId() {
+        return org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils.getInstanceId(rendererContext, objectAdapter);
+    }
+
     private String getOidStr() {
-        return org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils.getOidStr(resourceContext, objectAdapter);
+        return org.apache.isis.viewer.restfulobjects.rendering.util.OidUtils.getOidStr(rendererContext, objectAdapter);
     }
 
     private DomainObjectReprRenderer withMembers(final ObjectAdapter objectAdapter) {
@@ -195,7 +188,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         for (final ObjectAssociation assoc : associations) {
 
             if (mode.checkVisibility()) {
-                final Consent visibility = assoc.isVisible(getAuthenticationSession(), objectAdapter, resourceContext.getWhere());
+                final Consent visibility = assoc.isVisible(getAuthenticationSession(), objectAdapter, rendererContext.getWhere());
                 if (!visibility.isAllowed()) {
                     continue;
                 }
@@ -203,8 +196,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
             if (assoc instanceof OneToOneAssociation) {
                 final OneToOneAssociation property = (OneToOneAssociation) assoc;
 
-                final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.OBJECT_PROPERTY);
-                final ObjectPropertyReprRenderer renderer = (ObjectPropertyReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
+                final ObjectPropertyReprRenderer renderer = new ObjectPropertyReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(linkToBuilder);
 
@@ -222,8 +214,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
             if (assoc instanceof OneToManyAssociation) {
                 final OneToManyAssociation collection = (OneToManyAssociation) assoc;
 
-                final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.OBJECT_COLLECTION);
-                final ObjectCollectionReprRenderer renderer = (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
+                final ObjectCollectionReprRenderer renderer = new ObjectCollectionReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndCollection(objectAdapter, collection)).usingLinkTo(linkToBuilder);
 
@@ -235,7 +226,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
     private void addActions(final ObjectAdapter objectAdapter, final List<ObjectAction> actions, final JsonRepresentation members) {
         final LinkFollower linkFollower = getLinkFollower().follow("members");
         for (final ObjectAction action : actions) {
-            final Consent visibility = action.isVisible(getAuthenticationSession(), objectAdapter, resourceContext.getWhere());
+            final Consent visibility = action.isVisible(getAuthenticationSession(), objectAdapter, rendererContext.getWhere());
             if (!visibility.isAllowed()) {
                 continue;
             }
@@ -246,8 +237,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
 
             } else {
 
-                final RendererFactory factory = getRendererFactoryRegistry().find(RepresentationType.OBJECT_ACTION);
-                final ObjectActionReprRenderer renderer = (ObjectActionReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
+                final ObjectActionReprRenderer renderer = new ObjectActionReprRenderer(getRendererContext(), linkFollower, JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndAction(objectAdapter, action)).usingLinkTo(linkToBuilder);
 
@@ -263,11 +253,11 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         if(objectAdapter.getSpecification().containsDoOpFacet(NotPersistableFacet.class)) {
             return;
         }
-        final RendererFactory rendererFactory = getRendererFactoryRegistry().find(RepresentationType.DOMAIN_OBJECT);
-        final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
+        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(getRendererContext(), null, JsonRepresentation.newMap());
         final JsonRepresentation domainObjectRepr = renderer.with(objectAdapter).asPersistLinkArguments().render();
 
-        final LinkBuilder persistLinkBuilder = LinkBuilder.newBuilder(getResourceContext(), Rel.PERSIST, RepresentationType.DOMAIN_OBJECT, "objects/").withHttpMethod(RestfulHttpMethod.POST).withArguments(domainObjectRepr);
+        final String domainType = objectAdapter.getSpecification().getSpecId().asString();
+        final LinkBuilder persistLinkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.PERSIST.getName(), RepresentationType.DOMAIN_OBJECT, "objects/%s", domainType).withHttpMethod(RestfulHttpMethod.POST).withArguments(domainObjectRepr);
         getLinks().arrayAdd(persistLinkBuilder.build());
     }
 
@@ -293,18 +283,13 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
             return;
         }
 
-        final RendererFactory rendererFactory = getRendererFactoryRegistry().find(RepresentationType.DOMAIN_OBJECT);
-        final DomainObjectReprRenderer renderer = (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
+        final DomainObjectReprRenderer renderer = new DomainObjectReprRenderer(getRendererContext(), null, JsonRepresentation.newMap());
         final JsonRepresentation domainObjectRepr = renderer.with(objectAdapter).asModifyPropertiesLinkArguments().render();
 
-        final LinkBuilder persistLinkBuilder = LinkBuilder.newBuilder(getResourceContext(), Rel.MODIFY, RepresentationType.DOMAIN_OBJECT, "objects/%s", getOidStr()).withHttpMethod(RestfulHttpMethod.PUT).withArguments(domainObjectRepr);
+        final LinkBuilder persistLinkBuilder = LinkBuilder.newBuilder(getRendererContext(), Rel.MODIFY.getName(), RepresentationType.DOMAIN_OBJECT, "objects/%s/%s", getDomainType(), getInstanceId()).withHttpMethod(RestfulHttpMethod.PUT).withArguments(domainObjectRepr);
         getLinks().arrayAdd(persistLinkBuilder.build());
     }
 
-    protected RendererFactoryRegistry getRendererFactoryRegistry() {
-        return RendererFactoryRegistry.instance;
-    }
-
     // ///////////////////////////////////////////////////////////////////
     //
     // ///////////////////////////////////////////////////////////////////
@@ -316,7 +301,7 @@ public class DomainObjectReprRenderer extends ReprRendererAbstract<DomainObjectR
         }
         final TitleFacet titleFacet = objectSpec.getFacet(TitleFacet.class);
         final String title = titleFacet.title(objectAdapter, resourceContext.getLocalization());
-        return DomainObjectReprRenderer.newLinkToBuilder(resourceContext, Rel.OBJECT, objectAdapter).withTitle(title).build();
+        return DomainObjectReprRenderer.newLinkToBuilder(resourceContext, Rel.VALUE, objectAdapter).withTitle(title).build();
     }
 
  

http://git-wip-us.apache.org/repos/asf/isis/blob/e5093edb/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServiceLinkTo.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServiceLinkTo.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServiceLinkTo.java
index d17e5d7..11efae4 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServiceLinkTo.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/DomainServiceLinkTo.java
@@ -19,6 +19,7 @@ package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
+import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkBuilder;
 
 public class DomainServiceLinkTo extends DomainObjectLinkTo {
@@ -31,20 +32,25 @@ public class DomainServiceLinkTo extends DomainObjectLinkTo {
     }
 
     @Override
-    protected String linkRef() {
-        final StringBuilder buf = new StringBuilder("services/");
-        buf.append(serviceId);
-        return buf.toString();
+    public LinkBuilder builder(final Rel rel) {
+        final LinkBuilder linkBuilder = LinkBuilder.newBuilder(rendererContext, 
+                relElseDefault(rel).andParam("serviceId", serviceId), 
+                RepresentationType.DOMAIN_OBJECT, 
+                linkRef(new StringBuilder()).toString());
+        linkBuilder.withTitle(objectAdapter.titleString());
+        return linkBuilder;
     }
 
+
     @Override
-    protected Rel defaultRel() {
-        return Rel.SERVICE;
+    protected StringBuilder linkRef(StringBuilder buf) {
+        return buf.append("services/").append(serviceId);
     }
 
     @Override
-    public LinkBuilder builder(final Rel rel) {
-        return super.builder(rel).withId(serviceId);
+    protected Rel defaultRel() {
+        return Rel.SERVICE;
     }
 
+
 }
\ No newline at end of file