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/02/05 00:22:28 UTC

[3/3] isis git commit: ISIS-970: ensuring that @PostsPropertyChangedEvent, @PostsCollectionAddedToEvent, @PostsCollectionRemovedFromEvent, @PostsActionInvokedEvent are supported...

ISIS-970: ensuring that @PostsPropertyChangedEvent, @PostsCollectionAddedToEvent, @PostsCollectionRemovedFromEvent, @PostsActionInvokedEvent are supported...

... even if @Property, @Collection or @Action are also present.

(There is a bit of a compromise for collections, but property and action work ok).


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

Branch: refs/heads/master
Commit: 2c04671588d3c718c334552324faaad1adfb6ceb
Parents: e4f77b6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Feb 4 23:03:25 2015 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Feb 4 23:10:41 2015 +0000

----------------------------------------------------------------------
 .../action/ActionAnnotationFacetFactory.java    | 15 +++++--
 ...cetForPostsActionInvokedEventAnnotation.java | 37 ++++++++++++++++++
 .../CollectionAnnotationFacetFactory.java       | 33 +++++++++++++---
 ...orPostsCollectionAddedToEventAnnotation.java | 39 +++++++++++++++++++
 ...stsCollectionRemovedFromEventAnnotation.java | 39 +++++++++++++++++++
 .../PropertyAnnotationFacetFactory.java         | 20 +++++++---
 ...ropertyClearFacetForDomainEventAbstract.java |  8 ++--
 .../PropertyDomainEventFacetAbstract.java       |  4 +-
 ...tForPostsPropertyChangedEventAnnotation.java | 41 ++++++++++++++++++++
 ...opertySetterFacetForDomainEventAbstract.java |  6 +--
 10 files changed, 219 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/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 eecdc03..29a6e5a 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
@@ -51,6 +51,7 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForCommandAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
@@ -58,6 +59,7 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDom
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetDefault;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForActionInteractionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionDomainEventFacetForPostsActionInvokedEventAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventAbstract;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForDomainEventFromActionInteractionAnnotation;
@@ -65,19 +67,18 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInv
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacetForPostsActionInvokedEventAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.prototype.PrototypeFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForPublishedActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFallbackToNonIdempotent;
 import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetForActionAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetForActionSemanticsAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFromIdempotentAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetFromQueryOnlyAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.typeof.TypeOfFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.typeof.TypeOfFacetOnActionForTypeOfAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.publishing.PublishedActionFacetForPublishedActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.semantics.ActionSemanticsFacetForActionSemanticsAnnotation;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContextAware;
@@ -142,6 +143,12 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
 
             final ActionDomainEventFacetAbstract actionDomainEventFacet;
 
+            // search for @PostsActionInvoked(value=...)
+            if(postsActionInvokedEvent != null) {
+                actionDomainEventType = postsActionInvokedEvent.value();
+                actionDomainEventFacet = new ActionDomainEventFacetForPostsActionInvokedEventAnnotation(
+                        actionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
+            } else
             // search for @ActionInteraction(value=...)
             if(actionInteraction != null) {
                 actionDomainEventType = actionInteraction.value();
@@ -154,7 +161,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract implement
                 actionDomainEventFacet = new ActionDomainEventFacetForActionAnnotation(
                         actionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
             } else
-            // else use default event type (also for @PostsActionInvoked)
+            // else use default event type
             {
                 actionDomainEventType = ActionDomainEvent.Default.class;
                 actionDomainEventFacet = new ActionDomainEventFacetDefault(

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForPostsActionInvokedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForPostsActionInvokedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForPostsActionInvokedEventAnnotation.java
new file mode 100644
index 0000000..6148f97
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetForPostsActionInvokedEventAnnotation.java
@@ -0,0 +1,37 @@
+/*
+ *  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.invocation;
+
+import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+@Deprecated
+public class ActionDomainEventFacetForPostsActionInvokedEventAnnotation extends ActionDomainEventFacetAbstract {
+
+    @Deprecated
+    public ActionDomainEventFacetForPostsActionInvokedEventAnnotation(
+            final Class<? extends ActionDomainEvent<?>> eventType,
+            final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
+        super(eventType, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index fe038e0..0e3b4f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -49,6 +49,8 @@ import org.apache.isis.core.metamodel.facets.collections.collection.modify.Colle
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetDefault;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionAnnotation;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForCollectionInteractionAnnotation;
+import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation;
+import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromAbstract;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromCollectionAnnotation;
 import org.apache.isis.core.metamodel.facets.collections.collection.modify.CollectionRemoveFromFacetForDomainEventFromCollectionInteractionAnnotation;
@@ -97,19 +99,41 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract imple
         //
         // Set up CollectionDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
-        final Collection collection = Annotations.getAnnotation(method, Collection.class);
+        final PostsCollectionAddedToEvent postsCollectionAddedToEvent = Annotations.getAnnotation(method, PostsCollectionAddedToEvent.class);
+        final PostsCollectionRemovedFromEvent postsCollectionRemovedFromEvent = Annotations.getAnnotation(method, PostsCollectionRemovedFromEvent.class);
         final CollectionInteraction collectionInteraction = Annotations.getAnnotation(method, CollectionInteraction.class);
+        final Collection collection = Annotations.getAnnotation(method, Collection.class);
         final Class<? extends CollectionDomainEvent<?, ?>> collectionDomainEventType;
 
         final CollectionDomainEventFacetAbstract collectionDomainEventFacet;
 
-        // search for @PropertyInteraction(value=...)
+        // this is not quite ideal... because there are two events (addTo/removeFrom) whereas the
+        // newer @CollectionInteraction and @Collection annotations have a single event type.  The net result is that
+        // combining @PostsCollectionAddToEvent or @PostsCollectionRemovedFromEvent with @Collection or @CollectionInteraction
+        // could produce some unexpected results.
+        //
+        // Have decided not to sweat it; it's easy to update, and these annotations will be removed in Isis 2.0
+
+        // search for @PostsCollectionAddedToEvent(value=...)
+        if(postsCollectionAddedToEvent != null) {
+            collectionDomainEventType = postsCollectionAddedToEvent.value();
+            collectionDomainEventFacet = new CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation(
+                    collectionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
+        } else
+        // search for @PostsCollectionRemovedFromEvent(value=...)
+        if(postsCollectionRemovedFromEvent != null) {
+            collectionDomainEventType = postsCollectionRemovedFromEvent.value();
+            collectionDomainEventFacet = new CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation(
+                    collectionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
+        } else
+
+        // search for @CollectionInteraction(value=...)
         if(collectionInteraction != null) {
             collectionDomainEventType = collectionInteraction.value();
             collectionDomainEventFacet = new CollectionDomainEventFacetForCollectionInteractionAnnotation(
                     collectionDomainEventType, servicesInjector, getSpecificationLoader(), holder);
         } else
-        // search for @Property(domainEvent=...)
+        // search for @Collection(domainEvent=...)
         if(collection != null && collection.domainEvent() != null) {
             collectionDomainEventType = collection.domainEvent();
             collectionDomainEventFacet = new CollectionDomainEventFacetForCollectionAnnotation(
@@ -131,9 +155,6 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract imple
         //
         // here we support the deprecated annotations
         //
-        final PostsCollectionAddedToEvent postsCollectionAddedToEvent = Annotations.getAnnotation(method, PostsCollectionAddedToEvent.class);
-        final PostsCollectionRemovedFromEvent postsCollectionRemovedFromEvent = Annotations.getAnnotation(method, PostsCollectionRemovedFromEvent.class);
-
         final CollectionAddToFacet collectionAddToFacet = holder.getFacet(CollectionAddToFacet.class);
         if (collectionAddToFacet != null) {
             // the current collectionAddToFacet will end up as the underlying facet of

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation.java
new file mode 100644
index 0000000..a937f9f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation.java
@@ -0,0 +1,39 @@
+/*
+ *  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.collections.collection.modify;
+
+import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+/**
+ * @deprecated
+ */
+@Deprecated
+public class CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation extends CollectionDomainEventFacetAbstract {
+
+    public CollectionDomainEventFacetForPostsCollectionAddedToEventAnnotation(
+            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
+            final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
+        super(eventType, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation.java
new file mode 100644
index 0000000..50c4b54
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/collection/modify/CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation.java
@@ -0,0 +1,39 @@
+/*
+ *  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.collections.collection.modify;
+
+import org.apache.isis.applib.services.eventbus.CollectionDomainEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+/**
+ * @deprecated
+ */
+@Deprecated
+public class CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation extends CollectionDomainEventFacetAbstract {
+
+    public CollectionDomainEventFacetForPostsCollectionRemovedFromEventAnnotation(
+            final Class<? extends CollectionDomainEvent<?, ?>> eventType,
+            final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
+        super(eventType, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index e097db0..141bee4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -39,6 +39,9 @@ import org.apache.isis.core.metamodel.facets.object.regex.RegExFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
 import org.apache.isis.core.metamodel.facets.properties.property.disabled.DisabledFacetForPropertyAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.property.hidden.HiddenFacetForPropertyAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.property.maxlength.MaxLengthFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventAbstract;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromDefault;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyClearFacetForDomainEventFromPropertyAnnotation;
@@ -47,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.properties.property.modify.Property
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacet;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetAbstract;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetDefault;
+import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertyDomainEventFacetForPropertyInteractionAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventAbstract;
@@ -54,9 +58,6 @@ import org.apache.isis.core.metamodel.facets.properties.property.modify.Property
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForDomainEventFromPropertyInteractionAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.modify.PropertySetterFacetForPostsPropertyChangedEventAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.property.hidden.HiddenFacetForPropertyAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.property.mandatory.MandatoryFacetForPropertyAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.property.maxlength.MaxLengthFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.mustsatisfy.MustSatisfySpecificationFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.notpersisted.NotPersistedFacetForPropertyAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.property.regex.RegExFacetForPropertyAnnotation;
@@ -92,6 +93,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
     void processModify(final ProcessMethodContext processMethodContext) {
 
         final Method method = processMethodContext.getMethod();
+        final Class<?> declaringClass = method.getDeclaringClass();
         final FacetedMethod holder = processMethodContext.getFacetHolder();
 
         final PropertyOrCollectionAccessorFacet getterFacet = holder.getFacet(PropertyOrCollectionAccessorFacet.class);
@@ -103,12 +105,20 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
         // Set up PropertyDomainEventFacet, which will act as the hiding/disabling/validating advisor
         //
         final PostsPropertyChangedEvent postsPropertyChangedEvent = Annotations.getAnnotation(method, PostsPropertyChangedEvent.class);
-        final Property property = Annotations.getAnnotation(method, Property.class);
         final PropertyInteraction propertyInteraction = Annotations.getAnnotation(method, PropertyInteraction.class);
+        final Property property = Annotations.getAnnotation(method, Property.class);
         final Class<? extends PropertyDomainEvent<?, ?>> propertyDomainEventType;
 
         final PropertyDomainEventFacetAbstract propertyDomainEventFacet;
 
+        // search for @PostsPropertyChanged(value=...)
+        // (even though these do not participate in hide/disable/validate, we rely on the validate to set up the
+        // event on a thread-local, such that it is then picked up later by the setter/clear facets
+        if(postsPropertyChangedEvent != null) {
+            propertyDomainEventType = postsPropertyChangedEvent.value();
+            propertyDomainEventFacet = new PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation(
+                    propertyDomainEventType, getterFacet, servicesInjector, getSpecificationLoader(), holder);
+        } else
         // search for @PropertyInteraction(value=...)
         if(propertyInteraction != null) {
             propertyDomainEventType = propertyInteraction.value();
@@ -122,7 +132,7 @@ public class PropertyAnnotationFacetFactory extends FacetFactoryAbstract impleme
                     propertyDomainEventType, getterFacet, servicesInjector, getSpecificationLoader(), holder);
 
         } else
-        // else use default event type (also for @PostsPropertyChangedEvent)
+        // else use default event type
         {
             propertyDomainEventType = PropertyDomainEvent.Default.class;
             propertyDomainEventFacet = new PropertyDomainEventFacetDefault(

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
index 05fdd6f..2e0f35c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyClearFacetForDomainEventAbstract.java
@@ -74,7 +74,8 @@ public abstract class PropertyClearFacetForDomainEventAbstract
 
         try {
             // pick up existing event (saved in thread local during the validation phase)
-            final PropertyDomainEvent<?, ?> existingEvent = propertyDomainEventFacet.currentInteraction.get();
+            final PropertyDomainEvent<?, ?> existingEvent =
+                    PropertyDomainEventFacetAbstract.currentInteraction.get();
 
             // ... post the executing event
             final Object oldValue = getterFacet.getProperty(targetAdapter);
@@ -93,12 +94,13 @@ public abstract class PropertyClearFacetForDomainEventAbstract
             }
 
             // ... and post the event (reusing existing event if available)
-            final PropertyDomainEvent<?, ?> event = propertyDomainEventFacet.currentInteraction.get();
+            final PropertyDomainEvent<?, ?> event =
+                    PropertyDomainEventFacetAbstract.currentInteraction.get();
             domainEventHelper.postEventForProperty(value(), verify(event), AbstractDomainEvent.Phase.EXECUTED, getIdentified(), targetAdapter, oldValue, actualNewValue);
 
         } finally {
             // clean up
-            propertyDomainEventFacet.currentInteraction.set(null);
+            PropertyDomainEventFacetAbstract.currentInteraction.set(null);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index 7c7b6f7..7ebd397 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -41,7 +41,7 @@ public abstract class PropertyDomainEventFacetAbstract
 
     private final DomainEventHelper domainEventHelper;
 
-    final static ThreadLocal<PropertyDomainEvent<?,?>> currentInteraction = new ThreadLocal<PropertyDomainEvent<?,?>>();
+    final static ThreadLocal<PropertyDomainEvent<?,?>> currentInteraction = new ThreadLocal<>();
 
     private final PropertyOrCollectionAccessorFacet getterFacet;
 
@@ -85,7 +85,7 @@ public abstract class PropertyDomainEventFacetAbstract
 
         final PropertyDomainEvent<?, ?> event =
                 domainEventHelper.postEventForProperty(
-                    eventType(), null, AbstractDomainEvent.Phase.DISABLE, getIdentified(), ic.getTarget(), null, null);
+                        eventType(), null, AbstractDomainEvent.Phase.DISABLE, getIdentified(), ic.getTarget(), null, null);
         if (event != null && event.isDisabled()) {
             return event.getDisabledReason();
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
new file mode 100644
index 0000000..3b90bb7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation.java
@@ -0,0 +1,41 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.properties.property.modify;
+
+import org.apache.isis.applib.services.eventbus.PropertyDomainEvent;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+/**
+ * @deprecated
+ */
+@Deprecated
+public class PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation extends PropertyDomainEventFacetAbstract {
+
+    public PropertyDomainEventFacetForPostsPropertyChangedEventAnnotation(
+            final Class<? extends PropertyDomainEvent<?, ?>> eventType,
+            final PropertyOrCollectionAccessorFacet getterFacet,
+            final ServicesInjector servicesInjector, final SpecificationLoader specificationLoader, final FacetHolder holder) {
+        super(eventType, getterFacet, holder, servicesInjector, specificationLoader);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2c046715/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
index 19c3676..903595d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterFacetForDomainEventAbstract.java
@@ -72,7 +72,7 @@ public abstract class PropertySetterFacetForDomainEventAbstract
 
         try {
             // pick up existing event (saved in thread local during the validation phase)
-            final PropertyDomainEvent<?, ?> existingEvent = propertyDomainEventFacet.currentInteraction.get();
+            final PropertyDomainEvent<?, ?> existingEvent = PropertyDomainEventFacetAbstract.currentInteraction.get();
 
             // ... post the executing event
             final Object oldValue = getterFacet.getProperty(targetAdapter);
@@ -92,12 +92,12 @@ public abstract class PropertySetterFacetForDomainEventAbstract
             }
 
             // ... post the executed event
-            final PropertyDomainEvent<?, ?> event = propertyDomainEventFacet.currentInteraction.get();
+            final PropertyDomainEvent<?, ?> event = PropertyDomainEventFacetAbstract.currentInteraction.get();
             domainEventHelper.postEventForProperty(value(), verify(event), AbstractDomainEvent.Phase.EXECUTED, getIdentified(), targetAdapter, oldValue, actualNewValue);
 
         } finally {
             // clean up
-            propertyDomainEventFacet.currentInteraction.set(null);
+            PropertyDomainEventFacetAbstract.currentInteraction.set(null);
         }
     }