You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2011/06/23 19:04:48 UTC

svn commit: r1138992 - in /incubator/isis/trunk/viewer/restful/viewer2/src: main/java/META-INF/ main/java/org/apache/isis/viewer/restful/viewer2/ main/java/org/apache/isis/viewer/restful/viewer2/embedded/ main/java/org/apache/isis/viewer/restful/viewer...

Author: danhaywood
Date: Thu Jun 23 17:04:47 2011
New Revision: 1138992

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

Added:
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepBuilder.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/Representation.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/RepresentationBuilder.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeBuilder.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepBuilder.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberSelfRepBuilder.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepBuilder.java
Removed:
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/META-INF/
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/ActionRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/CollectionRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberRep.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRep.java
Modified:
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/embedded/EmbeddedWebViewerRestful.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java
    incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/RepContext.java Thu Jun 23 17:04:47 2011
@@ -20,14 +20,11 @@ package org.apache.isis.viewer.restful.v
 
 import java.util.Arrays;
 
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
 
 /**
  * The context within which this representation is being requested.
@@ -41,7 +38,7 @@ import com.google.common.collect.Lists;
  * representation will be keyed under.  This is required in order that
  * 'rel' links for attributes correctly concatenate.  It is also used to
  * infer whether member representations (which appear in summary form in
- * the {@link DomainObjectRep} and in more detail in their own resources)
+ * the {@link Representation} and in more detail in their own resources)
  * should include a _self attribute or not.
  */
 public class RepContext {
@@ -75,4 +72,11 @@ public class RepContext {
     public boolean hasAttribute() {
         return attribute != null;
     }
+
+    /**
+     * Returns a new {@link RepContext} with a different attribute.
+     */
+    public RepContext underAttribute(String attribute) {
+        return resourceContext.repContext(attribute);
+    }
 }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/embedded/EmbeddedWebViewerRestful.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/embedded/EmbeddedWebViewerRestful.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/embedded/EmbeddedWebViewerRestful.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/embedded/EmbeddedWebViewerRestful.java Thu Jun 23 17:04:47 2011
@@ -19,8 +19,8 @@
 package org.apache.isis.viewer.restful.viewer2.embedded;
 
 import org.apache.isis.core.commons.lang.MapUtils;
-import org.apache.isis.core.webapp.content.ResourceServlet;
 import org.apache.isis.core.webapp.content.ResourceCachingFilter;
+import org.apache.isis.core.webapp.content.ResourceServlet;
 import org.apache.isis.runtimes.dflt.runtime.viewer.web.WebAppSpecification;
 import org.apache.isis.runtimes.dflt.runtime.web.EmbeddedWebViewer;
 import org.apache.isis.runtimes.dflt.webapp.IsisSessionFilter;

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/LinkRepBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,63 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.representations;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+
+public class LinkRepBuilder extends RepresentationBuilder {
+
+    public static LinkRepBuilder newBuilder(RepContext repContext, String relSuffix, String url) {
+        return new LinkRepBuilder(repContext, relSuffix, url);
+    }
+    public static TypeBuilder newTypeBuilder(RepContext repContext, String relSuffix, ObjectSpecification objectSpec) {
+        return new TypeBuilder(repContext, relSuffix, objectSpec);
+    }
+
+    private final String relSuffix;
+    private final String url;
+    
+    private HttpMethod method = HttpMethod.GET;
+    private String title;
+    private String body;
+    
+    public LinkRepBuilder(RepContext repContext, String relSuffix, String url) {
+        super(repContext);
+        this.relSuffix = relSuffix;
+        this.url = url;
+    }
+    public LinkRepBuilder withMethod(HttpMethod method) {
+        this.method = method;
+        return this;
+    }
+    public LinkRepBuilder withTitle(String title) {
+        this.title = title;
+        return this;
+    }
+    public LinkRepBuilder withBody(String body) {
+        this.body = body;
+        return this;
+    }
+    public Representation build() {
+        representation.put("rel", repContext.relFor(relSuffix));
+        representation.put("url", repContext.urlFor(url));
+        representation.put("method", method);
+        representation.put("title", title);
+        representation.put("body", body);
+        return representation;
+    }
+}
\ No newline at end of file

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/Representation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/Representation.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/Representation.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/Representation.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,37 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.representations;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;
+
+public class Representation extends LinkedHashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public Object put(String key, Object value) {
+        if(value ==null) {
+            return null;
+        }
+        return super.put(key, value);
+    }
+
+    
+}

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/RepresentationBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/RepresentationBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/RepresentationBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/RepresentationBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,57 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.representations;
+
+import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
+import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+
+public abstract class RepresentationBuilder {
+
+    protected final RepContext repContext;
+    protected final Representation representation = new Representation();
+    
+    public RepresentationBuilder(RepContext repContext) {
+        this.repContext = repContext;
+    }
+
+    protected OidStringifier getOidStringifier() {
+        return getOidGenerator().getOidStringifier();
+    }
+
+    protected OidGenerator getOidGenerator() {
+        return getPersistenceSession().getOidGenerator();
+    }
+
+    protected PersistenceSession getPersistenceSession() {
+        return IsisContext.getPersistenceSession();
+    }
+
+    protected AuthenticationSession getSession() {
+        return IsisContext.getAuthenticationSession();
+    }
+
+    protected Localization getLocalization() {
+        return IsisContext.getLocalization();
+    }
+
+
+}
\ No newline at end of file

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/representations/TypeBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,72 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.representations;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+
+import com.google.common.collect.Maps;
+
+public class TypeBuilder extends LinkRepBuilder {
+    
+    private static Map<String,String> WELL_KNOWN_TYPES =
+        mapOf(
+            java.lang.String.class.getName(), "string",
+            java.lang.Byte.class.getName(), "byte",
+            java.lang.Short.class.getName(), "short",
+            java.lang.Integer.class.getName(), "int",
+            java.lang.Long.class.getName(), "long",
+            java.lang.Float.class.getName(), "float",
+            java.lang.Double.class.getName(), "double",
+            java.math.BigInteger.class.getName(), "bigint",
+            java.math.BigDecimal.class.getName(), "bigdec"
+            );
+
+    public TypeBuilder(RepContext repContext, String relSuffix, ObjectSpecification objectSpec) {
+        super(repContext, relSuffix, urlFor(objectSpec));
+    }
+    
+    private static String urlFor(ObjectSpecification objectSpec) {
+        return "types/application/vnd+" + map(objectSpec.getFullIdentifier());
+    }
+
+    private static String map(String className) {
+        String wellKnownType = WELL_KNOWN_TYPES.get(className);
+        return wellKnownType != null? wellKnownType: className;
+    }
+
+    /**
+     * Utility to converts varargs into an immutable map. 
+     */
+    private static Map<String, String> mapOf(String... keyOrValues) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        String key = null;
+        for(String keyOrValue: keyOrValues) {
+            if(key != null) {
+                map.put(key, keyOrValue);
+                key = null;
+            } else {
+                key = keyOrValue;
+            }
+        }
+        return Collections.unmodifiableMap(map);
+    }
+
+}
\ No newline at end of file

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/ResourceAbstract.java Thu Jun 23 17:04:47 2011
@@ -43,7 +43,6 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.restful.viewer2.ResourceContext;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
 import org.apache.isis.viewer.restful.viewer2.util.OidUtils;
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/bootstrap/BootstrapResourceImpl.java Thu Jun 23 17:04:47 2011
@@ -27,7 +27,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.viewer.restful.applib2.resources.BootstrapResource;
-import org.apache.isis.viewer.restful.applib2.resources.HomePageResource;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
 
 import com.google.common.io.ByteStreams;

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/home/HomePageResourceImpl.java Thu Jun 23 17:04:47 2011
@@ -23,7 +23,8 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.viewer.restful.applib2.resources.HomePageResource;
-import org.apache.isis.viewer.restful.viewer2.representations.LinkRep;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRepBuilder;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
 
 /**
@@ -39,15 +40,15 @@ public class HomePageResourceImpl extend
     public String resources() {
         init();
         
-        HomePageRep homePageRepresentation = new HomePageRep();
-        homePageRepresentation.setUser(linkTo("user"));
-
-        homePageRepresentation.setServices(linkTo("services"));
-        return asJson(homePageRepresentation);
+        Representation representation = new Representation();
+        representation.put("user", linkTo("user"));
+        representation.put("services", linkTo("services"));
+        
+        return asJson(representation);
     }
 
-    protected LinkRep linkTo(String url) {
-        return LinkRep.newBuilder(getResourceContext().repContext(url), null, url).build();
+    protected Representation linkTo(String url) {
+        return LinkRepBuilder.newBuilder(getResourceContext().repContext(url), null, url).build();
     }
 
 

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectRepBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,104 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.resources.objects;
+
+import java.util.Map;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRepBuilder;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
+import org.apache.isis.viewer.restful.viewer2.representations.RepresentationBuilder;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Maps;
+
+public class DomainObjectRepBuilder extends RepresentationBuilder{
+
+    public static DomainObjectRepBuilder newBuilder(RepContext representationContext, ObjectAdapter objectAdapter) {
+        return new DomainObjectRepBuilder(representationContext, objectAdapter);
+    }
+
+    private final ObjectAdapter objectAdapter;
+    private final Map<String, Representation> members = Maps.newLinkedHashMap();
+    
+    public DomainObjectRepBuilder(RepContext repContext, ObjectAdapter objectAdapter) {
+        super(repContext);
+        this.objectAdapter = objectAdapter;
+    }
+    
+    public Representation build() {
+        RepContext repContext = this.repContext.underAttribute("_self");
+        Representation selfLink = LinkRepBuilder.newBuilder(repContext, "link", urlFor(objectAdapter)).build();
+        Representation selfType = LinkRepBuilder.newTypeBuilder(repContext, "type", objectAdapter.getSpecification()).build();
+        String title = objectAdapter.titleString();
+        Representation iconLink = LinkRepBuilder.newBuilder(repContext, "icon", iconFor(objectAdapter)).build();
+        Representation self = new Representation();
+        self.put("link", selfLink);
+        self.put("type", selfType);
+        self.put("title", title);
+        self.put("icon", iconLink);
+        representation.put("_self", self);
+        if(!members.isEmpty()) {
+            for(Map.Entry<String, Representation> entry: members.entrySet()) {
+                String memberId = entry.getKey();
+                Representation memberRep = entry.getValue();
+                representation.put(memberId, memberRep);
+            }
+        }
+        return representation;
+    }
+
+    public void withProperty(String id, Representation propertyRep) {
+        members.put(id, propertyRep);
+    }
+
+    private String iconFor(ObjectAdapter objectAdapter) {
+        String iconName = objectAdapter.getIconName();
+        return "images/" + iconName + ".png";
+    }
+
+    private String urlFor(ObjectAdapter objectAdapter) {
+        OidStringifier oidStringifier = getOidStringifier();
+        return urlFor(objectAdapter, oidStringifier);
+    }
+
+    public static String urlFor(ObjectAdapter objectAdapter, OidStringifier oidStringifier) {
+        String oidStr = oidStringifier.enString(objectAdapter.getOid());
+        return "objects/" + oidStr;
+    }
+
+    public static Function<ObjectAdapter, Representation> fromAdapter(final RepContext repContext) {
+        return new Function<ObjectAdapter, Representation>() {
+            @Override
+            public Representation apply(ObjectAdapter input) {
+                return newBuilder(repContext, input).build();
+            }
+        };
+    }
+
+    public static Function<Representation, Representation> selfOf() {
+        return new Function<Representation, Representation>() {
+            @Override
+            public Representation apply(Representation input) {
+                return (Representation) input.get("_self");
+            }
+        };
+    }
+
+}
\ No newline at end of file

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/DomainObjectResourceImpl.java Thu Jun 23 17:04:47 2011
@@ -32,15 +32,12 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.restful.applib2.resources.ObjectResource;
-import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep.Builder;
 import org.apache.isis.viewer.restful.viewer2.util.UrlDecoderUtils;
 
 @Path("/objects")
@@ -58,19 +55,19 @@ public class DomainObjectResourceImpl ex
             throw new WebApplicationException(responseOfGone("could not determine object"));
         }
 
-        Builder builder = DomainObjectRep.newBuilder(getResourceContext().repContext(), objectAdapter);
+        DomainObjectRepBuilder builder = DomainObjectRepBuilder.newBuilder(getResourceContext().repContext(), objectAdapter);
         
         List<ObjectAssociation> properties = objectAdapter.getSpecification().getAssociations(ObjectAssociationFilters.PROPERTIES);
         for (ObjectAssociation otoa : properties) {
             Consent visibility = otoa.isVisible(getSession(), objectAdapter);
             if(visibility.isAllowed()) {
                 String id = otoa.getId();
-                PropertyRep propertyRep = PropertyRep.newBuilder(getResourceContext().repContext(id), objectAdapter, (OneToOneAssociation)otoa).build();
+                Representation propertyRep = PropertyRepBuilder.newBuilder(getResourceContext().repContext(id), objectAdapter, (OneToOneAssociation)otoa).build();
                 builder.withProperty(id, propertyRep);
             }
         }
         
-        DomainObjectRep representation = builder.build();
+        Representation representation = builder.build();
         return asJson(representation);
     }
 

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberSelfRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberSelfRepBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberSelfRepBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/MemberSelfRepBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,50 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.resources.objects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
+import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
+import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRepBuilder;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
+import org.apache.isis.viewer.restful.viewer2.representations.RepresentationBuilder;
+
+public class MemberSelfRepBuilder extends RepresentationBuilder {
+
+    public static MemberSelfRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        return new MemberSelfRepBuilder(repContext, objectAdapter, otoa);
+    }
+
+    private final ObjectAdapter objectAdapter;
+    private final ObjectMember objectMember;
+
+    public MemberSelfRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, ObjectMember objectMember) {
+        super(repContext);
+        this.objectAdapter = objectAdapter;
+        this.objectMember = objectMember;
+    }
+    
+    public Representation build() {
+        representation.put("link", LinkRepBuilder.newBuilder(repContext, "link", DomainObjectRepBuilder.urlFor(objectAdapter, getOidStringifier())).build());
+        return representation;
+    }
+}
\ No newline at end of file

Added: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepBuilder.java?rev=1138992&view=auto
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepBuilder.java (added)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/objects/PropertyRepBuilder.java Thu Jun 23 17:04:47 2011
@@ -0,0 +1,105 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.restful.viewer2.resources.objects;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.stringable.OidStringifier;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.HttpMethod;
+import org.apache.isis.viewer.restful.viewer2.representations.LinkRepBuilder;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
+import org.apache.isis.viewer.restful.viewer2.representations.RepresentationBuilder;
+
+public class PropertyRepBuilder extends RepresentationBuilder {
+
+    public static PropertyRepBuilder newBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        return new PropertyRepBuilder(repContext, objectAdapter, otoa);
+    }
+
+
+    private final ObjectAdapter objectAdapter;
+    private final OneToOneAssociation otoa;
+
+    public PropertyRepBuilder(RepContext repContext, ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        super(repContext);
+        this.objectAdapter = objectAdapter;
+        this.otoa = otoa;
+    }
+
+    public Representation build() {
+        if(addSelf()) {
+            Representation selfLink = LinkRepBuilder.newBuilder(repContext, "link", urlFor(objectAdapter, otoa)).build();
+            selfLink.put("method", HttpMethod.GET);
+            Representation selfRep = MemberSelfRepBuilder.newBuilder(repContext, objectAdapter, otoa).build();
+            representation.put("self", selfRep);
+        }
+        Representation type = LinkRepBuilder.newTypeBuilder(repContext, "type", otoa.getSpecification()).build();
+        representation.put("type", type);
+        representation.put("value", obtainValue());
+        Consent usability = otoa.isUsable(getSession(), objectAdapter);
+        representation.put("disabledReason", usability.getReason());
+        Representation detailsLink = LinkRepBuilder.newBuilder(repContext, "details", urlFor(objectAdapter, otoa)).build(); // TODO: same as self.link ???
+        representation.put("details", detailsLink);
+        return representation;
+    }
+
+    /**
+     * Only add the _self attribute if this representation is being
+     * generated in a context that is not 'under' an attribute of an
+     * owning {@link Representation representation}.
+     */
+    private boolean addSelf() {
+        return !repContext.hasAttribute();
+    }
+
+    private Object obtainValue() {
+        ObjectAdapter valueAdapter = otoa.get(objectAdapter);
+        if(valueAdapter == null) {
+            return null;
+        } 
+        ObjectSpecification otoaSpec = otoa.getSpecification();
+        ValueFacet valueFacet = otoaSpec.getFacet(ValueFacet.class);
+        if(valueFacet != null) {
+            EncodableFacet encodableFacet = otoaSpec.getFacet(EncodableFacet.class);
+            return encodableFacet.toEncodedString(valueAdapter);
+        } 
+        TitleFacet titleFacet = otoaSpec.getFacet(TitleFacet.class);
+        if (titleFacet == null) {
+            // fallback
+            titleFacet = otoaSpec.getFacet(TitleFacet.class);
+        }
+        String title = titleFacet.title(valueAdapter, getLocalization());
+        return LinkRepBuilder.newBuilder(repContext, "value", urlFor(valueAdapter)).withTitle(title).build();
+    }
+
+    private String urlFor(ObjectAdapter adapter) {
+        return DomainObjectRepBuilder.urlFor(adapter, getOidStringifier());
+    }
+
+    private String urlFor(ObjectAdapter objectAdapter, OneToOneAssociation otoa) {
+        OidStringifier oidStringifier = getOidStringifier();
+        String oidStr = oidStringifier.enString(objectAdapter.getOid());
+        return "objects/" + oidStr + "/property/" + otoa.getId();
+    }
+
+}
\ No newline at end of file

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/main/java/org/apache/isis/viewer/restful/viewer2/resources/services/ServicesResourceImpl.java Thu Jun 23 17:04:47 2011
@@ -26,9 +26,9 @@ import javax.ws.rs.Produces;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.restful.applib2.resources.ServicesResource;
 import org.apache.isis.viewer.restful.viewer2.RepContext;
+import org.apache.isis.viewer.restful.viewer2.representations.Representation;
 import org.apache.isis.viewer.restful.viewer2.resources.ResourceAbstract;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep;
-import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRep.SelfRep;
+import org.apache.isis.viewer.restful.viewer2.resources.objects.DomainObjectRepBuilder;
 
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
@@ -50,14 +50,14 @@ public class ServicesResourceImpl extend
         return asJsonList(serviceSelfRepresentations());
     }
 
-    protected List<DomainObjectRep.SelfRep> serviceSelfRepresentations() {
+    protected List<Representation> serviceSelfRepresentations() {
         final List<ObjectAdapter> serviceAdapters = getPersistenceSession().getServices();
         RepContext representationContext = getResourceContext().repContext();
         
-        Function<ObjectAdapter, SelfRep> objectSelfRepresentation = 
+        Function<ObjectAdapter, Representation> objectSelfRepresentation = 
             Functions.compose(
-                DomainObjectRep.selfOf(), 
-                DomainObjectRep.fromAdapter(representationContext));
+                DomainObjectRepBuilder.selfOf(), 
+                DomainObjectRepBuilder.fromAdapter(representationContext));
         return Lists.newArrayList(
             Collections2.transform(serviceAdapters, objectSelfRepresentation));
     }

Modified: incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java?rev=1138992&r1=1138991&r2=1138992&view=diff
==============================================================================
--- incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java (original)
+++ incubator/isis/trunk/viewer/restful/viewer2/src/test/java/org/apache/isis/viewer/restful/viewer2/RepresentationContextTest_relFor.java Thu Jun 23 17:04:47 2011
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.viewer.restful.viewer2;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import org.junit.Test;