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/07/09 17:41:30 UTC

svn commit: r1144686 - in /incubator/isis/trunk/framework: core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/ viewer/json/applib/src/main/java/org/apache/isis/v...

Author: danhaywood
Date: Sat Jul  9 15:41:29 2011
New Revision: 1144686

URL: http://svn.apache.org/viewvc?rev=1144686&view=rev
Log:
json viewer now renders contributed actions; also action parameters show defaults and choices; property now shows choices; simplified some of the 'rel' values in representations

Modified:
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
    incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/AbstractRestfulClient.java
    incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/resources/DomainObjectResource.java
    incubator/isis/trunk/framework/viewer/json/viewer/pom.xml
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/TypeBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/BodyArgs.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberRepType.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberType.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MutatorSpec.java
    incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionContainer.java Sat Jul  9 15:41:29 2011
@@ -78,7 +78,6 @@ public interface ObjectActionContainer {
      * Returns a list of all object actions, including or excluding contributed actions as required.
      */
     List<ObjectAction> getObjectActions(Contributed contributed);
-
     
     List<ObjectAction> getServiceActionsReturning(ActionType type);
 

Modified: incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/AbstractRestfulClient.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/AbstractRestfulClient.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/AbstractRestfulClient.java (original)
+++ incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/AbstractRestfulClient.java Sat Jul  9 15:41:29 2011
@@ -18,12 +18,9 @@
  */
 package org.apache.isis.viewer.json.applib;
 
-import org.apache.log4j.Logger;
 
 public abstract class AbstractRestfulClient {
 
-    private static Logger LOG = Logger.getLogger(AbstractRestfulClient.class);
-
     private final String hostUri;
 
     public String getHostUri() {

Modified: incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/resources/DomainObjectResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/resources/DomainObjectResource.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/resources/DomainObjectResource.java (original)
+++ incubator/isis/trunk/framework/viewer/json/applib/src/main/java/org/apache/isis/viewer/json/applib/resources/DomainObjectResource.java Sat Jul  9 15:41:29 2011
@@ -24,7 +24,6 @@ import java.util.List;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
-import javax.ws.rs.MatrixParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;

Modified: incubator/isis/trunk/framework/viewer/json/viewer/pom.xml
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/pom.xml?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/pom.xml (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/pom.xml Sat Jul  9 15:41:29 2011
@@ -65,18 +65,15 @@
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-servlet_2.5_spec</artifactId>
-            <version>1.2</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-annotation_1.0_spec</artifactId>
-            <version>1.1.1</version>
         </dependency>
         <dependency>
             <groupId>org.apache.geronimo.specs</groupId>
             <artifactId>geronimo-activation_1.1_spec</artifactId>
-            <version>1.1</version>
         </dependency>
 
 	</dependencies>

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -16,26 +16,33 @@
  */
 package org.apache.isis.viewer.json.viewer.representations;
 
-import java.util.List;
-
+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.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.resources.objects.DomainObjectRepBuilder;
 
 public class LinkRepBuilder extends RepresentationBuilder {
 
     public static LinkRepBuilder newBuilder(RepContext repContext, String relSuffix, String url) {
         return new LinkRepBuilder(repContext, relSuffix, url);
     }
-    public static TypeBuilder newTypeBuilder(RepContext repContext, String relSuffix, ObjectSpecification objectSpec) {
-        return new TypeBuilder(repContext, relSuffix, objectSpec);
+    public static TypeBuilder newTypeBuilder(RepContext repContext, ObjectSpecification objectSpec) {
+        return new TypeBuilder(repContext, objectSpec);
     }
 
+	public static LinkRepBuilder newObjectBuilder(RepContext repContext,
+			ObjectAdapter elementAdapter, OidStringifier oidStringifier) {
+    	String url = DomainObjectRepBuilder.urlFor(elementAdapter, oidStringifier);
+        return LinkRepBuilder.newBuilder(repContext, "object", url);
+	}
+
     private final String relSuffix;
     private final String url;
     
     private HttpMethod method = HttpMethod.GET;
     private String title;
-    private List<String> body;
+    private Object body;
     
     public LinkRepBuilder(RepContext repContext, String relSuffix, String url) {
         super(repContext);
@@ -50,12 +57,12 @@ public class LinkRepBuilder extends Repr
         this.title = title;
         return this;
     }
-    public LinkRepBuilder withBody(List<String> body) {
+    public LinkRepBuilder withBody(Object body) {
         this.body = body;
         return this;
     }
     public Representation build() {
-        representation.put("rel", repContext.relFor(relSuffix));
+        representation.put("rel", relSuffix);
         representation.put("url", repContext.urlFor(url));
         representation.put("method", method);
         representation.put("title", title);

Modified: incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/TypeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/TypeBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/TypeBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/TypeBuilder.java Sat Jul  9 15:41:29 2011
@@ -33,14 +33,15 @@ public class TypeBuilder extends LinkRep
             java.lang.Short.class.getName(), "short",
             java.lang.Integer.class.getName(), "int",
             java.lang.Long.class.getName(), "long",
+            java.lang.Boolean.class.getName(), "boolean",
             java.lang.Float.class.getName(), "float",
             java.lang.Double.class.getName(), "double",
             java.math.BigInteger.class.getName(), "bigint",
             java.math.BigDecimal.class.getName(), "bigdec"
             );
 
-    public TypeBuilder(RepContext repContext, String relSuffix, ObjectSpecification objectSpec) {
-        super(repContext, relSuffix, urlFor(objectSpec));
+    public TypeBuilder(RepContext repContext, ObjectSpecification objectSpec) {
+        super(repContext, "type", urlFor(objectSpec));
     }
     
     private static String urlFor(ObjectSpecification objectSpec) {

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/AbstractMemberRepBuilder.java Sat Jul  9 15:41:29 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;
@@ -30,8 +29,6 @@ import org.apache.isis.viewer.json.viewe
 import org.apache.isis.viewer.json.viewer.representations.Representation;
 import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
 
-import com.google.common.collect.Lists;
-
 public abstract class AbstractMemberRepBuilder<T extends ObjectMember> extends RepresentationBuilder {
 
     protected final ObjectAdapter objectAdapter;
@@ -48,23 +45,23 @@ public abstract class AbstractMemberRepB
     }
 
     protected void putSelfIfRequired() {
-        if(memberRepType.hasSelf()) {
+        if(memberRepType.isStandalone()) {
             Representation selfRep = MemberSelfRepBuilder.newBuilder(repContext, objectAdapter, memberType, objectMember).build();
             representation.put("self", selfRep);
         }
     }
 
     protected void putMemberTypeRep() {
-        representation.put("memberType", memberType);
+        representation.put("memberType", memberType.name().toLowerCase());
     }
 
     protected void putTypeRep() {
-        Representation typeRep = LinkRepBuilder.newTypeBuilder(repContext, "type", memberType.specFor(objectMember)).build();
+        Representation typeRep = LinkRepBuilder.newTypeBuilder(repContext, memberType.specFor(objectMember)).build();
         representation.put("type", typeRep);
     }
 
     protected void putMutatorsIfRequired() {
-        if(!memberRepType.hasMutators() || usability().isVetoed()) {
+        if(!memberRepType.isStandalone() || usability().isVetoed()) {
             return;
         }
         Map<String, MutatorSpec> mutators = memberType.getMutators();
@@ -72,7 +69,7 @@ public abstract class AbstractMemberRepB
             MutatorSpec mutatorSpec = mutators.get(mutator);
             if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
                 String urlForMember = urlForMember(mutatorSpec.suffix);
-                List<String> body = mutatorArgValues(mutatorSpec);
+                Object body = mutatorArgs(mutatorSpec);
                 Representation detailsLink = 
                     LinkRepBuilder.newBuilder(repContext, mutator, urlForMember)
                         .withHttpMethod(mutatorSpec.httpMethod)
@@ -83,21 +80,21 @@ public abstract class AbstractMemberRepB
         }
     }
 
-    /**
-     * Can be optionally overridden by members that are able
-     * to provide argument values (eg contributed actions).
-     */
-    protected List<String> mutatorArgValues(MutatorSpec mutatorSpec) {
-        List<String> values = Lists.newArrayList();
-        if(mutatorSpec.argSpec.isOne()) {
-            values.add("{arg}");
+    protected Object mutatorArgs(MutatorSpec mutatorSpec) {
+    	if(mutatorSpec.bodyArgs.isNone()) {
+    		return null;
+    	}
+        if(mutatorSpec.bodyArgs.isOne()) {
+    		final Representation argRep = new Representation();
+    		argRep.put("arg", null);
+            return argRep;
         }
-        return values;
+        throw new UnsupportedOperationException("should be overridden if bodyArgs is not 0 or 1");
     }
 
-
+    
     protected void putValueIfRequired() {
-        if(!memberRepType.hasValue(memberType)) {
+        if(!memberRepType.hasValueFor(memberType)) {
             return;
         } 
         representation.put("value", valueRep());
@@ -118,11 +115,11 @@ public abstract class AbstractMemberRepB
     }
 
     protected void putDetailsIfRequired() {
-        if(!memberRepType.hasLinkToDetails()) {
+        if(!memberRepType.isInline()) {
             return;
         } 
         String urlForMember = urlForMember();
-        Representation detailsLink = LinkRepBuilder.newBuilder(repContext, "details", urlForMember).build();
+        Representation detailsLink = LinkRepBuilder.newBuilder(repContext, memberType.name().toLowerCase(), urlForMember).build();
         representation.put("details", detailsLink);
     }
 

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/ActionRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -19,15 +19,18 @@ package org.apache.isis.viewer.json.view
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.json.viewer.RepContext;
+import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.Representation;
 
 import com.google.common.collect.Lists;
 
 public class ActionRepBuilder extends AbstractMemberRepBuilder<ObjectAction> {
 
-    public static ActionRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, ObjectAction oa) {
+	public static ActionRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, ObjectAction oa) {
         return new ActionRepBuilder(repContext, objectAdapter, oa);
     }
 
@@ -37,10 +40,12 @@ public class ActionRepBuilder extends Ab
 
     public Representation build() {
         putSelfIfRequired();
+        putContributedByIfRequired();
         putTypeRep();
         putMemberTypeRep();
         representation.put("actionType", objectMember.getType());
         representation.put("numParameters", objectMember.getParameterCount());
+        putParameterDetailsIfRequired();
         putValueIfRequired();
         putDisabledReason();
         putMutatorsIfRequired();
@@ -48,17 +53,96 @@ public class ActionRepBuilder extends Ab
         return representation;
     }
     
-    protected List<String> mutatorArgValues(MutatorSpec mutatorSpec) {
-        List<String> values = Lists.newArrayList();
+	private void putContributedByIfRequired() {
+    	if(!objectMember.isContributed()) {
+    		return;
+    	}
+    	ObjectAdapter serviceAdapter = contributingServiceAdapter();
+        Representation contributedByLink = LinkRepBuilder.newObjectBuilder(repContext, serviceAdapter, getOidStringifier()).build();
+		representation.put("contributedBy", contributedByLink);
+	}
+
+	private ObjectAdapter contributingServiceAdapter() {
+    	ObjectSpecification serviceType = objectMember.getOnType();
+    	List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
+    	for (ObjectAdapter serviceAdapter : serviceAdapters) {
+			if(serviceAdapter.getSpecification() == serviceType) {
+				return serviceAdapter;
+			}
+		}
+    	// fail fast
+    	throw new IllegalStateException("Unable to locate contributing service");
+	}
+
+    private void putParameterDetailsIfRequired() {
+    	Representation parameters = new Representation();
+    	if (memberRepType.isStandalone()) {
+    		for (int i=0; i< objectMember.getParameterCount(); i++) {
+    			ObjectActionParameter param = objectMember.getParameters().get(i);
+				parameters.put("param" + i, paramDetails(param));
+			}
+    	}
+		representation.put("parameters", parameters);
+	}
+
+	private Object paramDetails(ObjectActionParameter param) {
+		final Representation paramRep = new Representation();
+		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);
+		if(paramChoices != null) {
+			paramRep.put("choices", paramChoices);
+		}
+		Object paramDefault = defaultFor(param);
+		if(paramDefault != null) {
+			paramRep.put("default", paramDefault);
+		}
+		return paramRep;
+	}
+
+	private Object choicesFor(ObjectActionParameter param) {
+		ObjectAdapter[] choiceAdapters = param.getChoices(objectAdapter);
+		if(choiceAdapters == null || choiceAdapters.length == 0) {
+			return null;
+		}
+        List<Object> list = Lists.newArrayList();
+        for (final ObjectAdapter choiceAdapter : choiceAdapters) {
+        	ObjectSpecification objectSpec = param.getSpecification();
+        	list.add(DomainObjectRepBuilder.valueOrRef(repContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
+        }
+        return list;
+	}
+
+	private Object defaultFor(ObjectActionParameter param) {
+		ObjectAdapter defaultAdapter = param.getDefault(objectAdapter);
+		if(defaultAdapter == null) {
+			return null;
+		}
+    	ObjectSpecification objectSpec = param.getSpecification();
+    	return DomainObjectRepBuilder.valueOrRef(repContext, defaultAdapter, objectSpec, getOidStringifier(), getLocalization());
+	}
+
+	@Override
+	protected Object mutatorArgs(MutatorSpec mutatorSpec) {
+        List<Object> values = Lists.newArrayList();
         for(int i=0; i<objectMember.getParameterCount(); i++) {
-            values.add(argValueFor(i)); 
+    		final Representation argRep = new Representation();
+    		argRep.put("arg" + i, argValueFor(i));
+            values.add(argRep); 
         }
         return values;
     }
 
-    // TODO: expect in future to provide values for contributed actions.
-    private String argValueFor(int i) {
-        return "{arg" + i + "}";
-    }
+	private Object argValueFor(int i) {
+    	if(objectMember.isContributed()) {
+    		ObjectActionParameter actionParameter = objectMember.getParameters().get(i);
+    		if (actionParameter.getSpecification().isOfType(objectAdapter.getSpecification())) {
+    			return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, getOidStringifier()).build();
+    		}
+    	}
+    	return null;
+	}
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/BodyArgs.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/BodyArgs.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/BodyArgs.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/BodyArgs.java Sat Jul  9 15:41:29 2011
@@ -34,4 +34,8 @@ public enum BodyArgs {
         return this == ONE;
     }
 
+	public boolean isNone() {
+		return this == NONE;
+	}
+
 }

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/CollectionRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -49,12 +49,6 @@ public class CollectionRepBuilder extend
         return representation;
     }
 
-    protected List<String> mutatorArgValues(MutatorSpec mutatorSpec) {
-        List<String> values = Lists.newArrayList();
-        values.add(null);
-        return values;
-    }
-
     @Override
     protected Object valueRep() {
         ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
@@ -64,8 +58,10 @@ public class CollectionRepBuilder extend
         final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(valueAdapter);
         List<Representation> list = Lists.newArrayList();
         for (final ObjectAdapter elementAdapter : facet.iterable(valueAdapter)) {
-            String url = DomainObjectRepBuilder.urlFor(elementAdapter, getOidStringifier());
-            list.add(LinkRepBuilder.newBuilder(repContext, "value", url).build());
+
+            LinkRepBuilder newBuilder = LinkRepBuilder.newObjectBuilder(repContext, elementAdapter, getOidStringifier());
+
+			list.add(newBuilder.build());
         }
         
         return list;

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/DomainObjectRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -19,9 +19,15 @@ package org.apache.isis.viewer.json.view
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.applib.profiles.Localization;
 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.ObjectActionSet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionContainer.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -51,8 +57,8 @@ public class DomainObjectRepBuilder exte
     
     public Representation build() {
         RepContext repContext = this.repContext.underAttribute("_self");
-        Representation selfLink = LinkRepBuilder.newBuilder(repContext, "link", url()).build();
-        Representation selfType = LinkRepBuilder.newTypeBuilder(repContext, "type", objectAdapter.getSpecification()).build();
+        Representation selfLink = LinkRepBuilder.newBuilder(repContext, "object", url()).build();
+        Representation selfType = LinkRepBuilder.newTypeBuilder(repContext, objectAdapter.getSpecification()).build();
         String title = objectAdapter.titleString();
         Representation iconLink = LinkRepBuilder.newBuilder(repContext, "icon", icon()).build();
         Representation self = new Representation();
@@ -78,8 +84,7 @@ public class DomainObjectRepBuilder exte
     }
 
     private String url() {
-        OidStringifier oidStringifier = getOidStringifier();
-        return urlFor(objectAdapter, oidStringifier);
+        return urlFor(objectAdapter, getOidStringifier());
     }
 
     private void withAllMembers(final ObjectAdapter objectAdapter) {
@@ -102,17 +107,28 @@ public class DomainObjectRepBuilder exte
             }
         }
         
-        List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.EXCLUDED);
-        for (ObjectAction action : actions) {
+        List<ObjectAction> actions = objectAdapter.getSpecification().getObjectActions(Contributed.INCLUDED);
+        withActions(objectAdapter, actions);
+    }
+
+	private void withActions(final ObjectAdapter objectAdapter,
+			List<ObjectAction> actions) {
+		for (ObjectAction action : actions) {
             Consent visibility = action.isVisible(getSession(), objectAdapter);
             if(!visibility.isAllowed()) {
                 continue;
             } 
-            String id = action.getId();
-            Representation actionRep = ActionRepBuilder.newBuilder(repContext.underAttribute(id), objectAdapter, action).build();
-            withMember(id, actionRep);
+        	if(action.getType().isSet()) {
+        		ObjectActionSet objectActionSet = (ObjectActionSet) action;
+        		List<ObjectAction> subactions = objectActionSet.getActions();
+        		withActions(objectAdapter, subactions);
+        	} else {
+                final String id = action.getId();
+                Representation actionRep = ActionRepBuilder.newBuilder(repContext.underAttribute(id), objectAdapter, action).build();
+                withMember(id, actionRep);
+        	}
         }
-    }
+	}
 
     private void withMember(String id, Representation propertyRep) {
         members.put(id, propertyRep);
@@ -123,7 +139,7 @@ public class DomainObjectRepBuilder exte
     //
     /////////////////////////////////////////////////////////////////////
     
-    public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
+	public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
         String oidStr = oidStringifier.enString(objectAdapter.getOid());
         return "objects/" + oidStr;
     }
@@ -151,4 +167,22 @@ public class DomainObjectRepBuilder exte
         };
     }
 
+
+    /////////////////////////////////////////////////////////////////////
+    //
+    /////////////////////////////////////////////////////////////////////
+
+    public static Object valueOrRef(RepContext repContext,
+			final ObjectAdapter objectAdapter, ObjectSpecification objectSpec, OidStringifier oidStringifier, Localization localization) {
+		ValueFacet valueFacet = objectSpec.getFacet(ValueFacet.class);
+		if(valueFacet != null) {
+			EncodableFacet encodeableFacet = objectSpec.getFacet(EncodableFacet.class);
+			return encodeableFacet.toEncodedString(objectAdapter);
+		}
+		TitleFacet titleFacet = objectSpec.getFacet(TitleFacet.class);
+		String title = titleFacet.title(objectAdapter, localization);
+		return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, oidStringifier).withTitle(title).build();
+	}
+
+
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberRepType.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberRepType.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberRepType.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberRepType.java Sat Jul  9 15:41:29 2011
@@ -37,23 +37,15 @@ public enum MemberRepType {
     STANDALONE,
     INLINE;
 
-    public boolean hasSelf() {
-        return this == STANDALONE;
-    }
-
-    public boolean hasMutators() {
-        return this == STANDALONE;
-    }
-
-    public boolean hasLinkToDetails() {
-        return this == INLINE;
-    }
+    public boolean isInline() {
+		return this == INLINE;
+	}
 
-    public boolean hasValue(MemberType memberType) {
-        return memberType.isProperty() || memberType.isCollection() && isStandalone();
+    public boolean hasValueFor(MemberType memberType) {
+        return memberType.isProperty() || memberType.isCollection() && isStandalone();  
     }
 
-    private boolean isStandalone() {
+	public boolean isStandalone() {
         return this == STANDALONE;
     }
 

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberSelfRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -48,12 +48,11 @@ public class MemberSelfRepBuilder extend
 
     private Representation memberLinkRep() {
         String url = AbstractMemberRepBuilder.urlForMember(objectAdapter, memberType, objectMember, getOidStringifier());
-        return LinkRepBuilder.newBuilder(repContext, "link", url).build();
+        return LinkRepBuilder.newBuilder(repContext, "member", url).build();
     }
     
     private Representation domainObjectLinkRep() {
-        String url = DomainObjectRepBuilder.urlFor(objectAdapter, getOidStringifier());
-        return LinkRepBuilder.newBuilder(repContext, "object", url).build();
+        return LinkRepBuilder.newObjectBuilder(repContext, objectAdapter, getOidStringifier()).build();
     }
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberType.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberType.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberType.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MemberType.java Sat Jul  9 15:41:29 2011
@@ -94,4 +94,7 @@ public enum MemberType {
         return this == MemberType.ACTION;
     }
 
+    public static MemberType lookup(final String memberType) {
+    	return valueOf(memberType.toUpperCase());
+    }
 }

Modified: incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MutatorSpec.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MutatorSpec.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MutatorSpec.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/MutatorSpec.java Sat Jul  9 15:41:29 2011
@@ -34,13 +34,13 @@ public class MutatorSpec {
     public final Class<? extends Facet> mutatorFacetType;
     public final HttpMethod httpMethod;
     public final String suffix;
-    public final BodyArgs argSpec;
+    public final BodyArgs bodyArgs;
 
-    private MutatorSpec(Class<? extends Facet> validationFacetType, Class<? extends Facet> mutatorFacetType, HttpMethod httpMethod, BodyArgs argSpec, String suffix) {
+    private MutatorSpec(Class<? extends Facet> validationFacetType, Class<? extends Facet> mutatorFacetType, HttpMethod httpMethod, BodyArgs bodyArgs, String suffix) {
         this.validationFacetType = validationFacetType;
         this.mutatorFacetType = mutatorFacetType;
         this.httpMethod = httpMethod;
-        this.argSpec = argSpec;
+        this.bodyArgs = bodyArgs;
         this.suffix = suffix;
     }
 

Modified: incubator/isis/trunk/framework/viewer/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/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java?rev=1144686&r1=1144685&r2=1144686&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/objects/PropertyRepBuilder.java Sat Jul  9 15:41:29 2011
@@ -16,15 +16,16 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.objects;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-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.viewer.json.viewer.RepContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkRepBuilder;
 import org.apache.isis.viewer.json.viewer.representations.Representation;
 
+import com.google.common.collect.Lists;
+
 public class PropertyRepBuilder extends AbstractMemberRepBuilder<OneToOneAssociation> {
 
     public static PropertyRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
@@ -41,26 +42,40 @@ public class PropertyRepBuilder extends 
         putMemberTypeRep();
         putValueIfRequired();
         putDisabledReason();
+        putChoices();
         putMutatorsIfRequired();
         putDetailsIfRequired();
         return representation;
     }
 
 
-    @Override
+	@Override
     protected Object valueRep() {
         ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
         if(valueAdapter == null) {
-            return null;
-        } 
-        ValueFacet valueFacet = getMemberSpecFacet(ValueFacet.class);
-        if(valueFacet != null) {
-            EncodableFacet encodableFacet = getMemberSpecFacet(EncodableFacet.class);
-            return encodableFacet.toEncodedString(valueAdapter);
-        } 
-        TitleFacet titleFacet = getMemberSpecFacet(TitleFacet.class);
-        String title = titleFacet.title(valueAdapter, getLocalization());
-        return LinkRepBuilder.newBuilder(repContext, "value", urlForObject()).withTitle(title).build();
+		    return null;
+		}
+        return DomainObjectRepBuilder.valueOrRef(repContext, valueAdapter, objectMember.getSpecification(), getOidStringifier(), getLocalization());
     }
 
+    private void putChoices() {
+		Object propertyChoices = propertyChoices();
+		if(propertyChoices != null) {
+			representation.put("choices", propertyChoices);
+		}
+	}
+
+	private Object propertyChoices() {
+		ObjectAdapter[] choiceAdapters = objectMember.getChoices(objectAdapter);
+		if(choiceAdapters == null || choiceAdapters.length == 0) {
+			return null;
+		}
+        List<Object> list = Lists.newArrayList();
+        for (final ObjectAdapter choiceAdapter : choiceAdapters) {
+        	ObjectSpecification objectSpec = objectMember.getSpecification();
+        	list.add(DomainObjectRepBuilder.valueOrRef(repContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
+        }
+        return list;
+	}
+
 }
\ No newline at end of file