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/12 08:45:02 UTC

svn commit: r1182226 [1/2] - in /incubator/isis/trunk/framework: applib/src/main/java/org/apache/isis/applib/annotation/ core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/ core/progmodel/src/main/java/org/apache/isis/core...

Author: danhaywood
Date: Wed Oct 12 06:45:00 2011
New Revision: 1182226

URL: http://svn.apache.org/viewvc?rev=1182226&view=rev
Log:
ISIS-109, ISIS-124: more on the json-viewer; also added @Stable annotation in order to support application-defined media types

Added:
    incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/Stable.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacet.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacetAbstract.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableAnnotationFacetFactory.java
    incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableFacetAnnotation.java
    incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/
    incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/StableAnnotationFacetFactoryTest.java
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntity.java
    incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntityRepository.java
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/
    incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/StableEntityFixture.java
    incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/
    incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/StableEntityRepositoryDefault.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/UrlDecodeUtils.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java
      - copied, changed from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_invokeAction.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_accept.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java
      - copied, changed from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_services.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/services/
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_accept.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_representationAndHeaders.java
      - copied, changed from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java
      - copied, changed from r1179434, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java
Removed:
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_invokeAction.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_services.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java
Modified:
    incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
    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/RestfulRequest.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/blocks/Link.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/JsonMapper.java
    incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.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/RepresentationMatchers.java
    incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.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/DomainObjectReprRenderer.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/ObjectCollectionReprRenderer.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/main/java/org/apache/isis/viewer/json/viewer/resources/domainobjects/ScalarValueReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/AbstractTypeFeatureReprBuilder.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypeReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/DomainTypesReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionParamReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeActionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypeCollectionReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/domaintypes/TypePropertyReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/home/HomePageReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/user/UserReprRenderer.java
    incubator/isis/trunk/framework/viewer/json/json-viewer/src/test/java/org/apache/isis/viewer/json/viewer/representations/PathFollowerTest_asGraph.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/applib/src/main/java/org/apache/isis/applib/annotation/Stable.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/Stable.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/Stable.java (added)
+++ incubator/isis/trunk/framework/applib/src/main/java/org/apache/isis/applib/annotation/Stable.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,41 @@
+/*
+ *  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.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates that an entity's definition is stable, 
+ * such that any changes to its structure will be
+ * backwardly compatible.
+ * 
+ * <p>
+ * Originally introduced to support the json-viewer's
+ * RESTful support for application-defined mime types.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Stable {
+}

Added: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacet.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacet.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacet.java (added)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacet.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,34 @@
+/*
+ *  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.core.metamodel.facets.object.stable;
+
+import org.apache.isis.core.metamodel.facets.MarkerFacet;
+
+/**
+ * Indicates that this class is stable, that is, any changes to its structure
+ * will be backwards compatible.
+ * 
+ * <p>
+ * In the standard Apache Isis Programming Model, typically corresponds to applying the <tt>@Stable</tt> annotation
+ * at the class level.
+ */
+public interface StableFacet extends MarkerFacet {
+
+}

Added: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacetAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacetAbstract.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacetAbstract.java (added)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/stable/StableFacetAbstract.java Wed Oct 12 06:45:00 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.core.metamodel.facets.object.stable;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.MarkerFacetAbstract;
+
+public abstract class StableFacetAbstract extends MarkerFacetAbstract implements StableFacet {
+
+    public static Class<? extends Facet> type() {
+        return StableFacet.class;
+    }
+
+    public StableFacetAbstract(final FacetHolder holder) {
+        super(type(), holder);
+    }
+
+}

Added: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableAnnotationFacetFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableAnnotationFacetFactory.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableAnnotationFacetFactory.java (added)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableAnnotationFacetFactory.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,45 @@
+/*
+ *  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.core.progmodel.facets.object.stable.annotation;
+
+import org.apache.isis.applib.annotation.Stable;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.AnnotationBasedFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.object.stable.StableFacet;
+
+public class StableAnnotationFacetFactory extends AnnotationBasedFacetFactoryAbstract {
+
+    public StableAnnotationFacetFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContaxt) {
+        final Stable annotation = getAnnotation(processClassContaxt.getCls(), Stable.class);
+        FacetUtil.addFacet(create(annotation, processClassContaxt.getFacetHolder()));
+    }
+
+    private StableFacet create(final Stable annotation, final FacetHolder holder) {
+        return annotation == null ? null : new StableFacetAnnotation(holder);
+    }
+
+}

Added: incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableFacetAnnotation.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableFacetAnnotation.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableFacetAnnotation.java (added)
+++ incubator/isis/trunk/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/facets/object/stable/annotation/StableFacetAnnotation.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,31 @@
+/*
+ *  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.core.progmodel.facets.object.stable.annotation;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.stable.StableFacetAbstract;
+
+public class StableFacetAnnotation extends StableFacetAbstract {
+
+    public StableFacetAnnotation(final FacetHolder holder) {
+        super(holder);
+    }
+
+}

Added: incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/StableAnnotationFacetFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/StableAnnotationFacetFactoryTest.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/StableAnnotationFacetFactoryTest.java (added)
+++ incubator/isis/trunk/framework/core/progmodel/src/test/java/org/apache/isis/core/progmodel/facets/object/stable/StableAnnotationFacetFactoryTest.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,62 @@
+/*
+ *  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.core.progmodel.facets.object.stable;
+
+import org.apache.isis.applib.annotation.Stable;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
+import org.apache.isis.core.metamodel.facets.object.stable.StableFacet;
+import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.progmodel.facets.object.stable.annotation.StableAnnotationFacetFactory;
+import org.apache.isis.core.progmodel.facets.object.stable.annotation.StableFacetAnnotation;
+
+public class StableAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
+
+    private StableAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new StableAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testStableAnnotationPickedUpOnClassAndDefaultsToAlways() {
+        @Stable
+        class Customer {}
+
+        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(StableFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof StableFacetAnnotation);
+
+        assertNoMethodsRemoved();
+    }
+
+}
+

Modified: incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java (original)
+++ incubator/isis/trunk/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java Wed Oct 12 06:45:00 2011
@@ -97,6 +97,7 @@ import org.apache.isis.core.progmodel.fa
 import org.apache.isis.core.progmodel.facets.object.plural.annotation.PluralAnnotationFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.plural.staticmethod.PluralMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.regex.annotation.RegExFacetAnnotationForTypeFacetFactory;
+import org.apache.isis.core.progmodel.facets.object.stable.annotation.StableAnnotationFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.title.TitleMethodFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.typicallen.annotation.TypicalLengthAnnotationOnTypeFacetFactory;
 import org.apache.isis.core.progmodel.facets.object.validate.method.ValidateObjectViaValidateMethodFacetFactory;
@@ -286,6 +287,8 @@ public class ProgrammingModelFacetsJava5
 
         addFactory(ImmutableMarkerInterfacesFacetFactory.class);
 
+        addFactory(StableAnnotationFacetFactory.class);
+
         addFactory(MaxLengthAnnotationForTypeFacetFactory.class);
         addFactory(MaxLengthAnnotationForPropertyFacetFactory.class);
         addFactory(MaxLengthAnnotationForParameterFacetFactory.class);

Added: incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntity.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntity.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntity.java (added)
+++ incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntity.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,43 @@
+/*
+ *  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.stables;
+
+import org.apache.isis.applib.AbstractDomainObject;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Stable;
+
+@Stable
+public class StableEntity extends AbstractDomainObject {
+
+    // {{ Name
+    private String name;
+
+    @MemberOrder(sequence = "1")
+    public String getName() {
+        return name;
+    }
+
+    public void setName(final String name) {
+        this.name = name;
+    }
+    // }}
+
+
+}

Added: incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntityRepository.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntityRepository.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntityRepository.java (added)
+++ incubator/isis/trunk/framework/tck/tck-dom/src/main/java/org/apache/isis/tck/dom/stables/StableEntityRepository.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,45 @@
+/*
+ *  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.stables;
+
+import java.util.List;
+
+import org.apache.isis.applib.annotation.Idempotent;
+import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Named;
+import org.apache.isis.applib.annotation.QueryOnly;
+
+@Named("Stables")
+public interface StableEntityRepository {
+
+    @QueryOnly
+    @MemberOrder(sequence="1")
+    public List<StableEntity> list();
+
+    @MemberOrder(sequence="2")
+    public StableEntity newTransientEntity();
+
+    @Idempotent
+    @MemberOrder(sequence="2")
+    public StableEntity newPersistentEntity(
+        @Named("name") String name);
+
+
+}

Added: incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/StableEntityFixture.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/StableEntityFixture.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/StableEntityFixture.java (added)
+++ incubator/isis/trunk/framework/tck/tck-fixture/src/main/java/org/apache/isis/tck/fixture/stables/StableEntityFixture.java Wed Oct 12 06:45:00 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.stables;
+
+import org.apache.isis.applib.fixtures.AbstractFixture;
+import org.apache.isis.tck.dom.stables.StableEntity;
+import org.apache.isis.tck.dom.stables.StableEntityRepository;
+
+
+public class StableEntityFixture extends AbstractFixture {
+
+    @Override
+    public void install() {
+        createEntity("John");
+        createEntity("Mary");
+        createEntity("Bill");
+        createEntity("Sally");
+        createEntity("Diedre");
+    }
+    
+    private StableEntity createEntity(String name) {
+        return stableEntityRepository.newPersistentEntity(name);
+    }
+
+
+    // {{ injected: StableEntityRepository
+    private StableEntityRepository stableEntityRepository;
+
+    public void setStableEntityRepository(final StableEntityRepository stableEntityRepository) {
+        this.stableEntityRepository = stableEntityRepository;
+    }
+    // }}
+
+
+    
+}

Added: incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/StableEntityRepositoryDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/StableEntityRepositoryDefault.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/StableEntityRepositoryDefault.java (added)
+++ incubator/isis/trunk/framework/tck/tck-objstore-dflt/src/main/java/org/apache/isis/tck/objstore/dflt/stables/StableEntityRepositoryDefault.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,51 @@
+/*
+ *  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.stables;
+
+import org.apache.isis.tck.dom.AbstractEntityRepository;
+import org.apache.isis.tck.dom.stables.StableEntity;
+import org.apache.isis.tck.dom.stables.StableEntityRepository;
+
+public class StableEntityRepositoryDefault extends AbstractEntityRepository<StableEntity> implements StableEntityRepository {
+
+    public StableEntityRepositoryDefault() {
+        super(StableEntity.class);
+    }
+
+    @Override
+    public String getId() {
+        return "stables";
+    }
+
+    @Override
+    public StableEntity newTransientEntity() {
+        return newTransientInstance(StableEntity.class);
+    }
+
+    @Override
+    public StableEntity newPersistentEntity(String name) {
+        StableEntity entity = newTransientEntity();
+        entity.setName(name);
+        getContainer().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=1182226&r1=1182225&r2=1182226&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 12 06:45:00 2011
@@ -16,18 +16,22 @@
 #  under the License.
 isis.services.prefix = org.apache.isis.tck.objstore.dflt
 isis.services =\
-    scalars.ApplibValuesEntityRepositoryDefault,\
-    scalars.JdkValuesEntityRepositoryDefault,\
-    scalars.PrimitiveValuesEntityRepositoryDefault,\
-    scalars.WrapperValuesEntityRepositoryDefault
+    scalars.ApplibValuedEntityRepositoryDefault,\
+    scalars.JdkValuedEntityRepositoryDefault,\
+    scalars.PrimitiveValuedEntityRepositoryDefault,\
+    scalars.WrapperValuedEntityRepositoryDefault, \
+    simples.SimpleEntityRepositoryDefault,\
+    stables.StableEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
     LogonAsSvenFixture,\
-    scalars.ApplibValuesEntityFixture,\
-    scalars.JdkValuesEntityFixture,\
-    scalars.PrimitiveValuesEntityFixture,\
-    scalars.WrapperValuesEntityFixture
+    scalars.ApplibValuedEntityFixture,\
+    scalars.JdkValuedEntityFixture,\
+    scalars.PrimitiveValuedEntityFixture,\
+    scalars.WrapperValuedEntityFixture,\
+    simples.SimpleEntityFixture,\
+    stables.StableEntityFixture
 
 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=1182226&r1=1182225&r2=1182226&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 12 06:45:00 2011
@@ -16,18 +16,22 @@
 #  under the License.
 isis.services.prefix = org.apache.isis.tck.objstore.dflt
 isis.services =\
-    scalars.ApplibValuesEntityRepositoryDefault,\
-    scalars.JdkValuesEntityRepositoryDefault,\
-    scalars.PrimitiveValuesEntityRepositoryDefault,\
-    scalars.WrapperValuesEntityRepositoryDefault
+    scalars.ApplibValuedEntityRepositoryDefault,\
+    scalars.JdkValuedEntityRepositoryDefault,\
+    scalars.PrimitiveValuedEntityRepositoryDefault,\
+    scalars.WrapperValuedEntityRepositoryDefault, \
+    simples.SimpleEntityRepositoryDefault,\
+    stables.StableEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
     LogonAsSvenFixture,\
-    scalars.ApplibValuesEntityFixture,\
-    scalars.JdkValuesEntityFixture,\
-    scalars.PrimitiveValuesEntityFixture,\
-    scalars.WrapperValuesEntityFixture
+    scalars.ApplibValuedEntityFixture,\
+    scalars.JdkValuedEntityFixture,\
+    scalars.PrimitiveValuedEntityFixture,\
+    scalars.WrapperValuedEntityFixture,\
+    simples.SimpleEntityFixture,\
+    stables.StableEntityFixture
 
 isis.exploration.users=sven, dick, bob
 

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/RestfulRequest.java Wed Oct 12 06:45:00 2011
@@ -1,5 +1,7 @@
 package org.apache.isis.viewer.json.applib;
 
+import static org.apache.isis.viewer.json.applib.util.UrlDecodeUtils.*;
+
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -34,6 +36,11 @@ public final class RestfulRequest {
                 }
             };
         }
+        
+        @Override
+        public String toString() {
+            return name().toLowerCase();
+        }
     }
     
     public static class QueryParameter<Q> {
@@ -79,9 +86,14 @@ public final class RestfulRequest {
             }
             // special case processing
             if(values.length == 1) {
-                return getParser().valueOf(values[0]);
+                return getParser().valueOf(urlDecode(values[0]));
             }
-            return getParser().valueOf(values);
+            return getParser().valueOf(urlDecode(values));
+        }
+        
+        @Override
+        public String toString() {
+            return getName();
         }
     }
 
@@ -107,6 +119,11 @@ public final class RestfulRequest {
         void setHeader(ClientRequest clientRequest, X t) {
             clientRequest.header(getName(), parser.asString(t));
         }
+        
+        @Override
+        public String toString() {
+            return getName();
+        }
     }
 
     private final ClientRequest clientRequest;

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/blocks/Link.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/blocks/Link.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/blocks/Link.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/blocks/Link.java Wed Oct 12 06:45:00 2011
@@ -58,6 +58,10 @@ public final class Link extends JsonRepr
         return this;
     }
 
+    public JsonRepresentation getValue() {
+        return getRepresentation("value");
+    }
+
     public Method getMethod() {
         String methodStr = asObjectNode().path("method").getTextValue();
         return Method.valueOf(methodStr);
@@ -122,7 +126,7 @@ public final class Link extends JsonRepr
     public String toString() {
         return "Link [rel=" + getRel() + ", href=" + getHref()+ ", method=" + getMethod() + "]";
     }
-    
+
 
     
 }

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/JsonMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/JsonMapper.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/JsonMapper.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/JsonMapper.java Wed Oct 12 06:45:00 2011
@@ -31,6 +31,7 @@ import org.codehaus.jackson.map.deser.Js
 import org.codehaus.jackson.map.deser.StdDeserializerProvider;
 import org.codehaus.jackson.map.module.SimpleModule;
 import org.codehaus.jackson.type.JavaType;
+import org.jboss.resteasy.client.ClientResponse;
 
 
 public final class JsonMapper {
@@ -133,7 +134,8 @@ public final class JsonMapper {
     }
 
     public <T> T read(Response response, Class<T> requiredType) throws JsonParseException, JsonMappingException, IOException {
-        Object entityObj = response.getEntity();
+        final ClientResponse<?> clientResponse = (ClientResponse<?>)response; // a shame, but needed if calling resources directly
+        Object entityObj = clientResponse.getEntity(String.class);
         if(entityObj == null) {
             return null;
         }

Added: incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/UrlDecodeUtils.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/UrlDecodeUtils.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/UrlDecodeUtils.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/main/java/org/apache/isis/viewer/json/applib/util/UrlDecodeUtils.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,51 @@
+package org.apache.isis.viewer.json.applib.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.jboss.resteasy.client.ClientRequest;
+import org.jboss.resteasy.util.URLUtils;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+public final class UrlDecodeUtils {
+
+    public final static Function<String, String> FUNCTION = new Function<String, String>() {
+        
+        @Override
+        public String apply(String input) {
+            try {
+                return URLDecoder.decode(input, "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                return "";
+            }
+        }
+    };
+
+    private UrlDecodeUtils() {}
+
+    public static String urlDecode(String string) {
+        return FUNCTION.apply(string);
+    }
+
+    public static List<String> urlDecode(List<String> values) {
+        return Lists.transform(values, FUNCTION);
+    }
+
+    public static String[] urlDecode(String[] values) {
+        final List<String> asList = Arrays.asList(values);
+        return urlDecode(asList).toArray(new String[]{});
+    }
+
+}

Modified: incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-applib/src/test/java/org/apache/isis/viewer/json/applib/RestfulRequestQueryParameterTest_valueOf.java Wed Oct 12 06:45:00 2011
@@ -3,6 +3,8 @@ package org.apache.isis.viewer.json.appl
 import static org.hamcrest.CoreMatchers.*;
 import static org.junit.Assert.assertThat;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -79,6 +81,21 @@ public class RestfulRequestQueryParamete
         assertThat(valueOf.get(1).get(1), is("c"));
     }
 
+    @Test
+    public void commaSeparatedListUrlEncoded() throws UnsupportedEncodingException {
+        
+        final QueryParameter<List<List<String>>> queryParameter = RestfulRequest.QueryParameter.FOLLOW_LINKS;
+        parameterMap.put("x-ro-follow-links", new String[]{URLEncoder.encode("a,b.c", "UTF-8")});
+        List<List<String>> valueOf = queryParameter.valueOf(parameterMap);
+        
+        assertThat(valueOf.size(), is(2));
+        assertThat(valueOf.get(0).size(), is(1));
+        assertThat(valueOf.get(0).get(0), is("a"));
+        assertThat(valueOf.get(1).size(), is(2));
+        assertThat(valueOf.get(1).get(0), is("b"));
+        assertThat(valueOf.get(1).get(1), is("c"));
+    }
+
 
 
 }

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=1182226&r1=1182225&r2=1182226&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 12 06:45:00 2011
@@ -20,7 +20,8 @@ isis.services =\
     scalars.JdkValuedEntityRepositoryDefault,\
     scalars.PrimitiveValuedEntityRepositoryDefault,\
     scalars.WrapperValuedEntityRepositoryDefault, \
-    simples.SimpleEntityRepositoryDefault
+    simples.SimpleEntityRepositoryDefault,\
+    stables.StableEntityRepositoryDefault
 
 isis.fixtures.prefix= org.apache.isis.tck.fixture
 isis.fixtures=\
@@ -29,7 +30,8 @@ isis.fixtures=\
     scalars.JdkValuedEntityFixture,\
     scalars.PrimitiveValuedEntityFixture,\
     scalars.WrapperValuedEntityFixture,\
-    simples.SimpleEntityFixture\
+    simples.SimpleEntityFixture,\
+    stables.StableEntityFixture
 
 
 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/RepresentationMatchers.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/RepresentationMatchers.java Wed Oct 12 06:45:00 2011
@@ -1,7 +1,5 @@
 package org.apache.isis.viewer.json.tck;
 
-import java.io.IOException;
-
 import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -14,8 +12,6 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.blocks.Link;
 import org.apache.isis.viewer.json.applib.blocks.Method;
 import org.apache.isis.viewer.json.tck.RepresentationMatchers.AbstractMatcherBuilder;
-import org.codehaus.jackson.JsonParseException;
-import org.codehaus.jackson.map.JsonMappingException;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
@@ -115,7 +111,7 @@ public class RepresentationMatchers {
     }
 
 
-    public static <T> void assertThat(T actual, AbstractMatcherBuilder<T> matcherBuilder) {
+    public static <T extends JsonRepresentation> void assertThat(T actual, AbstractMatcherBuilder<T> matcherBuilder) {
         Assert.assertThat(actual, matcherBuilder.build());
     }
 
@@ -128,7 +124,7 @@ public class RepresentationMatchers {
     }
 
 
-    public static abstract class AbstractMatcherBuilder<T> {
+    public static abstract class AbstractMatcherBuilder<T extends JsonRepresentation> {
         protected RestfulClient client;
 
         public AbstractMatcherBuilder() {
@@ -142,12 +138,14 @@ public class RepresentationMatchers {
         public abstract Matcher<T> build();
     }
 
-    public static class LinkMatcherBuilder extends AbstractMatcherBuilder<Link> {
+    public static class LinkMatcherBuilder extends AbstractMatcherBuilder<JsonRepresentation> {
         private HttpStatusCode statusCode;
         private Method method;
         private String rel;
         private String href;
         private Matcher<String> hrefMatcher;
+        private Matcher<JsonRepresentation> valueMatcher;
+        private Boolean novalue;
 
         private LinkMatcherBuilder(RestfulClient client) {
             super(client);
@@ -173,6 +171,21 @@ public class RepresentationMatchers {
             return this;
         }
 
+        public LinkMatcherBuilder novalue() {
+            if(valueMatcher != null) {
+                throw new IllegalStateException("cannot assert on both there being a value and there not being a value");
+            }
+            this.novalue = true;
+            return this;
+        }
+
+        public LinkMatcherBuilder value(Matcher<JsonRepresentation> valueMatcher) {
+            if(this.novalue != null) {
+                throw new IllegalStateException("cannot assert on both there being a value and there not being a value");
+            }
+            this.valueMatcher = valueMatcher;
+            return this;
+        }
 
         public LinkMatcherBuilder returning(HttpStatusCode statusCode) {
             this.statusCode = statusCode;
@@ -180,13 +193,12 @@ public class RepresentationMatchers {
         }
 
         @Override
-        public Matcher<Link> build() {
-            
-            return new TypeSafeMatcher<Link>() {
+        public Matcher<JsonRepresentation> build() {
+            return new TypeSafeMatcher<JsonRepresentation>() {
 
                 @Override
                 public void describeTo(Description description) {
-                    description.appendText("a link ");
+                    description.appendText("a link");
                     if(rel != null) {
                         description.appendText(" with rel ").appendText(rel);
                     }
@@ -200,13 +212,20 @@ public class RepresentationMatchers {
                     if(method != null) {
                         description.appendText(" with method ").appendValue(method);
                     }
+                    if(novalue) {
+                        description.appendText(" with no value");
+                    }
+                    if(valueMatcher != null) {
+                        description.appendText(" with value ");
+                        valueMatcher.describeTo(description);
+                    }
                     
                     // trigger link being followed
                     if(statusCode != null) {
                         if(client == null) {
-                            description.appendText(" !!! provide client in matcher's constructor !!!");
+                            throw new IllegalStateException("require client in order to assert on statusCode");
                         }
-                        description.appendText(" that when followed");
+                        description.appendText(" that when followed returns status " + statusCode);
                     }
                     
                     // assertions on response
@@ -216,7 +235,11 @@ public class RepresentationMatchers {
                 }
 
                 @Override
-                public boolean matchesSafely(Link link) {
+                public boolean matchesSafely(JsonRepresentation linkRepr) {
+                    if(linkRepr == null) {
+                        return false;
+                    }
+                    Link link = linkRepr.asLink();
                     if(rel != null && !rel.equals(link.getRel())) {
                         return false;
                     }
@@ -229,6 +252,12 @@ public class RepresentationMatchers {
                     if(method != null && !method.equals(link.getMethod())) {
                         return false;
                     }
+                    if(novalue !=null && novalue && link.getValue() != null) {
+                        return false;
+                    }
+                    if(valueMatcher != null && !valueMatcher.matches(link)) {
+                        return false;
+                    }
 
                     // follow link if criteria require it
                     Response linkedResp = null;

Modified: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.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/home/HomePageResourceTest_xrofollowlinks.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/home/HomePageResourceTest_xrofollowlinks.java Wed Oct 12 06:45:00 2011
@@ -1,5 +1,10 @@
 package org.apache.isis.viewer.json.tck.resources.home;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
 import org.apache.isis.runtimes.dflt.webserver.WebServer;
 import org.apache.isis.viewer.json.applib.HttpMethod;
 import org.apache.isis.viewer.json.applib.RestfulClient;
@@ -7,7 +12,6 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
 import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
-import org.apache.isis.viewer.json.applib.homepage.HomePageResource;
 import org.apache.isis.viewer.json.tck.IsisWebServerRule;
 import org.junit.Before;
 import org.junit.Rule;
@@ -20,24 +24,35 @@ public class HomePageResourceTest_xrofol
     public IsisWebServerRule webServerRule = new IsisWebServerRule();
     
     private RestfulClient client;
-    private HomePageResource resource;
 
     @Before
     public void setUp() throws Exception {
         WebServer webServer = webServerRule.getWebServer();
         client = new RestfulClient(webServer.getBase());
-        
-        resource = client.getHomePageResource();
     }
 
     @Test
     public void xrofollowLinks() throws Exception {
 
-        // TODO: this needs to be more generic
-        final RestfulRequest request = client.createRequest(HttpMethod.GET, "/").withArg(QueryParameter.FOLLOW_LINKS, "user,services");
-        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+        RestfulRequest request;
+        RestfulResponse<HomePageRepresentation> restfulResponse;
+        HomePageRepresentation repr;
         
+        request = client.createRequest(HttpMethod.GET, "/");
+        restfulResponse = request.executeT();
+        repr = restfulResponse.getEntity();
         
+        assertThat(repr.getUser().getValue(), is(nullValue()));
+        assertThat(repr.getCapabilities().getValue(), is(nullValue()));
+        assertThat(repr.getServices().getValue(), is(nullValue()));
+
+        request = client.createRequest(HttpMethod.GET, "/").withArg(QueryParameter.FOLLOW_LINKS, "user,services,capabilities");
+        restfulResponse = request.executeT();
+        repr = restfulResponse.getEntity();
+
+        assertThat(repr.getUser().getValue(), is(not(nullValue())));
+        assertThat(repr.getCapabilities().getValue(), is(not(nullValue())));
+        assertThat(repr.getServices().getValue(), is(not(nullValue())));
     }
     
 

Copied: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java (from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/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?p2=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/invoke/DomainServiceResourceTest_invokeAction.java&p1=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_invokeAction.java&r1=1178710&r2=1182226&rev=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/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 12 06:45:00 2011
@@ -1,4 +1,4 @@
-package org.apache.isis.viewer.json.tck.resources.service;
+package org.apache.isis.viewer.json.tck.resources.service.invoke;
 
 import java.io.IOException;
 

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_accept.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/services/DomainServiceResourceTest_services_accept.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_accept.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_accept.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,63 @@
+package org.apache.isis.viewer.json.tck.resources.service.services;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.RepresentationType;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class DomainServiceResourceTest_services_accept {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void applicationJson() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "services").withHeader(RestfulRequest.Header.ACCEPT, MediaType.APPLICATION_JSON_TYPE);
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_profileList() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "services").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.LIST.getMediaType());
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_invalid() throws Exception {
+
+        final RestfulRequest request = client.createRequest(HttpMethod.GET, "services").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.USER.getMediaType());
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.NOT_ACCEPTABLE));
+    }
+
+}

Copied: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java (from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_services.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/services/DomainServiceResourceTest_services_representationAndHeaders.java?p2=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java&p1=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_services.java&r1=1178710&r2=1182226&rev=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/DomainServiceResourceTest_services.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_representationAndHeaders.java Wed Oct 12 06:45:00 2011
@@ -1,4 +1,4 @@
-package org.apache.isis.viewer.json.tck.resources.service;
+package org.apache.isis.viewer.json.tck.resources.service.services;
 
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isArray;
@@ -24,7 +24,6 @@ import org.apache.isis.viewer.json.appli
 import org.apache.isis.viewer.json.applib.domainobjects.DomainServiceResource;
 import org.apache.isis.viewer.json.applib.domainobjects.ListRepresentation;
 import org.apache.isis.viewer.json.tck.IsisWebServerRule;
-import org.apache.isis.viewer.json.tck.RepresentationMatchers;
 import org.codehaus.jackson.JsonParseException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.junit.Before;
@@ -32,7 +31,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 
-public class DomainServiceResourceTest_services {
+public class DomainServiceResourceTest_services_representationAndHeaders {
 
     @Rule
     public IsisWebServerRule webServerRule = new IsisWebServerRule();

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.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/services/DomainServiceResourceTest_services_xrofollowlinks.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/service/services/DomainServiceResourceTest_services_xrofollowlinks.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,67 @@
+package org.apache.isis.viewer.json.tck.resources.service.services;
+
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isArray;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isLink;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isMap;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.JsonRepresentation;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulRequest.QueryParameter;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.domainobjects.ListRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+
+public class DomainServiceResourceTest_services_xrofollowlinks {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+    
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void xrofollowLinks() throws Exception {
+
+        RestfulRequest request;
+        RestfulResponse<ListRepresentation> restfulResponse;
+        ListRepresentation repr;
+        
+        request = client.createRequest(HttpMethod.GET, "services");
+        restfulResponse = request.executeT();
+        repr = restfulResponse.getEntity();
+        
+        assertThat(repr.getValues(), isArray());
+        assertThat(repr.getValues().arraySize(), is(greaterThan(0)));
+        assertThat(repr.getValues().arrayGet(0), isLink().novalue());
+
+        request = client.createRequest(HttpMethod.GET, "services").withArg(QueryParameter.FOLLOW_LINKS, "values");
+        restfulResponse = request.executeT();
+        repr = restfulResponse.getEntity();
+
+        assertThat(repr.getValues().arrayGet(0), isLink().value(is(not(Matchers.<JsonRepresentation>nullValue()))));
+        assertThat(repr.getValues().arrayGet(0).getRepresentation("value"), isMap());
+    }
+    
+
+}
+
+
+    
\ No newline at end of file

Added: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_accept.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/user/UserResourceTest_accept.java?rev=1182226&view=auto
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_accept.java (added)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_accept.java Wed Oct 12 06:45:00 2011
@@ -0,0 +1,63 @@
+package org.apache.isis.viewer.json.tck.resources.user;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import javax.ws.rs.core.MediaType;
+
+import org.apache.isis.runtimes.dflt.webserver.WebServer;
+import org.apache.isis.viewer.json.applib.HttpMethod;
+import org.apache.isis.viewer.json.applib.RepresentationType;
+import org.apache.isis.viewer.json.applib.RestfulClient;
+import org.apache.isis.viewer.json.applib.RestfulRequest;
+import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
+import org.apache.isis.viewer.json.applib.homepage.HomePageRepresentation;
+import org.apache.isis.viewer.json.tck.IsisWebServerRule;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class UserResourceTest_accept {
+
+    @Rule
+    public IsisWebServerRule webServerRule = new IsisWebServerRule();
+
+    private RestfulClient client;
+
+    @Before
+    public void setUp() throws Exception {
+        WebServer webServer = webServerRule.getWebServer();
+        client = new RestfulClient(webServer.getBase());
+    }
+
+    @Test
+    public void applicationJson() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "user").withHeader(RestfulRequest.Header.ACCEPT, MediaType.APPLICATION_JSON_TYPE);
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_profileUser() throws Exception {
+
+        final RestfulRequest request = 
+                client.createRequest(HttpMethod.GET, "user").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.USER.getMediaType());
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.OK));
+    }
+
+    @Test
+    public void applicationJson_invalid() throws Exception {
+
+        final RestfulRequest request = client.createRequest(HttpMethod.GET, "user").withHeader(RestfulRequest.Header.ACCEPT, RepresentationType.HOME_PAGE.getMediaType());
+        final RestfulResponse<HomePageRepresentation> restfulResponse = request.executeT();
+
+        assertThat(restfulResponse.getStatus(), is(HttpStatusCode.NOT_ACCEPTABLE));
+    }
+
+}

Copied: incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_representationAndHeaders.java (from r1178710, incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest.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/user/UserResourceTest_representationAndHeaders.java?p2=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_representationAndHeaders.java&p1=incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest.java&r1=1178710&r2=1182226&rev=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-tck/src/test/java/org/apache/isis/viewer/json/tck/resources/user/UserResourceTest_representationAndHeaders.java Wed Oct 12 06:45:00 2011
@@ -1,6 +1,10 @@
 package org.apache.isis.viewer.json.tck.resources.user;
 
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.assertThat;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasMaxAge;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasParameter;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasSubType;
+import static org.apache.isis.viewer.json.tck.RepresentationMatchers.hasType;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isArray;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isFollowableLinkToSelf;
 import static org.apache.isis.viewer.json.tck.RepresentationMatchers.isLink;
@@ -12,6 +16,8 @@ import static org.junit.Assert.assertTha
 
 import java.io.IOException;
 
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status.Family;
 
@@ -19,6 +25,7 @@ import org.apache.isis.runtimes.dflt.web
 import org.apache.isis.viewer.json.applib.RepresentationType;
 import org.apache.isis.viewer.json.applib.RestfulClient;
 import org.apache.isis.viewer.json.applib.RestfulResponse;
+import org.apache.isis.viewer.json.applib.RestfulResponse.Header;
 import org.apache.isis.viewer.json.applib.RestfulResponse.HttpStatusCode;
 import org.apache.isis.viewer.json.applib.blocks.Method;
 import org.apache.isis.viewer.json.applib.user.UserRepresentation;
@@ -32,7 +39,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 
-public class UserResourceTest {
+public class UserResourceTest_representationAndHeaders {
 
     @Rule
     public IsisWebServerRule webServerRule = new IsisWebServerRule();
@@ -48,7 +55,6 @@ public class UserResourceTest {
         resource = client.getUserResource();
     }
 
-    @Ignore("self link is broken")
     @Test
     public void representation() throws Exception {
 
@@ -61,8 +67,6 @@ public class UserResourceTest {
         
         // then
         assertThat(jsonResp.getStatus(), is(HttpStatusCode.OK));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CONTENT_TYPE), is(RepresentationType.USER.getMediaType()));
-        assertThat(jsonResp.getHeader(RestfulResponse.Header.CACHE_CONTROL).getMaxAge(), is(3600));
         
         UserRepresentation repr = jsonResp.getEntity();
         assertThat(repr, is(not(nullValue())));
@@ -78,7 +82,29 @@ public class UserResourceTest {
         assertThat(repr.getExtensions(), isMap());
     }
 
-    @Ignore("self link is broken")
+    @Test
+    public void headers() throws Exception {
+
+        // given
+        Response resp = resource.user();
+        
+        // when
+        RestfulResponse<UserRepresentation> restfulResponse = RestfulResponse.ofT(resp);
+        
+        // then
+        final MediaType contentType = restfulResponse.getHeader(Header.CONTENT_TYPE);
+        assertThat(contentType, hasType("application"));
+        assertThat(contentType, hasSubType("json"));
+        assertThat(contentType, hasParameter("profile", "http://restfulobjects.org/profiles/user"));
+        assertThat(contentType, is(RepresentationType.USER.getMediaType()));
+
+        // then
+        final CacheControl cacheControl = restfulResponse.getHeader(Header.CACHE_CONTROL);
+        assertThat(cacheControl, hasMaxAge(60*60));
+        assertThat(cacheControl.getMaxAge(), is(60*60));
+    }
+
+    
     @Test
     public void self_isFollowable() throws Exception {
         // given

Copied: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java (from r1179434, incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java?p2=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java&p1=incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java&r1=1179434&r2=1182226&rev=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/PathFollower.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/LinkFollower.java Wed Oct 12 06:45:00 2011
@@ -6,7 +6,8 @@ import java.util.Map;
 
 import com.google.common.collect.Maps;
 
-public final class PathFollower {
+@SuppressWarnings({"rawtypes","unchecked"})
+public final class LinkFollower {
 
     public final static Map<String,Map> asGraph(List<List<String>> links) {
         if(links == null) {
@@ -32,29 +33,29 @@ public final class PathFollower {
         mergeInto(list.subList(1, list.size()), submap);
     }
 
-    public final static PathFollower initial(List<List<String>> links) {
+    public final static LinkFollower initial(List<List<String>> links) {
         final Map<String, Map> graph = asGraph(links);
-        return new PathFollower(graph, Mode.FOLLOWING_PATH);
+        return new LinkFollower(graph, Mode.FOLLOWINGPATH);
     }
 
-    public final static PathFollower following(Map<String,Map> graph) {
-        return new PathFollower(graph, Mode.FOLLOWING_PATH);
+    public final static LinkFollower following(Map<String,Map> graph) {
+        return new LinkFollower(graph, Mode.FOLLOWINGPATH);
     }
 
-    private static PathFollower terminated() {
-        return new PathFollower(null, Mode.TERMINATED);
+    private static LinkFollower terminated() {
+        return new LinkFollower(null, Mode.TERMINATED);
     }
 
 
     private enum Mode {
-        FOLLOWING_PATH,
+        FOLLOWINGPATH,
         TERMINATED;
     }
 
     private final Map<String, Map> graph;
     private Mode mode;
 
-    private PathFollower(Map<String, Map> graph, Mode mode) {
+    private LinkFollower(Map<String, Map> graph, Mode mode) {
         this.graph = graph;
         this.mode = mode;
     }
@@ -62,21 +63,25 @@ public final class PathFollower {
     /**
      * A little algebra...
      */
-    public PathFollower follow(String path) {
+    public LinkFollower follow(String path) {
         if(path == null || mode == Mode.TERMINATED) {
-            return PathFollower.terminated();
+            return LinkFollower.terminated();
         }
-        if(mode == Mode.FOLLOWING_PATH) {
+        if(mode == Mode.FOLLOWINGPATH) {
             Map remaining = graph.get(path);
             if(remaining != null) {
-                return PathFollower.following(remaining);
+                return LinkFollower.following(remaining);
             } else {
-                return PathFollower.terminated();
+                return LinkFollower.terminated();
             }
         }
-        return PathFollower.terminated();
+        return LinkFollower.terminated();
     }
-    
+
+    public boolean isFollowing() {
+        return mode == Mode.FOLLOWINGPATH;
+    }
+
     public boolean isTerminated() {
         return mode == Mode.TERMINATED;
     }

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/RendererFactory.java Wed Oct 12 06:45:00 2011
@@ -8,6 +8,6 @@ public interface RendererFactory {
 
     RepresentationType getRepresentationType();
 
-    ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation);
+    ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, LinkFollower linkFollower, JsonRepresentation representation);
     
 }
\ No newline at end of file

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/representations/ReprRendererAbstract.java Wed Oct 12 06:45:00 2011
@@ -13,32 +13,32 @@ import org.apache.isis.viewer.json.viewe
 public abstract class ReprRendererAbstract<R extends ReprRendererAbstract<R, T>, T> implements ReprRenderer<R, T> {
 
     protected final ResourceContext resourceContext;
-    private final PathFollower pathFollower;
+    private final LinkFollower linkFollower;
     private final RepresentationType representationType;
     protected final JsonRepresentation representation;
     
     protected boolean includesSelf;
 
-    public ReprRendererAbstract(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
+    public ReprRendererAbstract(ResourceContext resourceContext, LinkFollower linkFollower, RepresentationType representationType, JsonRepresentation representation) {
         this.resourceContext = resourceContext;
-        this.pathFollower = asProvidedElseCreate(pathFollower);
+        this.linkFollower = asProvidedElseCreate(linkFollower);
         this.representationType = representationType;
         this.representation = representation;
     }
 
-    private PathFollower asProvidedElseCreate(PathFollower pathFollower) {
-        if(pathFollower != null) {
-            return pathFollower;
+    private LinkFollower asProvidedElseCreate(LinkFollower linkFollower) {
+        if(linkFollower != null) {
+            return linkFollower;
         }
-        return PathFollower.initial(resourceContext.getFollowLinks());
+        return LinkFollower.initial(resourceContext.getFollowLinks());
     }
 
     public ResourceContext getResourceContext() {
         return resourceContext;
     }
 
-    public PathFollower getPathFollower() {
-        return pathFollower;
+    public LinkFollower getLinkFollower() {
+        return linkFollower;
     }
 
     @Override

Modified: incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.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/capabilities/CapabilitiesReprRenderer.java?rev=1182226&r1=1182225&r2=1182226&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.java (original)
+++ incubator/isis/trunk/framework/viewer/json/json-viewer/src/main/java/org/apache/isis/viewer/json/viewer/resources/capabilities/CapabilitiesReprRenderer.java Wed Oct 12 06:45:00 2011
@@ -3,7 +3,7 @@ package org.apache.isis.viewer.json.view
 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.PathFollower;
+import org.apache.isis.viewer.json.viewer.representations.LinkFollower;
 import org.apache.isis.viewer.json.viewer.representations.ReprRenderer;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererAbstract;
 import org.apache.isis.viewer.json.viewer.representations.ReprRendererFactoryAbstract;
@@ -16,13 +16,13 @@ public class CapabilitiesReprRenderer ex
         }
 
         @Override
-        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, PathFollower pathFollower, JsonRepresentation representation) {
-            return new CapabilitiesReprRenderer(resourceContext, pathFollower, getRepresentationType(), representation);
+        public ReprRenderer<?, ?> newRenderer(ResourceContext resourceContext, LinkFollower linkFollower, JsonRepresentation representation) {
+            return new CapabilitiesReprRenderer(resourceContext, linkFollower, getRepresentationType(), representation);
         }
     }
     
-    private CapabilitiesReprRenderer(ResourceContext resourceContext, PathFollower pathFollower, RepresentationType representationType, JsonRepresentation representation) {
-        super(resourceContext, pathFollower, representationType, representation);
+    private CapabilitiesReprRenderer(ResourceContext resourceContext, LinkFollower linkFollower, RepresentationType representationType, JsonRepresentation representation) {
+        super(resourceContext, linkFollower, representationType, representation);
     }
 
     @Override