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 2013/09/17 09:42:18 UTC

git commit: ISIS-473: actions now need to be explicitly annotated as @Bookmarkable

Updated Branches:
  refs/heads/master 6d3562286 -> 9197e40c9


ISIS-473: actions now need to be explicitly annotated as @Bookmarkable

(they must also have safe semantics, as previously).


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/9197e40c
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/9197e40c
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/9197e40c

Branch: refs/heads/master
Commit: 9197e40c980d06287107a06f3d3acd2c8f3b64ee
Parents: 6d35622
Author: Dan Haywood <da...@apache.org>
Authored: Tue Sep 17 08:41:42 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Sep 17 08:41:42 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ActionModel.java | 15 +++-
 .../ui/components/actions/ActionPanel.java      |  2 +-
 .../wicket/ui/pages/action/ActionPage.java      |  2 +-
 .../isis/applib/annotation/Bookmarkable.java    |  8 +-
 .../core/metamodel/facetapi/FeatureType.java    |  1 +
 .../bookmarkable/BookmarkPolicyFacet.java       |  2 +-
 .../BookmarkableAnnotationFacetFactory.java     |  8 +-
 ...rkableAnnotationFacetFactoryTest_action.java | 66 ++++++++++++++++
 .../BookmarkableAnnotationFacetFactoryTest.java | 83 --------------------
 ...arkableAnnotationFacetFactoryTest_class.java | 83 ++++++++++++++++++++
 .../dom/src/main/java/dom/todo/ToDoItems.java   | 12 +--
 11 files changed, 179 insertions(+), 103 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 7e4585d..6c18727 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -32,12 +32,14 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOidDefault;
 import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -525,9 +527,16 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> {
             argumentModel.setObject((ObjectAdapter)null);
         }
     }
-    
-    public boolean hasSafeActionSemantics() {
-        return getActionMemento().getAction().getSemantics() == ActionSemantics.Of.SAFE;
+
+    /**
+     * Bookmarkable if the {@link ObjectAction action} has a {@link BookmarkPolicyFacet bookmark} policy
+     * of {@link BookmarkPolicy#AS_ROOT root}, and has safe {@link ObjectAction#getSemantics() semantics}.
+     */
+    public boolean isBookmarkable() {
+        final ObjectAction action = getActionMemento().getAction();
+        final BookmarkPolicyFacet bookmarkPolicy = action.getFacet(BookmarkPolicyFacet.class);
+        final boolean safeSemantics = action.getSemantics() == ActionSemantics.Of.SAFE;
+        return bookmarkPolicy.value() == BookmarkPolicy.AS_ROOT && safeSemantics;
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
index 88f985b..a698a74 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionPanel.java
@@ -184,7 +184,7 @@ public class ActionPanel extends PanelAbstract<ActionModel> implements ActionExe
             
             resultType.addResults(this, resultAdapter);
 
-            if (actionModel.hasSafeActionSemantics()) {
+            if (actionModel.isBookmarkable()) {
                 bookmarkPage(actionModel);
             }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/action/ActionPage.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/action/ActionPage.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/action/ActionPage.java
index 403eafa..f2a130a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/action/ActionPage.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/action/ActionPage.java
@@ -42,7 +42,7 @@ public class ActionPage extends PageAbstract {
         super(new PageParameters(), ComponentType.ACTION);
         addChildComponents(model);
 
-        if(model.hasSafeActionSemantics()) {
+        if(model.isBookmarkable()) {
             bookmarkPage(model);
         }
         addBookmarkedPages();

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/applib/src/main/java/org/apache/isis/applib/annotation/Bookmarkable.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bookmarkable.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bookmarkable.java
index 1d66d63..360c085 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Bookmarkable.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Bookmarkable.java
@@ -26,14 +26,14 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * Indicates the policy by which the entity can be bookmarked.
+ * Indicates the policy by which the entity or action can be bookmarked.
  * 
  * <p>
- * Three policies are defined, which control how bookmarked entities are organized.
- * 
+ * Three {@link BookmarkPolicy policies} are defined, which control how bookmarked entities are organized.
+ * These have no meaning for bookmarkable actions.  
  */
 @Inherited
-@Target({ ElementType.TYPE })
+@Target({ ElementType.TYPE, ElementType.METHOD })
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Bookmarkable {
     

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
index 782a140..18edf60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -104,6 +104,7 @@ public enum FeatureType {
     public final static List<FeatureType> MEMBERS = ImmutableList.of(PROPERTY, COLLECTION, ACTION);
     public final static List<FeatureType> OBJECTS_AND_PROPERTIES = ImmutableList.of(OBJECT, PROPERTY);
     public final static List<FeatureType> OBJECTS_AND_COLLECTIONS = ImmutableList.of(OBJECT, COLLECTION);
+    public final static List<FeatureType> OBJECTS_AND_ACTIONS = ImmutableList.of(OBJECT, ACTION);
     public final static List<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = ImmutableList.of(OBJECT, PROPERTY, COLLECTION);
     public final static List<FeatureType> OBJECTS_POST_PROCESSING_ONLY = ImmutableList.of(OBJECT_POST_PROCESSING);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkable/BookmarkPolicyFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkable/BookmarkPolicyFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkable/BookmarkPolicyFacet.java
index 1ef3769..9e081f6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkable/BookmarkPolicyFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/bookmarkable/BookmarkPolicyFacet.java
@@ -25,7 +25,7 @@ import org.apache.isis.core.metamodel.facets.SingleValueFacet;
 
 
 /**
- * Corresponds to annotating the class with the {@link Bookmarkable} annotation.
+ * Corresponds to annotating the class or an action with the {@link Bookmarkable} annotation.
  */
 public interface BookmarkPolicyFacet extends SingleValueFacet<BookmarkPolicy> {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/annotation/BookmarkableAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/annotation/BookmarkableAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/annotation/BookmarkableAnnotationFacetFactory.java
index 71574d6..822525e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/annotation/BookmarkableAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/annotation/BookmarkableAnnotationFacetFactory.java
@@ -32,7 +32,7 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyF
 public class BookmarkableAnnotationFacetFactory extends FacetFactoryAbstract {
 
     public BookmarkableAnnotationFacetFactory() {
-        super(FeatureType.OBJECTS_ONLY);
+        super(FeatureType.OBJECTS_AND_ACTIONS);
     }
 
     @Override
@@ -41,6 +41,12 @@ public class BookmarkableAnnotationFacetFactory extends FacetFactoryAbstract {
         FacetUtil.addFacet(create(annotation, processClassContext.getFacetHolder()));
     }
 
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        final Bookmarkable annotation = Annotations.getAnnotation(processMethodContext.getMethod(), Bookmarkable.class);
+        FacetUtil.addFacet(create(annotation, processMethodContext.getFacetHolder()));
+    }
+
     private BookmarkPolicyFacet create(final Bookmarkable annotation, final FacetHolder holder) {
         return annotation == null ? new BookmarkPolicyFacetFallback(holder) : new BookmarkPolicyFacetViaBookmarkableAnnotation(holder, annotation.value());
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java
new file mode 100644
index 0000000..9f4069a
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/actions/bookmarkable/BookmarkableAnnotationFacetFactoryTest_action.java
@@ -0,0 +1,66 @@
+/*
+ *  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.actions.bookmarkable;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.Bookmarkable;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacet;
+import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacetAbstract;
+import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.progmodel.facets.object.bookmarkable.annotation.BookmarkableAnnotationFacetFactory;
+
+public class BookmarkableAnnotationFacetFactoryTest_action extends AbstractFacetFactoryTest {
+
+    private BookmarkableAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new BookmarkableAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testBookmarkableAnnotationPickedUpOnClass() {
+        class Customer {
+            @Bookmarkable(BookmarkPolicy.AS_CHILD)
+            public void placeOrder(){}
+        }
+        final Method actionMethod = findMethod(Customer.class, "placeOrder");
+
+        facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BookmarkPolicyFacetAbstract);
+
+        assertNoMethodsRemoved();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest.java
deleted file mode 100644
index 7fa5eee..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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.bookmarkable;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.applib.annotation.Bookmarkable;
-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.bookmarkable.BookmarkPolicyFacet;
-import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacetFallback;
-import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacetViaBookmarkableAnnotation;
-import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.progmodel.facets.object.bookmarkable.annotation.BookmarkableAnnotationFacetFactory;
-
-public class BookmarkableAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private BookmarkableAnnotationFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new BookmarkableAnnotationFacetFactory();
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testBookmarkableAnnotationPickedUpOnClass() {
-        @Bookmarkable(BookmarkPolicy.AS_CHILD)
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, null, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BookmarkPolicyFacetViaBookmarkableAnnotation);
-        BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet;
-        assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.AS_CHILD));
-        
-        assertNoMethodsRemoved();
-    }
-
-    public void testBookmarkablePolicyInferredPickedUpOnClassAndDefaultsToAlways() {
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, null, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BookmarkPolicyFacetFallback);
-        BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet;
-        assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.NEVER));
-        
-        assertNoMethodsRemoved();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest_class.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest_class.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest_class.java
new file mode 100644
index 0000000..ac2e660
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/object/bookmarkable/BookmarkableAnnotationFacetFactoryTest_class.java
@@ -0,0 +1,83 @@
+/*
+ *  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.bookmarkable;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.apache.isis.applib.annotation.BookmarkPolicy;
+import org.apache.isis.applib.annotation.Bookmarkable;
+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.bookmarkable.BookmarkPolicyFacet;
+import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacetFallback;
+import org.apache.isis.core.metamodel.facets.object.bookmarkable.BookmarkPolicyFacetViaBookmarkableAnnotation;
+import org.apache.isis.core.progmodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.progmodel.facets.object.bookmarkable.annotation.BookmarkableAnnotationFacetFactory;
+
+public class BookmarkableAnnotationFacetFactoryTest_class extends AbstractFacetFactoryTest {
+
+    private BookmarkableAnnotationFacetFactory facetFactory;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        facetFactory = new BookmarkableAnnotationFacetFactory();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        facetFactory = null;
+        super.tearDown();
+    }
+
+    public void testBookmarkableAnnotationPickedUpOnClass() {
+        @Bookmarkable(BookmarkPolicy.AS_CHILD)
+        class Customer {
+        }
+
+        facetFactory.process(new ProcessClassContext(Customer.class, null, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BookmarkPolicyFacetViaBookmarkableAnnotation);
+        BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet;
+        assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.AS_CHILD));
+        
+        assertNoMethodsRemoved();
+    }
+
+    public void testBookmarkablePolicyInferredPickedUpOnClassAndDefaultsToAlways() {
+        class Customer {
+        }
+
+        facetFactory.process(new ProcessClassContext(Customer.class, null, methodRemover, facetedMethod));
+
+        final Facet facet = facetedMethod.getFacet(BookmarkPolicyFacet.class);
+        assertNotNull(facet);
+        assertTrue(facet instanceof BookmarkPolicyFacetFallback);
+        BookmarkPolicyFacet bookmarkableFacet = (BookmarkPolicyFacet) facet;
+        assertThat(bookmarkableFacet.value(), is(BookmarkPolicy.NEVER));
+        
+        assertNoMethodsRemoved();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/9197e40c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
index dac7dcf..0988eb2 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
@@ -33,6 +33,7 @@ import org.joda.time.LocalDate;
 import org.apache.isis.applib.AbstractFactoryAndRepository;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
+import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Optional;
@@ -61,6 +62,7 @@ public class ToDoItems extends AbstractFactoryAndRepository {
     // NotYetComplete (action)
     // //////////////////////////////////////
     
+    @Bookmarkable
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "1")
     public List<ToDoItem> notYetComplete() {
@@ -144,23 +146,15 @@ public class ToDoItems extends AbstractFactoryAndRepository {
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "4")
     public List<ToDoItem> allToDos() {
-        return allToDos(NotifyUserIfNone.YES);
-    }
-
-    public enum NotifyUserIfNone { YES, NO }
-    
-    @Programmatic
-    public List<ToDoItem> allToDos(NotifyUserIfNone notifyUser) {
         final String currentUser = currentUserName();
         final List<ToDoItem> items = allMatches(ToDoItem.class, ToDoItem.thoseOwnedBy(currentUser));
         Collections.sort(items);
-        if(notifyUser == NotifyUserIfNone.YES && items.isEmpty()) {
+        if(items.isEmpty()) {
             getContainer().warnUser("No to-do items found.");
         }
         return items;
     }
 
-
     // //////////////////////////////////////
     // AutoComplete
     // //////////////////////////////////////