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

svn commit: r1173015 - in /incubator/isis/trunk/framework: core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/

Author: danhaywood
Date: Tue Sep 20 07:45:18 2011
New Revision: 1173015

URL: http://svn.apache.org/viewvc?rev=1173015&view=rev
Log:
ISIS-109: object action parameter invoke args now represented as a map rather than as a list

Added:
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionSemantics.java
Modified:
    incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getName.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceAbstract.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java

Modified: incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getName.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getName.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getName.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getName.java Tue Sep 20 07:45:18 2011
@@ -147,6 +147,7 @@ public class ObjectActionParameterAbstra
         assertThat(objectActionParameter.getName(), is("someParameterName"));
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void whenNamedFaceNotPresentAndOnlyOneParamOfType() throws Exception {
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberRepBuilder.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberRepBuilder.java Tue Sep 20 07:45:18 2011
@@ -16,8 +16,6 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
-import java.util.Map;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -61,41 +59,9 @@ public abstract class AbstractObjectMemb
         representation.mapPut(memberType.getJsProp(), objectMember.getId());
     }
 
-    public R withMutatorsIfEnabled() {
-        if(usability().isVetoed()) {
-            return cast(this);
-        }
-        Map<String, MutatorSpec> mutators = memberType.getMutators();
-        for(String mutator: mutators.keySet()) {
-            MutatorSpec mutatorSpec = mutators.get(mutator);
-            if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
-                
-                JsonRepresentation arguments = mutatorArgs(mutatorSpec);
-                JsonRepresentation detailsLink = 
-                        linkToBuilder.linkToMember(mutator, memberType, objectMember, mutatorSpec.suffix)
-                        .withHttpMethod(mutatorSpec.httpMethod)
-                        .withArguments(arguments)
-                        .build();
-                representation.mapPut(mutator, detailsLink);
-            }
-        }
-        return cast(this);
-    }
-
-    private JsonRepresentation mutatorArgs(MutatorSpec mutatorSpec) {
-    	return appendMutatorArgs(mutatorSpec);
-    }
+    public abstract R withMutatorsIfEnabled();
 
-    protected JsonRepresentation appendMutatorArgs(MutatorSpec mutatorSpec) {
-		if(mutatorSpec.arguments.isNone()) {
-    		return JsonRepresentation.newMap();
-    	}
-        if(mutatorSpec.arguments.isOne()) {
-            JsonRepresentation argValues = JsonRepresentation.newArray(1);
-            return argValues;
-        }
-        throw new UnsupportedOperationException("should be overridden if bodyArgs is not 0 or 1");
-	}
+    protected abstract JsonRepresentation mutatorArgs(MutatorSpec mutatorSpec);
     
     protected R withValue() {
         representation.mapPut("value", valueRep());

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java?rev=1173015&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java Tue Sep 20 07:45:18 2011
@@ -0,0 +1,36 @@
+package org.apache.isis.viewer.json.viewer.resources.domainobjects;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+
+public enum ActionSemantics {
+
+    QUERY_ONLY("invokeQueryOnly"),
+    IDEMPOTENT("invokeQueryOnly"),
+    SIDE_EFFECTS("invoke");
+    
+    private final String invokeKey;
+    private ActionSemantics(String invokeKey) {
+        this.invokeKey = invokeKey;
+        
+    }
+    
+    public String getInvokeKey() {
+        return invokeKey;
+    }
+
+    public boolean isQueryOnly() {
+        return this == QUERY_ONLY;
+    }
+
+    public boolean isIdempotent() {
+        return this == IDEMPOTENT;
+    }
+
+    public static ActionSemantics determine(ResourceContext resourceContext, ObjectAction action) {
+        // TODO
+        return ActionSemantics.SIDE_EFFECTS;
+    }
+
+    
+}

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionSemantics.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionSemantics.java?rev=1173015&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionSemantics.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/CollectionSemantics.java Tue Sep 20 07:45:18 2011
@@ -0,0 +1,26 @@
+package org.apache.isis.viewer.json.viewer.resources.domainobjects;
+
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+
+public enum CollectionSemantics {
+
+    SET("addToSet"),
+    LIST("addToList");
+    
+    private final String addToKey;
+
+    private CollectionSemantics(String addToKey) {
+        this.addToKey = addToKey;
+        
+    }
+    
+    public String getAddToKey() {
+        return addToKey;
+    }
+    
+    public static CollectionSemantics determine(ResourceContext resourceContext, OneToManyAssociation collection) {
+        return collection.getCollectionSemantics().isSet()?CollectionSemantics.SET:CollectionSemantics.LIST;
+    }
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceAbstract.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceAbstract.java Tue Sep 20 07:45:18 2011
@@ -262,9 +262,11 @@ public abstract class DomainResourceAbst
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
                 objectAdapter, actionId, Intent.ACCESS);
 
-        if (!isQueryOnly(action)) {
-            throw JsonApplicationException.create(HttpStatusCode.METHOD_NOT_ALLOWED,
-                    "Method not allowed; action '%s' is not query only", action.getId());
+        final ActionSemantics actionSemantics = ActionSemantics.determine(getResourceContext(), action);
+        if(!actionSemantics.isQueryOnly()) {
+            // TODO: reinstate
+//            throw JsonApplicationException.create(HttpStatusCode.METHOD_NOT_ALLOWED,
+//                    "Method not allowed; action '%s' is not query only", action.getId());
         }
 
         List<ObjectAdapter> argumentAdapters;
@@ -291,10 +293,12 @@ public abstract class DomainResourceAbst
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
                 objectAdapter, actionId, Intent.MUTATE);
 
-        if (!isIdempotent(action)) {
-            throw JsonApplicationException.create(
-                    HttpStatusCode.METHOD_NOT_ALLOWED,
-                    "Method not allowed; action '%s' is not idempotent", action.getId());
+        final ActionSemantics actionSemantics = ActionSemantics.determine(getResourceContext(), action);
+        if(actionSemantics.isIdempotent()) {
+            // TODO: reinstate
+//            throw JsonApplicationException.create(
+//                    HttpStatusCode.METHOD_NOT_ALLOWED,
+//                    "Method not allowed; action '%s' is not idempotent", action.getId());
         }
 
         List<ObjectAdapter> argumentAdapters = parseBody(action, arguments);
@@ -311,7 +315,8 @@ public abstract class DomainResourceAbst
                 argumentAdapters);
     }
 
-    protected Response invokeActionUsingAdapters(final ObjectAction action,
+    protected Response invokeActionUsingAdapters(
+        final ObjectAction action,
         final ObjectAdapter objectAdapter,
         final List<ObjectAdapter> argAdapters) {
 
@@ -355,16 +360,6 @@ public abstract class DomainResourceAbst
     }
 
 
-    private boolean isQueryOnly(final ObjectAction action) {
-        // TODO: determine whether action is query only
-        return true;
-    }
-
-    private boolean isIdempotent(final ObjectAction action) {
-        // TODO: determine whether action is idempotent
-        return true;
-    }
-
     private List<ObjectAdapter> argumentAdaptersFor(ObjectAction action,
         String arguments) throws JsonParseException, JsonMappingException, IOException {
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java Tue Sep 20 07:45:18 2011
@@ -37,26 +37,38 @@ import com.google.common.collect.Immutab
 
 public enum MemberType {
 
-    OBJECT_PROPERTY("properties/", "propertyId", "propertyDetails", ImmutableMap.of(
-            "modify", MutatorSpec.of(PropertyValidateFacet.class, PropertySetterFacet.class, HttpMethod.PUT, BodyArgs.ONE),
-            "clear", MutatorSpec.of(PropertyValidateFacet.class, PropertyClearFacet.class, HttpMethod.DELETE, BodyArgs.NONE)
-            )) {
+    OBJECT_PROPERTY("properties/", "propertyId", "propertyDetails", 
+            ImmutableMap.of(
+                "modify", MutatorSpec.of(PropertyValidateFacet.class, PropertySetterFacet.class, HttpMethod.PUT, BodyArgs.ONE),
+                "clear", MutatorSpec.of(PropertyValidateFacet.class, PropertyClearFacet.class, HttpMethod.DELETE, BodyArgs.NONE)
+                )) {
         @Override
         public ObjectSpecification specFor(ObjectMember objectMember) {
             return objectMember.getSpecification();
         }
     },
-    OBJECT_COLLECTION("collections/", "collectionId", "collectionDetails", ImmutableMap.of(
-            "addTo", MutatorSpec.of(CollectionValidateAddToFacet.class, CollectionAddToFacet.class, HttpMethod.PUT, BodyArgs.ONE),
-            "removeFrom", MutatorSpec.of(CollectionValidateRemoveFromFacet.class, CollectionRemoveFromFacet.class, HttpMethod.DELETE, BodyArgs.ONE)
-            )) {
+    /**
+     * {@link #getMutators()} are keyed by {@link CollectionSemantics#getAddToKey()}
+     */
+    OBJECT_COLLECTION("collections/", "collectionId", "collectionDetails", 
+            ImmutableMap.of(
+                "addToSet", MutatorSpec.of(CollectionValidateAddToFacet.class, CollectionAddToFacet.class, HttpMethod.PUT, BodyArgs.ONE),
+                "addToList", MutatorSpec.of(CollectionValidateAddToFacet.class, CollectionAddToFacet.class, HttpMethod.POST, BodyArgs.ONE),
+                "removeFrom", MutatorSpec.of(CollectionValidateRemoveFromFacet.class, CollectionRemoveFromFacet.class, HttpMethod.DELETE, BodyArgs.ONE)
+                )) {
         @Override
         public ObjectSpecification specFor(ObjectMember objectMember) {
             return objectMember.getSpecification();
         }
     },
-    OBJECT_ACTION("actions/", "actionId", "actionDetails", ImmutableMap.of(
-            "invoke", MutatorSpec.of(ActionValidationFacet.class, ActionInvocationFacet.class, HttpMethod.POST, BodyArgs.MANY, "invoke")
+    /**
+     * {@link #getMutators()} are keyed by {@link ActionSemantics#getInvokeKey()}
+     */
+    OBJECT_ACTION("actions/", "actionId", "actionDetails",
+            ImmutableMap.of(
+                "invokeQueryOnly", MutatorSpec.of(ActionValidationFacet.class, ActionInvocationFacet.class, HttpMethod.GET, BodyArgs.MANY, "invoke"),
+                "invokeIdempotent", MutatorSpec.of(ActionValidationFacet.class, ActionInvocationFacet.class, HttpMethod.PUT, BodyArgs.MANY, "invoke"),
+                "invoke", MutatorSpec.of(ActionValidationFacet.class, ActionInvocationFacet.class, HttpMethod.POST, BodyArgs.MANY, "invoke")
             )) {
         @Override
         public ObjectSpecification specFor(ObjectMember objectMember) {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java Tue Sep 20 07:45:18 2011
@@ -21,7 +21,6 @@ import org.apache.isis.viewer.json.viewe
 
 public class MutatorSpec {
 
-    
     public static MutatorSpec of(Class<? extends Facet> validationFacetType, Class<? extends Facet> mutatorFacetType, HttpMethod httpMethod, BodyArgs argSpec) {
         return of(validationFacetType, mutatorFacetType, httpMethod, argSpec, null);
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java Tue Sep 20 07:45:18 2011
@@ -17,6 +17,8 @@
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -26,8 +28,12 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.resources.domaintypes.DomainTypeRepBuilder;
 import org.apache.isis.viewer.json.viewer.resources.domaintypes.TypeActionRepBuilder;
+import org.codehaus.jackson.JsonNode;
+import org.codehaus.jackson.node.NullNode;
+import org.jboss.resteasy.util.GetRestful;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class ObjectActionRepBuilder extends AbstractObjectMemberRepBuilder<ObjectActionRepBuilder, ObjectAction> {
 
@@ -43,6 +49,7 @@ public class ObjectActionRepBuilder exte
     }
 
 
+    
      private void putExtensionsIsisProprietary(JsonRepresentation extensions) {
         extensions.mapPut("actionType", objectMember.getType());
         withExtensions(extensions );
@@ -64,6 +71,35 @@ public class ObjectActionRepBuilder exte
         withLinks(links);
     }
 
+    @Override
+    public ObjectActionRepBuilder withMutatorsIfEnabled() {
+        if(usability().isVetoed()) {
+            return cast(this);
+        }
+        Map<String, MutatorSpec> mutators = memberType.getMutators();
+        final ActionSemantics semantics = ActionSemantics.determine(this.resourceContext, objectMember);
+        
+        final String mutator = semantics.getInvokeKey();
+        final MutatorSpec mutatorSpec = mutators.get(mutator);
+        appendMutator(mutator, mutatorSpec);
+        
+        return cast(this);
+    }
+
+    protected void appendMutator(String mutator, MutatorSpec mutatorSpec) {
+        if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
+            
+            JsonRepresentation arguments = mutatorArgs(mutatorSpec);
+            JsonRepresentation detailsLink = 
+                    linkToBuilder.linkToMember(mutator, memberType, objectMember, mutatorSpec.suffix)
+                    .withHttpMethod(mutatorSpec.httpMethod)
+                    .withArguments(arguments)
+                    .build();
+            representation.mapPut(mutator, detailsLink);
+        }
+    }
+
+
     public JsonRepresentation build() {
 
         putDisabledReasonIfDisabled();
@@ -140,12 +176,13 @@ public class ObjectActionRepBuilder exte
 	}
 
 	@Override
-	protected JsonRepresentation appendMutatorArgs(MutatorSpec mutatorSpec) {
-	    JsonRepresentation argList = JsonRepresentation.newArray();
+	protected JsonRepresentation mutatorArgs(MutatorSpec mutatorSpec) {
+	    JsonRepresentation argMap = JsonRepresentation.newMap();
+	    List<ObjectActionParameter> parameters = objectMember.getParameters();
         for(int i=0; i<objectMember.getParameterCount(); i++) {
-            argList.arrayAdd(argValueFor(i)); 
+            argMap.mapPut(parameters.get(i).getName(), argValueFor(i)); 
         }
-        return argList;
+        return argMap;
     }
 
 	private Object argValueFor(int i) {
@@ -155,7 +192,7 @@ public class ObjectActionRepBuilder exte
     			return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, "object", objectAdapter).build();
     		}
     	}
-    	return "{value}";
+    	return NullNode.instance;
 	}
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java Tue Sep 20 07:45:18 2011
@@ -17,6 +17,7 @@
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
@@ -45,6 +46,43 @@ public class ObjectCollectionRepBuilder 
         withExtensions();
     }
 
+    @Override
+    public ObjectCollectionRepBuilder withMutatorsIfEnabled() {
+        if(usability().isVetoed()) {
+            return cast(this);
+        }
+        Map<String, MutatorSpec> mutators = memberType.getMutators();
+        for(String mutator: mutators.keySet()) {
+            MutatorSpec mutatorSpec = mutators.get(mutator);
+            if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
+                
+                JsonRepresentation arguments = mutatorArgs(mutatorSpec);
+                JsonRepresentation detailsLink = 
+                        linkToBuilder.linkToMember(mutator, memberType, objectMember, mutatorSpec.suffix)
+                        .withHttpMethod(mutatorSpec.httpMethod)
+                        .withArguments(arguments)
+                        .build();
+                representation.mapPut(mutator, detailsLink);
+            }
+        }
+        return cast(this);
+    }
+
+
+    protected JsonRepresentation mutatorArgs(MutatorSpec mutatorSpec) {
+        final JsonRepresentation repr = JsonRepresentation.newMap();
+        if(mutatorSpec.arguments.isNone()) {
+            return repr;
+        }
+        if(mutatorSpec.arguments.isOne()) {
+            JsonRepresentation argValues = JsonRepresentation.newArray(1);
+            return argValues;
+        }
+        throw new UnsupportedOperationException("should be overridden if bodyArgs is not 0 or 1");
+    }
+    
+
+
     public JsonRepresentation build() {
         return representation;
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java?rev=1173015&r1=1173014&r2=1173015&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java Tue Sep 20 07:45:18 2011
@@ -17,6 +17,7 @@
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
 import java.util.List;
+import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -43,6 +44,42 @@ public class ObjectPropertyRepBuilder ex
         withExtensions();
     }
 
+    
+    @Override
+    public ObjectPropertyRepBuilder withMutatorsIfEnabled() {
+        if(usability().isVetoed()) {
+            return cast(this);
+        }
+        Map<String, MutatorSpec> mutators = memberType.getMutators();
+        for(String mutator: mutators.keySet()) {
+            MutatorSpec mutatorSpec = mutators.get(mutator);
+            if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
+                
+                JsonRepresentation arguments = mutatorArgs(mutatorSpec);
+                JsonRepresentation detailsLink = 
+                        linkToBuilder.linkToMember(mutator, memberType, objectMember, mutatorSpec.suffix)
+                        .withHttpMethod(mutatorSpec.httpMethod)
+                        .withArguments(arguments)
+                        .build();
+                representation.mapPut(mutator, detailsLink);
+            }
+        }
+        return cast(this);
+    }
+
+    protected JsonRepresentation mutatorArgs(MutatorSpec mutatorSpec) {
+        final JsonRepresentation repr = JsonRepresentation.newMap();
+        if(mutatorSpec.arguments.isNone()) {
+            return repr;
+        }
+        if(mutatorSpec.arguments.isOne()) {
+            JsonRepresentation argValues = JsonRepresentation.newArray(1);
+            return argValues;
+        }
+        throw new UnsupportedOperationException("should be overridden if bodyArgs is not 0 or 1");
+    }
+
+
     public JsonRepresentation build() {
         return representation;
     }