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 2013/04/04 20:58:49 UTC

git commit: ISIS-377: ObjectChanged event also now exposes className of changed object; inject ObjectStringifier for custom payload events as well as for regular.

Updated Branches:
  refs/heads/master 62f7ab153 -> 61f2e4cec


ISIS-377: ObjectChanged event also now exposes className of changed object; inject ObjectStringifier for custom payload events as well as for regular.


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

Branch: refs/heads/master
Commit: 61f2e4cec1a0e896ece4ef3026a49cc8b84e5520
Parents: 62f7ab1
Author: Dan Haywood <da...@apache.org>
Authored: Thu Apr 4 19:58:12 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Apr 4 19:58:12 2013 +0100

----------------------------------------------------------------------
 .../service/publish/PublishingServiceJdo.java      |    2 +
 .../isis/applib/services/publish/EventPayload.java |    8 +++
 .../publish/EventPayloadForActionInvocation.java   |   12 ++++-
 .../publish/EventPayloadForObjectChanged.java      |   20 ++++++--
 .../applib/services/publish/ObjectStringifier.java |   13 ++---
 ...blishingServiceWithDefaultPayloadFactories.java |   10 +++-
 .../system/transaction/IsisTransaction.java        |   38 ++++++++++++++-
 .../system/transaction/IsisTransactionManager.java |   30 +++---------
 .../dom/src/main/java/dom/todo/ToDoItem.java       |    1 +
 9 files changed, 91 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishingServiceJdo.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishingServiceJdo.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishingServiceJdo.java
index 898d5e0..e8ba8a8 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishingServiceJdo.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishingServiceJdo.java
@@ -8,6 +8,7 @@ import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.MemberOrder;
+import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.NotInServiceMenu;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.publish.EventMetadata;
@@ -20,6 +21,7 @@ import org.apache.isis.objectstore.jdo.applib.service.publish.PublishedEvent.Sta
  * An implementation of {@link PublishingService} that persists events as
  * entities into a JDO-backed database.
  */
+@Named("Integration")
 public class PublishingServiceJdo extends AbstractService implements PublishingService {
 
     private EventSerializer eventSerializer;

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayload.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayload.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayload.java
index aadd334..0e5a356 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayload.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayload.java
@@ -1,5 +1,7 @@
 package org.apache.isis.applib.services.publish;
 
+import org.apache.isis.applib.annotation.Programmatic;
+
 
 
 
@@ -25,4 +27,10 @@ package org.apache.isis.applib.services.publish;
  */
 public interface EventPayload {
 
+    /**
+     * Injected by Isis runtime immediately after instantiation.
+     */
+    @Programmatic
+    void withStringifier(ObjectStringifier stringifier);
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForActionInvocation.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForActionInvocation.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForActionInvocation.java
index db9f052..df7b63b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForActionInvocation.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForActionInvocation.java
@@ -22,7 +22,7 @@ public class EventPayloadForActionInvocation<T> implements EventPayload {
     private final T target;
     private final List<? extends Object> arguments;
     private final Object result;
-    private ObjectStringifier stringifier = new ObjectStringifier.Simple();
+    private ObjectStringifier stringifier;
 
     public EventPayloadForActionInvocation(final Identifier actionIdentifier, final T target, final List<? extends Object> arguments, final Object result) {
         this.target = target;
@@ -31,10 +31,12 @@ public class EventPayloadForActionInvocation<T> implements EventPayload {
         this.result = result;
     }
 
+    /**
+     * Injected by Isis runtime immediately after instantiation.
+     */
     @Programmatic
-    public EventPayloadForActionInvocation<T> with(ObjectStringifier stringifier) {
+    public void withStringifier(ObjectStringifier stringifier) {
         this.stringifier = stringifier;
-        return this;
     }
 
 
@@ -128,6 +130,10 @@ public class EventPayloadForActionInvocation<T> implements EventPayload {
     
     @Override
     public String toString() {
+        if(stringifier == null) {
+            throw new IllegalStateException("ObjectStringifier has not been injected");
+        }
+
         final StringBuilder buf = new StringBuilder();
         buf.append(EventType.ACTION_INVOCATION + ":").append(getActionName());
         buf.append("\n    target=").append(stringifier.toString(target));

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForObjectChanged.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForObjectChanged.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForObjectChanged.java
index c717d27..c52e0a6 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForObjectChanged.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventPayloadForObjectChanged.java
@@ -14,24 +14,36 @@ import org.apache.isis.applib.annotation.Programmatic;
 public class EventPayloadForObjectChanged<T> implements EventPayload {
     
     private final T changed;
-    private ObjectStringifier stringifier = new ObjectStringifier.Simple();
+    private ObjectStringifier stringifier;
 
     public EventPayloadForObjectChanged(T changed) {
         this.changed = changed;
     }
 
+    /**
+     * Injected by Isis runtime immediately after instantiation.
+     */
     @Programmatic
-    public EventPayloadForObjectChanged<T> with(ObjectStringifier stringifier) {
+    public void withStringifier(ObjectStringifier stringifier) {
         this.stringifier = stringifier;
-        return this;
     }
 
     public T getChanged() {
         return changed;
     }
-    
+
+    public String getClassName() {
+        if(stringifier == null) {
+            throw new IllegalStateException("ObjectStringifier has not been injected");
+        }
+        return stringifier.classNameOf(changed);
+    }
+
     @Override
     public String toString() {
+        if(stringifier == null) {
+            throw new IllegalStateException("ObjectStringifier has not been injected");
+        }
         return EventType.OBJECT_CHANGED + ":"+ stringifier.toString(changed);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/core/applib/src/main/java/org/apache/isis/applib/services/publish/ObjectStringifier.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/ObjectStringifier.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/ObjectStringifier.java
index 729cd12..8ed3f0d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/ObjectStringifier.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/ObjectStringifier.java
@@ -1,16 +1,13 @@
 package org.apache.isis.applib.services.publish;
 
+import org.apache.isis.applib.annotation.PublishedObject.PayloadFactory;
+
 
 /**
- * To optionally configure the way that {@link EventPayloadForObjectChanged} and {@link EventPayloadForActionInvocation}
- * create the <tt>toString()</tt> form of their contents.
+ * Decouples the {@link PayloadFactory payload} {@link org.apache.isis.applib.annotation.PublishedAction.PayloadFactory factory}
+ * implementations from the framework for obtaining an string form (OID) and the class name of objects.
  */
 public interface ObjectStringifier {
+    public String classNameOf(Object object);
     public String toString(Object object);
-    static class Simple implements ObjectStringifier {
-        @Override
-        public String toString(Object object) {
-            return object != null? object.toString(): null;
-        }
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/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
index 1bd6eb8..aecbb38 100644
--- 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
@@ -4,6 +4,7 @@ import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
 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.invoke.ActionInvocationFacet.CurrentInvocation;
@@ -31,19 +32,22 @@ public class PublishingServiceWithDefaultPayloadFactories {
     public void publishObject(
             final PublishedObject.PayloadFactory payloadFactoryIfAny, 
             final EventMetadata metadata, 
-            final ObjectAdapter changedAdapter) {
+            final ObjectAdapter changedAdapter, 
+            final ObjectStringifier stringifier) {
         final PublishedObject.PayloadFactory payloadFactoryToUse = 
                 payloadFactoryIfAny != null
                 ? payloadFactoryIfAny
                 : defaultObjectPayloadFactory;
         final EventPayload payload = payloadFactoryToUse.payloadFor(ObjectAdapterUtils.unwrapObject(changedAdapter));
+        payload.withStringifier(stringifier);
         publishingService.publish(metadata, payload);
     }
 
     public void publishAction(
             final PublishedAction.PayloadFactory payloadFactoryIfAny, 
             final EventMetadata metadata, 
-            final CurrentInvocation currentInvocation) {
+            final CurrentInvocation currentInvocation, 
+            final ObjectStringifier stringifier) {
         final PublishedAction.PayloadFactory payloadFactoryToUse = 
                 payloadFactoryIfAny != null
                 ? payloadFactoryIfAny
@@ -53,7 +57,7 @@ public class PublishingServiceWithDefaultPayloadFactories {
                 ObjectAdapterUtils.unwrapObject(currentInvocation.getTarget()), 
                 ObjectAdapterUtils.unwrapObjects(currentInvocation.getParameters()), 
                 ObjectAdapterUtils.unwrapObject(currentInvocation.getResult()));
-        
+        payload.withStringifier(stringifier);
         publishingService.publish(metadata, payload);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/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 8f3b1e8..0e77422 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
@@ -47,6 +47,7 @@ import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.audit.AuditingService;
 import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.applib.services.publish.EventType;
+import org.apache.isis.applib.services.publish.ObjectStringifier;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
 import org.apache.isis.core.commons.ensure.Ensure;
@@ -55,12 +56,14 @@ import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet.CurrentInvocation;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
 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.publish.PublishedObjectFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
@@ -421,7 +424,7 @@ public class IsisTransaction implements TransactionScopedComponent {
             final String title = oidStr + ": " + currentInvocation.getAction().getIdentifier().toNameParmsIdentityString();
             
             final EventMetadata metadata = newEventMetadata(EventType.ACTION_INVOCATION, currentUser, currentTimestampEpoch, title);
-            publishingService.publishAction(payloadFactory, metadata, currentInvocation);
+            publishingService.publishAction(payloadFactory, metadata, currentInvocation, objectStringifier());
         } finally {
             ActionInvocationFacet.currentInvocation.set(null);
         }
@@ -441,10 +444,38 @@ public class IsisTransaction implements TransactionScopedComponent {
 
             final EventMetadata metadata = newEventMetadata(EventType.OBJECT_CHANGED, currentUser, currentTimestampEpoch, title);
 
-            publishingService.publishObject(payloadFactory, metadata, changedAdapter);
+            publishingService.publishObject(payloadFactory, metadata, changedAdapter, objectStringifier());
         }
     }
 
+    protected ObjectStringifier objectStringifier() {
+        if(objectStringifier == null) {
+            // lazily created; is threadsafe so no need to guard against race conditions
+            objectStringifier = new ObjectStringifier() {
+                @Override
+                public String toString(Object object) {
+                    if(object == null) {
+                        return null;
+                    }
+                    final ObjectAdapter adapter = getAdapterManager().adapterFor(object);
+                    Oid oid = adapter.getOid();
+                    return oid != null? oid.enString(getOidMarshaller()): encodedValueOf(adapter);
+                }
+                private String encodedValueOf(ObjectAdapter adapter) {
+                    EncodableFacet facet = adapter.getSpecification().getFacet(EncodableFacet.class);
+                    return facet != null? facet.toEncodedString(adapter): adapter.toString();
+                }
+                @Override
+                public String classNameOf(Object object) {
+                    final ObjectAdapter adapter = getAdapterManager().adapterFor(object);
+                    final String className = adapter.getSpecification().getFullIdentifier();
+                    return className;
+                }
+            };
+        }
+        return objectStringifier;
+    }
+
     private static long currentTimestampEpoch() {
         return Clock.getTime();
     }
@@ -786,6 +817,9 @@ public class IsisTransaction implements TransactionScopedComponent {
    
     private final Map<AdapterAndProperty, PreAndPostValues> changedObjectProperties = Maps.newLinkedHashMap();
     private final Set<ObjectAdapter> changedObjects = Sets.newLinkedHashSet();
+
+
+    private ObjectStringifier objectStringifier;
     
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
index 706ac90..01c3fe3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionManager.java
@@ -47,6 +47,7 @@ import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
@@ -461,10 +462,8 @@ public class IsisTransactionManager implements SessionScopedComponent {
         return new PublishedObject.PayloadFactory() {
             @Override
             public EventPayload payloadFor(final Object changedObject) {
-                return new EventPayloadForObjectChanged<Object>(changedObject)
-                            .with(objectStringifier());
+                return new EventPayloadForObjectChanged<Object>(changedObject);
             }
-
         };
     }
 
@@ -476,30 +475,11 @@ public class IsisTransactionManager implements SessionScopedComponent {
                         actionIdentifier, 
                         target, 
                         arguments, 
-                        result).with(objectStringifier());
+                        result);
             }
         };
     }
 
-    protected ObjectStringifier objectStringifier() {
-        return new ObjectStringifier() {
-            @Override
-            public String toString(Object object) {
-                if(object == null) {
-                    return null;
-                }
-                final ObjectAdapter adapter = getAdapterManager().adapterFor(object);
-                Oid oid = adapter.getOid();
-                return oid != null? oid.enString(IsisContext.getOidMarshaller()): encodedValueOf(adapter);
-            }
-            private String encodedValueOf(ObjectAdapter adapter) {
-                EncodableFacet facet = adapter.getSpecification().getFacet(EncodableFacet.class);
-                return facet != null? facet.toEncodedString(adapter): adapter.toString();
-            }
-        };
-    }
-
-
 
     // //////////////////////////////////////////////////////////////
     // Hooks
@@ -586,4 +566,8 @@ public class IsisTransactionManager implements SessionScopedComponent {
         return IsisContext.getPersistenceSession().getAdapterManager();
     }
 
+    protected OidMarshaller getOidMarshaller() {
+        return IsisContext.getOidMarshaller();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/61f2e4ce/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 63e0023..dcb3d6d 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -260,6 +260,7 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // }}
 
     // {{ notYetCompleted (action)
+    @PublishedAction
     @MemberOrder(sequence = "2")
     public ToDoItem notYetCompleted() {
         setComplete(false);