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/02/08 19:29:52 UTC

[24/32] ISIS-323: RO publishing done, but no xactn stuff yet

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/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
new file mode 100644
index 0000000..978a238
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
@@ -0,0 +1,59 @@
+package org.apache.isis.core.runtime.persistence.objectstore.transaction;
+
+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.PublishingService;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.actions.invoke.ActionInvocationFacet.CurrentInvocation;
+import org.apache.isis.core.metamodel.spec.ObjectAdapterUtils;
+
+/**
+ * Wrapper around {@link PublishingService} that also includes the
+ * {@link PublishedObject.PayloadFactory event} {@link PublishedAction.PayloadFactory canonicalizers}. 
+ */
+public class PublishingServiceWithDefaultPayloadFactories {
+
+    private final PublishingService publishingService;
+    private final PublishedObject.PayloadFactory defaultObjectPayloadFactory;
+    private final PublishedAction.PayloadFactory defaultActionPayloadFactory;
+    
+    public PublishingServiceWithDefaultPayloadFactories (
+            final PublishingService publishingService, 
+            final PublishedObject.PayloadFactory defaultObjectPayloadFactory, 
+            final PublishedAction.PayloadFactory defaultActionPayloadFactory) {
+        this.publishingService = publishingService;
+        this.defaultObjectPayloadFactory = defaultObjectPayloadFactory;
+        this.defaultActionPayloadFactory = defaultActionPayloadFactory;
+    }
+
+    public void publishObject(
+            final PublishedObject.PayloadFactory annotatedPayloadFactoryIfAny, 
+            final EventMetadata metadata, 
+            final ObjectAdapter changedAdapter) {
+        final PublishedObject.PayloadFactory payloadFactoryToUse = 
+                annotatedPayloadFactoryIfAny != null
+                ? annotatedPayloadFactoryIfAny
+                : defaultObjectPayloadFactory;
+        final EventPayload payload = payloadFactoryToUse.payloadFor(ObjectAdapterUtils.unwrapObject(changedAdapter));
+        publishingService.publish(metadata, payload);
+    }
+
+    public void publishAction(
+            final PublishedAction.PayloadFactory annotatedPayloadFactoryIfAny, 
+            final EventMetadata metadata, 
+            final CurrentInvocation currentInvocation) {
+        final PublishedAction.PayloadFactory payloadFactoryToUse = 
+                annotatedPayloadFactoryIfAny != null
+                ? annotatedPayloadFactoryIfAny
+                : defaultActionPayloadFactory;
+        final EventPayload payload = payloadFactoryToUse.payloadFor(
+                currentInvocation.getAction().getIdentifier(),
+                ObjectAdapterUtils.unwrapObject(currentInvocation.getTarget()), 
+                ObjectAdapterUtils.unwrapObjects(currentInvocation.getParameters()), 
+                ObjectAdapterUtils.unwrapObject(currentInvocation.getResult()));
+        
+        publishingService.publish(metadata, payload);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/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 3893480..a23fe8c 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
@@ -32,11 +32,11 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.UUID;
 
-import org.apache.isis.applib.annotation.PublishedAction.EventCanonicalizer;
+import org.apache.isis.applib.annotation.PublishedAction.PayloadFactory;
 import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.services.audit.AuditingService;
-import org.apache.isis.applib.services.publish.PublishingService;
+import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
 import org.apache.isis.core.commons.ensure.Ensure;
@@ -57,7 +57,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 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.PublishingServiceWithCanonicalizers;
+import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.SaveObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -198,7 +198,7 @@ public class IsisTransaction implements TransactionScopedComponent {
     /**
      * could be null if none has been registered
      */
-    private final PublishingServiceWithCanonicalizers publishingService;
+    private final PublishingServiceWithDefaultPayloadFactories publishingService;
 
     private State state;
 
@@ -206,7 +206,7 @@ public class IsisTransaction implements TransactionScopedComponent {
     
     private final UUID guid;
 
-    public IsisTransaction(final IsisTransactionManager transactionManager, final MessageBroker messageBroker, final UpdateNotifier updateNotifier, final TransactionalResource objectStore, final AuditingService auditingService, PublishingServiceWithCanonicalizers publishingService) {
+    public IsisTransaction(final IsisTransactionManager transactionManager, final MessageBroker messageBroker, final UpdateNotifier updateNotifier, final TransactionalResource objectStore, final AuditingService auditingService, PublishingServiceWithDefaultPayloadFactories publishingService) {
         
         ensureThatArg(transactionManager, is(not(nullValue())), "transaction manager is required");
         ensureThatArg(messageBroker, is(not(nullValue())), "message broker is required");
@@ -434,8 +434,10 @@ public class IsisTransaction implements TransactionScopedComponent {
             if(publishedObjectFacet == null) {
                 continue;
             }
-            final PublishedObject.EventCanonicalizer canonicalizer = publishedObjectFacet.value();
-            publishingService.publishObject(canonicalizer, getGuid(), currentUser, currentTimestampEpoch, changedAdapter);
+            final PublishedObject.PayloadFactory payloadFactory = publishedObjectFacet.value();
+            final EventMetadata metadata = new EventMetadata(getGuid(), currentUser, currentTimestampEpoch);
+
+            publishingService.publishObject(payloadFactory, metadata, changedAdapter);
         }
     }
 
@@ -449,8 +451,9 @@ public class IsisTransaction implements TransactionScopedComponent {
             if(publishedActionFacet == null) {
                 return;
             } 
-            final EventCanonicalizer canonicalizer = publishedActionFacet.value();
-            publishingService.publishAction(canonicalizer, guid, currentUser, currentTimestampEpoch, currentInvocation);
+            final PayloadFactory payloadFactory = publishedActionFacet.value();
+            final EventMetadata metadata = new EventMetadata(getGuid(), currentUser, currentTimestampEpoch);
+            publishingService.publishAction(payloadFactory, metadata, currentInvocation);
         } finally {
             ActionInvocationFacet.currentInvocation.set(null);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/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 edf67f5..34b8834 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
@@ -31,23 +31,32 @@ import java.util.List;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.PublishedAction;
 import org.apache.isis.applib.annotation.PublishedObject;
-import org.apache.isis.applib.annotation.PublishedObject.EventCanonicalizer;
 import org.apache.isis.applib.services.audit.AuditingService;
-import org.apache.isis.applib.services.publish.CanonicalEvent;
+import org.apache.isis.applib.services.publish.EventPayload;
+import org.apache.isis.applib.services.publish.EventPayloadForActionInvocation;
+import org.apache.isis.applib.services.publish.EventPayloadForChangedObject;
+import org.apache.isis.applib.services.publish.EventSerializer;
 import org.apache.isis.applib.services.publish.PublishingService;
+import org.apache.isis.applib.services.publish.ObjectStringifier;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 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.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithCanonicalizers;
+import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.log4j.Logger;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Lists;
+
 public class IsisTransactionManager implements SessionScopedComponent {
 
 
@@ -65,7 +74,7 @@ public class IsisTransactionManager implements SessionScopedComponent {
     /**
      * Could be null.
      */
-    private final PublishingServiceWithCanonicalizers publishingService;
+    private final PublishingServiceWithDefaultPayloadFactories publishingService;
 
     private IsisSession session;
 
@@ -388,61 +397,79 @@ public class IsisTransactionManager implements SessionScopedComponent {
     // Publishing service
     // ///////////////////////////////////////////
 
-    public PublishingServiceWithCanonicalizers getPublishingServiceIfAny(ServicesInjectorSpi servicesInjectorSpi) {
+    public PublishingServiceWithDefaultPayloadFactories getPublishingServiceIfAny(ServicesInjectorSpi servicesInjectorSpi) {
         final PublishingService publishingService = servicesInjectorSpi.lookupService(PublishingService.class);
         if(publishingService == null) {
             return null;
         }
-        
-        PublishedObject.EventCanonicalizer objectEventCanonicalizer = servicesInjectorSpi.lookupService(PublishedObject.EventCanonicalizer.class);
-        if(objectEventCanonicalizer == null) {
-            objectEventCanonicalizer = newDefaultObjectEventCanonicalizer();
+
+        EventSerializer eventSerializer = servicesInjectorSpi.lookupService(EventSerializer.class);
+        if(eventSerializer == null) {
+            eventSerializer = newSimpleEventSerializer();
+        }
+
+        PublishedObject.PayloadFactory objectPayloadFactory = servicesInjectorSpi.lookupService(PublishedObject.PayloadFactory.class);
+        if(objectPayloadFactory == null) {
+            objectPayloadFactory = newDefaultObjectPayloadFactory();
         }
         
-        PublishedAction.EventCanonicalizer actionEventCanonicalizer = servicesInjectorSpi.lookupService(PublishedAction.EventCanonicalizer.class);
-        if(actionEventCanonicalizer == null) {
-            actionEventCanonicalizer = newDefaultActionEventCanonicalizer();
+        PublishedAction.PayloadFactory actionPayloadFactory = servicesInjectorSpi.lookupService(PublishedAction.PayloadFactory.class);
+        if(actionPayloadFactory == null) {
+            actionPayloadFactory = newDefaultActionPayloadFactory();
         }
         
-        return new PublishingServiceWithCanonicalizers(publishingService, objectEventCanonicalizer, actionEventCanonicalizer);
+        return new PublishingServiceWithDefaultPayloadFactories(publishingService, objectPayloadFactory, actionPayloadFactory);
+    }
+
+    protected EventSerializer newSimpleEventSerializer() {
+        return new EventSerializer.Simple();
     }
 
 
-    protected PublishedObject.EventCanonicalizer newDefaultObjectEventCanonicalizer() {
-        return new PublishedObject.EventCanonicalizer() {
+    protected PublishedObject.PayloadFactory newDefaultObjectPayloadFactory() {
+        return new PublishedObject.PayloadFactory() {
             @Override
-            public CanonicalEvent canonicalizeObject(final Object changedObject) {
-                return new CanonicalEvent.Default("CHANGED_OBJECT\n    "+oidStrFor(changedObject));
+            public EventPayload payloadFor(final Object changedObject) {
+                return new EventPayloadForChangedObject(changedObject)
+                            .with(objectStringifier());
             }
+
         };
     }
 
-    protected PublishedAction.EventCanonicalizer newDefaultActionEventCanonicalizer() {
-        return new PublishedAction.EventCanonicalizer() {
+    protected PublishedAction.PayloadFactory newDefaultActionPayloadFactory() {
+        return new PublishedAction.PayloadFactory(){
+            @Override
+            public EventPayload payloadFor(Identifier actionIdentifier, Object target, List<Object> arguments, Object result) {
+                return new EventPayloadForActionInvocation(
+                        actionIdentifier, 
+                        target, 
+                        arguments, 
+                        result).with(objectStringifier());
+            }
+        };
+    }
 
+    protected ObjectStringifier objectStringifier() {
+        return new ObjectStringifier() {
             @Override
-            public CanonicalEvent canonicalizeAction(Object invokedObject, Identifier identifier, List<Object> args, Object actionResult) {
-                final StringBuilder buf = new StringBuilder();
-                buf.append("ACTION\n").append(identifier.toString());
-                buf.append("\n    target=").append(oidStrFor(invokedObject));
-                buf.append("\n      args=[");
-                for (Object arg : args) {
-                    buf.append("\n           ").append(oidStrFor(arg));
+            public String toString(Object object) {
+                if(object == null) {
+                    return null;
                 }
-                buf.append("\n      ]");
-                buf.append("\n    result=").append(actionResult != null ? oidStrFor(actionResult) : "void");
-                return new CanonicalEvent.Default(buf.toString()) ;
+                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();
             }
         };
     }
 
-    private static String oidStrFor(final Object changedObject) {
-        final ObjectAdapter adapter = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(changedObject);
-        return adapter.getOid().enString(IsisContext.getOidMarshaller());
-    }
 
 
-    
     // //////////////////////////////////////////////////////////////
     // Hooks
     // //////////////////////////////////////////////////////////////
@@ -513,6 +540,11 @@ public class IsisTransactionManager implements SessionScopedComponent {
         this.session = session;
     }
 
+    
+    // ////////////////////////////////////////////////////////////////
+    // Dependencies (from context)
+    // ////////////////////////////////////////////////////////////////
+
 
     /**
      * Called back by {@link IsisTransaction}.
@@ -520,8 +552,9 @@ public class IsisTransactionManager implements SessionScopedComponent {
     protected AuthenticationSession getAuthenticationSession() {
         return IsisContext.getAuthenticationSession();
     }
-
-
-
     
+    protected AdapterManager getAdapterManager() {
+        return IsisContext.getPersistenceSession().getAdapterManager();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java
index a7092c4..bd01c72 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/PersistenceSessionObjectStoreTest.java
@@ -57,7 +57,7 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateOb
 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.PojoAdapterBuilder;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithCanonicalizers;
+import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.SaveObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder.Persistence;
 import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi;
@@ -103,7 +103,7 @@ public class PersistenceSessionObjectStoreTest {
     @Mock
     private AuditingService mockAuditingService;
     @Mock
-    private PublishingServiceWithCanonicalizers mockPublishingService;
+    private PublishingServiceWithDefaultPayloadFactories mockPublishingService;
 
     @Mock
     private CreateObjectCommand createObjectCommand;

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
index 699c44d..5320556 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/transaction/IsisTransactionTest.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyO
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommandContext;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder;
-import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithCanonicalizers;
+import org.apache.isis.core.runtime.persistence.objectstore.transaction.PublishingServiceWithDefaultPayloadFactories;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.SaveObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.PojoAdapterBuilder.Persistence;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
@@ -77,7 +77,7 @@ public class IsisTransactionTest {
     @Mock
     private AuditingService mockAuditingService;
     @Mock
-    private PublishingServiceWithCanonicalizers mockPublishingService;
+    private PublishingServiceWithDefaultPayloadFactories mockPublishingService;
 
     private PersistenceCommand command;
     private PersistenceCommand command2;

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/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 0bc0671..7a4e757 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
@@ -82,7 +82,7 @@ import com.google.common.collect.Lists;
 @javax.jdo.annotations.Version(strategy=VersionStrategy.VERSION_NUMBER, column="VERSION")
 @ObjectType("TODO")
 @Audited
-@PublishedObject
+@PublishedObject(ToDoItemChangedPayloadFactory.class)
 @AutoComplete(repository=ToDoItems.class, action="autoComplete")
 @MemberGroups({"General", "Detail"})
 public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3: uncomment to use https://github.com/danhaywood/isis-wicket-gmap3
@@ -296,6 +296,7 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // }}
 
     // {{ add (action)
+    @PublishedAction
     @MemberOrder(name="dependencies", sequence = "3")
     public ToDoItem add(final ToDoItem toDoItem) {
         getDependencies().add(toDoItem);

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemChangedPayloadFactory.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemChangedPayloadFactory.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemChangedPayloadFactory.java
new file mode 100644
index 0000000..fd8415d
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemChangedPayloadFactory.java
@@ -0,0 +1,24 @@
+package dom.todo;
+
+import org.apache.isis.applib.annotation.PublishedObject.PayloadFactory;
+import org.apache.isis.applib.services.publish.EventPayload;
+import org.apache.isis.applib.services.publish.EventPayloadForChangedObject;
+
+public class ToDoItemChangedPayloadFactory implements PayloadFactory{
+
+    public static class ToDoItemPayload extends EventPayloadForChangedObject<ToDoItem> {
+
+        public ToDoItemPayload(ToDoItem changed) {
+            super(changed);
+        }
+        
+        public String getDescription() {
+            return getChanged().getDescription();
+        }
+    }
+    @Override
+    public EventPayload payloadFor(Object changedObject) {
+        return new ToDoItemPayload((ToDoItem) changedObject);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
index c7cc47f..757952d 100644
--- a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
@@ -163,7 +163,8 @@ isis.user-profile-store=in-memory
 isis.services = objstore.jdo.todo.ToDoItemsJdo,\
                 fixture.todo.ToDoItemsFixturesService,\
                 dom.audit.AuditServiceDemo,\
-                org.apache.isis.applib.services.publish.PublishingService$Stderr,
+                org.apache.isis.applib.services.publish.PublishingService$Stderr,\
+                org.apache.isis.viewer.restfulobjects.rendering.eventserializer.RestfulObjectsSpecEventSerializer
 
 # Specify the (optional) test fixtures
 #

http://git-wip-us.apache.org/repos/asf/isis/blob/7b745ecd/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/web.xml b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/web.xml
index 48a034e..e8d2287 100644
--- a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/web.xml
+++ b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/web.xml
@@ -203,7 +203,7 @@
     <!-- used by RestEasy to determine the JAX-RS resources and other related configuration -->
     <context-param>
         <param-name>javax.ws.rs.Application</param-name>
-        <param-value>org.apache.isis.viewer.restfulobjects.viewer.RestfulObjectsApplication</param-value>
+        <param-value>org.apache.isis.viewer.restfulobjects.server.RestfulObjectsApplication</param-value>
     </context-param>
     
     <context-param>
@@ -219,7 +219,7 @@
         <!-- authentication required for REST -->
         <init-param>
             <param-name>authenticationSessionStrategy</param-name>
-            <param-value>org.apache.isis.viewer.restfulobjects.viewer.authentication.AuthenticationSessionStrategyBasicAuth</param-value>
+            <param-value>org.apache.isis.viewer.restfulobjects.server.authentication.AuthenticationSessionStrategyBasicAuth</param-value>
         </init-param>
         <init-param>
             <!-- what to do if no session was found; we indicate to issue a 401 basic authentication challenge -->