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 2015/01/07 00:19:16 UTC

[46/50] [abbrv] isis git commit: ISIS-970: remove support for @ActionLayout(prototype=...) and parsing from xxx.layout.json; add support for @Action(restrictTo=Environment[]).

ISIS-970: remove support for @ActionLayout(prototype=...) and parsing from xxx.layout.json; add support for @Action(restrictTo=Environment[]).


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

Branch: refs/heads/ISIS-970
Commit: c9ea2305d937a0d66bd2d9c57b0b32650905a9bf
Parents: 7d6350e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Dec 30 14:56:16 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Jan 6 21:02:18 2015 +0000

----------------------------------------------------------------------
 .../apache/isis/applib/annotation/Action.java   | 14 ++++++
 .../isis/applib/annotation/ActionLayout.java    |  5 --
 .../isis/applib/annotation/Environment.java     | 34 +++++++++++++
 .../isis/applib/annotation/Prototype.java       |  2 +-
 .../applib/fixturescripts/FixtureScripts.java   |  4 +-
 .../action/ActionAnnotationFacetFactory.java    | 12 ++++-
 .../PrototypeFacetForActionAnnotation.java      | 48 +++++++++++++++++++
 .../layout/ActionLayoutFacetFactory.java        | 13 -----
 ...PrototypeFacetForActionLayoutAnnotation.java | 41 ----------------
 ...totypeFacetOnActionFromLayoutProperties.java | 50 --------------------
 .../layoutmetadata/ActionLayoutFacetRepr.java   |  1 -
 .../json/LayoutMetadataReaderFromJson.java      |  4 --
 .../simple/SimpleObjectsFixturesService.java    |  8 ++--
 .../dom/src/main/java/dom/todo/ToDoItem.java    | 13 +++--
 .../java/dom/todo/ToDoItemSubscriptions.java    | 14 ++++--
 .../dom/src/main/java/dom/todo/ToDoItems.java   |  9 ++--
 .../fixture/todo/ToDoItemsFixturesService.java  | 14 ++++--
 .../prototyping/ExternalLinksService.java       |  9 ++--
 18 files changed, 153 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
index e2627de..a9b6dea 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Action.java
@@ -168,4 +168,18 @@ public @interface Action {
      */
     Class<?> typeOf() default Object.class;
 
+
+    // //////////////////////////////////////
+
+
+    /**
+     * Which environments the action is available in.
+     *
+     * <p>
+     *     By default there are no restrictions, with the action being available in all environments.
+     * </p>
+     */
+    Environment[] restrictTo() default {Environment.DEVELOPMENT, Environment.PRODUCTION};
+
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
index 6bdb007..a692d71 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/ActionLayout.java
@@ -116,11 +116,6 @@ public @interface ActionLayout {
         PANEL_DROPDOWN
     }
 
-    /**
-     * Whether an action is a prototype action, only available when running in prototype (development) mode.
-     */
-    boolean prototype() default false;
-
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/applib/src/main/java/org/apache/isis/applib/annotation/Environment.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Environment.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Environment.java
new file mode 100644
index 0000000..7c2e49e
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Environment.java
@@ -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.applib.annotation;
+
+public enum Environment {
+    DEVELOPMENT,
+    PRODUCTION;
+
+    public static boolean hasDevelopmentOnly(final Environment[] environments) {
+
+        if (environments == null) {
+            return false;
+        }
+
+        return environments.length == 1 && environments[0] == DEVELOPMENT;
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/applib/src/main/java/org/apache/isis/applib/annotation/Prototype.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Prototype.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Prototype.java
index cb9178b..fe5626a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Prototype.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Prototype.java
@@ -26,7 +26,7 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * @deprecated - use {@link ActionLayout#prototype()} instead.
+ * @deprecated - use {@link org.apache.isis.applib.annotation.Action#restrictTo()} ()} instead.
  */
 @Deprecated
 @Inherited

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index 6ee15c9..8d6f57f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -244,8 +244,8 @@ public abstract class FixtureScripts extends AbstractService {
      * To make this action usable in the UI, override either {@link #choices0RunFixtureScript()} or 
      * {@link #autoComplete0RunFixtureScript(String)} with <tt>public</tt> visibility</tt>.
      */
-    @ActionLayout(
-        prototype = true
+    @Action(
+        restrictTo = Environment.DEVELOPMENT
     )
     @MemberOrder(sequence="10")
     public List<FixtureResult> runFixtureScript(

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index baca5e7..c39b81c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -58,12 +58,11 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
 
         processInteraction(processMethodContext);
         processHidden(processMethodContext);
-
+        processRestrictTo(processMethodContext);
         processSemantics(processMethodContext);
         processInvokeOn(processMethodContext);
         processCommand(processMethodContext);
         processPublishing(processMethodContext);
-
         processTypeOf(processMethodContext);
     }
 
@@ -83,6 +82,15 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
                 HiddenFacetForActionAnnotation.create(action, holder));
     }
 
+    private void processRestrictTo(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Action action = Annotations.getAnnotation(method, Action.class);
+        final FacetHolder holder = processMethodContext.getFacetHolder();
+
+        FacetUtil.addFacet(
+                PrototypeFacetForActionAnnotation.create(action, holder));
+    }
+
     private void processSemantics(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
         final Action action = Annotations.getAnnotation(method, Action.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PrototypeFacetForActionAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PrototypeFacetForActionAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PrototypeFacetForActionAnnotation.java
new file mode 100644
index 0000000..48dfb59
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/PrototypeFacetForActionAnnotation.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.action;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Environment;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
+import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacetAbstract;
+
+public class PrototypeFacetForActionAnnotation extends PrototypeFacetAbstract {
+
+    public static PrototypeFacet create(
+            final Action action,
+            final FacetHolder holder) {
+
+        if(action == null) {
+            return null;
+        }
+
+        final Environment[] environments = action.restrictTo();
+        boolean developmentOnly = Environment.hasDevelopmentOnly(environments);
+
+        return developmentOnly ? new PrototypeFacetForActionAnnotation(holder) : null;
+    }
+
+    private PrototypeFacetForActionAnnotation(FacetHolder holder) {
+        super(holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index e80b54b..23a653c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacetFallback;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
@@ -115,13 +114,6 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         }
         FacetUtil.addFacet(actionPositionFacet);
 
-
-        // prototype
-        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(prototypeFacet == null) {
-            prototypeFacet = PrototypeFacetForActionLayoutAnnotation.create(actionLayout, holder);
-        }
-        FacetUtil.addFacet(prototypeFacet);
     }
 
     @Override
@@ -167,11 +159,6 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         }
         FacetUtil.addFacet(actionPositionFacet);
 
-
-        // prototype
-        PrototypeFacet prototypeFacet = PrototypeFacetOnActionFromLayoutProperties.create(properties, holder);
-        FacetUtil.addFacet(prototypeFacet);
-
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetForActionLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetForActionLayoutAnnotation.java
deleted file mode 100644
index b22e140..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetForActionLayoutAnnotation.java
+++ /dev/null
@@ -1,41 +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.metamodel.facets.actions.layout;
-
-import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacetAbstract;
-
-public class PrototypeFacetForActionLayoutAnnotation extends PrototypeFacetAbstract {
-
-    public static PrototypeFacet create(ActionLayout actionLayout, FacetHolder holder) {
-        if(actionLayout == null) {
-            return null;
-        }
-        final boolean prototype = actionLayout.prototype();
-        return prototype ? new PrototypeFacetForActionLayoutAnnotation(holder) : null;
-    }
-
-    private PrototypeFacetForActionLayoutAnnotation(FacetHolder holder) {
-        super(holder);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetOnActionFromLayoutProperties.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetOnActionFromLayoutProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetOnActionFromLayoutProperties.java
deleted file mode 100644
index 2092c41..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PrototypeFacetOnActionFromLayoutProperties.java
+++ /dev/null
@@ -1,50 +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.metamodel.facets.actions.layout;
-
-import java.util.Properties;
-import com.google.common.base.Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacetAbstract;
-
-public class PrototypeFacetOnActionFromLayoutProperties extends PrototypeFacetAbstract {
-
-    public static PrototypeFacet create(Properties properties, FacetHolder holder) {
-        final boolean prototype = prototype(properties);
-        return prototype ? new PrototypeFacetOnActionFromLayoutProperties(holder): null;
-    }
-
-    private PrototypeFacetOnActionFromLayoutProperties(FacetHolder holder) {
-        super(holder);
-    }
-
-    private static boolean prototype(Properties properties) {
-        if(properties == null) {
-            return false;
-        }
-        String prototype = Strings.emptyToNull(properties.getProperty("prototype"));
-        if(prototype == null) {
-            return false;
-        }
-        return Boolean.parseBoolean(prototype);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
index 4fb113c..37ba265 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/ActionLayoutFacetRepr.java
@@ -31,5 +31,4 @@ public class ActionLayoutFacetRepr {
     public String named;
     public boolean namedEscaped = true;
     public ActionLayout.Position position;
-    public boolean prototype;
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
index b836808..46b1b08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layoutmetadata/json/LayoutMetadataReaderFromJson.java
@@ -356,10 +356,6 @@ public class LayoutMetadataReaderFromJson implements LayoutMetadataReader {
             if(actionLayout.position != null) {
                 props.setProperty(prefix + "." + actionName + ".actionLayout.position", ""+actionLayout.position);
             }
-            //
-            {
-                props.setProperty(prefix + "." + actionName + ".actionLayout.prototype", "" + actionLayout.prototype);
-            }
         }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
index f5544d8..9055c32 100644
--- a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
@@ -21,11 +21,11 @@ package fixture.simple;
 import fixture.simple.scenario.SimpleObjectsFixture;
 
 import java.util.List;
-import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.Prototype;
 import org.apache.isis.applib.fixturescripts.FixtureResult;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.fixturescripts.FixtureScripts;
@@ -63,8 +63,8 @@ public class SimpleObjectsFixturesService extends FixtureScripts {
 
     // //////////////////////////////////////
 
-    @ActionLayout(
-            prototype = true
+    @Action(
+            restrictTo = Environment.DEVELOPMENT
     )
     @MemberOrder(sequence="20")
     public Object installFixturesAndReturnFirst() {

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
index ebf709c..8b73f8b 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java
@@ -48,6 +48,7 @@ import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.Editing;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.InvokeOn;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.annotation.Optionality;
@@ -687,8 +688,10 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
     //endregion
 
     //region > openSourceCodeOnGithub (action)
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(prototype = true)
+    @Action(
+            semantics = SemanticsOf.SAFE,
+            restrictTo = Environment.DEVELOPMENT
+    )
     public URL openSourceCodeOnGithub() throws MalformedURLException {
         return new URL("https://github.com/apache/isis/tree/master/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItem.java");
     }
@@ -702,8 +705,10 @@ public class ToDoItem implements Categorized, Comparable<ToDoItem> {
         NonRecoverableException;
     }
 
-    @Action(semantics = SemanticsOf.SAFE)
-    @ActionLayout(prototype = true)
+    @Action(
+            semantics = SemanticsOf.SAFE,
+            restrictTo = Environment.DEVELOPMENT
+    )
     public void demoException(
             @ParameterLayout(named="Type")
             final DemoExceptionType type) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
index 53d99e5..cf70258 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemSubscriptions.java
@@ -29,14 +29,16 @@ import com.google.common.eventbus.Subscribe;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
-import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.NotContributed;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.eventbus.ActionInteractionEvent;
 import org.apache.isis.applib.services.eventbus.CollectionInteractionEvent;
 import org.apache.isis.applib.services.eventbus.EventBusService;
@@ -127,12 +129,14 @@ public class ToDoItemSubscriptions {
      * To demo/test what occurs if a subscriber that might veto an event.
      */
     @MemberOrder(name = "Prototyping", sequence = "80")
+    @NotContributed
     @ActionLayout(
-        named="Set subscriber behaviour",
-        prototype = true
+        named="Set subscriber behaviour"
+    )
+    @Action(
+            semantics = SemanticsOf.IDEMPOTENT,
+            restrictTo = Environment.DEVELOPMENT
     )
-    @NotContributed
-    @ActionSemantics(ActionSemantics.Of.IDEMPOTENT)
     public void subscriberBehaviour(
             @ParameterLayout(named="Behaviour") Behaviour behaviour) {
         this.behaviour = behaviour;

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
index 4be995f..eeb6ecd 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItems.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
@@ -174,10 +175,12 @@ public class ToDoItems {
 
     //region > allToDos (action)
     @ActionLayout(
-        cssClassFa = "fa fa-globe",
-        prototype = true
+        cssClassFa = "fa fa-globe"
+    )
+    @Action(
+            semantics = SemanticsOf.SAFE,
+            restrictTo = Environment.DEVELOPMENT
     )
-    @Action(semantics = SemanticsOf.SAFE)
     @MemberOrder(sequence = "50")
     public List<ToDoItem> allToDos() {
         final List<ToDoItem> items = container.allMatches(

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
index 77c4687..efa67ee 100644
--- a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
@@ -21,9 +21,11 @@ package fixture.todo;
 import fixture.todo.scenarios.ToDoItemsRecreateAndCompleteSeveral;
 
 import java.util.List;
+import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Optionality;
 import org.apache.isis.applib.annotation.Parameter;
@@ -47,8 +49,10 @@ public class ToDoItemsFixturesService extends FixtureScripts {
     }
 
     @ActionLayout(
-        cssClassFa="fa fa-bolt",
-        prototype = true
+        cssClassFa="fa fa-bolt"
+    )
+    @Action(
+            restrictTo = Environment.DEVELOPMENT
     )
     @Override
     public List<FixtureResult> runFixtureScript(
@@ -80,8 +84,10 @@ public class ToDoItemsFixturesService extends FixtureScripts {
 
 
     @ActionLayout(
-        cssClassFa="fa fa-list",
-        prototype = true
+        cssClassFa="fa fa-list"
+    )
+    @Action(
+            restrictTo = Environment.DEVELOPMENT
     )
     @MemberOrder(sequence="20")
     public Object recreateToDoItemsReturnFirst() {

http://git-wip-us.apache.org/repos/asf/isis/blob/c9ea2305/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
index 81b0570..57a3c94 100644
--- a/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
+++ b/example/application/todoapp/webapp/src/main/java/webapp/prototyping/ExternalLinksService.java
@@ -22,6 +22,7 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.Environment;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -55,10 +56,12 @@ public class ExternalLinksService {
     }
 
     @ActionLayout(
-        cssClassFa = "fa-external-link" ,
-        prototype = true
+            cssClassFa = "fa-external-link"
+    )
+    @Action(
+            semantics = SemanticsOf.SAFE,
+            restrictTo = Environment.DEVELOPMENT
     )
-    @Action(semantics = SemanticsOf.SAFE)
     @MemberOrder(name="Prototyping", sequence="91.1")
     public URL goToDocs(@ParameterLayout(named="Link") ExternalLink link) throws MalformedURLException {
         return link.open();