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/06/23 01:06:32 UTC

svn commit: r1138675 - in /incubator/isis/trunk: examples/claims/quickrun/ viewer/restful/ viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/re...

Author: danhaywood
Date: Wed Jun 22 23:06:31 2011
New Revision: 1138675

URL: http://svn.apache.org/viewvc?rev=1138675&view=rev
Log:
more work on restful viewer2

Added:
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepresentationContext.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java
      - copied, changed from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java
Removed:
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepresentationContext.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepresentation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/org/
Modified:
    incubator/isis/trunk/examples/claims/quickrun/pom.xml
    incubator/isis/trunk/viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ServicesResource.java
    incubator/isis/trunk/viewer/restful/pom.xml
    incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/ResourceAbstract.java
    incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/pom.xml
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/Constants.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/ResourceContext.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RestfulApplication.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/index.html
    incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/isis-json-support.js

Modified: incubator/isis/trunk/examples/claims/quickrun/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/examples/claims/quickrun/pom.xml?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/examples/claims/quickrun/pom.xml (original)
+++ incubator/isis/trunk/examples/claims/quickrun/pom.xml Wed Jun 22 23:06:31 2011
@@ -83,12 +83,10 @@
         </dependency>
         
         <!-- isis viewers -->
-        <!-- 
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
 			<artifactId>dnd</artifactId>
 		</dependency>
-		-->
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
 			<artifactId>html</artifactId>

Modified: incubator/isis/trunk/viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ServicesResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ServicesResource.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ServicesResource.java (original)
+++ incubator/isis/trunk/viewer/restful/applib/src/main/java/org/apache/isis/viewer/restful/applib/resources/ServicesResource.java Wed Jun 22 23:06:31 2011
@@ -25,7 +25,8 @@ import javax.ws.rs.Produces;
 public interface ServicesResource {
 
     @GET
-    @Produces({ "application/xhtml+xml", "text/html" })
+    //@Produces({ "application/xhtml+xml", "application/json", "text/html" })
+    @Produces({ "application/json" })
     @Path("/")
     public String services();
 

Modified: incubator/isis/trunk/viewer/restful/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/pom.xml?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/pom.xml (original)
+++ incubator/isis/trunk/viewer/restful/pom.xml Wed Jun 22 23:06:31 2011
@@ -112,6 +112,30 @@
                 <type>test-jar</type>
 			</dependency>
 
+
+	   		<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>restful-applib2</artifactId>
+				<version>0.1.2-incubating-SNAPSHOT</version>
+			</dependency>
+	   		<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>restful-applib2</artifactId>
+				<version>0.1.2-incubating-SNAPSHOT</version>
+                <type>test-jar</type>
+			</dependency>
+	   		<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>restful-viewer2</artifactId>
+				<version>0.1.2-incubating-SNAPSHOT</version>
+			</dependency>
+	   		<dependency>
+				<groupId>org.apache.isis.viewer</groupId>
+				<artifactId>restful-viewer2</artifactId>
+				<version>0.1.2-incubating-SNAPSHOT</version>
+                <type>test-jar</type>
+			</dependency>
+
 		</dependencies>
 	</dependencyManagement>
 
@@ -119,6 +143,7 @@
     <!-- USE -pl xxx TO SELECT A SINGLE MODULE -->
     <modules>
 	    <module>applib</module>
+	    <module>applib2</module>
 	    <module>viewer</module>
 	    <module>viewer2</module>
     </modules>

Modified: incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/ResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/ResourceAbstract.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/ResourceAbstract.java Wed Jun 22 23:06:31 2011
@@ -118,7 +118,7 @@ public abstract class ResourceAbstract {
         return getSpecificationLoader().loadSpecification(specFullName);
     }
 
-    protected ObjectAdapter getNakedObject(final String oidEncodedStr) {
+    protected ObjectAdapter getObjectAdapter(final String oidEncodedStr) {
         return OidUtils.getNakedObject(oidEncodedStr, getOidStringifier());
     }
 

Modified: incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer/src/main/java/org/apache/isis/viewer/restful/viewer/resources/objects/ObjectResourceImpl.java Wed Jun 22 23:06:31 2011
@@ -86,7 +86,7 @@ public class ObjectResourceImpl extends 
         init();
         final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
 
-        final ObjectAdapter objectAdapter = getNakedObject(oidStr);
+        final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         if (objectAdapter == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -220,7 +220,7 @@ public class ObjectResourceImpl extends 
         final String propertyId = UrlDecoderUtils.urlDecode(propertyEncodedId);
         final String proposedValue = UrlDecoderUtils.urlDecode(proposedEncodedValue);
 
-        final ObjectAdapter nakedObject = getNakedObject(oidStr);
+        final ObjectAdapter nakedObject = getObjectAdapter(oidStr);
         if (nakedObject == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -264,7 +264,7 @@ public class ObjectResourceImpl extends 
         final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
         final String propertyId = UrlDecoderUtils.urlDecode(propertyEncodedId);
 
-        final ObjectAdapter objectAdapter = getNakedObject(oidStr);
+        final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         if (objectAdapter == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -309,7 +309,7 @@ public class ObjectResourceImpl extends 
         final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
         final String collectionId = UrlDecoderUtils.urlDecode(collectionEncodedId);
 
-        final ObjectAdapter objectAdapter = getNakedObject(oidStr);
+        final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         if (objectAdapter == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -371,7 +371,7 @@ public class ObjectResourceImpl extends 
         final String collectionId = UrlDecoderUtils.urlDecode(collectionEncodedId);
         final String proposedValueOidStr = UrlDecoderUtils.urlDecode(proposedValueEncodedOidStr);
 
-        final ObjectAdapter objectAdapter = getNakedObject(oidStr);
+        final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         if (objectAdapter == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -381,7 +381,7 @@ public class ObjectResourceImpl extends 
         final OneToManyAssociation collection = (OneToManyAssociation) noSpec.getAssociation(collectionId);
 
         ObjectAdapter proposedValueNO = null;
-        proposedValueNO = getNakedObject(proposedValueOidStr);
+        proposedValueNO = getObjectAdapter(proposedValueOidStr);
 
         if (proposedValueNO == null) {
             throw new WebApplicationException(responseOfGone("could not determine proposed value"));
@@ -429,7 +429,7 @@ public class ObjectResourceImpl extends 
         final String[] argsEncoded = argsEncodedArray.toArray(new String[] {});
         final String[] args = urlDecode(argsEncoded);
 
-        final ObjectAdapter nakedObject = getNakedObject(oidStr);
+        final ObjectAdapter nakedObject = getObjectAdapter(oidStr);
         if (nakedObject == null) {
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
@@ -586,7 +586,7 @@ public class ObjectResourceImpl extends 
             proposedValueNO = parseable.parseTextEntry(nakedObject, proposedValue);
         } else {
             final String proposedValueOidStr = proposedValue;
-            proposedValueNO = getNakedObject(proposedValueOidStr);
+            proposedValueNO = getObjectAdapter(proposedValueOidStr);
         }
         return proposedValueNO;
     }

Modified: incubator/isis/trunk/viewer/restful/viewer2/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/pom.xml?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/pom.xml (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/pom.xml Wed Jun 22 23:06:31 2011
@@ -41,7 +41,7 @@
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.isis.viewer</groupId>
-			<artifactId>restful-applib</artifactId>
+			<artifactId>restful-applib2</artifactId>
 		</dependency>
 
 		<dependency>
@@ -59,24 +59,6 @@
             <artifactId>webapp</artifactId>
         </dependency>
 
-		<dependency>
-			<groupId>org.jboss.resteasy</groupId>
-			<artifactId>resteasy-jaxrs</artifactId>
-		</dependency>
-
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxrs</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-core-asl</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.jackson</groupId>
-            <artifactId>jackson-mapper-asl</artifactId>
-        </dependency>
-
         <!-- the javax:* equivalents of these are excluded in 
              dependencyManagement of resteasy-jaxrs, so  
              are required here -->           

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/Constants.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/Constants.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/Constants.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/Constants.java Wed Jun 22 23:06:31 2011
@@ -29,7 +29,7 @@ public final class Constants {
     public static final String JQUERY_SRC_JS = "jquery-1.6.1.js";
     public static final String JQUERY_MIN_JS = "jquery-1.6.1.min.js";
     public static final String URL_ENCODING_CHAR_SET =
-        org.apache.isis.viewer.restful.applib.Constants.URL_ENCODING_CHAR_SET;
+        org.apache.isis.viewer.restful.applib2.Constants.URL_ENCODING_CHAR_SET;
 
     private Constants() {
     }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepresentationContext.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepresentationContext.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepresentationContext.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java Wed Jun 22 23:06:31 2011
@@ -18,13 +18,38 @@
  */
 package org.apache.isis.viewer.restful.viewer2;
 
+import java.util.Arrays;
 
-public class RepresentationContext {
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+/**
+ * The context within which this representation is being requested.
+ * 
+ * <p>
+ * Part of the context is the overall {@link ResourceContext}, which incorporates
+ * such things as the current user, and HTTP headers.
+ * 
+ * <p>
+ * The other part of the context is an indication of the attribute that this
+ * representation will be keyed under.  This is required in order that
+ * 'rel' links for attributes correctly concatenate.  It is also used to
+ * infer whether member representations (which appear in summary form in
+ * the {@link DomainObjectRep} and in more detail in their own resources)
+ * should include a _self attribute or not.
+ */
+public class RepContext {
 
     private final ResourceContext resourceContext;
     private final String attribute;
 
-    public RepresentationContext(ResourceContext resourceContext, String attribute) {
+    public RepContext(ResourceContext resourceContext, String attribute) {
         this.resourceContext = resourceContext;
         this.attribute = attribute;
     }
@@ -34,6 +59,20 @@ public class RepresentationContext {
     }
 
     public String relFor(String relSuffix) {
-        return attribute == null? relSuffix: attribute + (relSuffix!=null?"." + relSuffix:"");
+        return Joiner.on(".").join( 
+            Iterables.filter(Arrays.asList(attribute, relSuffix), nonNulls())); 
+    }
+
+    private static <T> Predicate<T> nonNulls() {
+        return new Predicate<T>() {
+            @Override
+            public boolean apply(T input) {
+                return input != null;
+            }
+        };
+    }
+
+    public boolean hasAttribute() {
+        return attribute != null;
     }
 }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/ResourceContext.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/ResourceContext.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/ResourceContext.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/ResourceContext.java Wed Jun 22 23:06:31 2011
@@ -27,8 +27,11 @@ import javax.ws.rs.core.UriInfo;
 
 public class ResourceContext {
 
-    public RepresentationContext representationSelfLinkTo(String attribute) {
-        return new RepresentationContext(this, attribute);
+    public RepContext repContext() {
+        return repContext(null);
+    }
+    public RepContext repContext(String attribute) {
+        return new RepContext(this, attribute);
     }
 
 

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RestfulApplication.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RestfulApplication.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RestfulApplication.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RestfulApplication.java Wed Jun 22 23:06:31 2011
@@ -20,6 +20,7 @@ package org.apache.isis.viewer.restful.v
 
 import org.apache.isis.viewer.restful.viewer2.resources.bootstrap.BootstrapResourceImpl;
 import org.apache.isis.viewer.restful.viewer2.resources.home.HomePageResourceImpl;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectResourceImpl;
 import org.apache.isis.viewer.restful.viewer2.resources.services.ServicesResourceImpl;
 
 public class RestfulApplication extends AbstractJaxRsApplication {
@@ -28,6 +29,7 @@ public class RestfulApplication extends 
         addSingleton(new BootstrapResourceImpl());
         addSingleton(new HomePageResourceImpl());
         addSingleton(new ServicesResourceImpl());
+        addSingleton(new DomainObjectResourceImpl());
     }
 
 }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java Wed Jun 22 23:06:31 2011
@@ -16,14 +16,16 @@
  */
 package org.apache.isis.viewer.restful.viewer2.representations;
 
-import org.apache.isis.viewer.restful.viewer2.RepresentationContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
 import org.apache.isis.viewer.restful.viewer2.ResourceContext;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep.TypeBuilder;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class LinkRepresentation {
+public class LinkRep {
 
     private String rel;
     private String url;
@@ -70,13 +72,16 @@ public class LinkRepresentation {
         this.value = value;
     }
 
-    public static Builder newBuilder(RepresentationContext representationContext, String relSuffix, String url) {
-        return new Builder(representationContext, relSuffix, url);
+    public static LinkRep.TypeBuilder newTypeBuilder(RepContext repContext, String relSuffix, ObjectSpecification objectSpec) {
+        return new LinkRep.TypeBuilder(repContext, relSuffix, objectSpec);
+    }
+    public static Builder newBuilder(RepContext repContext, String relSuffix, String url) {
+        return new Builder(repContext, relSuffix, url);
     }
     
     public static class Builder {
         
-        private final RepresentationContext representationContext;
+        private final RepContext representationContext;
         private final String relSuffix;
         private final String url;
         
@@ -84,25 +89,25 @@ public class LinkRepresentation {
         private String title;
         private String body;
         
-        public Builder(RepresentationContext representationContext, String relSuffix, String url) {
+        public Builder(RepContext representationContext, String relSuffix, String url) {
             this.representationContext = representationContext;
             this.relSuffix = relSuffix;
             this.url = url;
         }
-        public LinkRepresentation.Builder withMethod(HttpMethod method) {
+        public LinkRep.Builder withMethod(HttpMethod method) {
             this.method = method;
             return this;
         }
-        public LinkRepresentation.Builder withTitle(String title) {
+        public LinkRep.Builder withTitle(String title) {
             this.title = title;
             return this;
         }
-        public LinkRepresentation.Builder withBody(String body) {
+        public LinkRep.Builder withBody(String body) {
             this.body = body;
             return this;
         }
-        public LinkRepresentation build() {
-            LinkRepresentation linkRepresentation = new LinkRepresentation();
+        public LinkRep build() {
+            LinkRep linkRepresentation = new LinkRep();
             linkRepresentation.setMethod(method);
             linkRepresentation.setTitle(title);
             linkRepresentation.setRel(representationContext.relFor(relSuffix));
@@ -111,4 +116,27 @@ public class LinkRepresentation {
             return linkRepresentation;
         }
     }
+
+    public static class TypeBuilder {
+        
+        private final RepContext representationContext;
+        private final String relSuffix;
+        private final ObjectSpecification objectSpec;
+        
+        public TypeBuilder(RepContext representationContext, String relSuffix, ObjectSpecification objectSpec) {
+            this.representationContext = representationContext;
+            this.relSuffix = relSuffix;
+            this.objectSpec = objectSpec;
+        }
+        
+        public LinkRep build() {
+            Builder typeBuilder = newBuilder(representationContext, relSuffix, urlFor(objectSpec));
+            LinkRep linkRep = typeBuilder.build();
+            return linkRep;
+        }
+    
+        private static String urlFor(ObjectSpecification objectSpec) {
+            return "types/application/vnd+" + objectSpec.getFullIdentifier();
+        }
+    }
 }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java Wed Jun 22 23:06:31 2011
@@ -16,52 +16,10 @@
  */
 package org.apache.isis.viewer.restful.viewer2.representations;
 
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.restful.viewer2.RepresentationContext;
-import org.apache.isis.viewer.restful.viewer2.ResourceContext;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class TypeRepresentation {
-    
-    private LinkRepresentation link;
-
-    public LinkRepresentation getLink() {
-        return link;
-    }
-
-    public void setLink(LinkRepresentation link) {
-        this.link = link;
-    }
-
-    public static Builder newBuilder(RepresentationContext representationContext, String relSuffix, ObjectSpecification objectSpec) {
-        return new Builder(representationContext, relSuffix, objectSpec);
-    }
-    
-    public static class Builder {
-        
-        private final RepresentationContext representationContext;
-        private final String relSuffix;
-        private final ObjectSpecification objectSpec;
-        
-        public Builder(RepresentationContext representationContext, String relSuffix, ObjectSpecification objectSpec) {
-            this.representationContext = representationContext;
-            this.relSuffix = relSuffix;
-            this.objectSpec = objectSpec;
-        }
-        
-        public TypeRepresentation build() {
-            TypeRepresentation typeRepresentation = new TypeRepresentation();
-            LinkRepresentation.Builder typeBuilder = LinkRepresentation.newBuilder(representationContext, relSuffix, urlFor(objectSpec));
-            LinkRepresentation linkRepresentation = typeBuilder.build();
-            typeRepresentation.setLink(linkRepresentation);
-            return typeRepresentation;
-        }
-
-        private static String urlFor(ObjectSpecification objectSpec) {
-            return "types/application/vnd+" + objectSpec.getFullIdentifier();
-        }
-    }
+public class TypeRep {
 }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java Wed Jun 22 23:06:31 2011
@@ -43,7 +43,7 @@ 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.restful.viewer2.ResourceContext;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRepresentation;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
 import org.apache.isis.viewer.restful.viewer2.util.OidUtils;
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
@@ -106,7 +106,7 @@ public abstract class ResourceAbstract {
         }
     }
 
-    protected String asJsonList(List<DomainObjectRepresentation> services) {
+    protected String asJsonList(List<?> services) {
         return asJson(services);
     }
 
@@ -118,7 +118,7 @@ public abstract class ResourceAbstract {
         return getSpecificationLoader().loadSpecification(specFullName);
     }
 
-    protected ObjectAdapter getNakedObject(final String oidEncodedStr) {
+    protected ObjectAdapter getObjectAdapter(final String oidEncodedStr) {
         return OidUtils.getNakedObject(oidEncodedStr, getOidStringifier());
     }
 

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java Wed Jun 22 23:06:31 2011
@@ -26,8 +26,8 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.isis.viewer.restful.applib.resources.BootstrapResource;
-import org.apache.isis.viewer.restful.applib.resources.HomePageResource;
+import org.apache.isis.viewer.restful.applib2.resources.BootstrapResource;
+import org.apache.isis.viewer.restful.applib2.resources.HomePageResource;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
 
 import com.google.common.io.ByteStreams;

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java Wed Jun 22 23:06:31 2011
@@ -16,34 +16,34 @@
  */
 package org.apache.isis.viewer.restful.viewer2.resources.home;
 
-import org.apache.isis.viewer.restful.viewer2.representations.LinkRepresentation;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class HomePageRepresentation {
+public class HomePageRep {
     
     @JsonSerialize(include=Inclusion.NON_NULL)
     public static class SelfRepresentation {
-        private LinkRepresentation link;
+        private LinkRep link;
 
-        public SelfRepresentation(LinkRepresentation link) {
+        public SelfRepresentation(LinkRep link) {
             this.link = link;
         }
 
-        public LinkRepresentation getLink() {
+        public LinkRep getLink() {
             return link;
         }
 
-        public void setLink(LinkRepresentation link) {
+        public void setLink(LinkRep link) {
             this.link = link;
         }
     }
     
     private SelfRepresentation _self;
     
-    private LinkRepresentation services;
-    private LinkRepresentation user;
+    private LinkRep services;
+    private LinkRep user;
 
     public SelfRepresentation get_self() {
         return _self;
@@ -53,19 +53,19 @@ public class HomePageRepresentation {
         this._self = self;
     }
     
-    public LinkRepresentation getServices() {
+    public LinkRep getServices() {
         return services;
     }
 
-    public void setServices(LinkRepresentation services) {
+    public void setServices(LinkRep services) {
         this.services = services;
     }
 
-    public LinkRepresentation getUser() {
+    public LinkRep getUser() {
         return user;
     }
 
-    public void setUser(LinkRepresentation user) {
+    public void setUser(LinkRep user) {
         this.user = user;
     }
     

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java Wed Jun 22 23:06:31 2011
@@ -22,8 +22,8 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.isis.viewer.restful.applib.resources.HomePageResource;
-import org.apache.isis.viewer.restful.viewer2.representations.LinkRepresentation;
+import org.apache.isis.viewer.restful.applib2.resources.HomePageResource;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
 
 /**
@@ -39,15 +39,15 @@ public class HomePageResourceImpl extend
     public String resources() {
         init();
         
-        HomePageRepresentation homePageRepresentation = new HomePageRepresentation();
+        HomePageRep homePageRepresentation = new HomePageRep();
         homePageRepresentation.setUser(linkTo("user"));
 
         homePageRepresentation.setServices(linkTo("services"));
         return asJson(homePageRepresentation);
     }
 
-    protected LinkRepresentation linkTo(String url) {
-        return LinkRepresentation.newBuilder(getResourceContext().representationSelfLinkTo(url), null, url).build();
+    protected LinkRep linkTo(String url) {
+        return LinkRep.newBuilder(getResourceContext().repContext(url), null, url).build();
     }
 
 

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java Wed Jun 22 23:06:31 2011
@@ -20,6 +20,6 @@ import org.codehaus.jackson.map.annotate
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class ActionRepresentation extends MemberRepresentation {
+public class ActionRep extends MemberRep {
 
 }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java Wed Jun 22 23:06:31 2011
@@ -16,10 +16,14 @@
  */
 package org.apache.isis.viewer.restful.viewer2.resources.objects;
 
+import java.util.Collection;
+
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class CollectionRepresentation extends MemberRepresentation {
+public class CollectionRep extends MemberRep {
+
+    private Collection<?> value;
 
 }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java Wed Jun 22 23:06:31 2011
@@ -16,60 +16,70 @@
  */
 package org.apache.isis.viewer.restful.viewer2.resources.objects;
 
-import java.util.List;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 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.restful.viewer2.RepresentationContext;
-import org.apache.isis.viewer.restful.viewer2.ResourceContext;
-import org.apache.isis.viewer.restful.viewer2.representations.LinkRepresentation;
-import org.apache.isis.viewer.restful.viewer2.representations.TypeRepresentation;
-
-import com.google.common.base.Function;
-
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class DomainObjectRepresentation {
+public class DomainObjectRep extends LinkedHashMap<String, Object>{
+
+    private static final long serialVersionUID = 1L;
 
-    public static Function<ObjectAdapter, DomainObjectRepresentation> fromAdapter(final RepresentationContext representationContext) {
-        return new Function<ObjectAdapter, DomainObjectRepresentation>() {
+    public static Function<ObjectAdapter, DomainObjectRep> fromAdapter(final RepContext representationContext) {
+        return new Function<ObjectAdapter, DomainObjectRep>() {
             @Override
-            public DomainObjectRepresentation apply(ObjectAdapter input) {
+            public DomainObjectRep apply(ObjectAdapter input) {
                 return newBuilder(representationContext, input).build();
             }
         };
     }
 
+    public static Function<DomainObjectRep, DomainObjectRep.SelfRep> selfOf() {
+        return new Function<DomainObjectRep, SelfRep>() {
+            @Override
+            public SelfRep apply(DomainObjectRep input) {
+                return (SelfRep) input.get("_self");
+            }
+        };
+    }
+
 
     @JsonSerialize(include=Inclusion.NON_NULL)
-    public static class SelfRepresentation {
-        private LinkRepresentation link;
-        private TypeRepresentation type;
+    public static class SelfRep {
+        private LinkRep link;
+        private LinkRep type;
         private String title;
-        private LinkRepresentation icon;
+        private LinkRep icon;
         
-        public SelfRepresentation(LinkRepresentation link) {
+        public SelfRep(LinkRep link) {
             this.link = link;
         }
 
-        public LinkRepresentation getLink() {
+        public LinkRep getLink() {
             return link;
         }
 
-        public void setLink(LinkRepresentation link) {
+        public void setLink(LinkRep link) {
             this.link = link;
         }
 
-        public TypeRepresentation getType() {
+        public LinkRep getType() {
             return type;
         }
 
-        public void setType(TypeRepresentation type) {
+        public void setType(LinkRep type) {
             this.type = type;
         }
 
@@ -81,71 +91,50 @@ public class DomainObjectRepresentation 
             this.title = title;
         }
 
-        public LinkRepresentation getIcon() {
+        public LinkRep getIcon() {
             return icon;
         }
 
-        public void setIcon(LinkRepresentation icon) {
+        public void setIcon(LinkRep icon) {
             this.icon = icon;
         }
     }
     
-    private SelfRepresentation _self;
-    private List<PropertyRepresentation> properties;
-    private List<CollectionRepresentation> collections;
-    private List<ActionRepresentation> actions;
-    
-    public SelfRepresentation get_self() {
-        return _self;
-    }
-    public void set_self(SelfRepresentation self) {
-        this._self = self;
-    }
-    public List<PropertyRepresentation> getProperties() {
-        return properties;
-    }
-    public void setProperties(List<PropertyRepresentation> properties) {
-        this.properties = properties;
-    }
-    public List<CollectionRepresentation> getCollections() {
-        return collections;
-    }
-    public void setCollections(List<CollectionRepresentation> collections) {
-        this.collections = collections;
-    }
-    public List<ActionRepresentation> getActions() {
-        return actions;
-    }
-    public void setActions(List<ActionRepresentation> actions) {
-        this.actions = actions;
-    }
     
 
-    public static Builder newBuilder(RepresentationContext representationContext, ObjectAdapter objectAdapter) {
+    public static Builder newBuilder(RepContext representationContext, ObjectAdapter objectAdapter) {
         return new Builder(representationContext, objectAdapter);
     }
 
     public static class Builder {
 
-        private final RepresentationContext representationContext;
+        private final RepContext repContext;
         private final ObjectAdapter objectAdapter;
+        private final Map<String, MemberRep> members = Maps.newLinkedHashMap();
         
-        public Builder(RepresentationContext representationContext, ObjectAdapter objectAdapter) {
-            this.representationContext = representationContext;
+        public Builder(RepContext repContext, ObjectAdapter objectAdapter) {
+            this.repContext = repContext;
             this.objectAdapter = objectAdapter;
         }
         
-        public DomainObjectRepresentation build() {
-            DomainObjectRepresentation domainObject = new DomainObjectRepresentation();
-            LinkRepresentation selfLink = LinkRepresentation.newBuilder(representationContext, "link", urlFor(objectAdapter)).build();
-            TypeRepresentation selfType = TypeRepresentation.newBuilder(representationContext, "type", objectAdapter.getSpecification()).build();
+        public DomainObjectRep build() {
+            DomainObjectRep domainObject = new DomainObjectRep();
+            LinkRep selfLink = LinkRep.newBuilder(repContext, "link", urlFor(objectAdapter)).build();
+            LinkRep selfType = LinkRep.newTypeBuilder(repContext, "type", objectAdapter.getSpecification()).build();
             String title = objectAdapter.titleString();
-            LinkRepresentation iconLink = LinkRepresentation.newBuilder(representationContext, "icon", iconFor(objectAdapter)).build();
-            SelfRepresentation self = new SelfRepresentation(selfLink);
+            LinkRep iconLink = LinkRep.newBuilder(repContext, "icon", iconFor(objectAdapter)).build();
+            SelfRep self = new SelfRep(selfLink);
             self.setTitle(title);
             self.setIcon(iconLink);
             self.setType(selfType);
-            domainObject.set_self(self);
+            domainObject.put("_self", self);
+            if(!members.isEmpty()) {
+                for(Map.Entry<String, MemberRep> entry: members.entrySet()) {
+                    String memberId = entry.getKey();
+                    MemberRep memberRep = entry.getValue();
+                    domainObject.put(memberId, memberRep);
+                }
+            }
             return domainObject;
         }
 
@@ -155,10 +144,8 @@ public class DomainObjectRepresentation 
         }
 
         private String urlFor(ObjectAdapter objectAdapter) {
-            String className = objectAdapter.getSpecification().getFullIdentifier();
             OidStringifier oidStringifier = getOidStringifier();
-            String oidStr = oidStringifier.enString(objectAdapter.getOid());
-            return className + "|" + oidStr;
+            return DomainObjectRep.urlFor(objectAdapter, oidStringifier);
         }
 
         protected OidStringifier getOidStringifier() {
@@ -172,5 +159,16 @@ public class DomainObjectRepresentation 
         protected PersistenceSession getPersistenceSession() {
             return IsisContext.getPersistenceSession();
         }
+
+        public void withProperty(String id, PropertyRep propertyRep) {
+            members.put(id, propertyRep);
+        }
+
     }
+    
+    public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
+        String oidStr = oidStringifier.enString(objectAdapter.getOid());
+        return "objects/" + oidStr;
+    }
+
 }

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java?rev=1138675&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java Wed Jun 22 23:06:31 2011
@@ -0,0 +1,126 @@
+/**
+ *  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.restful.viewer2.resources.objects;
+
+import java.io.InputStream;
+import java.util.List;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.restful.applib2.resources.ObjectResource;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep.Builder;
+import org.apache.isis.viewer.restful.viewer2.util.UrlDecoderUtils;
+
+@Path("/objects")
+public class DomainObjectResourceImpl extends ResourceAbstract implements ObjectResource {
+
+    @GET
+    @Path("/{oid}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String object(@PathParam("oid") final String oidEncodedStr) {
+        init();
+        final String oidStr = UrlDecoderUtils.urlDecode(oidEncodedStr);
+
+        final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        if (objectAdapter == null) {
+            throw new WebApplicationException(responseOfGone("could not determine object"));
+        }
+
+        Builder builder = DomainObjectRep.newBuilder(getResourceContext().repContext(), objectAdapter);
+        
+        List<ObjectAssociation> properties = objectAdapter.getSpecification().getAssociations(ObjectAssociationFilters.PROPERTIES);
+        for (ObjectAssociation otoa : properties) {
+            Consent visibility = otoa.isVisible(getSession(), objectAdapter);
+            if(visibility.isAllowed()) {
+                String id = otoa.getId();
+                PropertyRep propertyRep = PropertyRep.newBuilder(getResourceContext().repContext(id), objectAdapter, (OneToOneAssociation)otoa).build();
+                builder.withProperty(id, propertyRep);
+            }
+        }
+        
+        DomainObjectRep representation = builder.build();
+        return asJson(representation);
+    }
+
+    @PUT
+    @Path("/{oid}/property/{propertyId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String modifyProperty(@PathParam("oid") final String oidStr,
+        @PathParam("propertyId") final String propertyId, @QueryParam("proposedValue") final String proposedValue) {
+        return null;
+    }
+
+    @DELETE
+    @Path("/{oid}/property/{propertyId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String clearProperty(@PathParam("oid") final String oidStr, @PathParam("propertyId") final String propertyId){
+        return null;
+    }
+
+    @GET
+    @Path("/{oid}/collection/{collectionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String accessCollection(@PathParam("oid") final String oidStr,
+        @PathParam("collectionId") final String collectionId){
+        return null;
+    }
+
+    @PUT
+    @Path("/{oid}/collection/{collectionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String addToCollection(@PathParam("oid") final String oidStr,
+        @PathParam("collectionId") final String collectionId,
+        @QueryParam("proposedValue") final String proposedValueOidStr){
+        return null;
+    }
+
+    @DELETE
+    @Path("/{oid}/collection/{collectionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String removeFromCollection(@PathParam("oid") final String oidStr,
+        @PathParam("collectionId") final String collectionId,
+        @QueryParam("proposedValue") final String proposedValueOidStr){
+        return null;
+    }
+
+    @POST
+    @Path("/{oid}/action/{actionId}")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String invokeAction(@PathParam("oid") final String oidStr, @PathParam("actionId") final String actionId,
+        final InputStream body){
+        return null;
+    }
+
+}

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java Wed Jun 22 23:06:31 2011
@@ -16,15 +16,105 @@
  */
 package org.apache.isis.viewer.restful.viewer2.resources.objects;
 
+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.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+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.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public abstract class MemberRepresentation {
+public abstract class MemberRep {
     
     @JsonSerialize(include=Inclusion.NON_NULL)
-    public static class SelfRepresentation {
-        
+    public static class SelfRep {
+        private LinkRep link;
+        private String memberType;
+        private LinkRep object;
+        public LinkRep getLink() {
+            return link;
+        }
+        public void setLink(LinkRep link) {
+            this.link = link;
+        }
+        public String getMemberType() {
+            return memberType;
+        }
+        public void setMemberType(String memberType) {
+            this.memberType = memberType;
+        }
+        public LinkRep getObject() {
+            return object;
+        }
+        public void setObject(LinkRep object) {
+            this.object = object;
+        }
+        public static Builder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+            return new Builder(repContext, objectAdapter, otoa);
+        }
+        public static class Builder {
+
+            private final RepContext repContext;
+            private final ObjectAdapter objectAdapter;
+            private final OneToOneAssociation otoa;
+
+            public Builder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+                this.repContext = repContext;
+                this.objectAdapter = objectAdapter;
+                this.otoa = otoa;
+            }
+            
+            public SelfRep build() {
+                SelfRep selfRep = new SelfRep();
+                selfRep.setLink(LinkRep.newBuilder(repContext, "link", DomainObjectRep.urlFor(objectAdapter, getOidStringifier())).build());
+                return selfRep;
+            }
+
+            private OidStringifier getOidStringifier() {
+                return getOidGenerator().getOidStringifier();
+            }
+
+            protected OidGenerator getOidGenerator() {
+                return getPersistenceSession().getOidGenerator();
+            }
+
+            protected PersistenceSession getPersistenceSession() {
+                return IsisContext.getPersistenceSession();
+            }
+
+            
+        }
+    }
+
+    private SelfRep _self;
+    private LinkRep details;
+    private String disabledReason;
+    
+    public SelfRep get_self() {
+        return _self;
     }
 
+    public void set_self(SelfRep _self) {
+        this._self = _self;
+    }
+
+    public LinkRep getDetails() {
+        return details;
+    }
+
+    public void setDetails(LinkRep details) {
+        this.details = details;
+    }
+
+    public String getDisabledReason() {
+        return disabledReason;
+    }
+
+    public void setDisabledReason(String disabledReason) {
+        this.disabledReason = disabledReason;
+    }
 }

Copied: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java (from r1138227, incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepresentation.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java?p2=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java&p1=incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepresentation.java&r1=1138227&r2=1138675&rev=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepresentation.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java Wed Jun 22 23:06:31 2011
@@ -16,10 +16,150 @@
  */
 package org.apache.isis.viewer.restful.viewer2.resources.objects;
 
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+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.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.HttpMethod;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
 
 @JsonSerialize(include=Inclusion.NON_NULL)
-public class PropertyRepresentation extends MemberRepresentation {
+public class PropertyRep extends MemberRep {
+
+    private SelfRep _self;
+    private LinkRep type;
+    private Object value;
+
+    
+    public SelfRep get_self() {
+        return _self;
+    }
+
+    public void set_self(SelfRep _self) {
+        this._self = _self;
+    }
+
+    public LinkRep getType() {
+        return type;
+    }
+
+    public void setType(LinkRep type) {
+        this.type = type;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public static Builder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        return new Builder(repContext, objectAdapter, otoa);
+        
+    }
+    public static class Builder {
+
+        private final RepContext repContext;
+        private final ObjectAdapter objectAdapter;
+        private final OneToOneAssociation otoa;
+
+        public Builder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+            this.repContext = repContext;
+            this.objectAdapter = objectAdapter;
+            this.otoa = otoa;
+        }
+
+        public PropertyRep build() {
+            PropertyRep propertyRep = new PropertyRep();
+            if(addSelf()) {
+                LinkRep selfLink = LinkRep.newBuilder(repContext, "link", urlFor(objectAdapter, otoa)).build();
+                selfLink.setMethod(HttpMethod.GET);
+                SelfRep selfRep = SelfRep.newBuilder(repContext, objectAdapter, otoa).build();
+                propertyRep.set_self(selfRep);
+            }
+            LinkRep type = LinkRep.newTypeBuilder(repContext, "type", otoa.getSpecification()).build();
+            propertyRep.setType(type);
+            Consent usability = otoa.isUsable(getSession(), objectAdapter);
+            propertyRep.setDisabledReason(usability.getReason());
+            LinkRep detailsLink = LinkRep.newBuilder(repContext, "details", urlFor(objectAdapter, otoa)).build(); // TODO: same as self.link ???
+            propertyRep.setDetails(detailsLink);
+            propertyRep.setValue(obtainValue());
+            return propertyRep;
+        }
+
+        /**
+         * Only add the _self attribute if this representation is being
+         * generated in a context that is not 'under' an attribute of an
+         * owning {@link DomainObjectRep representation}.
+         */
+        private boolean addSelf() {
+            return !repContext.hasAttribute();
+        }
+
+        private Object obtainValue() {
+            ObjectAdapter valueAdapter = otoa.get(objectAdapter);
+            if(valueAdapter == null) {
+                return null;
+            } 
+            ObjectSpecification otoaSpec = otoa.getSpecification();
+            ValueFacet valueFacet = otoaSpec.getFacet(ValueFacet.class);
+            if(valueFacet != null) {
+                EncodableFacet encodableFacet = otoaSpec.getFacet(EncodableFacet.class);
+                return encodableFacet.toEncodedString(valueAdapter);
+            } 
+            TitleFacet titleFacet = otoaSpec.getFacet(TitleFacet.class);
+            if (titleFacet == null) {
+                // fallback
+                titleFacet = otoaSpec.getFacet(TitleFacet.class);
+            }
+            String title = titleFacet.title(valueAdapter, getLocalization());
+            return LinkRep.newBuilder(repContext, "value", urlFor(valueAdapter)).withTitle(title).build();
+        }
+
+        private String urlFor(ObjectAdapter adapter) {
+            return DomainObjectRep.urlFor(adapter, getOidStringifier());
+        }
+
+        private String urlFor(ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+            OidStringifier oidStringifier = getOidStringifier();
+            String oidStr = oidStringifier.enString(objectAdapter.getOid());
+            return "objects/" + oidStr + "/property/" + otoa.getId();
+        }
+
+        protected OidStringifier getOidStringifier() {
+            return getOidGenerator().getOidStringifier();
+        }
+
+        protected OidGenerator getOidGenerator() {
+            return getPersistenceSession().getOidGenerator();
+        }
+
+        protected PersistenceSession getPersistenceSession() {
+            return IsisContext.getPersistenceSession();
+        }
+
+        protected AuthenticationSession getSession() {
+            return IsisContext.getAuthenticationSession();
+        }
+        
+        protected Localization getLocalization() {
+            return IsisContext.getLocalization();
+        }
+
+    }
 
 }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java Wed Jun 22 23:06:31 2011
@@ -21,13 +21,17 @@ package org.apache.isis.viewer.restful.v
 import java.util.List;
 
 import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.viewer.restful.applib.resources.ServicesResource;
-import org.apache.isis.viewer.restful.viewer2.RepresentationContext;
+import org.apache.isis.viewer.restful.applib2.resources.ServicesResource;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRepresentation;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep.SelfRep;
 
+import com.google.common.base.Function;
+import com.google.common.base.Functions;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 
@@ -39,16 +43,23 @@ import com.google.common.collect.Lists;
 public class ServicesResourceImpl extends ResourceAbstract implements ServicesResource {
 
     @Override
+    @Produces({ "application/json" })
     public String services() {
         init();
 
-        return asJsonList(serviceRepresentations());
+        return asJsonList(serviceSelfRepresentations());
     }
 
-    protected List<DomainObjectRepresentation> serviceRepresentations() {
+    protected List<DomainObjectRep.SelfRep> serviceSelfRepresentations() {
         final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
-        RepresentationContext representationContext = getResourceContext().representationSelfLinkTo("_self");
-        return Lists.newArrayList(Collections2.transform(serviceAdapters, DomainObjectRepresentation.fromAdapter(representationContext)));
+        RepContext representationContext = getResourceContext().repContext();
+        
+        Function<ObjectAdapter, SelfRep> objectSelfRepresentation = 
+            Functions.compose(
+                DomainObjectRep.selfOf(), 
+                DomainObjectRep.fromAdapter(representationContext));
+        return Lists.newArrayList(
+            Collections2.transform(serviceAdapters, objectSelfRepresentation));
     }
 
 }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/index.html
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/index.html?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/index.html (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/index.html Wed Jun 22 23:06:31 2011
@@ -5,9 +5,34 @@
         <script type="text/javascript" src="/isis-json-support.js"></script>
     </head>
     <body>
-        <div id="app"></div>
+        <div id="services">
+            <p>Services</p>
+            <ul></ul>
+        </div>
+        <div id="breadcrumbs">
+            <ul></ul>
+        </div>
+        <div id="current">
+	        <div id="object">
+                <div id="summary">
+                    <ul></ul>
+                </div>
+		        <div id="properties">
+                    <ul></ul>
+		        </div>
+		        <div id="collections">
+                    <ul></ul>
+		        </div>
+	        </div>
+	        <div id="collection">
+                <ul></ul>
+	        </div>
+        </div>
+        <div id="actions">
+            <ul></ul>
+        </div>
         <script>
-            bootstrapApp();
+            bootstrap_app();
         </script>
     </body>
 </html>
\ No newline at end of file

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/isis-json-support.js
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/isis-json-support.js?rev=1138675&r1=1138674&r2=1138675&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/isis-json-support.js (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/resources/isis-json-support.js Wed Jun 22 23:06:31 2011
@@ -1,28 +1,28 @@
+function add_links(ul, linkable) {
+    var el = $("<a>", {
+         href: linkable.link.url,
+         text: linkable.title
+    });
+	ul.append(
+            $("<li/>").append(el)
+        );
+    $.data(el, "isis", linkable);
+}
 
-function bootstrapApp() {
+function bootstrap_app() {
     $.getJSON('/index', 
         undefined,
-		function(data) {
-        // load services
-        $('#app').html("<div id='services'><p>Services</p><ul/></div>");
-        $.getJSON(data.services.url,
-            undefined,
-            function(data) {
-                for(var i=0; i<data.length; i++) {
-                    var service = data[i]._self;
-                    var el = $("<a>", {
-                         href: service.link.url,
-                         text: service.title
-                    });
-                    $("#services ul").append(
-                            $("<li/>").append(el)
-                        );
-                    $.data(el, "isis", service);
-                    //var x = $.data(el, "isis");
-                    //var jsonString= JSON.stringify(x, null, "  ");
-                    //alert(jsonString);
-                }
-            });
+		function load_services (data) {
+	        $.getJSON(data.services.url,
+	            undefined,
+	            function(data) {
+	                for(var i=0; i<data.length; i++) {
+	                    add_links($("#services > ul"), data[i]);
+	                    //var x = $.data(el, "isis");
+	                    //var jsonString= JSON.stringify(x, null, "  ");
+	                    //alert(jsonString);
+	                }
+	            });
     });
 }   
 

Added: incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java?rev=1138675&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java Wed Jun 22 23:06:31 2011
@@ -0,0 +1,57 @@
+/**
+ *  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.restful.viewer2;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+
+public class RepresentationContextTest_relFor {
+
+    private RepContext context;
+    
+    @Test
+    public void bothNonNull() throws Exception {
+        context = new RepContext(null, "attribute");
+        String relFor = context.relFor("relSuffix");
+        assertThat(relFor, is("attribute.relSuffix"));
+    }
+
+    @Test
+    public void attributeNull() throws Exception {
+        context = new RepContext(null, null);
+        String relFor = context.relFor("relSuffix");
+        assertThat(relFor, is("relSuffix"));
+    }
+
+    @Test
+    public void relSuffixNull() throws Exception {
+        context = new RepContext(null, "attribute");
+        String relFor = context.relFor(null);
+        assertThat(relFor, is("attribute"));
+    }
+
+    @Test
+    public void bothNull() throws Exception {
+        context = new RepContext(null, null);
+        String relFor = context.relFor(null);
+        assertThat(relFor, is(""));
+    }
+
+}