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/29 09:57:17 UTC

[2/3] isis git commit: ISIS-968: extending @DomainService(nature=...).

ISIS-968: extending @DomainService(nature=...).

Also deprecating @NotInServiceMenu.


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

Branch: refs/heads/ISIS-968
Commit: 2a5db0c5fbd14237fb53bf292d54f3bcf4b16841
Parents: 4caf5c8
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 28 17:45:33 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 28 17:45:33 2015 +0000

----------------------------------------------------------------------
 .../isis/applib/annotation/DomainService.java   |  5 ++
 .../isis/applib/annotation/NatureOfService.java | 57 ++++++++++++++++++++
 .../applib/annotation/NotInServiceMenu.java     |  6 ++-
 ...butedFacetDerivedFromDomainServiceFacet.java | 36 +++++++++++++
 ...cetDerivedFromDomainServiceFacetFactory.java | 57 ++++++++++++++++++++
 ...eMenuFacetDerivedFromDomainServiceFacet.java | 43 +++++++++++++++
 ...cetDerivedFromDomainServiceFacetFactory.java | 57 ++++++++++++++++++++
 .../domainservice/DomainServiceFacet.java       | 21 +++++++-
 .../DomainServiceFacetAbstract.java             | 13 ++++-
 .../DomainServiceFacetAnnotation.java           |  6 ++-
 .../DomainServiceFacetAnnotationFactory.java    |  2 +-
 .../dflt/ProgrammingModelFacetsJava5.java       |  6 +++
 .../src/main/java/dom/simple/SimpleObject.java  |  1 -
 .../main/java/app/ToDoAppDashboardService.java  |  3 +-
 .../java/dom/todo/ToDoItemContributions.java    | 13 ++---
 .../java/dom/todo/ToDoItemSubscriptions.java    |  7 ++-
 16 files changed, 308 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
index 8f4321b..1c2c1ea 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
@@ -39,6 +39,11 @@ public @interface DomainService {
     Class<?> repositoryFor() default Object.class;
 
     /**
+     * The nature of this service, eg for menus, contributed actions, repository.
+     */
+    NatureOfService nature() default NatureOfService.VIEW;
+
+    /**
      * Number in Dewey Decimal format representing the order.
      *
      * <p>

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/applib/src/main/java/org/apache/isis/applib/annotation/NatureOfService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/NatureOfService.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/NatureOfService.java
new file mode 100644
index 0000000..f8d71b6
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/NatureOfService.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.applib.annotation;
+
+/**
+ * The different sorts of domain services recognized by Isis, as specified in {@link DomainService#nature()}
+ */
+public enum NatureOfService {
+
+    /**
+     * The default; the service's actions appear on menus and can be contributed to domain objects as actions,
+     * properties or collections.
+     */
+    VIEW,
+    /**
+     * The service's actions appear on menus but do not contribute.
+     *
+     * <p>
+     * Equivalent to annotating all actions with {@link org.apache.isis.applib.annotation.NotContributed}).
+     * </p>
+     */
+    VIEW_MENU,
+    /**
+     * The service's actions can be contributed to domain objects as actions, properties or collections but do not
+     * appear on menus.
+     *
+     * <p>
+     * Equivalent to annotating all actions with {@link org.apache.isis.applib.annotation.NotInServiceMenu).
+     * </p>
+     */
+    VIEW_CONTRIBUTIONS,
+    /**
+     * The service's actions do not appear on menus and are not contributed.
+     *
+     * <p>
+     * Equivalent to annotating all actions with both {@link org.apache.isis.applib.annotation.NotInServiceMenu} and {@link org.apache.isis.applib.annotation.NotContributed}).
+     * </p>
+     */
+    DOMAIN
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
index 9797fd1..5f58124 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/NotInServiceMenu.java
@@ -26,8 +26,7 @@ import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * Indicates the (service) action should be not be displayed in the service
- * menu.
+ * Indicates the (service) action should be not be displayed in the menu.
  * 
  * <p>
  * It may still be contributed (unless it has been annotated as
@@ -36,7 +35,10 @@ import java.lang.annotation.Target;
  * 
  * <p>
  * Has no meaning if annotated on an action of a regular entity.
+ * 
+ * @deprecated - instead move such actions into a separate domain service and specify nature of {@link org.apache.isis.applib.annotation.NatureOfService#VIEW_CONTRIBUTIONS contributions} or {@link org.apache.isis.applib.annotation.NatureOfService#DOMAIN domain} using {@link DomainService#nature()}.
  */
+@Deprecated
 @Inherited
 @Target({ ElementType.METHOD })
 @Retention(RetentionPolicy.RUNTIME)

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacet.java
new file mode 100644
index 0000000..167a99a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacet.java
@@ -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.actions.notcontributed.derived;
+
+
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacetAbstract;
+
+
+public class NotContributedFacetDerivedFromDomainServiceFacet extends NotContributedFacetAbstract {
+
+    private final NatureOfService natureOfService;
+
+    public NotContributedFacetDerivedFromDomainServiceFacet(final NatureOfService natureOfService, final FacetHolder holder) {
+        super(NotContributed.As.EITHER, holder);
+        this.natureOfService = natureOfService;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactory.java
new file mode 100644
index 0000000..cc346bd
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactory.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.notcontributed.derived;
+
+import java.lang.reflect.Method;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class NotContributedFacetDerivedFromDomainServiceFacetFactory extends FacetFactoryAbstract {
+
+    public NotContributedFacetDerivedFromDomainServiceFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Class<?> declaringClass = method.getDeclaringClass();
+        final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
+
+        final DomainServiceFacet domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
+        if(domainServiceFacet == null || domainServiceFacet.isNoop()) {
+            return;
+        }
+
+        final NatureOfService natureOfService = domainServiceFacet.getNatureOfService();
+        if(natureOfService == NatureOfService.VIEW_CONTRIBUTIONS || natureOfService == NatureOfService.VIEW) {
+            return;
+        }
+
+        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new NotContributedFacetDerivedFromDomainServiceFacet(natureOfService, facetHolder));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
new file mode 100644
index 0000000..10a8413
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacet.java
@@ -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.core.metamodel.facets.actions.notinservicemenu.derived;
+
+
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.events.VisibilityEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacetAbstract;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+
+
+public class NotInServiceMenuFacetDerivedFromDomainServiceFacet extends NotInServiceMenuFacetAbstract {
+
+    private final NatureOfService natureOfService;
+
+    public NotInServiceMenuFacetDerivedFromDomainServiceFacet(
+            final NatureOfService natureOfService, final FacetHolder holder) {
+        super(holder);
+        this.natureOfService = natureOfService;
+    }
+
+    @Override
+    public String hides(final VisibilityContext<? extends VisibilityEvent> ic) {
+        return String.format("@DomainService(nature=%s) annotation present", natureOfService);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
new file mode 100644
index 0000000..ceddccf
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived;
+
+import java.lang.reflect.Method;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory extends FacetFactoryAbstract {
+
+    public NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Class<?> declaringClass = method.getDeclaringClass();
+        final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
+
+        final DomainServiceFacet domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
+        if(domainServiceFacet == null || domainServiceFacet.isNoop()) {
+            return;
+        }
+        
+        final NatureOfService natureOfService = domainServiceFacet.getNatureOfService();
+        if(natureOfService == NatureOfService.VIEW_MENU || natureOfService == NatureOfService.VIEW) {
+            return;
+        }
+
+        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new NotInServiceMenuFacetDerivedFromDomainServiceFacet(natureOfService, facetHolder));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
index 1d9258e..e891308 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacet.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice;
 
 
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 
@@ -29,10 +30,26 @@ public interface DomainServiceFacet extends Facet {
 
     /**
      * Corresponds to {@link org.apache.isis.applib.annotation.DomainService#repositoryFor()}.
-     *
+     * <p/>
      * <p>
      * May be null.
      * </p>
      */
     public Class<?> getRepositoryFor();
-}
+
+    /**
+     * Corresponds to {@link org.apache.isis.applib.annotation.DomainService#nature()}.
+     *
+     * <p>
+     *     If set to {@link org.apache.isis.applib.annotation.NatureOfService#VIEW_MENU} or {@link org.apache.isis.applib.annotation.NatureOfService#DOMAIN}, then {@link org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacet} is
+     *     derived for all actions.
+     * </p>
+     *
+     * <p>
+     *     If set to {@link org.apache.isis.applib.annotation.NatureOfService#VIEW_CONTRIBUTIONS} or {@link org.apache.isis.applib.annotation.NatureOfService#DOMAIN}, then {@link org.apache.isis.core.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacet} is
+     *     derived for all actions.
+     * </p>
+     */
+    public NatureOfService getNatureOfService();
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
index fb63eb2..8195140 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/DomainServiceFacetAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice;
 
 
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -33,14 +34,22 @@ public abstract class DomainServiceFacetAbstract
     }
 
     private final Class<?> repositoryFor;
+    private final NatureOfService natureOfService;
 
-    public DomainServiceFacetAbstract(final FacetHolder facetHolder, final Class<?> repositoryFor) {
+    public DomainServiceFacetAbstract(
+            final FacetHolder facetHolder,
+            final Class<?> repositoryFor,
+            final NatureOfService natureOfService) {
         super(DomainServiceFacetAbstract.type(), facetHolder, Derivation.NOT_DERIVED);
         this.repositoryFor = repositoryFor;
+        this.natureOfService = natureOfService;
     }
 
-
     public Class<?> getRepositoryFor() {
         return repositoryFor;
     }
+
+    public NatureOfService getNatureOfService() {
+        return natureOfService;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
index 7c391ef..55aed4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotation.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.domainservice.annotation;
 
 
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacetAbstract;
 
@@ -27,7 +28,8 @@ public class DomainServiceFacetAnnotation extends DomainServiceFacetAbstract {
 
     public DomainServiceFacetAnnotation(
             final FacetHolder facetHolder,
-            final Class<?> repositoryFor) {
-        super(facetHolder, repositoryFor);
+            final Class<?> repositoryFor,
+            final NatureOfService natureOfService) {
+        super(facetHolder, repositoryFor, natureOfService);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index c81cf37..675b1bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -42,7 +42,7 @@ public class DomainServiceFacetAnnotationFactory extends FacetFactoryAbstract {
         FacetUtil.addFacet(
                 new DomainServiceFacetAnnotation(
                         processClassContext.getFacetHolder(),
-                        annotation.repositoryFor()));
+                        annotation.repositoryFor(), annotation.nature()));
         if(annotation.repositoryFor() != null) {
             FacetUtil.addFacet(
                     new IconFacetDerivedFromDomainServiceAnnotation(

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 9970867..4f9643e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -27,7 +27,9 @@ import org.apache.isis.core.metamodel.facets.actions.homepage.annotation.HomePag
 import org.apache.isis.core.metamodel.facets.actions.interaction.ActionNamedDebugExplorationFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notcontributed.annotation.NotContributedFacetAnnotationFactory;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.derived.NotContributedFacetDerivedFromDomainServiceFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.annotation.NotInServiceMenuFacetAnnotationFactory;
+import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived.NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.method.NotInServiceMenuFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.actions.paged.annotation.PagedFacetOnActionFactory;
 import org.apache.isis.core.metamodel.facets.actions.prototype.annotation.PrototypeFacetAnnotationFactory;
@@ -354,6 +356,10 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(NotInServiceMenuFacetAnnotationFactory.class);
         addFactory(NotInServiceMenuFacetViaMethodFactory.class);
 
+        addFactory(NotContributedFacetDerivedFromDomainServiceFacetFactory.class);
+        addFactory(NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory.class);
+
+
         addFactory(HiddenFacetOnTypeAnnotationFactory.class);
         // must come after the TitleAnnotationFacetFactory, because can act as an override
         addFactory(HiddenFacetOnMemberFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
index f93aacf..b0cbb46 100644
--- a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
+++ b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
@@ -24,7 +24,6 @@ import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
-import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.applib.util.ObjectContracts;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboardService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboardService.java b/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboardService.java
index 7fc67af..c60f255 100644
--- a/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboardService.java
+++ b/example/application/todoapp/dom/src/main/java/app/ToDoAppDashboardService.java
@@ -19,9 +19,10 @@
 package app;
 
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.homepage.AbstractHomePageDashboardService;
 
-@DomainService
+@DomainService(nature = NatureOfService.DOMAIN)
 public class ToDoAppDashboardService extends AbstractHomePageDashboardService<ToDoAppDashboard> {
 
     public ToDoAppDashboardService() {

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
index 3a9b6a9..65a7219 100644
--- a/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/todoapp/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -32,12 +32,11 @@ import org.joda.time.LocalDate;
 import org.apache.isis.applib.AbstractFactoryAndRepository;
 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.Disabled;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.NotContributed;
 import org.apache.isis.applib.annotation.NotContributed.As;
-import org.apache.isis.applib.annotation.NotInServiceMenu;
 import org.apache.isis.applib.annotation.Optional;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -46,11 +45,10 @@ import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.value.Clob;
 
-@DomainService
+@DomainService(nature = NatureOfService.VIEW_CONTRIBUTIONS)
 public class ToDoItemContributions extends AbstractFactoryAndRepository {
 
     //region > priority (contributed property)
-    @NotInServiceMenu
     @NotContributed(As.ACTION) // ie contributed as association
     @Action(
             semantics = SemanticsOf.SAFE,
@@ -106,7 +104,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     //endregion
 
     //region >  next, previous (contributed actions)
-    @NotInServiceMenu
     @NotContributed(As.ASSOCIATION) // ie contributed as action
     @Action(semantics = SemanticsOf.SAFE)
     @ActionLayout(
@@ -132,7 +129,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
 
     // //////////////////////////////////////
 
-    @NotInServiceMenu
     @NotContributed(As.ASSOCIATION) // ie contributed as action
     @ActionLayout(
             describedAs = "The previous item not yet completed"
@@ -174,7 +170,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     //endregion
 
     //region > similarTo (contributed collection)
-    @NotInServiceMenu
     @NotContributed(As.ACTION)
     @Action(semantics = SemanticsOf.SAFE)
     public List<ToDoItem> similarTo(final ToDoItem toDoItem) {
@@ -199,7 +194,6 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
 
     //region > updateCategory (contributed action)
 
-    @NotInServiceMenu
     @ActionLayout(
             describedAs = "Update category and subcategory"
     )
@@ -236,8 +230,7 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     /**
      * Demonstrates functionality of streaming back Clob/Blob result within an action with a prompt, i.e. Ajax request
      */
-    @ActionSemantics(ActionSemantics.Of.SAFE)
-    @NotInServiceMenu
+    @Action(semantics = SemanticsOf.SAFE)
     public Clob exportAsJson(
             final ToDoItem toDoItem,
             @ParameterLayout(named = "File name") String fileName

http://git-wip-us.apache.org/repos/asf/isis/blob/2a5db0c5/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 600d9c0..de9afc5 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
@@ -33,11 +33,11 @@ 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.RestrictTo;
 import org.apache.isis.applib.annotation.MemberOrder;
-import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
@@ -58,7 +58,7 @@ import static com.google.common.collect.Lists.newArrayList;
  *     vetoing the change).
  * </p>
  */
-@DomainService
+@DomainService(nature = NatureOfService.VIEW_MENU)
 @DomainServiceLayout(menuBar = DomainServiceLayout.MenuBar.SECONDARY, menuOrder = "30")
 public class ToDoItemSubscriptions {
 
@@ -129,7 +129,6 @@ 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"
     )