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/01 10:16:58 UTC

[21/35] isis git commit: ISIS-1370: simplifying IsisTransaction, just lookup PublishingServiceInternal.

ISIS-1370: simplifying IsisTransaction, just lookup PublishingServiceInternal.


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

Branch: refs/heads/ISIS-1291
Commit: a44ea7b88ad204af20390405f6f774043c5c5928
Parents: 77d6b1b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sat Apr 30 07:40:58 2016 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sat Apr 30 07:40:58 2016 +0100

----------------------------------------------------------------------
 .../transaction/PublishingServiceInternal.java  | 129 +++++++++++++++++++
 ...shingServiceWithDefaultPayloadFactories.java | 110 ----------------
 .../system/transaction/IsisTransaction.java     |  49 ++-----
 3 files changed, 140 insertions(+), 148 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a44ea7b8/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternal.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternal.java
new file mode 100644
index 0000000..99b93a6
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceInternal.java
@@ -0,0 +1,129 @@
+/*
+ *  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.runtime.persistence.objectstore.transaction;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.PublishedAction;
+import org.apache.isis.applib.annotation.PublishedObject;
+import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
+import org.apache.isis.applib.services.publish.EventMetadata;
+import org.apache.isis.applib.services.publish.EventPayload;
+import org.apache.isis.applib.services.publish.ObjectStringifier;
+import org.apache.isis.applib.services.publish.PublishingService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet.CurrentInvocation;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+/**
+ * Wrapper around {@link PublishingService}.  Is a no-op if there is no injected service.
+ */
+@DomainService(nature = NatureOfService.DOMAIN)
+public class PublishingServiceInternal {
+
+    @Inject
+    private PublishingService publishingServiceIfAny;
+
+    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY = new Function<ObjectAdapter, ObjectAdapter>() {
+        public ObjectAdapter apply(ObjectAdapter adapter) {
+            if(adapter == null) {
+                return null;
+            }
+            if (!adapter.isDestroyed()) {
+                return adapter;
+            }
+            // objectstores such as JDO prevent the underlying pojo from being touched once it has been deleted.
+            // we therefore replace that pojo with an 'empty' one.
+
+            Object replacementObject = getPersistenceSession().instantiateAndInjectServices(adapter.getSpecification());
+            getPersistenceSession().remapRecreatedPojo(adapter, replacementObject);
+            return adapter;
+        }
+        protected PersistenceSession getPersistenceSession() {
+            return IsisContext.getPersistenceSession();
+        }
+
+    };
+
+
+    @Programmatic
+    public boolean canPublish() {
+        return publishingServiceIfAny != null;
+    }
+
+    @Programmatic
+    public void publishObject(
+            final PublishedObject.PayloadFactory payloadFactory,
+            final EventMetadata metadata, 
+            final ObjectAdapter changedAdapter, 
+            final ChangeKind changeKind, 
+            final ObjectStringifier stringifier) {
+
+        if (publishingServiceIfAny == null) {
+            return;
+        }
+
+        final EventPayload payload = payloadFactory.payloadFor(
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(changedAdapter)), changeKind);
+        payload.withStringifier(stringifier);
+        publishingServiceIfAny.publish(metadata, payload);
+    }
+
+    @Programmatic
+    public void publishAction(
+            final PublishedAction.PayloadFactory payloadFactory,
+            final EventMetadata metadata, 
+            final CurrentInvocation currentInvocation, 
+            final ObjectStringifier stringifier) {
+
+        if (publishingServiceIfAny == null) {
+            return;
+        }
+
+        final ObjectAdapter target = currentInvocation.getTarget();
+        final ObjectAdapter result = currentInvocation.getResult();
+        final List<ObjectAdapter> parameters = currentInvocation.getParameters();
+        final EventPayload payload = payloadFactory.payloadFor(
+                currentInvocation.getIdentifiedHolder().getIdentifier(),
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(target)), 
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(parameters)), 
+                ObjectAdapter.Util.unwrap(undeletedElseEmpty(result)));
+        payload.withStringifier(stringifier);
+        publishingServiceIfAny.publish(metadata, payload);
+    }
+
+    private static List<ObjectAdapter> undeletedElseEmpty(List<ObjectAdapter> parameters) {
+        return Lists.newArrayList(Iterables.transform(parameters, NOT_DESTROYED_ELSE_EMPTY));
+    }
+
+    private static ObjectAdapter undeletedElseEmpty(ObjectAdapter adapter) {
+        return NOT_DESTROYED_ELSE_EMPTY.apply(adapter);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a44ea7b8/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
deleted file mode 100644
index cadc27c..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.persistence.objectstore.transaction;
-
-import java.util.List;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.PublishedAction;
-import org.apache.isis.applib.annotation.PublishedObject;
-import org.apache.isis.applib.annotation.PublishedObject.ChangeKind;
-import org.apache.isis.applib.services.publish.EventMetadata;
-import org.apache.isis.applib.services.publish.EventPayload;
-import org.apache.isis.applib.services.publish.ObjectStringifier;
-import org.apache.isis.applib.services.publish.PublishingService;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet.CurrentInvocation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-/**
- * Wrapper around {@link PublishingService} that also includes the payload factories for
- * {@link PublishedObject.PayloadFactory published object}s and {@link PublishedAction.PayloadFactory published action}s.
- */
-public class PublishingServiceWithDefaultPayloadFactories {
-
-    private final PublishingService publishingService;
-
-    private final static Function<ObjectAdapter, ObjectAdapter> NOT_DESTROYED_ELSE_EMPTY = new Function<ObjectAdapter, ObjectAdapter>() {
-        public ObjectAdapter apply(ObjectAdapter adapter) {
-            if(adapter == null) {
-                return null;
-            }
-            if (!adapter.isDestroyed()) {
-                return adapter;
-            }
-            // objectstores such as JDO prevent the underlying pojo from being touched once it has been deleted.
-            // we therefore replace that pojo with an 'empty' one.
-
-            Object replacementObject = getPersistenceSession().instantiateAndInjectServices(adapter.getSpecification());
-            getPersistenceSession().remapRecreatedPojo(adapter, replacementObject);
-            return adapter;
-        }
-        protected PersistenceSession getPersistenceSession() {
-            return IsisContext.getPersistenceSession();
-        }
-
-    };
-    
-    public PublishingServiceWithDefaultPayloadFactories(
-            final PublishingService publishingService) {
-        this.publishingService = publishingService;
-    }
-
-    public void publishObject(
-            final PublishedObject.PayloadFactory payloadFactory,
-            final EventMetadata metadata, 
-            final ObjectAdapter changedAdapter, 
-            final ChangeKind changeKind, 
-            final ObjectStringifier stringifier) {
-        final EventPayload payload = payloadFactory.payloadFor(
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(changedAdapter)), changeKind);
-        payload.withStringifier(stringifier);
-        publishingService.publish(metadata, payload);
-    }
-
-    public void publishAction(
-            final PublishedAction.PayloadFactory payloadFactory,
-            final EventMetadata metadata, 
-            final CurrentInvocation currentInvocation, 
-            final ObjectStringifier stringifier) {
-        final ObjectAdapter target = currentInvocation.getTarget();
-        final ObjectAdapter result = currentInvocation.getResult();
-        final List<ObjectAdapter> parameters = currentInvocation.getParameters();
-        final EventPayload payload = payloadFactory.payloadFor(
-                currentInvocation.getIdentifiedHolder().getIdentifier(),
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(target)), 
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(parameters)), 
-                ObjectAdapter.Util.unwrap(undeletedElseEmpty(result)));
-        payload.withStringifier(stringifier);
-        publishingService.publish(metadata, payload);
-    }
-
-    private static List<ObjectAdapter> undeletedElseEmpty(List<ObjectAdapter> parameters) {
-        return Lists.newArrayList(Iterables.transform(parameters, NOT_DESTROYED_ELSE_EMPTY));
-    }
-
-    private static ObjectAdapter undeletedElseEmpty(ObjectAdapter adapter) {
-        return NOT_DESTROYED_ELSE_EMPTY.apply(adapter);
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a44ea7b8/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index 62158af..f02145f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -60,7 +60,6 @@ import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.applib.services.publish.EventSerializer;
 import org.apache.isis.applib.services.publish.EventType;
 import org.apache.isis.applib.services.publish.ObjectStringifier;
-import org.apache.isis.applib.services.publish.PublishingService;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
@@ -80,11 +79,9 @@ import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInv
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet.CurrentInvocation;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
-import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionPayloadFactoryDefault;
 import org.apache.isis.core.metamodel.facets.object.audit.AuditableFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
-import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectPayloadFactoryDefault;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -93,7 +90,7 @@ import org.apache.isis.core.metamodel.transactions.TransactionState;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
+import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceInternal;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
@@ -257,7 +254,7 @@ public class IsisTransaction implements TransactionScopedComponent {
     /**
      * could be null if none has been registered
      */
-    private final PublishingServiceWithDefaultPayloadFactories publishingServiceIfAny;
+    private final PublishingServiceInternal publishingServiceInternal;
 
     /**
      * Will be that of the {@link #command} if not <tt>null</tt>, otherwise will be randomly created.
@@ -292,7 +289,7 @@ public class IsisTransaction implements TransactionScopedComponent {
         this.clockService = lookupService(ClockService.class);
 
         this.auditingServiceIfAny = lookupServiceIfAny(AuditingService3.class);
-        this.publishingServiceIfAny = getPublishingServiceIfAny(servicesInjector);
+        this.publishingServiceInternal = lookupService(PublishingServiceInternal.class);
 
         // determine whether this xactn is taking place in the context of an
         // existing command in which a previous xactn has already occurred.
@@ -309,30 +306,6 @@ public class IsisTransaction implements TransactionScopedComponent {
         }
     }
 
-    
-    // ///////////////////////////////////////////
-    // Publishing service
-    // ///////////////////////////////////////////
-
-    private PublishingServiceWithDefaultPayloadFactories getPublishingServiceIfAny(ServicesInjector servicesInjector) {
-        final PublishingService publishingService = servicesInjector.lookupService(PublishingService.class);
-        if(publishingService == null) {
-            return null;
-        }
-
-        PublishedObject.PayloadFactory objectPayloadFactory = servicesInjector.lookupService(PublishedObject.PayloadFactory.class);
-        if(objectPayloadFactory == null) {
-            objectPayloadFactory = new PublishedObjectPayloadFactoryDefault();
-        }
-        
-        PublishedAction.PayloadFactory actionPayloadFactory = servicesInjector.lookupService(PublishedAction.PayloadFactory.class);
-        if(actionPayloadFactory == null) {
-            actionPayloadFactory = new PublishedActionPayloadFactoryDefault();
-        }
-        
-        return new PublishingServiceWithDefaultPayloadFactories(publishingService);
-    }
-    
     protected EventSerializer newSimpleEventSerializer() {
         return new EventSerializer.Simple();
     }
@@ -511,7 +484,7 @@ public class IsisTransaction implements TransactionScopedComponent {
 
     public void publishActionIfRequired(final String currentUser, final java.sql.Timestamp timestamp) {
 
-        if(publishingServiceIfAny == null) {
+        if(!publishingServiceInternal.canPublish()) {
             return;
         }
 
@@ -566,7 +539,7 @@ public class IsisTransaction implements TransactionScopedComponent {
                     parameterNames, parameterTypes, returnType);
 
             final PublishedAction.PayloadFactory payloadFactory = publishedActionFacet.value();
-            publishingServiceIfAny.publishAction(payloadFactory, metadata, currentInvocation, objectStringifier());
+            publishingServiceInternal.publishAction(payloadFactory, metadata, currentInvocation, objectStringifier());
         } finally {
             // ensures that cannot publish this action more than once
             ActionInvocationFacet.currentInvocation.set(null);
@@ -581,11 +554,12 @@ public class IsisTransaction implements TransactionScopedComponent {
     /**
      * @return the adapters that were published (if any were).
      */
-    protected List<ObjectAdapter> publishedChangedObjectsIfRequired(final String currentUser, final java.sql.Timestamp timestamp) {
-        if(publishingServiceIfAny == null) {
-            return Collections.emptyList();
+    protected void publishedChangedObjectsIfRequired(final String currentUser, final java.sql.Timestamp timestamp) {
+
+        if(!publishingServiceInternal.canPublish()) {
+            return;
         }
-        
+
         // take a copy of enlisted adapters ... the JDO implementation of the PublishingService 
         // creates further entities which would be enlisted; taking copy of the keys avoids ConcurrentModificationException
         List<ObjectAdapter> enlistedAdapters = Lists.newArrayList(changeKindByEnlistedAdapter.keySet());
@@ -604,10 +578,9 @@ public class IsisTransaction implements TransactionScopedComponent {
             final EventMetadata metadata = newEventMetadata(
                     currentUser, timestamp, changeKind, enlistedAdapterClass, enlistedTarget);
 
-            publishingServiceIfAny
+            publishingServiceInternal
                     .publishObject(payloadFactory, metadata, enlistedAdapter, changeKind, objectStringifier());
         }
-        return enlistedAdapters;
     }
 
     protected ObjectStringifier objectStringifier() {