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 2016/05/12 16:05:27 UTC

isis git commit: ISIS-1370: provide wormhole to allow mixin properties/collections to disable publishing of actions.

Repository: isis
Updated Branches:
  refs/heads/ISIS-1291 b8d19e67d -> b87fc3775


ISIS-1370: provide wormhole to allow mixin properties/collections to disable publishing of actions.


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

Branch: refs/heads/ISIS-1291
Commit: b87fc37756f8e14ed74ea42fbec555dc0eed2047
Parents: b8d19e6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu May 12 17:05:25 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu May 12 17:05:25 2016 +0100

----------------------------------------------------------------------
 ...onInvocationFacetForDomainEventAbstract.java |   3 +-
 ...etterOrClearFacetForDomainEventAbstract.java |   5 +-
 .../publishing/PublishingServiceInternal.java   |  11 ++
 .../specimpl/OneToManyAssociationMixedIn.java   |  13 ++-
 .../specimpl/OneToOneAssociationMixedIn.java    |  18 +++-
 .../PublishingServiceInternalDefault.java       | 102 ++++++++++++++-----
 6 files changed, 119 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 1222033..a7b38b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -297,7 +297,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
 
             final Exception executionExceptionIfAny = priorExecution.getThrew();
 
-            // TODO: should also sync DTO's threw here...
+            // TODO: should also sync DTO's 'threw' attribute here...?
 
             if(executionExceptionIfAny != null) {
                 throw executionExceptionIfAny instanceof RuntimeException
@@ -316,6 +316,7 @@ public abstract class ActionInvocationFacetForDomainEventAbstract
             // update Command (if required)
             setCommandResultIfEntity(command, returnedAdapter);
 
+            // publish (if not a contributed association, query-only mixin)
             final PublishedActionFacet publishedActionFacet = getIdentified().getFacet(PublishedActionFacet.class);
             if (publishedActionFacet != null) {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
index e7af2d6..482513a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertySetterOrClearFacetForDomainEventAbstract.java
@@ -269,7 +269,7 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract
             // handle any exceptions
             final Interaction.Execution priorExecution = interaction.getPriorExecution();
 
-            // TODO: should also sync DTO's threw here...
+            // TODO: should also sync DTO's 'threw' attribute here...?
 
             final Exception executionExceptionIfAny = priorExecution.getThrew();
             if(executionExceptionIfAny != null) {
@@ -279,8 +279,7 @@ public abstract class PropertySetterOrClearFacetForDomainEventAbstract
             }
 
 
-
-
+            // publish (if not a contributed association, query-only mixin)
             final PublishedPropertyFacet publishedPropertyFacet = getIdentified().getFacet(PublishedPropertyFacet.class);
             if (publishedPropertyFacet != null) {
                 getPublishingServiceInternal().publishProperty(priorExecution);

http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
index c3bd614..5e857be 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/publishing/PublishingServiceInternal.java
@@ -41,4 +41,15 @@ public interface PublishingServiceInternal {
 
     @Programmatic
     void publishProperty(final Interaction.Execution execution);
+
+
+    interface Block<T> {
+        T exec();
+    }
+
+    /**
+     * Slightly hokey wormhole (anti)pattern to disable publishing for mixin associations.
+     */
+    @Programmatic
+    <T> T withPublishingSuppressed(final Block<T> block);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 34ba2d0..3ccf7c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -40,6 +40,7 @@ import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedF
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
@@ -147,7 +148,13 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
             final ObjectAdapter mixedInAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
         final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
-        return mixinAction.executeInternal(mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+        return getPublishingServiceInternal().withPublishingSuppressed(
+                new PublishingServiceInternal.Block<ObjectAdapter>() {
+                    @Override public ObjectAdapter exec() {
+                        return mixinAction.executeInternal(
+                                mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+                    }
+                });
     }
 
     @Override
@@ -207,5 +214,9 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
 
     //endregion
 
+    private PublishingServiceInternal getPublishingServiceInternal() {
+        return getServicesInjector().lookupService(PublishingServiceInternal.class);
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index 99bb677..7e138cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -38,6 +38,7 @@ import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedF
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
@@ -128,7 +129,16 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
-        return mixinAction.executeInternal(mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+
+        return getPublishingServiceInternal().withPublishingSuppressed(
+                new PublishingServiceInternal.Block<ObjectAdapter>(){
+                    @Override
+                    public ObjectAdapter exec() {
+                        return mixinAction.executeInternal(
+                                mixinAdapter, mixedInAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+                    }
+                }
+        );
     }
 
     @Override
@@ -181,4 +191,10 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
     public ObjectSpecification getMixinType() {
         return getSpecificationLoader().loadSpecification(mixinType);
     }
+
+    private PublishingServiceInternal getPublishingServiceInternal() {
+        return getServicesInjector().lookupService(PublishingServiceInternal.class);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/b87fc377/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
index e15a978..7e8a3d8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/publish/PublishingServiceInternalDefault.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import javax.enterprise.context.RequestScoped;
 import javax.inject.Inject;
 
 import com.google.common.base.Function;
@@ -43,13 +44,13 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.clock.ClockService;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.CommandContext;
-import org.apache.isis.applib.services.publish.PublishedObjects;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.iactn.InteractionContext;
 import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.applib.services.publish.EventPayload;
 import org.apache.isis.applib.services.publish.EventType;
 import org.apache.isis.applib.services.publish.ObjectStringifier;
+import org.apache.isis.applib.services.publish.PublishedObjects;
 import org.apache.isis.applib.services.publish.PublisherService;
 import org.apache.isis.applib.services.publish.PublishingService;
 import org.apache.isis.applib.services.user.UserService;
@@ -76,9 +77,12 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
  * Wrapper around {@link PublishingService}.  Is a no-op if there is no injected service.
  */
 @DomainService(nature = NatureOfService.DOMAIN)
+@RequestScoped
 public class PublishingServiceInternalDefault implements PublishingServiceInternal {
 
-    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY = new Function<ObjectAdapter, ObjectAdapter>() {
+    //region > static helper functions
+    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY =
+            new Function<ObjectAdapter, ObjectAdapter>() {
         public ObjectAdapter apply(ObjectAdapter adapter) {
             if(adapter == null) {
                 return null;
@@ -98,24 +102,17 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         }
 
     };
+    //endregion
 
-    @Programmatic
-    public static EventType eventTypeFor(ChangeKind changeKind) {
-        if(changeKind == ChangeKind.UPDATE) {
-            return EventType.OBJECT_UPDATED;
-        }
-        if(changeKind == ChangeKind.CREATE) {
-            return EventType.OBJECT_CREATED;
-        }
-        if(changeKind == ChangeKind.DELETE) {
-            return EventType.OBJECT_DELETED;
-        }
-        throw new IllegalArgumentException("unknown ChangeKind '" + changeKind + "'");
-    }
-
+    //region > publishObjects
     @Override
     @Programmatic
     public void publishObjects() {
+
+        if(suppress) {
+            return;
+        }
+
         // take a copy of enlisted adapters ... the JDO implementation of the PublishingService
         // creates further entities which would be enlisted; taking copy of the map avoids ConcurrentModificationException
         final Map<ObjectAdapter, ChangeKind> changeKindByEnlistedAdapter = Maps.newHashMap();
@@ -203,7 +200,9 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         return new PublishedObjectsDefault(transactionUuid, userName, timestamp, changeKindByPublishedAdapter);
     }
 
+    //endregion
 
+    //region > publishAction
 
     @Programmatic
     public void publishAction(
@@ -214,6 +213,9 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
             final List<ObjectAdapter> parameterAdapters,
             final ObjectAdapter resultAdapter) {
 
+        if(suppress) {
+            return;
+        }
         publishActionToPublishingService(
                 objectAction, identifiedHolder, targetAdapter, parameterAdapters, resultAdapter
         );
@@ -221,13 +223,6 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         publishToPublisherServices(execution);
     }
 
-    @Override
-    public void publishProperty(
-            final Interaction.Execution execution) {
-
-        publishToPublisherServices(execution);
-    }
-
     private void publishActionToPublishingService(
             final ObjectAction objectAction,
             final IdentifiedHolder identifiedHolder,
@@ -333,10 +328,6 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         return NOT_DESTROYED_ELSE_EMPTY.apply(adapter);
     }
 
-    protected OidMarshaller getOidMarshaller() {
-        return IsisContext.getOidMarshaller();
-    }
-
     private EventMetadata newEventMetadata(
             final String currentUser,
             final Timestamp timestamp,
@@ -354,6 +345,38 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
                 enlistedAdapterClass, null, enlistedTarget, null, null, null, null);
     }
 
+    private static EventType eventTypeFor(ChangeKind changeKind) {
+        if(changeKind == ChangeKind.UPDATE) {
+            return EventType.OBJECT_UPDATED;
+        }
+        if(changeKind == ChangeKind.CREATE) {
+            return EventType.OBJECT_CREATED;
+        }
+        if(changeKind == ChangeKind.DELETE) {
+            return EventType.OBJECT_DELETED;
+        }
+        throw new IllegalArgumentException("unknown ChangeKind '" + changeKind + "'");
+    }
+    //endregion
+
+    //region > publishProperty
+
+    @Override
+    public void publishProperty(
+            final Interaction.Execution execution) {
+
+        if(suppress) {
+            return;
+        }
+
+        publishToPublisherServices(execution);
+    }
+
+
+    //endregion
+
+    //region > helper: publishToPublisherServices
+
     private void publishToPublisherServices(final Interaction.Execution<?,?> execution) {
 
         if(publisherServices == null || publisherServices.isEmpty()) {
@@ -365,6 +388,27 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
         }
     }
 
+    //endregion
+
+    //region > suppress
+
+    // this service is request scoped
+    boolean suppress;
+
+    @Programmatic
+    @Override
+    public <T> T withPublishingSuppressed(final Block<T> block) {
+        try {
+            suppress = true;
+            return block.exec();
+        } finally {
+            suppress = false;
+        }
+    }
+
+    //endregion
+
+    //region > injected services
     @Inject
     private List<PublisherService> publisherServices;
 
@@ -389,9 +433,13 @@ public class PublishingServiceInternalDefault implements PublishingServiceIntern
     @Inject
     private UserService userService;
 
+    protected OidMarshaller getOidMarshaller() {
+        return IsisContext.getOidMarshaller();
+    }
 
     private IsisTransactionManager.PersistenceSessionTransactionManagement getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
+    //endregion
 
 }