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/13 08:59:12 UTC

svn commit: r1170062 [2/2] - in /incubator/isis/trunk/framework/viewer/json: json-tck/src/test/java/org/apache/isis/viewer/json/tck/ json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ json-viewer/src/main/java/org/apache/isis/viewer/json/vie...

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberSelfRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberSelfRepBuilder.java?rev=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberSelfRepBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberSelfRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,58 @@
+/**
+ *  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.spec.feature.ObjectMember;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
+import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
+
+public class MemberSelfRepBuilder extends AbstractRepresentationBuilder<MemberSelfRepBuilder> {
+
+    public static MemberSelfRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
+        return new MemberSelfRepBuilder(resourceContext, objectAdapter, memberType, objectMember);
+    }
+
+    private final ObjectAdapter objectAdapter;
+    private final MemberType memberType;
+    private final ObjectMember objectMember;
+
+    public MemberSelfRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, MemberType memberType, ObjectMember objectMember) {
+        super(resourceContext);
+        this.objectAdapter = objectAdapter;
+        this.memberType = memberType;
+        this.objectMember = objectMember;
+    }
+    
+    public JsonRepresentation build() {
+        representation.mapPut("link", memberLinkRep());
+        representation.mapPut("object", domainObjectLinkRep());
+        return representation;
+    }
+
+    private JsonRepresentation memberLinkRep() {
+        String url = AbstractObjectMemberRepBuilder.urlForMember(objectAdapter, memberType, objectMember, getOidStringifier());
+        return LinkToBuilder.newBuilder(resourceContext, "member", url).build();
+    }
+    
+    private JsonRepresentation domainObjectLinkRep() {
+        return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, "object", objectAdapter, getOidStringifier()).build();
+    }
+
+}
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/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=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MemberType.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,134 @@
+/**
+ *  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 java.util.Map;
+
+import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertyClearFacet;
+import org.apache.isis.core.metamodel.facets.properties.modify.PropertySetterFacet;
+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.ObjectMember;
+import org.apache.isis.core.progmodel.facets.actions.validate.ActionValidationFacet;
+import org.apache.isis.core.progmodel.facets.collections.validate.CollectionValidateAddToFacet;
+import org.apache.isis.core.progmodel.facets.collections.validate.CollectionValidateRemoveFromFacet;
+import org.apache.isis.core.progmodel.facets.properties.validate.PropertyValidateFacet;
+import org.apache.isis.viewer.json.applib.util.Enums;
+import org.apache.isis.viewer.json.viewer.representations.HttpMethod;
+
+import com.google.common.collect.ImmutableMap;
+
+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)
+            )) {
+        @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)
+            )) {
+        @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")
+            )) {
+        @Override
+        public ObjectSpecification specFor(ObjectMember objectMember) {
+            ObjectAction objectAction = (ObjectAction) objectMember;
+            return objectAction.getReturnType();
+        }
+    };
+
+    private final Map<String, MutatorSpec> mutators;
+    
+    private final String urlPart;
+    private final String detailsRel;
+    private final String name;
+    private final String jsProp;
+    
+    private MemberType(String urlPart, String jsProp, String detailsRel, Map<String, MutatorSpec> mutators) {
+        this.urlPart = urlPart;
+        this.jsProp = jsProp;
+        this.detailsRel = detailsRel;
+        this.mutators = mutators;
+        name = Enums.enumToCamelCase(this);
+    }
+
+    public String getJsProp() {
+        return jsProp;
+    }
+
+    public String urlPart() {
+        return urlPart;
+    }
+    
+    public Map<String, MutatorSpec> getMutators() {
+        return mutators;
+    }
+    
+    public abstract ObjectSpecification specFor(ObjectMember objectMember);
+
+    public boolean isProperty() {
+        return this == MemberType.OBJECT_PROPERTY;
+    }
+
+    public boolean isCollection() {
+        return this == MemberType.OBJECT_COLLECTION;
+    }
+
+    public boolean isAction() {
+        return this == MemberType.OBJECT_ACTION;
+    }
+
+    public static MemberType lookup(final String memberTypeName) {
+        for (MemberType memberType : values()) {
+            if(memberType.getName().equals(memberTypeName)) {
+                return memberType;
+            }
+        }
+    	return null;
+    }
+
+	public static MemberType of(ObjectMember objectMember) {
+		return objectMember.isAction()?
+				OBJECT_ACTION:
+					objectMember.isOneToOneAssociation()?
+						OBJECT_PROPERTY:
+						OBJECT_COLLECTION;
+	}
+
+    public String getDetailsRel() {
+        return detailsRel;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+}

Added: 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=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/MutatorSpec.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,47 @@
+/**
+ *  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.facetapi.Facet;
+import org.apache.isis.viewer.json.viewer.representations.HttpMethod;
+
+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);
+    }
+
+    public static MutatorSpec of(Class<? extends Facet> validationFacetType, Class<? extends Facet> mutatorFacetType, HttpMethod httpMethod, BodyArgs argSpec, String suffix) {
+        return new MutatorSpec(validationFacetType, mutatorFacetType, httpMethod, argSpec, suffix);
+    }
+
+    public final Class<? extends Facet> validationFacetType;
+    public final Class<? extends Facet> mutatorFacetType;
+    public final HttpMethod httpMethod;
+    public final String suffix;
+    public final BodyArgs arguments;
+
+    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.arguments = bodyArgs;
+        this.suffix = suffix;
+    }
+
+}
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/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=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,160 @@
+/**
+ *  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 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.applib.JsonRepresentation;
+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 com.google.common.collect.Lists;
+
+public class ObjectActionRepBuilder extends AbstractObjectMemberRepBuilder<ObjectActionRepBuilder, ObjectAction> {
+
+	public static ObjectActionRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, ObjectAction objectAction) {
+        return new ObjectActionRepBuilder(resourceContext, objectAdapter, objectAction);
+    }
+
+    protected ObjectActionRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, ObjectAction objectAction) {
+        super(resourceContext, objectAdapter, MemberType.OBJECT_ACTION, objectAction);
+        
+        putId();
+        putMemberType();
+
+        putDisabledReasonIfDisabled();
+        withMutatorsIfEnabled();
+        
+        JsonRepresentation extensions = JsonRepresentation.newMap();
+        putExtensionsIsisProprietary(extensions);
+        
+        JsonRepresentation links = JsonRepresentation.newArray();
+        addLinksFormalDomainModel(links, resourceContext);
+        addLinksIsisProprietary(links, resourceContext);
+    }
+
+
+     private void putExtensionsIsisProprietary(JsonRepresentation extensions) {
+        extensions.mapPut("actionType", objectMember.getType());
+        withExtensions(extensions );
+    }
+
+     private void addLinksFormalDomainModel(JsonRepresentation links, ResourceContext resourceContext) {
+         links.arrayAdd(TypeActionRepBuilder.newLinkToBuilder(resourceContext, "typeAction", objectAdapter.getSpecification(), objectMember).build());
+     }
+
+     private void addLinksIsisProprietary(JsonRepresentation links, ResourceContext resourceContext) {
+       if(objectMember.isContributed()) {
+            ObjectAdapter serviceAdapter = contributingServiceAdapter();
+            JsonRepresentation contributedByLink = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, "contributedBy", serviceAdapter, getOidStringifier()).build();
+            links.arrayAdd(contributedByLink);
+        }
+
+       links.arrayAdd(DomainTypeRepBuilder.newLinkToBuilder(resourceContext, "domainType", objectAdapter.getSpecification()).build());
+       
+        withLinks(links);
+    }
+
+    public JsonRepresentation build() {
+        return representation;
+    }
+    
+	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");
+	}
+
+    public ObjectActionRepBuilder withParameterDetails() {
+    	List<Object> parameters = Lists.newArrayList();
+		for (int i=0; i< objectMember.getParameterCount(); i++) {
+			ObjectActionParameter param = objectMember.getParameters().get(i);
+			parameters.add(paramDetails(param));
+		}
+		representation.mapPut("parameters", parameters);
+		return this;
+	}
+
+	private Object paramDetails(ObjectActionParameter param) {
+		final JsonRepresentation paramRep = JsonRepresentation.newMap();
+		paramRep.mapPut("name", param.getName());
+		paramRep.mapPut("num", param.getNumber());
+		paramRep.mapPut("description", param.getDescription());
+		Object paramChoices = choicesFor(param);
+		if(paramChoices != null) {
+			paramRep.mapPut("choices", paramChoices);
+		}
+		Object paramDefault = defaultFor(param);
+		if(paramDefault != null) {
+			paramRep.mapPut("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(resourceContext, 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(resourceContext, defaultAdapter, objectSpec, getOidStringifier(), getLocalization());
+	}
+
+	@Override
+	protected JsonRepresentation appendMutatorArgs(MutatorSpec mutatorSpec) {
+	    JsonRepresentation argList = JsonRepresentation.newArray();
+        for(int i=0; i<objectMember.getParameterCount(); i++) {
+            argList.arrayAdd(argValueFor(i)); 
+        }
+        return argList;
+    }
+
+	private Object argValueFor(int i) {
+    	if(objectMember.isContributed()) {
+    		ObjectActionParameter actionParameter = objectMember.getParameters().get(i);
+    		if (actionParameter.getSpecification().isOfType(objectAdapter.getSpecification())) {
+    			return DomainObjectRepBuilder.newLinkToBuilder(resourceContext, "object", objectAdapter, getOidStringifier()).build();
+    		}
+    	}
+    	return "{value}";
+	}
+
+}
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkToBuilder.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/ObjectAdapterLinkToBuilder.java?rev=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkToBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkToBuilder.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,13 @@
+package org.apache.isis.viewer.json.viewer.resources.domainobjects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.RepBuilder;
+
+public interface ObjectAdapterLinkToBuilder extends RepBuilder {
+
+    ObjectAdapterLinkToBuilder usingResourceContext(ResourceContext resourceContext);
+    
+    ObjectAdapterLinkToBuilder with(ObjectAdapter objectAdapter);
+    
+}

Added: 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=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectCollectionRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,70 @@
+/**
+ *  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 java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
+
+import com.google.common.collect.Lists;
+
+public class ObjectCollectionRepBuilder extends AbstractObjectMemberRepBuilder<ObjectCollectionRepBuilder, OneToManyAssociation> {
+
+    public static ObjectCollectionRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
+        return new ObjectCollectionRepBuilder(resourceContext, objectAdapter, otma);
+    }
+
+    public ObjectCollectionRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToManyAssociation otma) {
+        super(resourceContext, objectAdapter, MemberType.OBJECT_COLLECTION, otma);
+
+        putId();
+        putMemberType();
+        putDisabledReasonIfDisabled();
+        
+        withLinks();
+        withExtensions();
+    }
+
+    public JsonRepresentation build() {
+        return representation;
+    }
+
+    @Override
+    protected Object valueRep() {
+        ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
+        if(valueAdapter == null) {
+            return null;
+        }
+        final CollectionFacet facet = CollectionFacetUtils.getCollectionFacetFromSpec(valueAdapter);
+        List<JsonRepresentation> list = Lists.newArrayList();
+        for (final ObjectAdapter elementAdapter : facet.iterable(valueAdapter)) {
+
+            LinkToBuilder newBuilder = DomainObjectRepBuilder.newLinkToBuilder(resourceContext, "object", elementAdapter, getOidStringifier());
+
+			list.add(newBuilder.build());
+        }
+        
+        return list;
+    }
+
+}
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/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=1170062&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -0,0 +1,81 @@
+/**
+ *  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 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.OneToOneAssociation;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.viewer.ResourceContext;
+
+import com.google.common.collect.Lists;
+
+public class ObjectPropertyRepBuilder extends AbstractObjectMemberRepBuilder<ObjectPropertyRepBuilder, OneToOneAssociation> {
+
+    public static ObjectPropertyRepBuilder newBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        return new ObjectPropertyRepBuilder(resourceContext, objectAdapter, otoa);
+    }
+
+    public ObjectPropertyRepBuilder(ResourceContext resourceContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        super(resourceContext, objectAdapter, MemberType.OBJECT_PROPERTY, otoa);
+
+        putId();
+        putMemberType();
+        putDisabledReasonIfDisabled();
+        
+        withLinks();
+        withExtensions();
+    }
+
+    public JsonRepresentation build() {
+        return representation;
+    }
+
+
+	@Override
+    protected Object valueRep() {
+        ObjectAdapter valueAdapter = objectMember.get(objectAdapter);
+        if(valueAdapter == null) {
+		    return null;
+		}
+        return DomainObjectRepBuilder.valueOrRef(resourceContext, valueAdapter, objectMember.getSpecification(), getOidStringifier(), getLocalization());
+    }
+
+    public ObjectPropertyRepBuilder withChoices() {
+		Object propertyChoices = propertyChoices();
+		if(propertyChoices != null) {
+			representation.mapPut("choices", propertyChoices);
+		}
+		return this;
+	}
+
+	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(resourceContext, choiceAdapter, objectSpec, getOidStringifier(), getLocalization()));
+        }
+        return list;
+	}
+
+}
\ 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/AbstractTypeMemberRepBuilder.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/AbstractTypeMemberRepBuilder.java?rev=1170062&r1=1170061&r2=1170062&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeMemberRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeMemberRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -19,10 +19,10 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
 import org.apache.isis.viewer.json.viewer.resources.domainobjects.MemberType;
 
-public abstract class AbstractTypeMemberRepBuilder<R extends RepresentationBuilder<R>, T extends ObjectMember> extends RepresentationBuilder<R> {
+public abstract class AbstractTypeMemberRepBuilder<R extends AbstractRepresentationBuilder<R>, T extends ObjectMember> extends AbstractRepresentationBuilder<R> {
 
     protected final ObjectSpecification objectSpecification;
     protected final MemberType memberType;

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeRepBuilder.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/DomainTypeRepBuilder.java?rev=1170062&r1=1170061&r2=1170062&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -19,19 +19,19 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
-import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
+import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
 
-public class DomainTypeRepBuilder extends RepresentationBuilder<DomainTypeRepBuilder> {
+public class DomainTypeRepBuilder extends AbstractRepresentationBuilder<DomainTypeRepBuilder> {
 
     public static DomainTypeRepBuilder newBuilder(ResourceContext representationContext) {
         return new DomainTypeRepBuilder(representationContext);
     }
 
-    public static LinkBuilder newLinkToBuilder(ResourceContext resourceContext, String rel, ObjectSpecification objectSpec) {
+    public static LinkToBuilder newLinkToBuilder(ResourceContext resourceContext, String rel, ObjectSpecification objectSpec) {
         String typeFullName = objectSpec.getFullIdentifier();
         String url = "domainTypes/" + typeFullName;
-        return LinkBuilder.newBuilder(resourceContext, rel, url);
+        return LinkToBuilder.newBuilder(resourceContext, rel, url);
     }
 
     public DomainTypeRepBuilder(ResourceContext resourceContext) {

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=1170062&r1=1170061&r2=1170062&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 13 06:59:11 2011
@@ -27,7 +27,7 @@ import javax.ws.rs.core.Response;
 
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.domaintypes.DomainTypeResource;
-import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
 
 /**
@@ -45,8 +45,8 @@ public class DomainTypeResourceServersid
         init();
 
         JsonRepresentation representation = JsonRepresentation.newMap();
-        representation.mapPut("representationType", LinkBuilder.newBuilder(getResourceContext(), "representationType", "representationTypes/representationType").build());
-        representation.mapPut("self", LinkBuilder.newBuilder(getResourceContext(), "self", "representationType/" + representationTypeName).build());
+        representation.mapPut("representationType", LinkToBuilder.newBuilder(getResourceContext(), "representationType", "representationTypes/representationType").build());
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "representationType/" + representationTypeName).build());
         
         return responseOfOk(jsonFor(representation));
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionRepBuilder.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/TypeActionRepBuilder.java?rev=1170062&r1=1170061&r2=1170062&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -20,7 +20,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
 import org.apache.isis.viewer.json.viewer.resources.domainobjects.MemberType;
 
 public class TypeActionRepBuilder extends AbstractTypeMemberRepBuilder<TypeActionRepBuilder, ObjectAction> {
@@ -29,11 +29,11 @@ public class TypeActionRepBuilder extend
         return new TypeActionRepBuilder(representationContext, objectSpecification, objectAction);
     }
 
-    public static LinkBuilder newLinkToBuilder(ResourceContext resourceContext, String rel, ObjectSpecification objectSpecification, ObjectAction objectAction) {
+    public static LinkToBuilder newLinkToBuilder(ResourceContext resourceContext, String rel, ObjectSpecification objectSpecification, ObjectAction objectAction) {
         String typeFullName = objectSpecification.getFullIdentifier();
         String actionId = objectAction.getId();
         String url = "domainTypes/" + typeFullName + "/actions/" + actionId;
-        return LinkBuilder.newBuilder(resourceContext, rel, url);
+        return LinkToBuilder.newBuilder(resourceContext, rel, url);
     }
 
     public TypeActionRepBuilder(ResourceContext resourceContext, ObjectSpecification objectSpecification, ObjectAction objectAction) {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java?rev=1170062&r1=1170061&r2=1170062&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageResourceServerside.java Tue Sep 13 06:59:11 2011
@@ -30,7 +30,7 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.homepage.HomePageResource;
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
-import org.apache.isis.viewer.json.viewer.representations.LinkBuilder;
+import org.apache.isis.viewer.json.viewer.representations.LinkToBuilder;
 import org.apache.isis.viewer.json.viewer.resources.ResourceAbstract;
 
 /**
@@ -49,10 +49,10 @@ public class HomePageResourceServerside 
         
         JsonRepresentation representation = JsonRepresentation.newMap();
         
-        representation.mapPut("self", LinkBuilder.newBuilder(getResourceContext(), "self", "").build());
-        representation.mapPut("user", LinkBuilder.newBuilder(getResourceContext(), "user", "user").build());
-        representation.mapPut("services", LinkBuilder.newBuilder(getResourceContext(), "services", "services").build());
-        representation.mapPut("capabilities", LinkBuilder.newBuilder(getResourceContext(), "capabilities", "capabilities").build());
+        representation.mapPut("self", LinkToBuilder.newBuilder(getResourceContext(), "self", "").build());
+        representation.mapPut("user", LinkToBuilder.newBuilder(getResourceContext(), "user", "user").build());
+        representation.mapPut("services", LinkToBuilder.newBuilder(getResourceContext(), "services", "services").build());
+        representation.mapPut("capabilities", LinkToBuilder.newBuilder(getResourceContext(), "capabilities", "capabilities").build());
 
         representation.mapPut("links", JsonRepresentation.newArray());
         representation.mapPut("extensions", JsonRepresentation.newMap());

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java?rev=1170062&r1=1170061&r2=1170062&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserRepBuilder.java Tue Sep 13 06:59:11 2011
@@ -19,9 +19,9 @@ package org.apache.isis.viewer.json.view
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.viewer.ResourceContext;
-import org.apache.isis.viewer.json.viewer.representations.RepresentationBuilder;
+import org.apache.isis.viewer.json.viewer.representations.AbstractRepresentationBuilder;
 
-public class UserRepBuilder extends RepresentationBuilder<UserRepBuilder> {
+public class UserRepBuilder extends AbstractRepresentationBuilder<UserRepBuilder> {
 
     public static UserRepBuilder newBuilder(ResourceContext resourceContext) {
         return new UserRepBuilder(resourceContext);