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
}