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 19:28:45 UTC

svn commit: r1173268 - in /incubator/isis/trunk/framework: tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/ tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/ viewer/json/json-applib/src/main/java/org/apach...

Author: danhaywood
Date: Tue Sep 20 17:28:45 2011
New Revision: 1173268

URL: http://svn.apache.org/viewvc?rev=1173268&view=rev
Log:
ISIS-109: working on the domain object representation, scalar value representation, domain object list representation, domain type representations

Added:
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarRepBuilder.java
Modified:
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/SimpleEntityFixture.java
    incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/SimpleEntityRepositoryDefault.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/AbstractRepresentationBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java
    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/DomainObjectListRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.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/DomainServiceResourceServerside.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/ObjectPropertyRepBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java

Modified: incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/SimpleEntityFixture.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/SimpleEntityFixture.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/SimpleEntityFixture.java (original)
+++ incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/simples/SimpleEntityFixture.java Tue Sep 20 17:28:45 2011
@@ -16,18 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
-
 package org.apache.isis.tck.fixture.simples;
 
 import org.apache.isis.applib.fixtures.AbstractFixture;
-import org.apache.isis.tck.dom.scalars.WrapperValuedEntity;
-import org.apache.isis.tck.dom.scalars.WrapperValuedEntityRepository;
 import org.apache.isis.tck.dom.simples.SimpleEntity;
 import org.apache.isis.tck.dom.simples.SimpleEntityRepository;
 
 
-
 public class SimpleEntityFixture extends AbstractFixture {
 
     @Override

Modified: incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/SimpleEntityRepositoryDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/SimpleEntityRepositoryDefault.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/SimpleEntityRepositoryDefault.java (original)
+++ incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/simples/SimpleEntityRepositoryDefault.java Tue Sep 20 17:28:45 2011
@@ -44,6 +44,7 @@ public class SimpleEntityRepositoryDefau
         SimpleEntity entity = newTransientEntity();
         entity.setName(name);
         entity.setFlag(flag);
+        getContainer().persist(entity);
         return entity;
     }
     

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domaintypes/DomainTypeResource.java Tue Sep 20 17:28:45 2011
@@ -68,6 +68,6 @@ public interface DomainTypeResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @ClientResponseType(entityType=String.class)
     public abstract Response typeActionParam(@PathParam("domainType") final String domainType,
-        @PathParam("actionId") final String actionId, @PathParam("paramNum") final int paramNum);
+        @PathParam("actionId") final String actionId, @PathParam("paramNum") final String paramName);
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/AbstractRepresentationBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/AbstractRepresentationBuilder.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/AbstractRepresentationBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/AbstractRepresentationBuilder.java Tue Sep 20 17:28:45 2011
@@ -28,10 +28,15 @@ import org.apache.isis.viewer.json.viewe
 public abstract class AbstractRepresentationBuilder<T extends AbstractRepresentationBuilder<T>> implements RepBuilder {
 
     protected final ResourceContext resourceContext;
-    protected final JsonRepresentation representation = JsonRepresentation.newMap();
+    protected final JsonRepresentation representation;
     
     public AbstractRepresentationBuilder(ResourceContext resourceContext) {
+        this(resourceContext, JsonRepresentation.newMap());
+    }
+
+    public AbstractRepresentationBuilder(ResourceContext resourceContext, JsonRepresentation representation) {
         this.resourceContext = resourceContext;
+        this.representation = representation;
     }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/ResourceAbstract.java Tue Sep 20 17:28:45 2011
@@ -58,6 +58,7 @@ import org.apache.isis.viewer.json.viewe
 import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
 import org.apache.isis.viewer.json.viewer.representations.RepBuilder;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract.Caching;
+import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainObjectListRepBuilder;
 import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainObjectRepBuilder;
 import org.apache.isis.viewer.json.viewer.util.OidUtils;
 import org.apache.isis.viewer.json.viewer.util.UrlDecoderUtils;
@@ -162,6 +163,8 @@ public abstract class ResourceAbstract {
 
 	protected String jsonFor(
 			final Collection<ObjectAdapter> collectionAdapters) {
+	    
+	    
 		return jsonFor(Lists.newArrayList(
             Collections2.transform(collectionAdapters, toObjectSelfRepresentation())));
 	}
@@ -259,7 +262,6 @@ public abstract class ResourceAbstract {
         return responseOfOk(representationType, representationBuilder.build(), caching);
     }
 
-    
 
 
     // //////////////////////////////////////////////////////////////
@@ -270,7 +272,7 @@ public abstract class ResourceAbstract {
         return IsisContext.getAuthenticationSession();
     }
     
-    private SpecificationLoader getSpecificationLoader() {
+    protected SpecificationLoader getSpecificationLoader() {
         return IsisContext.getSpecificationLoader();
     }
 

Modified: 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=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ActionSemantics.java Tue Sep 20 17:28:45 2011
@@ -6,7 +6,7 @@ import org.apache.isis.viewer.json.viewe
 public enum ActionSemantics {
 
     QUERY_ONLY("invokeQueryOnly"),
-    IDEMPOTENT("invokeQueryOnly"),
+    IDEMPOTENT("invokeIdempotent"),
     SIDE_EFFECTS("invoke");
     
     private final String invokeKey;
@@ -23,13 +23,13 @@ public enum ActionSemantics {
         return this == QUERY_ONLY;
     }
 
-    public boolean isIdempotent() {
-        return this == IDEMPOTENT;
+    public boolean isQueryOnlyOrIdempotent() {
+        return isQueryOnly() || this == IDEMPOTENT;
     }
 
     public static ActionSemantics determine(ResourceContext resourceContext, ObjectAction action) {
         // TODO
-        return ActionSemantics.SIDE_EFFECTS;
+        return ActionSemantics.QUERY_ONLY;
     }
 
     

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectListRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectListRepBuilder.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectListRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectListRepBuilder.java Tue Sep 20 17:28:45 2011
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.domainobjects;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -26,13 +27,17 @@ import org.apache.isis.viewer.json.viewe
 public class DomainObjectListRepBuilder extends AbstractRepresentationBuilder<DomainObjectListRepBuilder> {
 
     private ObjectAdapterLinkToBuilder objectAdapterLinkToBuilder;
-    
+
+    public static DomainObjectListRepBuilder newBuilder(ResourceContext resourceContext, JsonRepresentation representation) {
+        return new DomainObjectListRepBuilder(resourceContext, representation);
+    }
+
     public static DomainObjectListRepBuilder newBuilder(ResourceContext resourceContext) {
-        return new DomainObjectListRepBuilder(resourceContext);
+        return new DomainObjectListRepBuilder(resourceContext, JsonRepresentation.newMap());
     }
 
-    private DomainObjectListRepBuilder(ResourceContext resourceContext) {
-        super(resourceContext);
+    private DomainObjectListRepBuilder(ResourceContext resourceContext, JsonRepresentation representation) {
+        super(resourceContext, representation);
         usingLinkToBuilder(new DomainObjectLinkToBuilder());
     }
     
@@ -41,7 +46,7 @@ public class DomainObjectListRepBuilder 
         return this;
     }
 
-    public DomainObjectListRepBuilder withAdapters(List<ObjectAdapter> objectAdapters) {
+    public DomainObjectListRepBuilder withAdapters(Collection<ObjectAdapter> objectAdapters) {
         JsonRepresentation list = JsonRepresentation.newArray();
         for(ObjectAdapter adapter: objectAdapters) {
             JsonRepresentation linkToObject = objectAdapterLinkToBuilder.with(adapter).linkToAdapter().build();

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectRepBuilder.java Tue Sep 20 17:28:45 2011
@@ -40,8 +40,8 @@ import com.google.common.base.Function;
 
 public class DomainObjectRepBuilder extends AbstractRepresentationBuilder<DomainObjectRepBuilder> {
 
-    public static DomainObjectRepBuilder newBuilder(ResourceContext representationContext) {
-        return new DomainObjectRepBuilder(representationContext);
+    public static DomainObjectRepBuilder newBuilder(ResourceContext resourceContext) {
+        return new DomainObjectRepBuilder(resourceContext);
     }
 
     public static LinkToBuilder newLinkToBuilder(ResourceContext resourceContext, String rel, ObjectAdapter elementAdapter) {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.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/DomainObjectResourceServerside.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectResourceServerside.java Tue Sep 20 17:28:45 2011
@@ -43,6 +43,8 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.domainobjects.DomainObjectResource;
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract.Caching;
+import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainResourceAbstract.Intent;
 
 @Path("/objects")
 public class DomainObjectResourceServerside extends DomainResourceAbstract implements
@@ -61,7 +63,7 @@ public class DomainObjectResourceServers
 
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
         
-        return responseWithRepresentationOf(objectAdapter);
+        return object(objectAdapter);
     }
 
     @PUT
@@ -287,14 +289,7 @@ public class DomainObjectResourceServers
         init();
 
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
-        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.ACCESS);
-
-        ObjectActionRepBuilder repBuilder = ObjectActionRepBuilder.newBuilder(
-                getResourceContext(), objectAdapter, action);
-        
-        return responseOfOk(RepresentationType.OBJECT_ACTION, repBuilder, Caching.NONE)
-                .build();
+        return actionPrompt(actionId, objectAdapter);
     }
 
 

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=1173268&r1=1173267&r2=1173268&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 17:28:45 2011
@@ -46,7 +46,9 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
 import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
+import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract.Caching;
 import org.apache.isis.viewer.json.viewer.util.OidUtils;
 import org.apache.isis.viewer.json.viewer.util.UrlDecoderUtils;
 import org.apache.isis.viewer.json.viewer.util.UrlParserUtils;
@@ -60,6 +62,199 @@ import com.google.common.io.ByteStreams;
 public abstract class DomainResourceAbstract extends ResourceAbstract {
 
     // //////////////////////////////////////////////////////////////
+    // object
+    // //////////////////////////////////////////////////////////////
+
+    protected Response object(final ObjectAdapter objectAdapter) {
+        ResourceContext resourceContext = getResourceContext();
+        final AbstractRepresentationBuilder<?> repBuilder =
+                DomainObjectRepBuilder.newBuilder(resourceContext)
+                        .withAdapter(objectAdapter);
+
+        ResponseBuilder respBuilder = 
+                responseOfOk(RepresentationType.DOMAIN_OBJECT, repBuilder, Caching.NONE);
+
+        Version version = objectAdapter.getVersion();
+        if (version != null && version.getTime() != null) {
+            respBuilder.lastModified(version.getTime());
+        }
+        return respBuilder.build();
+    }
+
+
+    
+    // //////////////////////////////////////////////////////////////
+    // action Prompt
+    // //////////////////////////////////////////////////////////////
+
+    protected Response actionPrompt(final String actionId, final ObjectAdapter serviceAdapter) {
+        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
+                serviceAdapter, actionId, Intent.ACCESS);
+
+        ObjectActionRepBuilder repBuilder = 
+                ObjectActionRepBuilder.newBuilder(getResourceContext(), serviceAdapter, action)
+                .withDetailsLink()
+                .withMutatorsIfEnabled();
+        
+        return responseOfOk(RepresentationType.OBJECT_ACTION, repBuilder, Caching.NONE)
+                .build();
+    }
+
+    
+    // //////////////////////////////////////////////////////////////
+    // invoke action
+    // //////////////////////////////////////////////////////////////
+
+    enum Intent {
+        ACCESS, MUTATE;
+
+        public boolean isMutate() {
+            return this == MUTATE;
+        }
+    }
+
+    protected Response invokeActionQueryOnly(final ObjectAdapter objectAdapter, final String actionId, final String arguments) {
+        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
+                objectAdapter, actionId, Intent.ACCESS);
+
+        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;
+        try {
+            argumentAdapters = argumentAdaptersFor(action, arguments);
+        } catch (IOException e) {
+            throw JsonApplicationException.create(HttpStatusCode.BAD_REQUEST,
+                    "Action '%s' has query arguments that cannot be parsed as JSON", e, action.getId());
+        }
+
+        int numParameters = action.getParameterCount();
+        int argSize = argumentAdapters.size();
+        if (argSize != numParameters) {
+            throw JsonApplicationException.create(
+                    HttpStatusCode.BAD_REQUEST,
+                    "Action '%s' has %d parameters but received %d arguments",
+                    numParameters, argSize, action.getId());
+        }
+        
+        JsonRepresentation representationWithSelf = representationWithSelfFor(objectAdapter, action);
+        // TODO: append action args to 'self'
+
+        return invokeActionUsingAdapters(objectAdapter, action, argumentAdapters, representationWithSelf);
+    }
+
+    protected Response invokeActionIdempotent(final ObjectAdapter objectAdapter, final String actionId, final InputStream arguments) {
+        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
+                objectAdapter, actionId, Intent.MUTATE);
+
+        final ActionSemantics actionSemantics = ActionSemantics.determine(getResourceContext(), action);
+        if(actionSemantics.isQueryOnlyOrIdempotent()) {
+            // 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);
+        JsonRepresentation representationWithSelf = representationWithSelfFor(objectAdapter, action);
+        // TODO: append action args to 'self'
+
+        return invokeActionUsingAdapters(objectAdapter, action,
+                argumentAdapters, representationWithSelf);
+    }
+
+    protected Response invokeAction(final ObjectAdapter objectAdapter, final String actionId, final InputStream body) {
+        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
+                objectAdapter, actionId, Intent.MUTATE);
+
+        List<ObjectAdapter> argumentAdapters = parseBody(action, body);
+        JsonRepresentation representationWithSelf = representationWithSelfFor(objectAdapter, action);
+        // TODO: append action args to 'self'
+
+        return invokeActionUsingAdapters(objectAdapter, action,
+                argumentAdapters, representationWithSelf);
+    }
+
+    protected Response invokeActionUsingAdapters(
+        final ObjectAdapter objectAdapter,
+        final ObjectAction action,
+        final List<ObjectAdapter> argAdapters, JsonRepresentation representationWithSelf) {
+        
+        // validate
+        List<ObjectActionParameter> parameters = action.getParameters();
+        for (int i = 0; i < parameters.size(); i++) {
+            ObjectActionParameter parameter = parameters.get(i);
+            ObjectAdapter paramAdapter = argAdapters.get(i);
+            if (paramAdapter.getSpecification().containsFacet(ValueFacet.class)) {
+                Object arg = paramAdapter.getObject();
+                String reasonNotValid = parameter.isValid(objectAdapter, arg);
+                if (reasonNotValid != null) {
+                    throw JsonApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE, reasonNotValid);
+                }
+            }
+        }
+        ObjectAdapter[] argArray = argAdapters.toArray(new ObjectAdapter[0]);
+        Consent consent = action.isProposedArgumentSetValid(objectAdapter,
+                argArray);
+        if (consent.isVetoed()) {
+            throw JsonApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE, consent.getReason());
+        }
+
+        // invoke
+        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray);
+
+        // response
+        if (returnedAdapter == null) {
+            return responseOfNoContent(objectAdapter.getVersion()).build();
+        }
+
+        final CollectionFacet collectionFacet = returnedAdapter.getSpecification().getFacet(CollectionFacet.class);
+        if (collectionFacet != null) {
+            final Collection<ObjectAdapter> collectionAdapters = collectionFacet
+                    .collection(returnedAdapter);
+            DomainObjectListRepBuilder repBuilder = DomainObjectListRepBuilder.newBuilder(getResourceContext(), representationWithSelf).withAdapters(collectionAdapters);
+            return responseOfOk(RepresentationType.LIST, repBuilder, Caching.NONE).build();
+        }
+
+        final EncodableFacet encodableFacet = returnedAdapter.getSpecification().getFacet(EncodableFacet.class);
+        if(encodableFacet != null) {
+            ScalarRepBuilder repBuilder = ScalarRepBuilder.newBuilder(getResourceContext(), representationWithSelf).withAdapter(objectAdapter);
+            return responseOfOk(RepresentationType.SCALAR_VALUE, repBuilder, Caching.NONE).build();
+        }
+
+        return object(returnedAdapter);
+    }
+
+
+    private JsonRepresentation representationWithSelfFor(final ObjectAdapter objectAdapter, final ObjectAction action) {
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        String oid = getOidStr(objectAdapter);
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "objects/%s/actions/%s/invoke", oid, action.getId()).build());
+        return representation;
+    }
+
+
+    private List<ObjectAdapter> argumentAdaptersFor(ObjectAction action,
+        String arguments) throws JsonParseException, JsonMappingException, IOException {
+
+        List<ObjectAdapter> argumentAdapters = Lists.newArrayList();
+        // List<ObjectActionParameter> parameters = action.getParameters();
+        // for (int i = 0; i < parameters.size(); i++) {
+        // ObjectActionParameter parameter = parameters.get(i);
+        // ObjectSpecification paramSpc = parameter.getSpecification();
+        // String argument = arguments.get(i);
+        // argumentAdapters.add(objectAdapterFor(paramSpc, argument));
+        // }
+        //
+        return argumentAdapters;
+    }
+
+    
+    // //////////////////////////////////////////////////////////////
     // objectAdapterFor
     // //////////////////////////////////////////////////////////////
 
@@ -246,135 +441,7 @@ public abstract class DomainResourceAbst
 
 
     
-    // //////////////////////////////////////////////////////////////
-    // invoke action
-    // //////////////////////////////////////////////////////////////
-
-    enum Intent {
-        ACCESS, MUTATE;
-
-        public boolean isMutate() {
-            return this == MUTATE;
-        }
-    }
-
-    protected Response invokeActionQueryOnly(final ObjectAdapter objectAdapter, final String actionId, final String arguments) {
-        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.ACCESS);
-
-        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;
-        try {
-            argumentAdapters = argumentAdaptersFor(action, arguments);
-        } catch (IOException e) {
-            throw JsonApplicationException.create(HttpStatusCode.BAD_REQUEST,
-                    "Action '%s' has query arguments that cannot be parsed as JSON", e, action.getId());
-        }
-
-        int numParameters = action.getParameterCount();
-        int argSize = argumentAdapters.size();
-        if (argSize != numParameters) {
-            throw JsonApplicationException.create(
-                    HttpStatusCode.BAD_REQUEST,
-                    "Action '%s' has %d parameters but received %d arguments",
-                    numParameters, argSize, action.getId());
-        }
-
-        return invokeActionUsingAdapters(action, objectAdapter, argumentAdapters);
-    }
-
-    protected Response invokeActionIdempotent(final ObjectAdapter objectAdapter, final String actionId, final InputStream arguments) {
-        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.MUTATE);
-
-        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);
-        return invokeActionUsingAdapters(action, objectAdapter,
-                argumentAdapters);
-    }
-
-    protected Response invokeAction(final ObjectAdapter objectAdapter, final String actionId, final InputStream body) {
-        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.MUTATE);
-
-        List<ObjectAdapter> argumentAdapters = parseBody(action, body);
-        return invokeActionUsingAdapters(action, objectAdapter,
-                argumentAdapters);
-    }
-
-    protected Response invokeActionUsingAdapters(
-        final ObjectAction action,
-        final ObjectAdapter objectAdapter,
-        final List<ObjectAdapter> argAdapters) {
-
-        // validate
-        List<ObjectActionParameter> parameters = action.getParameters();
-        for (int i = 0; i < parameters.size(); i++) {
-            ObjectActionParameter parameter = parameters.get(i);
-            ObjectAdapter paramAdapter = argAdapters.get(i);
-            if (paramAdapter.getSpecification().containsFacet(ValueFacet.class)) {
-                Object arg = paramAdapter.getObject();
-                String reasonNotValid = parameter.isValid(objectAdapter, arg);
-                if (reasonNotValid != null) {
-                    throw JsonApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE, reasonNotValid);
-                }
-            }
-        }
-        ObjectAdapter[] argArray = argAdapters.toArray(new ObjectAdapter[0]);
-        Consent consent = action.isProposedArgumentSetValid(objectAdapter,
-                argArray);
-        if (consent.isVetoed()) {
-            throw JsonApplicationException.create(HttpStatusCode.NOT_ACCEPTABLE, consent.getReason());
-        }
-
-        // invoke
-        final ObjectAdapter returnedAdapter = action.execute(objectAdapter, argArray);
-
-        // response
-        if (returnedAdapter == null) {
-            return responseOfNoContent(objectAdapter.getVersion()).build();
-        }
-
-        final CollectionFacet facet = returnedAdapter.getSpecification().getFacet(CollectionFacet.class);
-        if (facet != null) {
-            final Collection<ObjectAdapter> collectionAdapters = facet
-                    .collection(returnedAdapter);
-            String json = jsonFor(collectionAdapters);
-            return responseOfOk(RepresentationType.LIST, json, Caching.NONE).build();
-        }
-
-        return responseWithRepresentationOf(returnedAdapter);
-    }
-
-
-    private List<ObjectAdapter> argumentAdaptersFor(ObjectAction action,
-        String arguments) throws JsonParseException, JsonMappingException, IOException {
-
-        List<ObjectAdapter> argumentAdapters = Lists.newArrayList();
-        // List<ObjectActionParameter> parameters = action.getParameters();
-        // for (int i = 0; i < parameters.size(); i++) {
-        // ObjectActionParameter parameter = parameters.get(i);
-        // ObjectSpecification paramSpc = parameter.getSpecification();
-        // String argument = arguments.get(i);
-        // argumentAdapters.add(objectAdapterFor(paramSpc, argument));
-        // }
-        //
-        return argumentAdapters;
-    }
-
+    
     // ///////////////////////////////////////////////////////////////////
     // parseBody
     // ///////////////////////////////////////////////////////////////////
@@ -439,26 +506,6 @@ public abstract class DomainResourceAbst
         }
 
     // //////////////////////////////////////////////////////////////
-    // responses
-    // //////////////////////////////////////////////////////////////
-
-    protected Response responseWithRepresentationOf(final ObjectAdapter objectAdapter) {
-        ResourceContext resourceContext = getResourceContext();
-        final AbstractRepresentationBuilder<?> repBuilder =
-                DomainObjectRepBuilder.newBuilder(resourceContext)
-                        .withAdapter(objectAdapter);
-
-        ResponseBuilder respBuilder = responseOfOk(RepresentationType.DOMAIN_OBJECT, repBuilder, Caching.NONE);
-
-        Version version = objectAdapter.getVersion();
-        if (version != null && version.getTime() != null) {
-            respBuilder.lastModified(version.getTime());
-        }
-        return respBuilder.build();
-    }
-
-
-    // //////////////////////////////////////////////////////////////
     // misc
     // //////////////////////////////////////////////////////////////
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.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/DomainServiceResourceServerside.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceResourceServerside.java Tue Sep 20 17:28:45 2011
@@ -127,14 +127,8 @@ public class DomainServiceResourceServer
         init();
 
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                serviceAdapter, actionId, Intent.ACCESS);
 
-        ObjectActionRepBuilder repBuilder = ObjectActionRepBuilder.newBuilder(
-                getResourceContext(), serviceAdapter, action);
-        
-        return responseOfOk(RepresentationType.OBJECT_ACTION, repBuilder, Caching.NONE)
-                .build();
+        return actionPrompt(actionId, serviceAdapter);
     }
 
     

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=1173268&r1=1173267&r2=1173268&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 17:28:45 2011
@@ -48,7 +48,6 @@ public class ObjectActionRepBuilder exte
     public JsonRepresentation build() {
 
         putDisabledReasonIfDisabled();
-        withMutatorsIfEnabled();
         
         JsonRepresentation extensions = JsonRepresentation.newMap();
         putExtensionsIsisProprietary(extensions);

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=1173268&r1=1173267&r2=1173268&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 17:28:45 2011
@@ -38,11 +38,10 @@ public class ObjectPropertyRepBuilder ex
 
         putId();
         putMemberType();
+        withValue();
     }
 
 
-
-
     public JsonRepresentation build() {
         putDisabledReasonIfDisabled();
 

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarRepBuilder.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/ScalarRepBuilder.java?rev=1173268&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarRepBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarRepBuilder.java Tue Sep 20 17:28:45 2011
@@ -0,0 +1,80 @@
+/**
+ *  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.json.viewer.resources.domainobjects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.viewer.JsonApplicationException;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
+
+public class ScalarRepBuilder extends AbstractRepresentationBuilder<ScalarRepBuilder> {
+
+    public static ScalarRepBuilder newBuilder(final ResourceContext resourceContext) {
+        return new ScalarRepBuilder(resourceContext, JsonRepresentation.newMap());
+    }
+
+    public static ScalarRepBuilder newBuilder(ResourceContext resourceContext, JsonRepresentation representation) {
+        return new ScalarRepBuilder(resourceContext, representation);
+    }
+
+    private ScalarRepBuilder(final ResourceContext resourceContext, JsonRepresentation representation) {
+        super(resourceContext, representation);
+    }
+
+    public ScalarRepBuilder withAdapter(final ObjectAdapter objectAdapter) {
+        final EncodableFacet facet = objectAdapter.getSpecification().getFacet(EncodableFacet.class);
+        if(facet == null) {
+            throw JsonApplicationException.create(HttpStatusCode.INTERNAL_SERVER_ERROR, "Not an (encodable) value", objectAdapter.titleString());
+        }
+        final String encodedString = facet.toEncodedString(objectAdapter);
+        representation.mapPut("value", encodedString);
+        return this;
+    }
+
+    @Override
+    public JsonRepresentation build() {
+ 
+        JsonRepresentation extensions = JsonRepresentation.newMap();
+        putExtensionsIsisProprietary(extensions);
+        withExtensions(extensions );
+        
+        JsonRepresentation links = JsonRepresentation.newArray();
+        addLinksFormalDomainModel(links, resourceContext);
+        addLinksIsisProprietary(links, resourceContext);
+        withLinks(links);
+
+        return representation;
+    }
+
+    /////////////////////////////////////////////////////
+    // extensions and links
+    /////////////////////////////////////////////////////
+    
+    private void putExtensionsIsisProprietary(JsonRepresentation extensions) {
+    }
+
+    private void addLinksFormalDomainModel(JsonRepresentation links, ResourceContext resourceContext) {
+    }
+
+    private void addLinksIsisProprietary(JsonRepresentation links, ResourceContext resourceContext) {
+    }
+
+    
+}
\ 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/domaintypes/DomainTypeResourceServerside.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/domaintypes/DomainTypeResourceServerside.java?rev=1173268&r1=1173267&r2=1173268&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeResourceServerside.java Tue Sep 20 17:28:45 2011
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.viewer.json.viewer.resources.domaintypes;
 
+import java.util.Collection;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -25,6 +27,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.applib.domaintypes.DomainTypeResource;
@@ -40,64 +43,94 @@ public class DomainTypeResourceServersid
 
 
     @GET
-    @Path("/{domainTypeName}")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response representationType(@PathParam("domainTypeName") final String representationTypeName) {
+    @Path("/")
+    @Produces({ MediaType.APPLICATION_JSON })
+    public Response domainTypes() {
         init();
 
         JsonRepresentation representation = JsonRepresentation.newMap();
-        representation.mapPut("representationType", LinkToBuilder.newBuilder(getResourceContext(), "representationType", "representationTypes/representationType").build());
-        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "representationType/" + representationTypeName).build());
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainTypes").build());
+        
+        JsonRepresentation specList = JsonRepresentation.newArray();
+        final Collection<ObjectSpecification> allSpecifications = getSpecificationLoader().allSpecifications();
+        for (ObjectSpecification objectSpec : allSpecifications) {
+            final LinkToBuilder linkBuilder = LinkToBuilder.newBuilder(getResourceContext(), "domainType", "domainTypes/%s", objectSpec.getFullIdentifier());
+            specList.arrayAdd(linkBuilder.build());
+        }
+        
+        representation.mapPut("domainTypes", specList);
         
         return responseOfOk(RepresentationType.DOMAIN_TYPE, representation, Caching.ONE_DAY).build();
     }
 
-
-    @GET
-    @Path("/")
-    @Produces({ MediaType.APPLICATION_JSON })
-    public Response domainTypes() {
-        return null;
-    }
-
+    
     @GET
     @Path("/{domainType}")
     @Produces({ MediaType.APPLICATION_JSON })
     public Response domainType(@PathParam("domainType") final String domainType){
-        return null;
+        init();
+
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainTypes/%s", domainType).build());
+        
+        return responseOfOk(RepresentationType.DOMAIN_TYPE, representation, Caching.ONE_DAY).build();
     }
 
     @GET
     @Path("/{domainType}/properties/{propertyId}")
     @Produces({ MediaType.APPLICATION_JSON })
-    public Response typeProperty(@PathParam("domainType") final String domainType,
-        @PathParam("propertyId") final String propertyId){
-        return null;
+    public Response typeProperty(
+            @PathParam("domainType") final String domainType,
+            @PathParam("propertyId") final String propertyId){
+        init();
+
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainTypes/%s/properties/%s", domainType, propertyId).build());
+        
+        return responseOfOk(RepresentationType.DOMAIN_TYPE_PROPERTY, representation, Caching.ONE_DAY).build();
     }
 
     @GET
     @Path("/{domainType}/collections/{collectionId}")
     @Produces({ MediaType.APPLICATION_JSON })
-    public Response typeCollection(@PathParam("domainType") final String domainType,
-        @PathParam("collectionId") final String collectionId){
-        return null;
+    public Response typeCollection(
+            @PathParam("domainType") final String domainType,
+            @PathParam("collectionId") final String collectionId){
+        init();
+
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainType/%s/collections/%s", domainType, collectionId).build());
+        
+        return responseOfOk(RepresentationType.DOMAIN_TYPE_COLLECTION, representation, Caching.ONE_DAY).build();
     }
 
     @GET
     @Path("/{domainType}/actions/{actionId}")
     @Produces({ MediaType.APPLICATION_JSON })
-    public Response typeAction(@PathParam("domainType") final String domainType,
-        @PathParam("actionId") final String actionId){
-        return null;
+    public Response typeAction(
+            @PathParam("domainType") final String domainType,
+            @PathParam("actionId") final String actionId){
+        init();
+
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainTypes/%s/actions/%s", domainType, actionId).build());
+        
+        return responseOfOk(RepresentationType.DOMAIN_TYPE_ACTION, representation, Caching.ONE_DAY).build();
     }
 
     @GET
-    @Path("/{domainType}/actions/{actionId}/params/{paramNum}")
+    @Path("/{domainType}/actions/{actionId}/params/{paramName}")
     @Produces({ MediaType.APPLICATION_JSON })
-    public Response typeActionParam(@PathParam("domainType") final String domainType,
-        @PathParam("actionId") final String actionId, @PathParam("paramNum") final int paramNum){
-        return null;
-    }
+    public Response typeActionParam(
+            @PathParam("domainType") final String domainType,
+            @PathParam("actionId") final String actionId,
+            @PathParam("paramName") final String paramName){
+        init();
 
+        JsonRepresentation representation = JsonRepresentation.newMap();
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "domainTypes/%s/actions/%s/params/%s", domainType, actionId, paramName).build());
+        
+        return responseOfOk(RepresentationType.DOMAIN_TYPE_COLLECTION, representation, Caching.ONE_DAY).build();
+    }
 
 }
\ No newline at end of file