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/10/27 01:12:47 UTC

svn commit: r1189531 [1/2] - in /incubator/isis/trunk/framework: core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/util/ core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/ tck/tck-dom/src/main/java/org/apache/isis/t...

Author: danhaywood
Date: Wed Oct 26 23:12:46 2011
New Revision: 1189531

URL: http://svn.apache.org/viewvc?rev=1189531&view=rev
Log:
ISIS-109: lots more changes; can now set/clear properties, addto collections (not checked removing from), and invoke actions; also tidied up the linkTo stuff for services vs objects throughout, and extended the TCK to have a parent/child entity pair

Added:
    incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/util/
    incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ChildEntity.java
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntity.java
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntityRepository.java
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assoc/
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/ParentAndChildEntityFixture.java
    incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/
    incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/ParentEntityRepositoryDefault.java
Modified:
    incubator/isis/trunk/framework/viewer/dnd-tck/src/main/resources/isis.properties
    incubator/isis/trunk/framework/viewer/html-tck/src/main/webapp/WEB-INF/isis.properties
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/main/webapp/WEB-INF/isis.properties
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.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/DomainResourceHelper.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.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/JsonValueEncoder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectAdapterLinkTo.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectPropertyReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/JsonValueEncoderTest_asAdapter.java
    incubator/isis/trunk/framework/viewer/scimpi/scimpi-tck/src/main/webapp/WEB-INF/isis.properties
    incubator/isis/trunk/framework/viewer/wicket/wicket-tck/src/main/webapp/WEB-INF/isis.properties
    incubator/isis/trunk/framework/viewer/xhtml/xhtml-tck/src/main/webapp/WEB-INF/isis.properties

Added: incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java (added)
+++ incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FeatureTypeTest_identifierFor.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,45 @@
+package org.apache.isis.core.metamodel.facetapi;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+
+import org.apache.isis.applib.Identifier;
+import org.junit.Test;
+
+public class FeatureTypeTest_identifierFor {
+
+    public static class SomeDomainClass {
+        private BigDecimal aBigDecimal;
+        public BigDecimal getABigDecimal() {
+            return aBigDecimal;
+        }
+        public void setABigDecimal(BigDecimal aBigDecimal) {
+            this.aBigDecimal = aBigDecimal;
+        }
+        private BigDecimal anotherBigDecimal;
+        public BigDecimal getAnotherBigDecimal() {
+            return anotherBigDecimal;
+        }
+        public void setAnotherBigDecimal(BigDecimal anotherBigDecimal) {
+            this.anotherBigDecimal = anotherBigDecimal;
+        }
+    }
+    
+    @Test
+    public void property_whenMethodNameIs_XYyyZzz() throws Exception {
+        Method method = SomeDomainClass.class.getMethod("getABigDecimal");
+        final Identifier identifierFor = FeatureType.PROPERTY.identifierFor(SomeDomainClass.class, method);
+        assertThat(identifierFor.getMemberName(), is("ABigDecimal")); // very odd compared to anotherBigDecimal, but arises from Introspector class, so presumably part of the javabeans spec.
+    }
+
+    @Test
+    public void property_whenMethodNameIs_XxxxYyyZzz() throws Exception {
+        Method method = SomeDomainClass.class.getMethod("getAnotherBigDecimal");
+        final Identifier identifierFor = FeatureType.PROPERTY.identifierFor(SomeDomainClass.class, method);
+        assertThat(identifierFor.getMemberName(), is("anotherBigDecimal"));
+    }
+
+}

Added: incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ChildEntity.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ChildEntity.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ChildEntity.java (added)
+++ incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ChildEntity.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,108 @@
+/*
+ *  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.tck.dom.assocs;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.AbstractDomainObject;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.applib.util.TitleBuffer;
+
+public class ChildEntity extends AbstractDomainObject {
+
+    // {{ Identification
+    public String title() {
+        final TitleBuffer buf = new TitleBuffer();
+        if(getParent() != null) {
+            buf.append(getParent().getName()).append("-");
+        }
+        buf.append(getName());
+        return buf.toString();
+    }
+    // }}
+
+    // {{ Name
+    private String name;
+
+    @MemberOrder(sequence = "1")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+    // }}
+
+    // {{ Parent
+    private ParentEntity parent;
+
+    @MemberOrder(sequence = "1")
+    @Optional
+    public ParentEntity getParent() {
+        return parent;
+    }
+
+    public void setParent(final ParentEntity parent) {
+        this.parent = parent;
+    }
+    // }}
+
+
+
+    // {{ moveTo
+    @MemberOrder(sequence = "1")
+    public ChildEntity moveTo(final ParentEntity newParent) {
+        if(newParent == getParent()) {
+            // nothing to do
+            return this;
+        }
+        if(getParent() != null) {
+            getParent().removeChild(this);
+        }
+        newParent.getChildren().add(this);
+        this.setParent(newParent);
+        return this;
+    }
+    public ParentEntity default0MoveTo() {
+        return getParent();
+    }
+    public List<ParentEntity> choices0MoveTo() {
+        return parentEntityRepository.list();
+    }
+    // }}
+
+
+    // {{ injected dependencies
+    // {{ injected: ParentEntityRepository
+    private ParentEntityRepository parentEntityRepository;
+    public void setParentEntityRepository(final ParentEntityRepository parentEntityRepository) {
+        this.parentEntityRepository = parentEntityRepository;
+    }
+    // }}
+
+
+    // }}
+
+
+    
+}

Added: incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntity.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntity.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntity.java (added)
+++ incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntity.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,93 @@
+/*
+ *  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.tck.dom.assocs;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.AbstractDomainObject;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Optional;
+import org.apache.isis.applib.util.TitleBuffer;
+
+public class ParentEntity extends AbstractDomainObject {
+
+    // {{ Identification
+    public String title() {
+        final TitleBuffer buf = new TitleBuffer();
+        buf.append(getName());
+        return buf.toString();
+    }
+    // }}
+
+
+    // {{ Name
+    private String name;
+
+    @MemberOrder(sequence = "1")
+    @Optional
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+    // }}
+
+    // {{ Children
+    private List<ChildEntity> children = new ArrayList<ChildEntity>();
+
+    @MemberOrder(sequence = "1")
+    public List<ChildEntity> getChildren() {
+        return children;
+    }
+
+    public void setChildren(final List<ChildEntity> children) {
+        this.children = children;
+    }
+    // }}
+
+    // {{ newChild (action)
+    public ChildEntity newChild(String name) {
+        final ChildEntity childEntity = newTransientInstance(ChildEntity.class);
+        childEntity.setName(name);
+        childEntity.setParent(this);
+        this.getChildren().add(childEntity);
+        persistIfNotAlready(childEntity);
+        return childEntity;
+    }
+    // }}
+
+    // {{ removeChild (action)
+    public ParentEntity removeChild(ChildEntity childEntity) {
+        if(children.contains(childEntity)) {
+            children.remove(childEntity);
+            childEntity.setParent(null);
+        }
+        return this;
+    }
+    public List<ChildEntity> choices0RemoveChild() {
+        return getChildren();
+    }
+    // }}
+    
+}

Added: incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntityRepository.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntityRepository.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntityRepository.java (added)
+++ incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/assocs/ParentEntityRepository.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,36 @@
+/*
+ *  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.tck.dom.assocs;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Named;
+
+@Named("Parents")
+public interface ParentEntityRepository {
+
+    @MemberOrder(sequence="1")
+    public List<ParentEntity> list();
+
+    @MemberOrder(sequence="2")
+    public ParentEntity newEntity(String name);
+
+}

Added: incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/ParentAndChildEntityFixture.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/ParentAndChildEntityFixture.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/ParentAndChildEntityFixture.java (added)
+++ incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/assocs/ParentAndChildEntityFixture.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,52 @@
+/*
+ *  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.tck.fixture.assocs;
+
+import org.apache.isis.applib.fixtures.AbstractFixture;
+import org.apache.isis.tck.dom.assocs.ParentEntity;
+import org.apache.isis.tck.dom.assocs.ParentEntityRepository;
+
+
+public class ParentAndChildEntityFixture extends AbstractFixture {
+
+    @Override
+    public void install() {
+        createEntity("parent 1");
+        createEntity("parent 2");
+        createEntity("parent 3");
+        createEntity("parent 4");
+        createEntity("parent 5");
+    }
+    
+    private ParentEntity createEntity(String name) {
+        final ParentEntity parent = parentEntityRepository.newEntity(name);
+        parent.newChild("child 1");
+        parent.newChild("child 2");
+        return parent;
+    }
+
+    
+    private ParentEntityRepository parentEntityRepository;
+    public void setParentEntityRepository(ParentEntityRepository parentEntityRepository) {
+        this.parentEntityRepository = parentEntityRepository;
+    }
+    
+}

Added: incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/ParentEntityRepositoryDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/ParentEntityRepositoryDefault.java?rev=1189531&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/ParentEntityRepositoryDefault.java (added)
+++ incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/assocs/ParentEntityRepositoryDefault.java Wed Oct 26 23:12:46 2011
@@ -0,0 +1,48 @@
+/*
+ *  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.tck.objstore.dflt.assocs;
+
+import java.util.List;
+
+import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.annotation.QueryOnly;
+import org.apache.isis.tck.dom.assocs.ParentEntity;
+import org.apache.isis.tck.dom.assocs.ParentEntityRepository;
+
+public class ParentEntityRepositoryDefault extends AbstractFactoryAndRepository implements ParentEntityRepository {
+
+    
+    public String getId() {
+        return "parentEntities";
+    }
+
+    @QueryOnly
+    public List<ParentEntity> list() {
+        return allInstances(ParentEntity.class);
+    }
+
+    public ParentEntity newEntity(String name) {
+        ParentEntity entity = newTransientInstance(ParentEntity.class);
+        entity.setName(name);
+        persist(entity);
+        return entity;
+    }
+    
+}

Modified: incubator/isis/trunk/framework/viewer/dnd-tck/src/main/resources/isis.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/dnd-tck/src/main/resources/isis.properties?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/dnd-tck/src/main/resources/isis.properties (original)
+++ incubator/isis/trunk/framework/viewer/dnd-tck/src/main/resources/isis.properties Wed Oct 26 23:12:46 2011
@@ -21,7 +21,8 @@ isis.services =\
     scalars.PrimitiveValuedEntityRepositoryDefault,\
     scalars.WrapperValuedEntityRepositoryDefault, \
     simples.SimpleEntityRepositoryDefault,\
-    stables.StableEntityRepositoryDefault
+    stables.StableEntityRepositoryDefault,\
+    assocs.ParentEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
@@ -31,7 +32,8 @@ isis.fixtures=\
     scalars.PrimitiveValuedEntityFixture,\
     scalars.WrapperValuedEntityFixture,\
     simples.SimpleEntityFixture,\
-    stables.StableEntityFixture
+    stables.StableEntityFixture,\
+    assocs.ParentAndChildEntityFixture
 
 isis.exploration.users=sven, dick, bob
 

Modified: incubator/isis/trunk/framework/viewer/html-tck/src/main/webapp/WEB-INF/isis.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/html-tck/src/main/webapp/WEB-INF/isis.properties?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/html-tck/src/main/webapp/WEB-INF/isis.properties (original)
+++ incubator/isis/trunk/framework/viewer/html-tck/src/main/webapp/WEB-INF/isis.properties Wed Oct 26 23:12:46 2011
@@ -21,7 +21,8 @@ isis.services =\
     scalars.PrimitiveValuedEntityRepositoryDefault,\
     scalars.WrapperValuedEntityRepositoryDefault, \
     simples.SimpleEntityRepositoryDefault,\
-    stables.StableEntityRepositoryDefault
+    stables.StableEntityRepositoryDefault,\
+    assocs.ParentEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
@@ -31,7 +32,8 @@ isis.fixtures=\
     scalars.PrimitiveValuedEntityFixture,\
     scalars.WrapperValuedEntityFixture,\
     simples.SimpleEntityFixture,\
-    stables.StableEntityFixture
+    stables.StableEntityFixture,\
+    assocs.ParentAndChildEntityFixture
 
 isis.exploration.users=sven, dick, bob
 

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/domainobjects/DomainServiceResource.java Wed Oct 26 23:12:46 2011
@@ -83,31 +83,31 @@ public interface DomainServiceResource {
     ////////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType=String.class)
-    public Response serviceInvokeActionQueryOnly(
-        @PathParam("oid") final String oidStr, 
+    public Response invokeActionQueryOnly(
+        @PathParam("serviceId") final String serviceId, 
         @PathParam("actionId") final String actionId,
         @QueryParam("args") final String arguments);
 
     @PUT
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType=String.class)
-    public Response serviceInvokeActionIdempotent(
-        @PathParam("oid") final String oidStr, 
+    public Response invokeActionIdempotent(
+        @PathParam("serviceId") final String serviceId, 
         @PathParam("actionId") final String actionId,
         final InputStream arguments);
 
     @POST
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
     @ClientResponseType(entityType=String.class)
-    public Response serviceInvokeAction(
-        @PathParam("oid") final String oidStr, 
+    public Response invokeAction(
+        @PathParam("serviceId") final String serviceId, 
         @PathParam("actionId") final String actionId,
         final InputStream arguments);
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/main/webapp/WEB-INF/isis.properties
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/main/webapp/WEB-INF/isis.properties?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/main/webapp/WEB-INF/isis.properties (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/main/webapp/WEB-INF/isis.properties Wed Oct 26 23:12:46 2011
@@ -21,7 +21,8 @@ isis.services =\
     scalars.PrimitiveValuedEntityRepositoryDefault,\
     scalars.WrapperValuedEntityRepositoryDefault, \
     simples.SimpleEntityRepositoryDefault,\
-    stables.StableEntityRepositoryDefault
+    stables.StableEntityRepositoryDefault,\
+    assocs.ParentEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
@@ -31,7 +32,8 @@ isis.fixtures=\
     scalars.PrimitiveValuedEntityFixture,\
     scalars.WrapperValuedEntityFixture,\
     simples.SimpleEntityFixture,\
-    stables.StableEntityFixture
+    stables.StableEntityFixture,\
+    assocs.ParentAndChildEntityFixture
 
 
 isis.reflector.class-substitutor=org.apache.isis.runtimes.dflt.bytecode.dflt.classsubstitutor.CglibClassSubstitutor

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java Wed Oct 26 23:12:46 2011
@@ -154,7 +154,7 @@ public class DomainServiceResourceTest_i
         final Response responseBefore = client.follow(linkToSimpleEntity);
         final RestfulResponse<DomainObjectRepresentation> restfulResponseBefore = RestfulResponse.ofT(responseBefore);
         final DomainObjectRepresentation simpleEntityBefore = restfulResponseBefore.getEntity();
-        assertThat(simpleEntityBefore.getProperty("flag").getBoolean("value"), is(true));
+        final Boolean before = simpleEntityBefore.getProperty("flag").getBoolean("value");
 
         // and given 'toggle' action on repo
         JsonRepresentation givenAction = givenAction("simples", "toggle");
@@ -182,7 +182,9 @@ public class DomainServiceResourceTest_i
         final Response responseAfter = client.follow(linkToSimpleEntity);
         final RestfulResponse<DomainObjectRepresentation> restfulResponseAfter = RestfulResponse.ofT(responseAfter);
         final DomainObjectRepresentation simpleEntityAfter = restfulResponseAfter.getEntity();
-        assertThat(simpleEntityAfter.getProperty("flag").getBoolean("value"), is(false));
+        
+        final Boolean after = simpleEntityAfter.getProperty("flag").getBoolean("value");
+        assertThat(after, is(!before)); // ie has been toggled
     }
 
 

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/ResourceContext.java Wed Oct 26 23:12:46 2011
@@ -37,6 +37,8 @@ import org.apache.isis.runtimes.dflt.run
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.viewer.resources.domainobjects.DomainServiceLinkTo;
+import org.apache.isis.viewer.json.viewer.resources.domainobjects.ObjectAdapterLinkTo;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
@@ -201,4 +203,5 @@ public class ResourceContext {
 
 
 
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.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/AbstractObjectMemberReprRenderer.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/AbstractObjectMemberReprRenderer.java Wed Oct 26 23:12:46 2011
@@ -24,6 +24,7 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 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.LinkFollower;
 import org.apache.isis.viewer.json.viewer.representations.Rel;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
@@ -48,7 +49,7 @@ public abstract class AbstractObjectMemb
         }
     }
     
-    protected ObjectAdapterLinkTo linkToBuilder;
+    protected ObjectAdapterLinkTo linkTo;
     
     protected ObjectAdapter objectAdapter;
     protected MemberType memberType;
@@ -64,7 +65,7 @@ public abstract class AbstractObjectMemb
         this.objectAdapter = objectAndMember.getObjectAdapter();
         this.objectMember = objectAndMember.getMember();
         this.memberType = MemberType.determineFrom(objectMember);
-        usingLinkToBuilder(new DomainObjectLinkTo());
+        usingLinkTo(new DomainObjectLinkTo());
 
         // done eagerly so can use as criteria for x-ro-follow-links
         representation.mapPut(memberType.getJsProp(), objectMember.getId());
@@ -76,8 +77,8 @@ public abstract class AbstractObjectMemb
     /**
      * Must be called after {@link #with(ObjectAndMember)} (which provides the {@link #objectAdapter}).
      */
-    public R usingLinkToBuilder(ObjectAdapterLinkTo linkToBuilder) {
-        this.linkToBuilder = linkToBuilder.usingResourceContext(resourceContext).with(objectAdapter);
+    public R usingLinkTo(ObjectAdapterLinkTo linkTo) {
+        this.linkTo = linkTo.usingResourceContext(resourceContext).with(objectAdapter);
         return cast(this);
     }
 
@@ -109,6 +110,7 @@ public abstract class AbstractObjectMemb
         
         if (mode.isStandalone()){
             addLinkToSelf();
+            addLinkToUp();
         }
         if (mode.isFollowed() || mode.isStandalone()){
             addMutatorsIfEnabled();
@@ -120,26 +122,39 @@ public abstract class AbstractObjectMemb
         }
     }
     
+
     private void addLinkToSelf() {
-        getLinks().arrayAdd(linkToBuilder.linkToMember(Rel.SELF, memberType, objectMember).build());
+        getLinks().arrayAdd(linkTo.memberBuilder(Rel.SELF, memberType, objectMember).build());
     }
 
+    private void addLinkToUp() {
+        getLinks().arrayAdd(linkTo.builder(Rel.UP).build());
+    }
+    
     protected abstract void addMutatorsIfEnabled();
     
     /**
      * For subclasses to call back to when {@link #addMutatorsIfEnabled() adding mutators}.
      */
     protected void addLinkFor(final MutatorSpec mutatorSpec) {
-        if(hasMemberFacet(mutatorSpec.mutatorFacetType)) {
-            
-            JsonRepresentation arguments = mutatorArgs(mutatorSpec);
-            JsonRepresentation mutatorLink = 
-                    linkToBuilder.linkToMember(mutatorSpec.rel, memberType, objectMember, mutatorSpec.suffix)
-                    .withHttpMethod(mutatorSpec.httpMethod)
-                    .withArguments(arguments)
-                    .build();
-            getLinks().arrayAdd(mutatorLink);
-        }
+        if(!hasMemberFacet(mutatorSpec.mutatorFacetType)) {
+            return;
+        } 
+        JsonRepresentation arguments = mutatorArgs(mutatorSpec);
+        RepresentationType representationType = mutatorRepType();
+        JsonRepresentation mutatorLink = 
+                linkTo.memberBuilder(mutatorSpec.rel, memberType, objectMember, representationType, mutatorSpec.suffix)
+                .withHttpMethod(mutatorSpec.httpMethod)
+                .withArguments(arguments)
+                .build();
+        getLinks().arrayAdd(mutatorLink);
+    }
+
+    /**
+     * Default implementation is suitable for properties and collections
+     */
+    protected RepresentationType mutatorRepType() {
+        return memberType.getRepresentationType();
     }
 
     /**
@@ -161,7 +176,7 @@ public abstract class AbstractObjectMemb
     
     private R addDetailsLink() {
         final JsonRepresentation link = 
-                linkToBuilder.linkToMember(Rel.DETAILS, memberType, objectMember).build();
+                linkTo.memberBuilder(Rel.DETAILS, memberType, objectMember).build();
         getLinks().arrayAdd(link);
         
         final LinkFollower membersLinkFollower = getLinkFollower();

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.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/DomainObjectLinkTo.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectLinkTo.java Wed Oct 26 23:12:46 2011
@@ -27,7 +27,6 @@ public class DomainObjectLinkTo implemen
 
     protected ResourceContext resourceContext;
     protected ObjectAdapter objectAdapter;
-    protected Rel rel;
 
     @Override
     public final DomainObjectLinkTo usingResourceContext(ResourceContext resourceContext) {
@@ -44,7 +43,12 @@ public class DomainObjectLinkTo implemen
     
     @Override
     public LinkBuilder builder() {
-        return LinkBuilder.newBuilder(resourceContext, linkRel(), RepresentationType.DOMAIN_OBJECT, linkRef());
+        return builder(null);
+    }
+
+    @Override
+    public LinkBuilder builder(Rel rel) {
+        return LinkBuilder.newBuilder(resourceContext, relElseDefault(rel), RepresentationType.DOMAIN_OBJECT, linkRef());
     }
 
     /**
@@ -62,21 +66,24 @@ public class DomainObjectLinkTo implemen
         return buf.toString();
     }
 
+    private Rel relElseDefault(Rel rel) {
+        return rel != null ? rel : defaultRel();
+    }
+
     /**
-     * hook method
+     * hook method; used by {@link #builder(Rel)}.
      */
-    protected Rel linkRel() {
-        return rel!=null?rel:Rel.OBJECT;
+    protected Rel defaultRel() {
+        return Rel.OBJECT;
     }
 
     @Override
-    public ObjectAdapterLinkTo with(Rel rel) {
-        this.rel = rel;
-        return this;
+    public final LinkBuilder memberBuilder(Rel rel, MemberType memberType, ObjectMember objectMember, String... parts) {
+        return memberBuilder(rel, memberType, objectMember, memberType.getRepresentationType(), parts);
     }
 
     @Override
-    public final LinkBuilder linkToMember(Rel rel, MemberType memberType, ObjectMember objectMember, String... parts) {
+    public final LinkBuilder memberBuilder(Rel rel, MemberType memberType, ObjectMember objectMember, RepresentationType representationType, String... parts) {
         StringBuilder buf = new StringBuilder(linkRef());
         buf.append("/").append(memberType.getUrlPart()).append(objectMember.getId());
         for(String part: parts) {
@@ -86,9 +93,8 @@ public class DomainObjectLinkTo implemen
             buf.append("/").append(part);
         }
         String url = buf.toString();
-        return LinkBuilder.newBuilder(resourceContext, rel, memberType.getRepresentationType(), url);
+        return LinkBuilder.newBuilder(resourceContext, rel, representationType, url);
     }
-
     
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.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/DomainObjectReprRenderer.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainObjectReprRenderer.java Wed Oct 26 23:12:46 2011
@@ -22,6 +22,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.consent.Consent;
 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.services.ServiceUtil;
 import org.apache.isis.core.metamodel.spec.ObjectActionSet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -89,14 +90,18 @@ public class DomainObjectReprRenderer ex
 
         // self
         if(includesSelf && objectAdapter.isPersistent()) {
-            JsonRepresentation self = linkToBuilder.with(Rel.SELF).with(objectAdapter).builder().build();
+            JsonRepresentation self = linkToBuilder.with(objectAdapter).builder(Rel.SELF).build();
             getLinks().arrayAdd(self);
         }
 
         // title
         String title = objectAdapter.titleString();
-        representation.mapPut("oid", OidUtils.getOidStr(resourceContext, objectAdapter));
         representation.mapPut("title", title);
+        representation.mapPut("oid", OidUtils.getOidStr(resourceContext, objectAdapter));
+        final boolean isService = objectAdapter.getSpecification().isService();
+        if(isService) {
+            representation.mapPut("serviceId", ServiceUtil.id(objectAdapter.getObject()));
+        }
         
         // members
         withMembers(objectAdapter);
@@ -107,12 +112,11 @@ public class DomainObjectReprRenderer ex
                 DomainTypeReprRenderer.newLinkToBuilder(getResourceContext(), Rel.DESCRIBEDBY, objectAdapter.getSpecification()).build());
         
         // extensions
-        getExtensions();
+        getExtensions().mapPut("isService", isService);
         
         return representation;
     }
 
-
     private DomainObjectReprRenderer withMembers(ObjectAdapter objectAdapter) {
         JsonRepresentation members = JsonRepresentation.newArray();
         List<ObjectAssociation> associations = objectAdapter.getSpecification().getAssociations();
@@ -140,7 +144,7 @@ public class DomainObjectReprRenderer ex
                         (ObjectPropertyReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
                 
                 renderer.with(new ObjectAndProperty(objectAdapter, property))
-                        .usingLinkToBuilder(linkToBuilder);
+                        .usingLinkTo(linkToBuilder);
                 
                 members.arrayAdd(renderer.render());
             }
@@ -152,7 +156,7 @@ public class DomainObjectReprRenderer ex
                         (ObjectCollectionReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
 
                 renderer.with(new ObjectAndCollection(objectAdapter, collection))
-                    .usingLinkToBuilder(linkToBuilder);
+                    .usingLinkTo(linkToBuilder);
                 
                 members.arrayAdd(renderer.render());
             }
@@ -179,7 +183,7 @@ public class DomainObjectReprRenderer ex
                         (ObjectActionReprRenderer) factory.newRenderer(getResourceContext(), linkFollower, JsonRepresentation.newMap());
                 
                 renderer.with(new ObjectAndAction(objectAdapter, action))
-                        .usingLinkToBuilder(linkToBuilder);
+                        .usingLinkTo(linkToBuilder);
 
                 members.arrayAdd(renderer.render());
             }

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=1189531&r1=1189530&r2=1189531&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 Wed Oct 26 23:12:46 2011
@@ -76,7 +76,7 @@ public class DomainObjectResourceServers
         
         final DomainObjectReprRenderer renderer = 
                 (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
-        renderer.with(objectAdapter);
+        renderer.with(objectAdapter).includesSelf();
         
         ResponseBuilder respBuilder = responseOfOk(renderer, Caching.NONE);
         
@@ -114,7 +114,7 @@ public class DomainObjectResourceServers
         init(RepresentationType.OBJECT_PROPERTY);
         
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
         
         return helper.propertyDetails(objectAdapter, propertyId, Caching.NONE);
     }
@@ -128,11 +128,11 @@ public class DomainObjectResourceServers
             final InputStream body) {
         init();
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-        
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+        
         final OneToOneAssociation property = helper.getPropertyThatIsVisibleAndUsable(
-                objectAdapter, propertyId, Intent.MUTATE);
+                propertyId, Intent.MUTATE);
 
         ObjectSpecification propertySpec = property.getSpecification();
         String bodyAsString = DomainResourceHelper.asStringUtf8(body);
@@ -160,11 +160,11 @@ public class DomainObjectResourceServers
             @PathParam("propertyId") final String propertyId) {
         init();
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+        
         final OneToOneAssociation property = helper.getPropertyThatIsVisibleAndUsable(
-                objectAdapter, propertyId, Intent.MUTATE);
+                propertyId, Intent.MUTATE);
 
         Consent consent = property.isAssociationValid(objectAdapter, null);
         if (consent.isVetoed()) {
@@ -191,11 +191,11 @@ public class DomainObjectResourceServers
         @PathParam("collectionId") final String collectionId) {
         init(RepresentationType.OBJECT_COLLECTION);
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+
         final OneToManyAssociation collection = helper.getCollectionThatIsVisibleAndUsable(
-                objectAdapter, collectionId, Intent.ACCESS);
+                collectionId, Intent.ACCESS);
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_COLLECTION);
         final ObjectCollectionReprRenderer renderer = 
@@ -215,11 +215,11 @@ public class DomainObjectResourceServers
             final InputStream body) {
         init();
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+
         final OneToManyAssociation collection = helper.getCollectionThatIsVisibleAndUsable(
-                objectAdapter, collectionId, Intent.MUTATE);
+                collectionId, Intent.MUTATE);
 
         if (!collection.getCollectionSemantics().isSet()) {
             throw JsonApplicationException.create(
@@ -252,11 +252,11 @@ public class DomainObjectResourceServers
             final InputStream body) {
         init();
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+
         final OneToManyAssociation collection = helper.getCollectionThatIsVisibleAndUsable(
-                objectAdapter, collectionId, Intent.MUTATE);
+                collectionId, Intent.MUTATE);
 
         if (!collection.getCollectionSemantics().isListOrArray()) {
             throw JsonApplicationException.create(
@@ -290,11 +290,11 @@ public class DomainObjectResourceServers
 
         init();
         
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+
         final OneToManyAssociation collection = helper.getCollectionThatIsVisibleAndUsable(
-                objectAdapter, collectionId, Intent.MUTATE);
+                collectionId, Intent.MUTATE);
 
         ObjectSpecification collectionSpec = collection.getSpecification();
         String bodyAsString = DomainResourceHelper.asStringUtf8(body);
@@ -324,11 +324,10 @@ public class DomainObjectResourceServers
             @PathParam("actionId") final String actionId) {
         init(RepresentationType.OBJECT_ACTION);
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
-        
-        return helper.actionPrompt(actionId, objectAdapter);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
+
+        return helper.actionPrompt(actionId);
     }
 
 
@@ -346,11 +345,10 @@ public class DomainObjectResourceServers
             @QueryParam("args") final String arguments) {
         init(RepresentationType.GENERIC);
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
 
-        return helper.invokeActionQueryOnly(objectAdapter, actionId, arguments);
+        return helper.invokeActionQueryOnly(actionId, arguments);
     }
 
     @PUT
@@ -362,11 +360,10 @@ public class DomainObjectResourceServers
             final InputStream arguments) {
         init(RepresentationType.GENERIC);
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
         
-        return helper.invokeActionIdempotent(objectAdapter, actionId, arguments);
+        return helper.invokeActionIdempotent(actionId, arguments);
     }
 
 
@@ -379,11 +376,10 @@ public class DomainObjectResourceServers
             final InputStream body) {
         init(RepresentationType.GENERIC);
         
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter objectAdapter = getObjectAdapter(oidStr);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), objectAdapter);
         
-        return helper.invokeAction(objectAdapter, actionId, body);
+        return helper.invokeAction(actionId, body);
     }
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.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/DomainResourceHelper.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainResourceHelper.java Wed Oct 26 23:12:46 2011
@@ -22,7 +22,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map.Entry;
 
-import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
@@ -33,7 +32,6 @@ import org.apache.isis.core.metamodel.co
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacet;
 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;
@@ -44,7 +42,6 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.viewer.json.applib.JsonRepresentation;
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.json.applib.blocks.LinkRepresentation;
 import org.apache.isis.viewer.json.applib.util.JsonMapper;
 import org.apache.isis.viewer.json.applib.util.UrlEncodingUtils;
 import org.apache.isis.viewer.json.viewer.JsonApplicationException;
@@ -69,12 +66,23 @@ import com.google.common.io.ByteStreams;
 public class DomainResourceHelper {
     
     private final ResourceContext resourceContext;
+    private ObjectAdapterLinkTo adapterLinkTo;
 
     // TODO: inject somehow instead
     private final RendererFactoryRegistry rendererFactoryRegistry = RendererFactoryRegistry.instance;
+    private final ObjectAdapter objectAdapter;
 
-    public DomainResourceHelper(ResourceContext resourceContext) {
+
+    public DomainResourceHelper(ResourceContext resourceContext, ObjectAdapter objectAdapter) {
         this.resourceContext = resourceContext;
+        this.objectAdapter = objectAdapter;
+        using(new DomainObjectLinkTo());
+    }
+
+    public DomainResourceHelper using(ObjectAdapterLinkTo linkTo) {
+        adapterLinkTo = linkTo;
+        adapterLinkTo.usingResourceContext(resourceContext).with(objectAdapter);
+        return this;
     }
 
     // //////////////////////////////////////////////////////////////
@@ -87,13 +95,13 @@ public class DomainResourceHelper {
             final Caching caching) {
 
         final OneToOneAssociation property = getPropertyThatIsVisibleAndUsable(
-                objectAdapter, propertyId, Intent.ACCESS);
+                propertyId, Intent.ACCESS);
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_PROPERTY);
         final ObjectPropertyReprRenderer renderer = 
                 (ObjectPropertyReprRenderer) factory.newRenderer(resourceContext, null, JsonRepresentation.newMap());
         
-        renderer.with(new ObjectAndProperty(objectAdapter, property))
+        renderer.with(new ObjectAndProperty(objectAdapter, property)).usingLinkTo(adapterLinkTo)
                 .asStandalone();
         
         return ResourceAbstract.responseOfOk(renderer, caching).build();
@@ -103,15 +111,16 @@ public class DomainResourceHelper {
     // action Prompt
     // //////////////////////////////////////////////////////////////
 
-    Response actionPrompt(final String actionId, final ObjectAdapter serviceAdapter) {
+    Response actionPrompt(final String actionId) {
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                serviceAdapter, actionId, Intent.ACCESS);
+                actionId, Intent.ACCESS);
 
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_ACTION);
         final ObjectActionReprRenderer renderer = 
                 (ObjectActionReprRenderer) factory.newRenderer(resourceContext, null, JsonRepresentation.newMap());
         
-        renderer.with(new ObjectAndAction(serviceAdapter, action))
+        renderer.with(new ObjectAndAction(objectAdapter, action))
+                .usingLinkTo(adapterLinkTo)
                 .asStandalone();
 
         return ResourceAbstract.responseOfOk(renderer, Caching.NONE).build();
@@ -131,11 +140,10 @@ public class DomainResourceHelper {
     }
 
     Response invokeActionQueryOnly(
-            final ObjectAdapter objectAdapter, 
             final String actionId, 
             final String argumentsQueryString) {
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.ACCESS);
+                actionId, Intent.ACCESS);
 
         final ActionSemantics actionSemantics = ActionSemantics.determine(resourceContext, action);
         if(!actionSemantics.isQueryOnly()) {
@@ -145,7 +153,7 @@ public class DomainResourceHelper {
 
         JsonRepresentation arguments = parseQueryString(action, argumentsQueryString);
         
-        return invokeActionUsingAdapters(objectAdapter, action, arguments);
+        return invokeActionUsingAdapters(action, arguments);
     }
 
 
@@ -167,12 +175,11 @@ public class DomainResourceHelper {
     }
 
     Response invokeActionIdempotent(
-            final ObjectAdapter objectAdapter, 
             final String actionId, 
             final InputStream body) {
         
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.MUTATE);
+                actionId, Intent.MUTATE);
 
         final ActionSemantics actionSemantics = ActionSemantics.determine(resourceContext, action);
         if(!actionSemantics.isIdempotent()) {
@@ -183,21 +190,20 @@ public class DomainResourceHelper {
         String bodyAsString = asStringUtf8(body);
         final JsonRepresentation arguments = readBodyAsMap(bodyAsString);
 
-        return invokeActionUsingAdapters(objectAdapter, action, arguments);
+        return invokeActionUsingAdapters(action, arguments);
     }
 
-    Response invokeAction(final ObjectAdapter objectAdapter, final String actionId, final InputStream body) {
+    Response invokeAction(final String actionId, final InputStream body) {
         final ObjectAction action = getObjectActionThatIsVisibleAndUsable(
-                objectAdapter, actionId, Intent.MUTATE);
+                actionId, Intent.MUTATE);
         
         String bodyAsString = asStringUtf8(body);
         final JsonRepresentation arguments = readBodyAsMap(bodyAsString);
 
-        return invokeActionUsingAdapters(objectAdapter, action, arguments);
+        return invokeActionUsingAdapters(action, arguments);
     }
 
     Response invokeActionUsingAdapters(
-        final ObjectAdapter objectAdapter,
         final ObjectAction action,
         final JsonRepresentation arguments) {
         
@@ -241,15 +247,15 @@ public class DomainResourceHelper {
         
         final CollectionFacet collectionFacet = returnedAdapter.getSpecification().getFacet(CollectionFacet.class);
         if (collectionFacet != null) {
-            representation = representationWithSelfFor(RepresentationType.LIST, objectAdapter, action, arguments);
+            representation = representationWithSelfFor(RepresentationType.LIST, action, arguments);
             
             final Collection<ObjectAdapter> collectionAdapters = collectionFacet.collection(returnedAdapter);
 
             final RendererFactory factory = rendererFactoryRegistry.find(RepresentationType.LIST);
             final ListReprRenderer renderer = (ListReprRenderer) factory.newRenderer(resourceContext, null, representation);
-            renderer.with(collectionAdapters);
-            renderer.withReturnType(action.getReturnType());
-            renderer.withElementType(returnedAdapter.getElementSpecification());
+            renderer.with(collectionAdapters)
+                    .withReturnType(action.getReturnType())
+                    .withElementType(returnedAdapter.getElementSpecification());
             
             return ResourceAbstract.responseOfOk(renderer, Caching.NONE).build();
         }
@@ -257,13 +263,14 @@ public class DomainResourceHelper {
         
         final EncodableFacet encodableFacet = returnedAdapter.getSpecification().getFacet(EncodableFacet.class);
         if(encodableFacet != null) {
-            representation = representationWithSelfFor(RepresentationType.SCALAR_VALUE, objectAdapter, action, arguments);
+            representation = representationWithSelfFor(RepresentationType.SCALAR_VALUE, action, arguments);
             
             final RendererFactory factory = rendererFactoryRegistry.find(RepresentationType.SCALAR_VALUE);
 
             ScalarValueReprRenderer renderer = (ScalarValueReprRenderer) factory.newRenderer(resourceContext, null, representation);
-            renderer.with(returnedAdapter);
-            renderer.withReturnType(action.getReturnType());
+            renderer.with(returnedAdapter)
+                    .withReturnType(action.getReturnType());
+            
             return ResourceAbstract.responseOfOk(renderer, Caching.NONE).build();
         }
 
@@ -282,14 +289,18 @@ public class DomainResourceHelper {
     }
 
 
-    private JsonRepresentation representationWithSelfFor(final RepresentationType representationType, final ObjectAdapter objectAdapter, final ObjectAction action, final JsonRepresentation bodyArgs) {
+    private JsonRepresentation representationWithSelfFor(final RepresentationType representationType, final ObjectAction action, final JsonRepresentation bodyArgs) {
         JsonRepresentation representation = JsonRepresentation.newMap();
         final JsonRepresentation links = JsonRepresentation.newArray();
         representation.mapPut("links", links);
         
-        String oid = OidUtils.getOidStr(resourceContext, objectAdapter);
-        final JsonRepresentation selfLink = 
-                LinkBuilder.newBuilder(resourceContext, Rel.SELF, representationType.getMediaType(), "objects/%s/actions/%s/invoke", oid, action.getId()).build();
+        final LinkBuilder memberBuilder = adapterLinkTo.memberBuilder(Rel.SELF, MemberType.ACTION, action, representationType, "invoke");
+        final JsonRepresentation selfLink = memberBuilder.build();
+
+        // TODO: delete this stuff
+        //String oid = OidUtils.getOidStr(resourceContext, objectAdapter);
+        //LinkBuilder.newBuilder(resourceContext, Rel.SELF, representationType.getMediaType(), "objects/%s/actions/%s/invoke", oid, action.getId()).build();
+        
         links.arrayAdd(selfLink);
         selfLink.mapPut("args", bodyArgs);
         return representation;
@@ -344,7 +355,7 @@ public class DomainResourceHelper {
      * @throws JsonMappingException 
      * @throws JsonParseException 
      */
-    private ObjectAdapter objectAdapterFor(
+    ObjectAdapter objectAdapterFor(
             final ObjectSpecification spec,
             final String urlEncodedJson) throws JsonParseException, JsonMappingException, IOException {
 
@@ -370,20 +381,19 @@ public class DomainResourceHelper {
     // ///////////////////////////////////////////////////////////////////
 
     protected OneToOneAssociation getPropertyThatIsVisibleAndUsable(
-        final ObjectAdapter objectAdapter,
-        final String propertyId, final Intent intent) {
+        final String propertyId,
+        final Intent intent) {
+        
         ObjectAssociation association = objectAdapter.getSpecification()
                 .getAssociation(propertyId);
         if (association == null || !association.isOneToOneAssociation()) {
             throwNotFoundException(propertyId, MemberType.PROPERTY);
         }
         OneToOneAssociation property = (OneToOneAssociation) association;
-        return memberThatIsVisibleAndUsable(objectAdapter, property, MemberType.PROPERTY,
-                intent);
+        return memberThatIsVisibleAndUsable(property, MemberType.PROPERTY, intent);
     }
 
     protected OneToManyAssociation getCollectionThatIsVisibleAndUsable(
-        final ObjectAdapter objectAdapter,
         final String collectionId,
         final Intent intent) {
 
@@ -393,27 +403,24 @@ public class DomainResourceHelper {
             throwNotFoundException(collectionId, MemberType.COLLECTION);
         }
         OneToManyAssociation collection = (OneToManyAssociation) association;
-        return memberThatIsVisibleAndUsable(objectAdapter, collection, MemberType.COLLECTION,
-                intent);
+        return memberThatIsVisibleAndUsable(collection, MemberType.COLLECTION, intent);
     }
 
     protected ObjectAction getObjectActionThatIsVisibleAndUsable(
-        final ObjectAdapter objectAdapter,
-        final String actionId,
-        Intent intent) {
+            final String actionId,
+            Intent intent) {
 
         ObjectAction action = objectAdapter.getSpecification().getObjectAction(actionId);
         if (action == null) {
             throwNotFoundException(actionId, MemberType.ACTION);
         }
         
-        return memberThatIsVisibleAndUsable(objectAdapter, action, MemberType.ACTION, intent);
+        return memberThatIsVisibleAndUsable(action, MemberType.ACTION, intent);
     }
 
     protected <T extends ObjectMember> T memberThatIsVisibleAndUsable(
-        final ObjectAdapter objectAdapter,
-        T objectMember, final MemberType memberType,
-        final Intent intent) {
+            T objectMember,
+            final MemberType memberType, final Intent intent) {
         String memberId = objectMember.getId();
         AuthenticationSession authenticationSession = resourceContext.getAuthenticationSession();
         if (objectMember.isVisible(authenticationSession, objectAdapter).isVetoed()) {
@@ -467,7 +474,7 @@ public class DomainResourceHelper {
                     resourceFor(objectSpec));
         }
 
-        ObjectAdapter proposedValueAdapter = objectAdapterFor(resourceContext, objectSpec, arguments);
+        ObjectAdapter proposedValueAdapter = objectAdapterFor(resourceContext, objectSpec, representation);
         return proposedValueAdapter;
     }
 
@@ -588,4 +595,5 @@ public class DomainResourceHelper {
     }
 
 
+
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.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/DomainServiceLinkTo.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/DomainServiceLinkTo.java Wed Oct 26 23:12:46 2011
@@ -22,7 +22,6 @@ import org.apache.isis.viewer.json.viewe
 import org.apache.isis.viewer.json.viewer.representations.Rel;
 
 public class DomainServiceLinkTo extends DomainObjectLinkTo {
-
     private String serviceId;
 
     @Override
@@ -38,13 +37,13 @@ public class DomainServiceLinkTo extends
     }
     
     @Override
-    protected Rel linkRel() {
-         return rel!=null?rel:Rel.SERVICE;
+    protected Rel defaultRel() {
+         return Rel.SERVICE;
     }
     
     @Override
-    public LinkBuilder builder() {
-        return super.builder().withId(serviceId);
+    public LinkBuilder builder(Rel rel) {
+        return super.builder(rel).withId(serviceId);
     }
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/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=1189531&r1=1189530&r2=1189531&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 Wed Oct 26 23:12:46 2011
@@ -70,21 +70,20 @@ public class DomainServiceResourceServer
     @GET
     @Path("/{serviceId}")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_ERROR })
-    @Override
     public Response service(
             @PathParam("serviceId") String serviceId) {
-        RepresentationType representationType = RepresentationType.DOMAIN_OBJECT;
-        init(representationType);
+        init(RepresentationType.DOMAIN_OBJECT);
         
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
         
-        final RendererFactory factory = rendererFactoryRegistry.find(representationType);
+        final RendererFactory rendererFactory = 
+                rendererFactoryRegistry.find(RepresentationType.DOMAIN_OBJECT);
+        
         final DomainObjectReprRenderer renderer = 
-                (DomainObjectReprRenderer) factory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
+                (DomainObjectReprRenderer) rendererFactory.newRenderer(getResourceContext(), null, JsonRepresentation.newMap());
         renderer.usingLinkToBuilder(new DomainServiceLinkTo())
-                    .includesSelf()
-                    .with(serviceAdapter);
-        
+                    .with(serviceAdapter)
+                    .includesSelf();
 
         return responseOfOk(renderer, Caching.ONE_DAY).build();
     }
@@ -103,7 +102,7 @@ public class DomainServiceResourceServer
         init(RepresentationType.OBJECT_PROPERTY);
 
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
 
         return helper.propertyDetails(serviceAdapter, propertyId, Caching.ONE_DAY);
     }
@@ -122,11 +121,10 @@ public class DomainServiceResourceServer
             @PathParam("actionId") final String actionId) {
         init(RepresentationType.OBJECT_ACTION);
 
-        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext());
-
         final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
 
-        return helper.actionPrompt(actionId, serviceAdapter);
+        return helper.actionPrompt(actionId);
     }
 
     
@@ -135,44 +133,50 @@ public class DomainServiceResourceServer
     ////////////////////////////////////////////////////////////
 
     @GET
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
-    public Response serviceInvokeActionQueryOnly(
-            @PathParam("oid") final String oidStr, 
+    public Response invokeActionQueryOnly(
+            @PathParam("serviceId") final String serviceId, 
             @PathParam("actionId") final String actionId,
             @QueryParam("args") final String arguments) {
         init(RepresentationType.GENERIC);
 
-        // TODO
-        throw new UnsupportedOperationException();
+        final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+
+        return helper.invokeActionQueryOnly(actionId, arguments);
     }
 
     @PUT
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
-    public Response serviceInvokeActionIdempotent(
-            @PathParam("oid") final String oidStr, 
+    public Response invokeActionIdempotent(
+            @PathParam("serviceId") final String serviceId, 
             @PathParam("actionId") final String actionId,
             final InputStream arguments) {
         init(RepresentationType.GENERIC);
 
-        // TODO
-        throw new UnsupportedOperationException();
+        final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+
+        return helper.invokeActionIdempotent(actionId, arguments);
     }
 
     @POST
-    @Path("/{oid}/actions/{actionId}/invoke")
+    @Path("/{serviceId}/actions/{actionId}/invoke")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON, RestfulMediaType.APPLICATION_JSON_DOMAIN_OBJECT, RestfulMediaType.APPLICATION_JSON_LIST, RestfulMediaType.APPLICATION_JSON_SCALAR_VALUE, RestfulMediaType.APPLICATION_JSON_ERROR })
-    public Response serviceInvokeAction(
-            @PathParam("oid") final String oidStr, 
+    public Response invokeAction(
+            @PathParam("serviceId") final String serviceId, 
             @PathParam("actionId") final String actionId,
             final InputStream arguments) {
         init(RepresentationType.GENERIC);
 
-        // TODO
-        throw new UnsupportedOperationException();
+        final ObjectAdapter serviceAdapter = getServiceAdapter(serviceId);
+        final DomainResourceHelper helper = new DomainResourceHelper(getResourceContext(), serviceAdapter).using(new DomainServiceLinkTo());
+
+        return helper.invokeAction(actionId, arguments);
     }
 
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/JsonValueEncoder.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/JsonValueEncoder.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/JsonValueEncoder.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/JsonValueEncoder.java Wed Oct 26 23:12:46 2011
@@ -60,11 +60,17 @@ public final class JsonValueEncoder {
         }
         
         if(isInteger(objectSpec)) {
-            if(!representation.isInt()) {
-                throwIncompatibleException(objectSpec, representation);
-            } 
-            String argStr = ""+representation.asInt();
-            return encodableFacet.fromEncodedString(argStr);
+            if(representation.isInt()) {
+                String argStr = ""+representation.asInt();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            // best effort
+            if(representation.isString()) {
+                String argStr = representation.asString();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            // give up
+            throwIncompatibleException(objectSpec, representation);
         }
         
         if(isLong(objectSpec)) {
@@ -76,27 +82,77 @@ public final class JsonValueEncoder {
         }
         
         if(isBigInteger(objectSpec)) {
-            if(!representation.isBigInteger()) {
-                throwIncompatibleException(objectSpec, representation);
-            } 
-            String argStr = ""+representation.asBigInteger();
-            return encodableFacet.fromEncodedString(argStr);
+            if(representation.isBigInteger()) {
+                String argStr = ""+representation.asBigInteger();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            // best effort
+            if(representation.isLong()) {
+                String argStr = ""+representation.asLong();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isInt()) {
+                String argStr = ""+representation.asInt();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isString()) {
+                String argStr = representation.asString();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            // give up
+            throwIncompatibleException(objectSpec, representation);
         }
         
         if(isBigDecimal(objectSpec)) {
-            if(!representation.isBigDecimal()) {
-                throwIncompatibleException(objectSpec, representation);
-            } 
-            String argStr = ""+representation.asBigDecimal();
-            return encodableFacet.fromEncodedString(argStr);
+            if(representation.isBigDecimal()) { 
+                String argStr = ""+representation.asBigDecimal();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            // best effort
+            if(representation.isBigInteger()) { 
+                String argStr = ""+representation.asBigInteger();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isDouble()) {
+                String argStr = ""+representation.asDouble();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            if(representation.isLong()) {
+                String argStr = ""+representation.asLong();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isInt()) {
+                String argStr = ""+representation.asInt();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isString()) {
+                String argStr = representation.asString();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            // give up
+            throwIncompatibleException(objectSpec, representation);
         }
         
         if(isDouble(objectSpec)) {
-            if(!representation.isDouble()) {
-                throwIncompatibleException(objectSpec, representation);
-            } 
-            String argStr = ""+representation.asDouble();
-            return encodableFacet.fromEncodedString(argStr);
+            if(representation.isDouble()) {
+                String argStr = ""+representation.asDouble();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            // best effort
+            if(representation.isLong()) {
+                String argStr = ""+representation.asLong();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isInt()) {
+                String argStr = ""+representation.asInt();
+                return encodableFacet.fromEncodedString(argStr);
+            } 
+            if(representation.isString()) {
+                String argStr = representation.asString();
+                return encodableFacet.fromEncodedString(argStr);
+            }
+            // give up
+            throwIncompatibleException(objectSpec, representation);
         }
         
         if(!representation.isString()) {

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.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/ListReprRenderer.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ListReprRenderer.java Wed Oct 26 23:12:46 2011
@@ -47,7 +47,7 @@ public class ListReprRenderer extends Re
         }
     }
 
-    private ObjectAdapterLinkTo linkToBuilder;
+    private ObjectAdapterLinkTo linkTo;
     private Collection<ObjectAdapter> objectAdapters;
     private ObjectSpecification elementType;
     private ObjectSpecification returnType;
@@ -58,7 +58,7 @@ public class ListReprRenderer extends Re
     }
     
     public ListReprRenderer usingLinkToBuilder(ObjectAdapterLinkTo objectAdapterLinkToBuilder) {
-        this.linkToBuilder = objectAdapterLinkToBuilder.usingResourceContext(resourceContext);
+        this.linkTo = objectAdapterLinkToBuilder.usingResourceContext(resourceContext);
         return this;
     }
 
@@ -98,7 +98,7 @@ public class ListReprRenderer extends Re
         final LinkFollower linkFollower = getLinkFollower().follow("values");
 
         for(ObjectAdapter adapter: objectAdapters) {
-            JsonRepresentation linkToObject = linkToBuilder.with(adapter).builder().build();
+            JsonRepresentation linkToObject = linkTo.with(adapter).builder().build();
             values.arrayAdd(linkToObject);
 
             if(linkFollower.matches(linkToObject)) {
@@ -112,13 +112,5 @@ public class ListReprRenderer extends Re
         representation.mapPut("values", values);
     }
 
-    private void addLinkToReturnType() {
-        addLink(Rel.RETURN_TYPE, returnType);
-    }
-
-    private void addLinkToElementType() {
-        addLink(Rel.ELEMENT_TYPE, elementType);
-    }
-
 
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.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/ObjectActionReprRenderer.java?rev=1189531&r1=1189530&r2=1189531&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ObjectActionReprRenderer.java Wed Oct 26 23:12:46 2011
@@ -20,6 +20,8 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+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.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -83,7 +85,9 @@ public class ObjectActionReprRenderer ex
         RendererFactory factory = RendererFactoryRegistry.instance.find(RepresentationType.OBJECT_ACTION);
         final ObjectActionReprRenderer renderer = 
                 (ObjectActionReprRenderer) factory.newRenderer(getResourceContext(), getLinkFollower(), JsonRepresentation.newMap());
-        renderer.with(new ObjectAndAction(objectAdapter, objectMember)).asFollowed();
+        renderer.with(new ObjectAndAction(objectAdapter, objectMember))
+                .usingLinkTo(linkTo)
+                .asFollowed();
         detailsLink.mapPut("value", renderer.render());
     }
 
@@ -129,6 +133,21 @@ public class ObjectActionReprRenderer ex
         return argMap;
     }
 
+    @Override
+    protected RepresentationType mutatorRepType() {
+        final ObjectSpecification returnType = objectMember.getReturnType();
+        if(returnType == null) {
+            return RepresentationType.GENERIC;
+        }
+        if(returnType.containsFacet(CollectionFacet.class)) {
+            return RepresentationType.LIST;
+        }
+        if(returnType.containsFacet(ValueFacet.class)) {
+            return RepresentationType.SCALAR_VALUE;
+        }
+        return RepresentationType.DOMAIN_OBJECT;
+    }
+    
     private Object argValueFor(int i) {
         if(objectMember.isContributed()) {
             ObjectActionParameter actionParameter = objectMember.getParameters().get(i);