You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2011/09/05 02:38:23 UTC

svn commit: r1165139 [2/3] - in /incubator/isis/trunk/framework: core/commons/src/main/java/org/apache/isis/core/commons/lang/ runtimes/dflt/webserver/src/main/java/org/apache/isis/runtimes/dflt/webserver/ viewer/json/json-applib/src/main/java/org/apac...

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -16,38 +16,24 @@
  */
 package org.apache.isis.viewer.json.viewer.representations;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
-import org.apache.isis.viewer.json.viewer.resources.objects.DomainObjectRepBuilder;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 
-public class LinkRepBuilder extends RepresentationBuilder {
+public class LinkRepBuilder extends RepresentationBuilder<LinkRepBuilder> {
 
-    public static LinkRepBuilder newBuilder(RepContext repContext, String rel, String href) {
-        return new LinkRepBuilder(repContext, rel, href);
+    public static LinkRepBuilder newBuilder(ResourceContext resourceContext, String rel, String href) {
+        return new LinkRepBuilder(resourceContext, rel, href);
     }
 
-	public static LinkRepBuilder newObjectBuilder(RepContext repContext, ObjectAdapter elementAdapter, OidStringifier oidStringifier) {
-    	String url = DomainObjectRepBuilder.urlFor(elementAdapter, oidStringifier);
-        return LinkRepBuilder.newBuilder(repContext, "object", url);
-	}
-
-    public static LinkRepBuilder newTypeBuilder(RepContext repContext, ObjectSpecification objectSpec) {
-        String url = "types/" + WellKnownType.canonical(objectSpec.getFullIdentifier());
-        return LinkRepBuilder.newBuilder(repContext, "type", url);
-    }
-
-    private final String rel;
+	private final String rel;
     private final String href;
     
     private HttpMethod method = HttpMethod.GET;
     private String title;
     private JsonRepresentation arguments;
     
-    public LinkRepBuilder(RepContext repContext, String rel, String href) {
-        super(repContext);
+    public LinkRepBuilder(ResourceContext resourceContext, String rel, String href) {
+        super(resourceContext);
         this.rel = rel;
         this.href = href;
     }
@@ -65,7 +51,7 @@ public class LinkRepBuilder extends Repr
     }
     public JsonRepresentation build() {
         representation.put("rel", rel);
-        representation.put("href", repContext.urlFor(href));
+        representation.put("href", resourceContext.urlFor(href));
         representation.put("method", method);
         representation.put("title", title);
         representation.put("arguments", arguments);

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RepresentationBuilder.java Mon Sep  5 00:38:21 2011
@@ -23,15 +23,52 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 
-public abstract class RepresentationBuilder {
+public abstract class RepresentationBuilder<T extends RepresentationBuilder<T>> {
 
-    protected final RepContext repContext;
+    protected final ResourceContext resourceContext;
     protected final JsonRepresentation representation = JsonRepresentation.newMap();
     
-    public RepresentationBuilder(RepContext repContext) {
-        this.repContext = repContext;
+    public RepresentationBuilder(ResourceContext resourceContext) {
+        this.resourceContext = resourceContext;
+    }
+
+    public T withRepresentationType(String representationTypeName) {
+        String href = "representationTypes/" + representationTypeName;
+        JsonRepresentation linkToRepresentationType = 
+                LinkRepBuilder.newBuilder(resourceContext, "representationType", href).build();
+        representation.put("representationType", linkToRepresentationType);
+        return (T) this;
+    }
+
+    public T withSelf(String href) {
+        representation.put("self", LinkRepBuilder.newBuilder(resourceContext, "self", href).build());
+        return (T) this;
+    }
+
+    public RepresentationBuilder<T> withLinks() {
+        return withLinks(JsonRepresentation.newArray());
+    }
+
+    public T withLinks(JsonRepresentation links) {
+        if(!links.isArray()) {
+            throw new IllegalArgumentException("links must be a list");
+        }
+        representation.put("links", links);
+        return (T) this;
+    }
+
+    public T withMetadata() {
+        return withMetadata(JsonRepresentation.newMap());
+    }
+
+    public T withMetadata(JsonRepresentation metadata) {
+        if(!metadata.isMap()) {
+            throw new IllegalArgumentException("metadata must be a map");
+        }
+        representation.put("metadata", metadata);
+        return (T) this;
     }
 
     public abstract JsonRepresentation build();
@@ -56,5 +93,4 @@ public abstract class RepresentationBuil
         return IsisContext.getLocalization();
     }
 
-
 }
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/RepresentationType.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/RepresentationType.java?rev=1165139&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/RepresentationType.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/RepresentationType.java Mon Sep  5 00:38:21 2011
@@ -0,0 +1,33 @@
+package org.apache.isis.viewer.json.viewer.resources;
+
+public enum RepresentationType {
+
+    HOME_PAGE,
+    USER,
+    LIST,
+    SCALAR_VALUE,
+    OBJECT,
+    OBJECT_PROPERTY,
+    OBJECT_COLLECTION,
+    OBJECT_ACTION,
+    DOMAIN_TYPE,
+    DOMAIN_PROPERTY,
+    DOMAIN_COLLECTION,
+    DOMAIN_ACTION,
+    DOMAIN_ACTION_PARAMETER;
+    
+    public String getName() {
+        StringBuilder builder = new StringBuilder();
+        boolean nextUpper = false;
+        for(char c: name().toCharArray()) {
+            if(c == '_') {
+                nextUpper = true;
+            } else {
+                builder.append(nextUpper?c:Character.toLowerCase(c));
+                nextUpper = false;
+            }
+        }
+        return builder.toString();
+    }
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java Mon Sep  5 00:38:21 2011
@@ -20,6 +20,7 @@ package org.apache.isis.viewer.json.view
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -47,13 +48,13 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManager;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.json.applib.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
 import org.apache.isis.viewer.json.applib.util.JsonMapper;
-import org.apache.isis.viewer.json.applib.util.JsonResponse;
-import org.apache.isis.viewer.json.viewer.RepContext;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract.ExceptionPojo;
 import org.apache.isis.viewer.json.viewer.resources.objects.DomainObjectRepBuilder;
 import org.apache.isis.viewer.json.viewer.util.OidUtils;
 import org.apache.isis.viewer.json.viewer.util.UrlDecoderUtils;
@@ -140,7 +141,7 @@ public abstract class ResourceAbstract {
     }
 
 	private Function<ObjectAdapter, JsonRepresentation> toObjectSelfRepresentation() {
-		final RepContext representationContext = getResourceContext().repContext();
+		final ResourceContext representationContext = getResourceContext();
         
         Function<ObjectAdapter, JsonRepresentation> objectSelfRepresentation = 
             Functions.compose(
@@ -165,7 +166,7 @@ public abstract class ResourceAbstract {
         
         if (objectAdapter == null) {
             final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
-            throw new WebApplicationException(responseOfNotFound("could not determine adapter for OID: '" + oidStr + "'"));
+            throw new WebApplicationException(responseOf(HttpStatusCode.NOT_FOUND, "could not determine adapter for OID: '%s'", oidStr));
         }
         return objectAdapter;
     }
@@ -213,7 +214,6 @@ public abstract class ResourceAbstract {
 
 		// reference
 		try {
-			@SuppressWarnings("unchecked")
 			JsonRepresentation argLink = (JsonRepresentation) node;
 			String oidFromHref = UrlParserUtils.oidFromHref(argLink);
 			
@@ -232,67 +232,94 @@ public abstract class ResourceAbstract {
     // Responses
     // //////////////////////////////////////////////////////////////
 
-    protected static Response responseOfOk() {
-        return Response.ok().build();
-    }
-
+    /**
+     * Common case.
+     */
     public static Response responseOfOk(String jsonEntity) {
         return Response.ok().entity(jsonEntity).type(MediaType.APPLICATION_JSON_TYPE).build();
     }
 
-    protected static Response responseOfGone(final String reason, final Object... args) {
-        return Response.status(Status.GONE).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
+    /**
+     * Common case.
+     */
+    protected static Response responseOfNoContent() {
+        return Response.status(HttpStatusCode.NO_CONTENT.getJaxrsStatusType()).build();
     }
 
-    protected static Response responseOfBadRequest(final Consent consent) {
-        return responseOfBadRequest(consent.getReason());
+    /**
+     * Common case.
+     */
+    protected static Response responseOfUnauthorized(final Consent consent) {
+        return responseOf(HttpStatusCode.UNAUTHORIZED, consent.getReason());
     }
 
-    protected static Response responseOfNoContent(final String reason, final Object... args) {
-        return Response.status(Status.NO_CONTENT).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
+    
+    protected static Response responseOf(HttpStatusCode httpStatusCode, final String reason, final Object... args) {
+        return Response.status(httpStatusCode.getJaxrsStatusType()).header(RestfulResponse.Header.WARNING.getName(), String.format(reason, args)).build();
     }
 
-    protected static Response responseOfBadRequest(final String reason, final Object... args) {
-        return Response.status(Status.BAD_REQUEST).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
+    protected static Response responseOf(HttpStatusCode httpStatusCode, final Exception ex) {
+        ResponseBuilder builder = Response.status(httpStatusCode.getJaxrsStatusType()).header(RestfulResponse.Header.WARNING.getName(), ex.getMessage());
+        return withStackTrace(builder, ex).build();
     }
 
-    protected static Response responseOfBadRequest(final String reason, Exception ex, final Object... args) {
-        ResponseBuilder builder = Response.status(Status.BAD_REQUEST).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args));
-        return withStackTraceAndMediaType(builder,ex).build();
+    protected static Response responseOf(HttpStatusCode httpStatusCode, final String reason, Exception ex, final Object... args) {
+        ResponseBuilder builder = Response.status(Status.BAD_REQUEST).header(RestfulResponse.Header.WARNING.getName(), String.format(reason, args));
+        return withStackTrace(builder,ex).build();
     }
 
-    protected static Response responseOfBadRequest(final Exception ex) {
-        ResponseBuilder builder = Response.status(Status.BAD_REQUEST).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, ex.getMessage());
-        return withStackTraceAndMediaType(builder,ex).build();
+    
+    private static ResponseBuilder withStackTrace(ResponseBuilder builder, final Exception ex) {
+        return builder.type(MediaType.APPLICATION_JSON_TYPE).entity(jsonFor(ex));
     }
 
-    protected static Response responseOfNotFound(final IllegalArgumentException e) {
-        return responseOfNotFound(e.getMessage());
-    }
 
-    protected static Response responseOfNotFound(final String reason, Object... args) {
-        return Response.status(Status.NOT_FOUND).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
-    }
+    static class ExceptionPojo {
 
-    protected static Response responseOfPreconditionFailed(final String reason, final Object... args) {
-        return Response.status(StatusTypes.PRECONDITION_FAILED).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
-    }
+        public static ExceptionPojo create(Exception ex) {
+            return new ExceptionPojo(ex);
+        }
 
-    protected static Response responseOfMethodNotAllowed(final String reason, final Object... args) {
-        return Response.status(StatusTypes.METHOD_NOT_ALLOWED).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
-    }
+        private static String format(StackTraceElement stackTraceElement) {
+            return stackTraceElement.toString();
+        }
 
-    protected static Response responseOfInternalServerError(final Exception ex) {
-        ResponseBuilder builder = Response.status(Status.INTERNAL_SERVER_ERROR).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, ex.getMessage());
-        return withStackTraceAndMediaType(builder, ex).build();
-    }
+        private final String message;
+        private final List<String> stackTrace = Lists.newArrayList();
+        private ExceptionPojo causedBy;
+
+        public ExceptionPojo(Throwable ex) {
+            this.message = ex.getMessage();
+            StackTraceElement[] stackTraceElements = ex.getStackTrace();
+            for (StackTraceElement stackTraceElement : stackTraceElements) {
+                this.stackTrace.add(format(stackTraceElement));
+            }
+            Throwable cause = ex.getCause();
+            if(cause != null && cause != ex) {
+                this.causedBy = new ExceptionPojo(cause);
+            }
+        }
+        
+        public String getMessage() {
+            return message;
+        }
+        
+        public List<String> getStackTrace() {
+            return stackTrace;
+        }
+        
+        public ExceptionPojo getCausedBy() {
+            return causedBy;
+        }
 
-    private static ResponseBuilder withStackTraceAndMediaType(ResponseBuilder builder, final Exception ex) {
-        return builder.type(MediaType.TEXT_PLAIN_TYPE).entity(ExceptionUtils.getFullStackTrace(ex));
     }
-
-    protected static Response responseOfInternalServerError(final String reason, final Object... args) {
-        return Response.status(Status.INTERNAL_SERVER_ERROR).header(JsonResponse.HEADER_X_RESTFUL_OBJECTS_REASON, String.format(reason, args)).build();
+    static String jsonFor(Exception ex) {
+        try {
+            return JsonMapper.instance().write(ExceptionPojo.create(ex));
+        } catch (Exception e) {
+            // fallback
+            return "{ \"exception\": \"" + ExceptionUtils.getFullStackTrace(ex) + "\" }";
+        }
     }
 
     // //////////////////////////////////////////////////////////////

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java (from r1164046, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceImpl.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceImpl.java&r1=1164046&r2=1165139&rev=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceImpl.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java Mon Sep  5 00:38:21 2011
@@ -32,7 +32,7 @@ import org.apache.isis.viewer.json.viewe
  * Implementation note: it seems to be necessary to annotate the implementation with {@link Path} rather than the
  * interface (at least under RestEasy 1.0.2 and 1.1-RC2).
  */
-public class HomePageResourceImpl extends ResourceAbstract implements HomePageResource {
+public class HomePageResourceServerside extends ResourceAbstract implements HomePageResource {
 
 
     @Override
@@ -41,10 +41,10 @@ public class HomePageResourceImpl extend
         init();
         
         JsonRepresentation representation = JsonRepresentation.newMap();
-        representation.put("representationType", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "representationType", "representationTypes/homePage").build());
-        representation.put("self", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "self", "").build());
-        representation.put("user", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "user", "user").build());
-        representation.put("services", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "services", "services").build());
+        representation.put("representationType", LinkRepBuilder.newBuilder(getResourceContext(), "representationType", "representationTypes/homePage").build());
+        representation.put("self", LinkRepBuilder.newBuilder(getResourceContext(), "self", "").build());
+        representation.put("user", LinkRepBuilder.newBuilder(getResourceContext(), "user", "user").build());
+        representation.put("services", LinkRepBuilder.newBuilder(getResourceContext(), "services", "services").build());
         
         return responseOfOk(asJson(representation));
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainObjectListRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainObjectListRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainObjectListRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainObjectListRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -21,48 +21,50 @@ import java.util.List;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 import org.apache.isis.viewer.json.viewer.representations.WellKnownType;
+import org.apache.isis.viewer.json.viewer.resources.objects.DomainObjectRepBuilder;
 
-public class DomainObjectListRepBuilder extends RepresentationBuilder {
+public class DomainObjectListRepBuilder extends RepresentationBuilder<DomainObjectListRepBuilder> {
 
-    public static DomainObjectListRepBuilder newBuilder(RepContext repContext, ObjectSpecification objectSpec, List<ObjectAdapter> objectAdapters) {
-        return newBuilder(repContext, WellKnownType.canonical(objectSpec.getFullIdentifier()), objectAdapters);
+    protected DomainObjectListRepBuilder(ResourceContext resourceContext, String typeName, List<ObjectAdapter> objectAdapters) {
+        this(resourceContext);
     }
 
-    public static DomainObjectListRepBuilder newBuilder(RepContext repContext, String typeName, List<ObjectAdapter> objectAdapters) {
-        return new DomainObjectListRepBuilder(repContext, typeName, objectAdapters);
+    protected DomainObjectListRepBuilder(ResourceContext resourceContext) {
+        super(resourceContext);
     }
 
-    private final List<ObjectAdapter> objectAdapters;
-    private String typeName;
-    
-    DomainObjectListRepBuilder(RepContext repContext, String typeName, List<ObjectAdapter> objectAdapters) {
-        super(repContext);
-        this.objectAdapters = objectAdapters;
-        this.typeName = typeName;
+    public DomainObjectListRepBuilder withRepresentationTypeListOf(String typeName) {
+        return withRepresentationType("list:" + typeName);
+    }
+
+    public DomainObjectListRepBuilder withRepresentationTypeListOf(ObjectSpecification objectSpec) {
+        return withRepresentationTypeListOf(WellKnownType.canonical(objectSpec.getFullIdentifier()));
     }
-    
-    public JsonRepresentation build() {
-        JsonRepresentation linkToRepresentationType = LinkRepBuilder.newBuilder(repContext, "representationType", "representationTypes/list:" + typeName).build();
-        representation.put("representationType", linkToRepresentationType);
 
+    public DomainObjectListRepBuilder withAdapters(List<ObjectAdapter> objectAdapters) {
         JsonRepresentation list = JsonRepresentation.newArray();
         for(ObjectAdapter adapter: objectAdapters) {
             JsonRepresentation linkToObject = buildLinkTo(adapter);
             list.add(linkToObject);
         }
         representation.put("value", list);
-        representation.put("links", JsonRepresentation.newArray());
-        representation.put("metadata", JsonRepresentation.newMap());
+        return this;
+    }
+
+
+    public JsonRepresentation build() {
+        withLinks();
+        withMetadata();
 
         return representation;
     }
 
+
     protected JsonRepresentation buildLinkTo(ObjectAdapter adapter) {
-        return LinkRepBuilder.newObjectBuilder(repContext, adapter, getOidStringifier()).build();
+        return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, adapter, getOidStringifier()).build();
     }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -16,7 +16,6 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.objects;
 
-import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -26,49 +25,49 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 
-import com.google.common.collect.Lists;
-
-public abstract class AbstractMemberRepBuilder<T extends ObjectMember> extends RepresentationBuilder {
+public abstract class AbstractMemberRepBuilder<R extends RepresentationBuilder<R>, T extends ObjectMember> extends RepresentationBuilder<R> {
 
     protected final ObjectAdapter objectAdapter;
     protected final MemberType memberType;
     protected final T objectMember;
-    protected final MemberRepType memberRepType;
 
-    public AbstractMemberRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, MemberType memberType, T objectMember) {
-        super(repContext);
+    public AbstractMemberRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, MemberType memberType, T objectMember) {
+        super(resourceContext);
         this.objectAdapter = objectAdapter;
         this.memberType = memberType;
         this.objectMember = objectMember;
-        this.memberRepType = repContext.getMemberRepType();
     }
 
-    protected void putSelfIfRequired() {
-        if(memberRepType.isStandalone()) {
-            JsonRepresentation selfRep = MemberSelfRepBuilder.newBuilder(repContext, objectAdapter, memberType, objectMember).build();
-            representation.put("_self", selfRep);
+    protected void putSelfIfRequired(MemberRepType memberRepType) {
+        if(!memberRepType.isStandalone()) {
+            return;
         }
-    }
+        
+        JsonRepresentation selfRep = JsonRepresentation.newMap();
+        String url = AbstractMemberRepBuilder.urlForMember(objectAdapter, memberType, objectMember, getOidStringifier());
+        JsonRepresentation memberLinkRep = LinkRepBuilder.newBuilder(resourceContext, "member", url).build();
+        selfRep.put("link", memberLinkRep);
+        
+        JsonRepresentation linkTo = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, objectAdapter, getOidStringifier()).build();
+        selfRep.put("object", linkTo);
 
-    protected void putMemberTypeRep() {
-        representation.put("memberType", memberType.name().toLowerCase());
+        representation.put("self", selfRep);
     }
 
-    protected void putTypeRep() {
-        ObjectSpecification specFor = memberType.specFor(objectMember);
-        JsonRepresentation typeRep = LinkRepBuilder.newTypeBuilder(repContext, specFor).build();
-        representation.put("type", typeRep);
+    public R withMemberType() {
+        representation.put("memberType", memberType.name().toLowerCase());
+        return (R) this;
     }
 
     protected void putIdRep() {
         representation.put(memberType.key(), objectMember.getId());
     }
 
-    protected void putMutatorsIfRequired() {
+    protected void putMutatorsIfRequired(MemberRepType memberRepType) {
         if(!memberRepType.isStandalone() || usability().isVetoed()) {
             return;
         }
@@ -79,7 +78,7 @@ public abstract class AbstractMemberRepB
                 String urlForMember = urlForMember(mutatorSpec.suffix);
                 JsonRepresentation arguments = mutatorArgs(mutatorSpec);
                 JsonRepresentation detailsLink = 
-                    LinkRepBuilder.newBuilder(repContext, mutator, urlForMember)
+                    LinkRepBuilder.newBuilder(resourceContext, mutator, urlForMember)
                         .withHttpMethod(mutatorSpec.httpMethod)
                         .withArguments(arguments)
                         .build();
@@ -104,7 +103,7 @@ public abstract class AbstractMemberRepB
 	}
 
     
-    protected void putValueIfRequired() {
+    protected void putValueIfRequired(MemberRepType memberRepType) {
         if(!memberRepType.hasValueFor(memberType)) {
             return;
         } 
@@ -119,18 +118,17 @@ public abstract class AbstractMemberRepB
         return null;
     }
 
-
     protected final void putDisabledReason() {
         String disabledReasonRep = usability().getReason();
         representation.put("disabledReason", disabledReasonRep);
     }
 
-    protected void putDetailsIfRequired() {
+    protected void putDetailsIfRequired(MemberRepType memberRepType) {
         if(!memberRepType.isInline()) {
             return;
         } 
         String urlForMember = urlForMember();
-        JsonRepresentation detailsLink = LinkRepBuilder.newBuilder(repContext, memberType.name().toLowerCase(), urlForMember).build();
+        JsonRepresentation detailsLink = LinkRepBuilder.newBuilder(resourceContext, memberType.name().toLowerCase(), urlForMember).build();
         representation.put("details", detailsLink);
     }
 
@@ -188,4 +186,5 @@ public abstract class AbstractMemberRepB
         return buf.toString();
     }
 
+    
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -23,34 +23,34 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 
 import com.google.common.collect.Lists;
 
-public class ActionRepBuilder extends AbstractMemberRepBuilder<ObjectAction> {
+public class ActionRepBuilder extends AbstractMemberRepBuilder<ActionRepBuilder, ObjectAction> {
 
-	public static ActionRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, ObjectAction oa) {
-        return new ActionRepBuilder(repContext, objectAdapter, oa);
+	public static ActionRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, ObjectAction objectAction) {
+        return new ActionRepBuilder(resourceContext, objectAdapter, objectAction);
     }
 
-    public ActionRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, ObjectAction oa) {
-        super(repContext, objectAdapter, MemberType.ACTION, oa);
-    }
-
-    public JsonRepresentation build() {
-        putSelfIfRequired();
+    protected ActionRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, ObjectAction objectAction) {
+        super(resourceContext, objectAdapter, MemberType.ACTION, objectAction);
+        MemberRepType memberRepType = MemberRepType.STANDALONE;
+        putSelfIfRequired(memberRepType);
         putContributedByIfRequired();
-        putTypeRep();
+        
         putIdRep();
-        putMemberTypeRep();
+        withMemberType();
         representation.put("actionType", objectMember.getType());
         representation.put("numParameters", objectMember.getParameterCount());
-        putParameterDetailsIfRequired();
-        putValueIfRequired();
+        putParameterDetailsIfRequired(memberRepType);
+        putValueIfRequired(memberRepType);
         putDisabledReason();
-        putMutatorsIfRequired();
-        putDetailsIfRequired();
+        putMutatorsIfRequired(memberRepType);
+        putDetailsIfRequired(memberRepType);
+    }
+
+    public JsonRepresentation build() {
         return representation;
     }
     
@@ -59,7 +59,7 @@ public class ActionRepBuilder extends Ab
     		return;
     	}
     	ObjectAdapter serviceAdapter = contributingServiceAdapter();
-        JsonRepresentation contributedByLink = LinkRepBuilder.newObjectBuilder(repContext, serviceAdapter, getOidStringifier()).build();
+        JsonRepresentation contributedByLink = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, serviceAdapter, getOidStringifier()).build();
 		representation.put("contributedBy", contributedByLink);
 	}
 
@@ -75,7 +75,7 @@ public class ActionRepBuilder extends Ab
     	throw new IllegalStateException("Unable to locate contributing service");
 	}
 
-    private void putParameterDetailsIfRequired() {
+    private void putParameterDetailsIfRequired(MemberRepType memberRepType) {
     	if (!memberRepType.isStandalone()) {
     		return;
     	} 
@@ -90,7 +90,6 @@ public class ActionRepBuilder extends Ab
 	private Object paramDetails(ObjectActionParameter param) {
 		final JsonRepresentation paramRep = JsonRepresentation.newMap();
 		paramRep.put("name", param.getName());
-		paramRep.put("type", LinkRepBuilder.newTypeBuilder(repContext, param.getSpecification()).build());
 		paramRep.put("num", param.getNumber());
 		paramRep.put("description", param.getDescription());
 		Object paramChoices = choicesFor(param);
@@ -112,7 +111,7 @@ public class ActionRepBuilder extends Ab
         List<Object> list = Lists.newArrayList();
         for (final ObjectAdapter choiceAdapter : choiceAdapters) {
         	ObjectSpecification objectSpec = param.getSpecification();
-        	list.add(DomainObjectRepBuilder.valueOrRef(repContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
+        	list.add(DomainObjectRepBuilder.valueOrRef(resourceContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
         }
         return list;
 	}
@@ -123,7 +122,7 @@ public class ActionRepBuilder extends Ab
 			return null;
 		}
     	ObjectSpecification objectSpec = param.getSpecification();
-    	return DomainObjectRepBuilder.valueOrRef(repContext, defaultAdapter, objectSpec, getOidStringifier(), getLocalization());
+    	return DomainObjectRepBuilder.valueOrRef(resourceContext, defaultAdapter, objectSpec, getOidStringifier(), getLocalization());
 	}
 
 	@Override
@@ -139,7 +138,7 @@ public class ActionRepBuilder extends Ab
     	if(objectMember.isContributed()) {
     		ObjectActionParameter actionParameter = objectMember.getParameters().get(i);
     		if (actionParameter.getSpecification().isOfType(objectAdapter.getSpecification())) {
-    			return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, getOidStringifier()).build();
+    			return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, objectAdapter, getOidStringifier()).build();
     		}
     	}
     	return "{value}";

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -23,30 +23,32 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 
 import com.google.common.collect.Lists;
 
-public class CollectionRepBuilder extends AbstractMemberRepBuilder<OneToManyAssociation> {
+public class CollectionRepBuilder extends AbstractMemberRepBuilder<CollectionRepBuilder, OneToManyAssociation> {
 
-    public static CollectionRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
-        return new CollectionRepBuilder(repContext, objectAdapter, otma);
+    public static CollectionRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
+        return new CollectionRepBuilder(resourceContext, objectAdapter, otma);
     }
 
-    public CollectionRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
-        super(repContext, objectAdapter, MemberType.COLLECTION, otma);
-    }
+    public CollectionRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
+        super(resourceContext, objectAdapter, MemberType.COLLECTION, otma);
 
-    public JsonRepresentation build() {
-        putSelfIfRequired();
-        putTypeRep();
+        MemberRepType memberRepType = MemberRepType.STANDALONE;
+
+        putSelfIfRequired(memberRepType);
         putIdRep();
-        putMemberTypeRep();
-        putValueIfRequired();
+        withMemberType();
+        putValueIfRequired(memberRepType);
         putDisabledReason();
-        putMutatorsIfRequired();
-        putDetailsIfRequired();
+        putMutatorsIfRequired(memberRepType);
+        putDetailsIfRequired(memberRepType);
+    }
+
+    public JsonRepresentation build() {
         return representation;
     }
 
@@ -60,7 +62,7 @@ public class CollectionRepBuilder extend
         List<JsonRepresentation> list = Lists.newArrayList();
         for (final ObjectAdapter elementAdapter : facet.iterable(valueAdapter)) {
 
-            LinkRepBuilder newBuilder = LinkRepBuilder.newObjectBuilder(repContext, elementAdapter, getOidStringifier());
+            LinkRepBuilder newBuilder = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, elementAdapter, getOidStringifier());
 
 			list.add(newBuilder.build());
         }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -17,7 +17,6 @@
 package org.apache.isis.viewer.json.viewer.resources.objects;
 
 import java.util.List;
-import java.util.Map;
 
 import org.apache.isis.applib.profiles.Localization;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -34,50 +33,43 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.representations.WellKnownType;
 import org.apache.isis.viewer.json.viewer.util.OidUtils;
 
 import com.google.common.base.Function;
-import com.google.common.collect.Maps;
 
-public class DomainObjectRepBuilder extends RepresentationBuilder {
+public class DomainObjectRepBuilder extends RepresentationBuilder<DomainObjectRepBuilder> {
 
-    public static DomainObjectRepBuilder newBuilder(RepContext representationContext, ObjectAdapter objectAdapter) {
+    public static DomainObjectRepBuilder newBuilder(ResourceContext representationContext, ObjectAdapter objectAdapter) {
         return new DomainObjectRepBuilder(representationContext, objectAdapter);
     }
 
     private final ObjectAdapter objectAdapter;
-    private final Map<String, JsonRepresentation> members = Maps.newLinkedHashMap();
     
-    public DomainObjectRepBuilder(RepContext repContext, ObjectAdapter objectAdapter) {
-        super(repContext);
+    public DomainObjectRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter) {
+        super(resourceContext);
         this.objectAdapter = objectAdapter;
+        withRepresentationType("object:" + WellKnownType.canonical(objectAdapter.getSpecification().getFullIdentifier()));
+        withSelf();
+        withMembers();
     }
-    
-    public JsonRepresentation build() {
-        RepContext repContext = this.repContext.underAttribute("_self");
-        JsonRepresentation selfLink = LinkRepBuilder.newBuilder(repContext, "object", url()).build();
-        JsonRepresentation selfType = LinkRepBuilder.newTypeBuilder(repContext, objectAdapter.getSpecification()).build();
-        String title = objectAdapter.titleString();
-        JsonRepresentation iconLink = LinkRepBuilder.newBuilder(repContext, "icon", icon()).build();
+
+    public DomainObjectRepBuilder withSelf() {
         JsonRepresentation self = JsonRepresentation.newMap();
+        JsonRepresentation selfLink = LinkRepBuilder.newBuilder(resourceContext, "object", url()).build();
+        //JsonRepresentation selfType = LinkRepBuilder.newTypeBuilder(resourceContext, objectAdapter.getSpecification()).build();
+        String title = objectAdapter.titleString();
+        //JsonRepresentation iconLink = LinkRepBuilder.newBuilder(resourceContext, "icon", icon()).build();
         self.put("link", selfLink);
-        self.put("type", selfType);
         self.put("oid", OidUtils.getOidStr(objectAdapter, getOidStringifier()));
         self.put("title", title);
-        self.put("icon", iconLink);
-        representation.put("_self", self);
-        withAllMembers(objectAdapter);
-        if(!members.isEmpty()) {
-            for(Map.Entry<String, JsonRepresentation> entry: members.entrySet()) {
-                String memberId = entry.getKey();
-                JsonRepresentation memberRep = entry.getValue();
-                representation.put(memberId, memberRep);
-            }
-        }
-        return representation;
+//        self.put("type", selfType);
+//        self.put("icon", iconLink);
+        representation.put("self", self);
+        return this;
     }
 
     private String icon() {
@@ -89,7 +81,15 @@ public class DomainObjectRepBuilder exte
         return urlFor(objectAdapter, getOidStringifier());
     }
 
-    private void withAllMembers(final ObjectAdapter objectAdapter) {
+
+    public DomainObjectRepBuilder withMembers() {
+        JsonRepresentation members = JsonRepresentation.newArray();
+        addAllMembers(objectAdapter, members);
+        representation.put("members", members);
+        return this;
+    }
+
+    private void addAllMembers(final ObjectAdapter objectAdapter, JsonRepresentation members) {
         List<ObjectAssociation> associations = objectAdapter.getSpecification().getAssociations();
         for (ObjectAssociation assoc : associations) {
             Consent visibility = assoc.isVisible(getSession(), objectAdapter);
@@ -99,22 +99,22 @@ public class DomainObjectRepBuilder exte
             String id = assoc.getId();
             if(assoc instanceof OneToOneAssociation) {
                 OneToOneAssociation property = (OneToOneAssociation)assoc;
-                JsonRepresentation propertyRep = PropertyRepBuilder.newBuilder(repContext.underAttribute(id), objectAdapter, property).build();
-                withMember(id, propertyRep);
+                JsonRepresentation propertyRep = PropertyRepBuilder.newBuilder(resourceContext, objectAdapter, property).build();
+                members.put(id, propertyRep);
             }
             if(assoc instanceof OneToManyAssociation) {
                 OneToManyAssociation collection = (OneToManyAssociation) assoc;
-                JsonRepresentation collectionRep = CollectionRepBuilder.newBuilder(repContext.underAttribute(id), objectAdapter, collection).build();
-                withMember(id, collectionRep);
+                JsonRepresentation collectionRep = CollectionRepBuilder.newBuilder(resourceContext, objectAdapter, collection).build();
+                members.put(id, collectionRep);
             }
         }
         
         List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.INCLUDED);
-        withActions(objectAdapter, actions);
+        addActions(objectAdapter, actions, members);
     }
 
-	private void withActions(final ObjectAdapter objectAdapter,
-			List<ObjectAction> actions) {
+	private void addActions(final ObjectAdapter objectAdapter,
+			List<ObjectAction> actions, JsonRepresentation members) {
 		for (ObjectAction action : actions) {
             Consent visibility = action.isVisible(getSession(), objectAdapter);
             if(!visibility.isAllowed()) {
@@ -123,25 +123,31 @@ public class DomainObjectRepBuilder exte
         	if(action.getType().isSet()) {
         		ObjectActionSet objectActionSet = (ObjectActionSet) action;
         		List<ObjectAction> subactions = objectActionSet.getActions();
-        		withActions(objectAdapter, subactions);
+        		addActions(objectAdapter, subactions, members);
         	} else {
                 final String id = action.getId();
-                JsonRepresentation actionRep = ActionRepBuilder.newBuilder(repContext.underAttribute(id), objectAdapter, action).build();
-                withMember(id, actionRep);
+                JsonRepresentation actionRep = ActionRepBuilder.newBuilder(resourceContext, objectAdapter, action).build();
+                members.put(id, actionRep);
         	}
         }
 	}
 
-    private void withMember(String id, JsonRepresentation propertyRep) {
-        members.put(id, propertyRep);
+    public JsonRepresentation build() {
+        withLinks();
+        withMetadata();
+        return representation;
     }
-    
 
     /////////////////////////////////////////////////////////////////////
     //
     /////////////////////////////////////////////////////////////////////
     
-	public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
+	public static LinkRepBuilder newLinkToBuilder(ResourceContext resourceContext, ObjectAdapter elementAdapter, OidStringifier oidStringifier) {
+    	String url = urlFor(elementAdapter, oidStringifier);
+        return LinkRepBuilder.newBuilder(resourceContext, "object", url);
+    }
+
+    public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
         String oidStr = oidStringifier.enString(objectAdapter.getOid());
         return "objects/" + oidStr;
     }
@@ -151,11 +157,11 @@ public class DomainObjectRepBuilder exte
     //
     /////////////////////////////////////////////////////////////////////
 
-    public static Function<ObjectAdapter, JsonRepresentation> fromAdapter(final RepContext repContext) {
+    public static Function<ObjectAdapter, JsonRepresentation> fromAdapter(final ResourceContext resourceContext) {
         return new Function<ObjectAdapter, JsonRepresentation>() {
             @Override
             public JsonRepresentation apply(ObjectAdapter input) {
-                return newBuilder(repContext, input).build();
+                return newBuilder(resourceContext, input).build();
             }
         };
     }
@@ -174,7 +180,7 @@ public class DomainObjectRepBuilder exte
     //
     /////////////////////////////////////////////////////////////////////
 
-    public static Object valueOrRef(RepContext repContext,
+    public static Object valueOrRef(ResourceContext resourceContext,
 			final ObjectAdapter objectAdapter, ObjectSpecification objectSpec, OidStringifier oidStringifier, Localization localization) {
 		ValueFacet valueFacet = objectSpec.getFacet(ValueFacet.class);
 		if(valueFacet != null) {
@@ -183,7 +189,7 @@ public class DomainObjectRepBuilder exte
 		}
 		TitleFacet titleFacet = objectSpec.getFacet(TitleFacet.class);
 		String title = titleFacet.title(objectAdapter, localization);
-		return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, oidStringifier).withTitle(title).build();
+		return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, objectAdapter, oidStringifier).withTitle(title).build();
 	}
 
 

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceServerside.java (from r1164046, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceImpl.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceServerside.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceServerside.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceImpl.java&r1=1164046&r2=1165139&rev=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceImpl.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectResourceServerside.java Mon Sep  5 00:38:21 2011
@@ -46,6 +46,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.viewer.json.applib.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.domain.DomainObjectResource;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
 import org.apache.isis.viewer.json.viewer.util.UrlDecoderUtils;
@@ -57,7 +58,7 @@ import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
 
 @Path("/objects")
-public class DomainObjectResourceImpl extends ResourceAbstract implements
+public class DomainObjectResourceServerside extends ResourceAbstract implements
         DomainObjectResource {
 
     @GET
@@ -67,7 +68,7 @@ public class DomainObjectResourceImpl ex
 
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         final DomainObjectRepBuilder builder = DomainObjectRepBuilder
-                .newBuilder(getResourceContext().repContext(), objectAdapter);
+                .newBuilder(getResourceContext(), objectAdapter);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 
@@ -83,7 +84,7 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, propertyId, Intent.ACCESS);
 
         final PropertyRepBuilder builder = PropertyRepBuilder.newBuilder(
-                getResourceContext().repContext(), objectAdapter, property);
+                getResourceContext(), objectAdapter, property);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 
@@ -99,7 +100,7 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, collectionId, Intent.ACCESS);
 
         final CollectionRepBuilder builder = CollectionRepBuilder.newBuilder(
-                getResourceContext().repContext(), objectAdapter, collection);
+                getResourceContext(), objectAdapter, collection);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 
@@ -115,7 +116,7 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, actionId, Intent.ACCESS);
 
         ActionRepBuilder builder = ActionRepBuilder.newBuilder(
-                getResourceContext().repContext(), objectAdapter, action);
+                getResourceContext(), objectAdapter, action);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 
@@ -132,25 +133,22 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, actionId, Intent.ACCESS);
 
         if (!isIdempotent(action)) {
-            throw new WebApplicationException(
-                    responseOfMethodNotAllowed("Method not allowed; action '"
-                            + action.getId() + "' is not idempotent"));
+            return responseOf(HttpStatusCode.METHOD_NOT_ALLOWED, 
+                    "Method not allowed; action '%s' is not idempotent", action.getId());
         }
         int numParameters = action.getParameterCount();
         int numArguments = arguments.size();
         if (numArguments != numParameters) {
-            throw new WebApplicationException(
-                    responseOfBadRequest("Action '" + action.getId() + "' has "
-                            + numParameters + " parameters but received "
-                            + numArguments + " arguments"));
+            return responseOf(HttpStatusCode.BAD_REQUEST, 
+                    "Action '%s' has %d parameters but received %d  arguments", action.getId(), numParameters, numArguments);
         }
 
         List<ObjectAdapter> parameters;
         try {
             parameters = argumentAdaptersFor(action, arguments);
         } catch (IOException e) {
-            throw new WebApplicationException(
-                    responseOfBadRequest("Action '" + action.getId() +"' has body that cannot be parsed as JSON", e));
+            return responseOf(HttpStatusCode.BAD_REQUEST, 
+                    "Action '%s' has body that cannot be parsed as JSON", e, action.getId());
         }
         return invokeActionUsingAdapters(action, objectAdapter, parameters);
     }
@@ -212,13 +210,12 @@ public class DomainObjectResourceImpl ex
 
         Consent consent = property.isAssociationValid(objectAdapter, argAdapter);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(
-                    responseOfPreconditionFailed(consent.getReason()));
+            return responseOfUnauthorized(consent);
         }
 
         property.set(objectAdapter, argAdapter);
 
-        return responseOfOk();
+        return responseOfNoContent();
     }
 
     @PUT
@@ -234,7 +231,8 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, collectionId, Intent.MUTATE);
 
         if (!collection.getCollectionSemantics().isSet()) {
-            throw new WebApplicationException(responseOfBadRequest("Collection '" + collectionId + "' does not have set semantics"));
+            return responseOf(HttpStatusCode.BAD_REQUEST, 
+                    "Collection '' does not have set semantics", collectionId);
         }
 
         ObjectSpecification collectionSpec = collection.getSpecification();
@@ -242,12 +240,12 @@ public class DomainObjectResourceImpl ex
 
         Consent consent = collection.isValidToAdd(objectAdapter, argAdapter);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(responseOfPreconditionFailed(consent.getReason()));
+            return responseOfUnauthorized(consent);
         }
 
         collection.addElement(objectAdapter, argAdapter);
         
-        return responseOfOk();
+        return responseOfNoContent();
     }
 
     // /////////////////////////////////////////////////////////////////
@@ -267,13 +265,12 @@ public class DomainObjectResourceImpl ex
 
         Consent consent = property.isAssociationValid(objectAdapter, null);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(
-                    responseOfPreconditionFailed(consent.getReason()));
+            return responseOfUnauthorized(consent);
         }
 
         property.set(objectAdapter, null);
 
-        return responseOfOk();
+        return responseOfNoContent();
     }
 
     @DELETE
@@ -293,12 +290,12 @@ public class DomainObjectResourceImpl ex
 
         Consent consent = collection.isValidToRemove(objectAdapter, argAdapter);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(responseOfPreconditionFailed(consent.getReason()));
+            return responseOfUnauthorized(consent);
         }
 
         collection.removeElement(objectAdapter, argAdapter);
         
-        return responseOfOk();
+        return responseOfNoContent();
     }
 
     // /////////////////////////////////////////////////////////////////
@@ -318,7 +315,8 @@ public class DomainObjectResourceImpl ex
                 objectAdapter, collectionId, Intent.MUTATE);
 
         if (!collection.getCollectionSemantics().isListOrArray()) {
-            throw new WebApplicationException(responseOfBadRequest("Collection '" + collectionId + "' does not have list or array semantics"));
+            return responseOf(HttpStatusCode.METHOD_NOT_ALLOWED, 
+                    "Collection '%s' does not have list or array semantics", collectionId);
         }
 
         ObjectSpecification collectionSpec = collection.getSpecification();
@@ -326,12 +324,12 @@ public class DomainObjectResourceImpl ex
 
         Consent consent = collection.isValidToAdd(objectAdapter, argAdapter);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(responseOfPreconditionFailed(consent.getReason()));
+            return responseOfUnauthorized(consent);
         }
 
         collection.addElement(objectAdapter, argAdapter);
         
-        return responseOfOk();
+        return responseOfNoContent();
     }
 
     @POST
@@ -360,10 +358,9 @@ public class DomainObjectResourceImpl ex
         int numArguments = arguments.size();
         if (numArguments != numParameters) {
             throw new WebApplicationException(
-                    responseOfBadRequest("Action '" + action.getId()
-                            + "' has " + numParameters
-                            + " parameters but received " + numArguments
-                            + " arguments in body"));
+                responseOf(HttpStatusCode.BAD_REQUEST, 
+                        "Action '%s' has %d parameters but received %d arguments in body", 
+                        action.getId(), numParameters, numArguments));
         }
 
         for (int i = 0; i < numParameters; i++) {
@@ -391,20 +388,14 @@ public class DomainObjectResourceImpl ex
             return objectAdapterFor(paramSpec, arg);
         } catch (ExpectedStringRepresentingValueException e) {
             throw new WebApplicationException(
-                    responseOfBadRequest("Action '"
-                            + action.getId()
-                            + "', argument "
-                            + i
-                            + " should be a URL encoded string representing a value of type "
-                            + resourceFor(paramSpec)));
+                    responseOf(HttpStatusCode.BAD_REQUEST, 
+                        "Action '%s', argument %d should be a URL encoded string representing a value of type %s",
+                        action.getId(), i, resourceFor(paramSpec)));
         } catch (ExpectedMapRepresentingReferenceException e) {
             throw new WebApplicationException(
-                    responseOfBadRequest("Action '"
-                            + action.getId()
-                            + "', argument "
-                            + i
-                            + " should be a map representing a link to reference of type "
-                            + resourceFor(paramSpec)));
+                    responseOf(HttpStatusCode.BAD_REQUEST, 
+                        "Action '%s', argument %d should be a map representing a link to reference of type %s",
+                        action.getId(), i, resourceFor(paramSpec)));
         }
     }
 
@@ -424,8 +415,7 @@ public class DomainObjectResourceImpl ex
                 Object arg = paramAdapter.getObject();
                 String reasonNotValid = parameter.isValid(objectAdapter, arg);
                 if (reasonNotValid != null) {
-                    throw new WebApplicationException(
-                            responseOfPreconditionFailed(reasonNotValid));
+                    return responseOf(HttpStatusCode.NOT_ACCEPTABLE, reasonNotValid);
                 }
             }
         }
@@ -433,14 +423,13 @@ public class DomainObjectResourceImpl ex
         Consent consent = action.isProposedArgumentSetValid(objectAdapter,
                 argArray);
         if (consent.isVetoed()) {
-            throw new WebApplicationException(
-                    responseOfPreconditionFailed(consent.getReason()));
+            return responseOf(HttpStatusCode.NOT_ACCEPTABLE, consent.getReason());
         }
 
         final ObjectAdapter returnedAdapter = action.execute(objectAdapter,
                 argArray);
         if (returnedAdapter == null) {
-            return responseOfOk();
+            return responseOfNoContent();
         }
         final CollectionFacet facet = returnedAdapter.getSpecification()
                 .getFacet(CollectionFacet.class);
@@ -458,7 +447,9 @@ public class DomainObjectResourceImpl ex
         List<?> arguments = parseBody(body);
         if (arguments.size() != 1) {
             throw new WebApplicationException(
-                    responseOfBadRequest("Body should contain 1 argument representing a value of type '" + resourceFor(objectSpec) + "'"));
+                    responseOf(HttpStatusCode.BAD_REQUEST, 
+                        "Body should contain 1 argument representing a value of type '%s'", 
+                        resourceFor(objectSpec)));
         }
 
         ObjectAdapter proposedValueAdapter = objectAdapterFor(objectSpec, arguments.get(0));
@@ -474,14 +465,13 @@ public class DomainObjectResourceImpl ex
             return arguments;
         } catch (JsonParseException e) {
             throw new WebApplicationException(e,
-                    responseOfBadRequest("could not parse body"));
+                    responseOf(HttpStatusCode.BAD_REQUEST, "could not parse body", e));
         } catch (JsonMappingException e) {
-            throw new WebApplicationException(
-                    e,
-                    responseOfBadRequest("could not map body to a Map structure"));
+            throw new WebApplicationException(e,
+                    responseOf(HttpStatusCode.BAD_REQUEST, "could not map body to a Map structure", e));
         } catch (IOException e) {
             throw new WebApplicationException(e,
-                    responseOfBadRequest("could not read body"));
+                    responseOf(HttpStatusCode.BAD_REQUEST, "could not read body", e));
         }
     }
 
@@ -548,20 +538,21 @@ public class DomainObjectResourceImpl ex
             if (usable.isVetoed()) {
                 String memberTypeStr = memberType.name().toLowerCase();
                 throw new WebApplicationException(
-                        responseOfPreconditionFailed(memberTypeStr
-                                + " is not usable: '" + memberId + "' ("
-                                + usable.getReason() + ")"));
+                        responseOf(HttpStatusCode.NOT_ACCEPTABLE, 
+                        "%s is not usable: '%s' (%s)", 
+                        memberTypeStr, memberId, usable.getReason()));
             }
         }
         return objectMember;
     }
 
-    private static void throwNotFoundException(final String memberId,
-        MemberType memberType) {
+    private static void throwNotFoundException(
+            final String memberId, MemberType memberType) {
         String memberTypeStr = memberType.name().toLowerCase();
         throw new WebApplicationException(
-                responseOfNotFound(memberTypeStr + " '" + memberId
-                        + "' either does not exist or is not visible"));
+                responseOf(HttpStatusCode.NOT_FOUND, 
+                        "%s '%s' either does not exist or is not visible", 
+                        memberTypeStr, memberId));
     }
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -19,22 +19,22 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 
-public class MemberSelfRepBuilder extends RepresentationBuilder {
+public class MemberSelfRepBuilder extends RepresentationBuilder<MemberSelfRepBuilder> {
 
-    public static MemberSelfRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
-        return new MemberSelfRepBuilder(repContext, objectAdapter, memberType, objectMember);
+    public static MemberSelfRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
+        return new MemberSelfRepBuilder(resourceContext, objectAdapter, memberType, objectMember);
     }
 
     private final ObjectAdapter objectAdapter;
     private final MemberType memberType;
     private final ObjectMember objectMember;
 
-    public MemberSelfRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
-        super(repContext);
+    public MemberSelfRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
+        super(resourceContext);
         this.objectAdapter = objectAdapter;
         this.memberType = memberType;
         this.objectMember = objectMember;
@@ -48,11 +48,11 @@ public class MemberSelfRepBuilder extend
 
     private JsonRepresentation memberLinkRep() {
         String url = AbstractMemberRepBuilder.urlForMember(objectAdapter, memberType, objectMember, getOidStringifier());
-        return LinkRepBuilder.newBuilder(repContext, "member", url).build();
+        return LinkRepBuilder.newBuilder(resourceContext, "member", url).build();
     }
     
     private JsonRepresentation domainObjectLinkRep() {
-        return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, getOidStringifier()).build();
+        return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, objectAdapter, getOidStringifier()).build();
     }
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -22,30 +22,32 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 
 import com.google.common.collect.Lists;
 
-public class PropertyRepBuilder extends AbstractMemberRepBuilder<OneToOneAssociation> {
+public class PropertyRepBuilder extends AbstractMemberRepBuilder<PropertyRepBuilder, OneToOneAssociation> {
 
-    public static PropertyRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
-        return new PropertyRepBuilder(repContext, objectAdapter, otoa);
+    public static PropertyRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        return new PropertyRepBuilder(resourceContext, objectAdapter, otoa);
     }
 
-    public PropertyRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
-        super(repContext, objectAdapter, MemberType.PROPERTY, otoa);
-    }
+    public PropertyRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        super(resourceContext, objectAdapter, MemberType.PROPERTY, otoa);
 
-    public JsonRepresentation build() {
-        putSelfIfRequired();
-        putTypeRep();
+        MemberRepType memberRepType = MemberRepType.STANDALONE;
+
+        putSelfIfRequired(memberRepType);
         putIdRep();
-        putMemberTypeRep();
-        putValueIfRequired();
+        withMemberType();
+        putValueIfRequired(memberRepType);
         putDisabledReason();
         putChoices();
-        putMutatorsIfRequired();
-        putDetailsIfRequired();
+        putMutatorsIfRequired(memberRepType);
+        putDetailsIfRequired(memberRepType);
+    }
+
+    public JsonRepresentation build() {
         return representation;
     }
 
@@ -56,7 +58,7 @@ public class PropertyRepBuilder extends 
         if(valueAdapter == null) {
 		    return null;
 		}
-        return DomainObjectRepBuilder.valueOrRef(repContext, valueAdapter, objectMember.getSpecification(), getOidStringifier(), getLocalization());
+        return DomainObjectRepBuilder.valueOrRef(resourceContext, valueAdapter, objectMember.getSpecification(), getOidStringifier(), getLocalization());
     }
 
     private void putChoices() {
@@ -74,7 +76,7 @@ public class PropertyRepBuilder extends 
         List<Object> list = Lists.newArrayList();
         for (final ObjectAdapter choiceAdapter : choiceAdapters) {
         	ObjectSpecification objectSpec = objectMember.getSpecification();
-        	list.add(DomainObjectRepBuilder.valueOrRef(repContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
+        	list.add(DomainObjectRepBuilder.valueOrRef(resourceContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
         }
         return list;
 	}

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceServerside.java (from r1164046, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceImpl.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceServerside.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceServerside.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceImpl.java&r1=1164046&r2=1165139&rev=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceImpl.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/reptypes/RepresentationTypeResourceServerside.java Mon Sep  5 00:38:21 2011
@@ -35,7 +35,7 @@ import org.apache.isis.viewer.json.viewe
  * interface (at least under RestEasy 1.0.2 and 1.1-RC2).
  */
 @Path("/representationTypes")
-public class RepresentationTypeResourceImpl extends ResourceAbstract implements RepresentationTypeResource {
+public class RepresentationTypeResourceServerside extends ResourceAbstract implements RepresentationTypeResource {
 
 
     @GET
@@ -45,8 +45,8 @@ public class RepresentationTypeResourceI
         init();
 
         JsonRepresentation representation = JsonRepresentation.newMap();
-        representation.put("representationType", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "representationType", "representationTypes/representationType").build());
-        representation.put("self", LinkRepBuilder.newBuilder(getResourceContext().repContextInline(), "self", "representationType/" + representationTypeName).build());
+        representation.put("representationType", LinkRepBuilder.newBuilder(getResourceContext(), "representationType", "representationTypes/representationType").build());
+        representation.put("self", LinkRepBuilder.newBuilder(getResourceContext(), "self", "representationType/" + representationTypeName).build());
         
         return responseOfOk(asJson(representation));
     }

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServiceListRepBuilder.java (from r1164046, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainServiceListRepBuilder.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServiceListRepBuilder.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServiceListRepBuilder.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainServiceListRepBuilder.java&r1=1164046&r2=1165139&rev=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objectlist/DomainServiceListRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServiceListRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -14,32 +14,30 @@
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
-package org.apache.isis.viewer.json.viewer.resources.objectlist;
-
-import java.util.List;
+package org.apache.isis.viewer.json.viewer.resources.services;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.resources.objectlist.DomainObjectListRepBuilder;
 
-public class DomainServiceListRepBuilder extends DomainObjectListRepBuilder {
+class DomainServiceListRepBuilder extends DomainObjectListRepBuilder {
 
-    public static DomainServiceListRepBuilder newBuilder(RepContext repContext, List<ObjectAdapter> serviceAdapters) {
-        return new DomainServiceListRepBuilder(repContext, serviceAdapters);
+    public static DomainObjectListRepBuilder newBuilder(ResourceContext resourceContext) {
+        return new DomainServiceListRepBuilder(resourceContext);
     }
 
-    private DomainServiceListRepBuilder(RepContext repContext, List<ObjectAdapter> serviceAdapters) {
-        super(repContext, "object", serviceAdapters);
+    private DomainServiceListRepBuilder(ResourceContext resourceContext) {
+        super(resourceContext);
+        withRepresentationTypeListOf("object");
     }
 
     @Override
     protected JsonRepresentation buildLinkTo(ObjectAdapter serviceAdapter) {
-        Object servicePojo = serviceAdapter.getObject();
-        String serviceId = ServiceUtil.id(servicePojo);
-        JsonRepresentation linkToService = LinkRepBuilder.newBuilder(repContext, "service", "services/" + serviceId).build();
-        return linkToService;
+        String serviceId = ServiceUtil.id(serviceAdapter.getObject());
+        return LinkRepBuilder.newBuilder(resourceContext, "service", "services/" + serviceId).build();
     }
 
 

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServicesResourceServerside.java (from r1164046, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/ServicesResourceImpl.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServicesResourceServerside.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServicesResourceServerside.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/ServicesResourceImpl.java&r1=1164046&r2=1165139&rev=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/ServicesResourceImpl.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/services/DomainServicesResourceServerside.java Mon Sep  5 00:38:21 2011
@@ -30,24 +30,24 @@ import javax.ws.rs.core.Response;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.json.applib.domain.ServicesResource;
-import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.applib.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.domain.DomainServicesResource;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
 import org.apache.isis.viewer.json.viewer.resources.objectlist.DomainObjectListRepBuilder;
-import org.apache.isis.viewer.json.viewer.resources.objectlist.DomainServiceListRepBuilder;
 import org.apache.isis.viewer.json.viewer.resources.objects.DomainObjectRepBuilder;
 
-public class ServicesResourceImpl extends ResourceAbstract implements ServicesResource {
+public class DomainServicesResourceServerside extends ResourceAbstract implements DomainServicesResource {
 
     @Override
     @Produces({ MediaType.APPLICATION_JSON })
     public Response services() {
         init();
 
-        final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
-		RepContext repContext = getResourceContext().repContext();
+		ResourceContext resourceContext = getResourceContext();
+		final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
 
-        DomainServiceListRepBuilder builder = DomainServiceListRepBuilder.newBuilder(repContext, serviceAdapters);
+        DomainObjectListRepBuilder builder = DomainServiceListRepBuilder.newBuilder(resourceContext).withAdapters(serviceAdapters);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 
@@ -60,11 +60,12 @@ public class ServicesResourceImpl extend
 
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
         if(serviceAdapter == null) {
-            return responseOfNotFound("Could not locate service '%s'", serviceId);
+            Object[] args = { serviceId };
+            return responseOf(HttpStatusCode.NOT_FOUND, "Could not locate service '%s'", args);
         }
-        RepContext repContext = getResourceContext().repContext();
+        ResourceContext resourceContext = getResourceContext();
 
-        DomainObjectRepBuilder builder = DomainObjectRepBuilder.newBuilder(repContext, serviceAdapter);
+        DomainObjectRepBuilder builder = DomainObjectRepBuilder.newBuilder(resourceContext, serviceAdapter);
         return responseOfOk(jsonRepresentionFrom(builder));
     }
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java?rev=1165139&r1=1165138&r2=1165139&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java Mon Sep  5 00:38:21 2011
@@ -18,37 +18,34 @@ package org.apache.isis.viewer.json.view
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
-import org.apache.isis.viewer.json.viewer.RepContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 
-public class UserRepBuilder extends RepresentationBuilder {
+public class UserRepBuilder extends RepresentationBuilder<UserRepBuilder> {
 
-    public static UserRepBuilder newBuilder(RepContext repContext, AuthenticationSession authenticationSession) {
-        return new UserRepBuilder(repContext, authenticationSession);
+    public static UserRepBuilder newBuilder(ResourceContext resourceContext) {
+        return new UserRepBuilder(resourceContext);
     }
 
-    private final AuthenticationSession authenticationSession;
-    
-    private UserRepBuilder(RepContext repContext, AuthenticationSession authenticationSession) {
-        super(repContext);
-        this.authenticationSession = authenticationSession;
+    private UserRepBuilder(ResourceContext resourceContext) {
+        super(resourceContext);
+        withRepresentationType("user");
+        withSelf("user");
     }
-    
-    public JsonRepresentation build() {
-        JsonRepresentation linkToRepresentationType = LinkRepBuilder.newBuilder(repContext, "representationType", "representationTypes/user").build();
-        representation.put("representationType", linkToRepresentationType);
-        
-        representation.put("self", LinkRepBuilder.newBuilder(repContext, "self", "user").build());
+
+    public UserRepBuilder withAuthenticationSession(AuthenticationSession authenticationSession) {
         representation.put("username", authenticationSession.getUserName());
         JsonRepresentation roles = JsonRepresentation.newArray();
         for (String role : authenticationSession.getRoles()) {
             roles.add(role);
         }
         representation.put("roles", roles);
-        
-        representation.put("links", JsonRepresentation.newArray());
-        representation.put("metadata", JsonRepresentation.newMap());
+        return this;
+    }
+    
+    public JsonRepresentation build() {
+        withLinks();
+        withMetadata();
         return representation;
     }