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);