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 2014/01/26 16:02:04 UTC

git commit: ISIS-660: Factored out 'Transactional' for Interactions

Updated Branches:
  refs/heads/master e447e999a -> bd5357803


ISIS-660: Factored out 'Transactional' for Interactions

As a means of distinguishing implementations that are persistent (eg InteractionJdo) vs
those that are not (eg InteractionDefault).

In addition:
- Clock.getTimeAsJavaSqlTimestamp()
- use for setting times on Interaction objects.


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

Branch: refs/heads/master
Commit: bd5357803ef636e7865c718303a95adf34fd5ef9
Parents: e447e99
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Sun Jan 26 14:55:17 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Sun Jan 26 14:55:17 2014 +0000

----------------------------------------------------------------------
 .../service/interaction/InteractionJdo.java     | 35 ++++++++++++----
 .../interaction/InteractionRepository.java      |  3 +-
 .../interaction/InteractionServiceJdo.java      | 31 ++++++++++----
 .../applib/service/publish/PublishedEvent.java  |  5 ++-
 .../org/apache/isis/applib/clock/Clock.java     |  6 +++
 .../isis/applib/services/Transactional.java     | 43 ++++++++++++++++++++
 .../services/interaction/Interaction.java       | 19 ---------
 .../interaction/InteractionDefault.java         | 12 ------
 .../interaction/spi/InteractionFactory.java     |  7 +++-
 .../applib/services/publish/EventMetadata.java  |  8 +++-
 .../system/persistence/PersistenceSession.java  | 38 +++++++++++------
 .../transaction/IsisTransactionManager.java     |  4 +-
 ...reTransactionManager_EndTransactionTest.java | 11 ++++-
 .../java/webapp/prototyping/Interactions.java   |  3 +-
 14 files changed, 158 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionJdo.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionJdo.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionJdo.java
index fb09d78..0b1eb7a 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionJdo.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionJdo.java
@@ -19,6 +19,7 @@ package org.apache.isis.objectstore.jdo.applib.service.interaction;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.sql.Timestamp;
+import java.util.UUID;
 
 import javax.inject.Inject;
 import javax.jdo.annotations.IdentityType;
@@ -40,6 +41,7 @@ import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.applib.annotation.TypicalLength;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
+import org.apache.isis.applib.services.Transactional;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkHolder;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -74,7 +76,7 @@ import org.apache.isis.applib.util.ObjectContracts;
         left={"Target","Notes"}, 
         right={"Identifiers","Timings"})
 @Named("Interaction")
-public class InteractionJdo implements Interaction {
+public class InteractionJdo implements Interaction, Transactional {
 
     @SuppressWarnings("unused")
     private static final Logger LOG = LoggerFactory.getLogger(InteractionJdo.class);
@@ -310,25 +312,44 @@ public class InteractionJdo implements Interaction {
     // transactionId (property)
     // //////////////////////////////////////
 
-    private String guid;
+    
+    // //////////////////////////////////////
+    
+    private String transactionId;
 
+    /**
+     * The unique identifier (a GUID) of the transaction in which this interaction occurred.
+     * 
+     * <p>
+     * Note that this is the same as the Isis transaction guid as found in the JDO applib's
+     * <tt>PublishedEvent</tt>.
+     */
     @javax.jdo.annotations.PrimaryKey
     @javax.jdo.annotations.Column(allowsNull="false", length=36)
     @TypicalLength(36)
     @MemberOrder(name="Identifiers",sequence = "20")
-    public String getGuid() {
-        return guid;
+    @Disabled
+    @Override
+    public String getTransactionId() {
+        return transactionId;
     }
 
-    public void setGuid(final String guid) {
-        this.guid = guid;
+    /**
+     * <b>NOT API</b>: intended to be called only by the framework.
+     * 
+     * <p>
+     * Implementation notes: copied over from the Isis transaction when the interaction is persisted.
+     */
+    @Override
+    public void setTransactionId(final String transactionId) {
+        this.transactionId = transactionId;
     }
 
     // //////////////////////////////////////
 
     @Override
     public String toString() {
-        return ObjectContracts.toString(this, "startedAt,user,actionIdentifier,target,completedAt,duration,guid");
+        return ObjectContracts.toString(this, "startedAt,user,actionIdentifier,target,completedAt,duration,transactionId");
     }
 
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionRepository.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionRepository.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionRepository.java
index 8eb25f0..b998701 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionRepository.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionRepository.java
@@ -17,6 +17,7 @@
 package org.apache.isis.objectstore.jdo.applib.service.interaction;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
@@ -25,7 +26,7 @@ import org.apache.isis.applib.annotation.ActionSemantics.Of;
 public interface InteractionRepository {
 
     @ActionSemantics(Of.SAFE)
-    InteractionJdo findByGuid(final String guid);
+    InteractionJdo findByGuid(final UUID guid);
     
     @ActionSemantics(Of.SAFE)
     List<InteractionJdo> currentInteractions();

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionServiceJdo.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionServiceJdo.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionServiceJdo.java
index a7a93e0..1a47743 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionServiceJdo.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/interaction/InteractionServiceJdo.java
@@ -17,6 +17,7 @@
 package org.apache.isis.objectstore.jdo.applib.service.interaction;
 
 import java.util.List;
+import java.util.UUID;
 
 import javax.inject.Inject;
 
@@ -41,32 +42,44 @@ public class InteractionServiceJdo extends AbstractService implements Interactio
 
     @Programmatic
     @Override
-    public Interaction start() {
-        return newTransientInstance(InteractionJdo.class);
+    public Interaction create() {
+        InteractionJdo interaction = newTransientInstance(InteractionJdo.class);
+        return interaction;
     }
 
     @Programmatic
     @Override
-    public void complete(Interaction interaction) {
+    public void startTransaction(Interaction interaction, UUID transactionId) {
+        if(interaction instanceof InteractionJdo) {
+            // should be the case, since this service created the object in the #create() method
+            final InteractionJdo interactionJdo = (InteractionJdo) interaction;
+            interactionJdo.setTransactionId(transactionId.toString());
+        }
+    }
+
+    @Programmatic
+    @Override
+    public void complete(final Interaction interaction) {
         if(interaction.getActionIdentifier() == null) {
             // discard, no action occurred
             return;
         }
         if(interaction instanceof InteractionJdo) {
-            // should be the case, since this service created the object in the #start() method
-            InteractionJdo interactionJdo = (InteractionJdo) interaction;
-            interactionJdo.setCompletedAt(new java.sql.Timestamp(new java.util.Date().getTime()));
+            // should be the case, since this service created the object in the #create() method
+            final InteractionJdo interactionJdo = (InteractionJdo) interaction;
+            
+            interactionJdo.setCompletedAt(Clock.getTimeAsJavaSqlTimestamp());
             persistIfNotAlready(interaction);
         }
     }
 
     @Override
-    public InteractionJdo findByGuid(String guid) {
+    public InteractionJdo findByGuid(UUID guid) {
         persistCurrentInteractionIfRequired();
         return firstMatch(
                 new QueryDefault<InteractionJdo>(InteractionJdo.class, 
                         "findByGuid", 
-                        "guid", guid));
+                        "guid", guid.toString()));
     }
 
     private void persistCurrentInteractionIfRequired() {
@@ -100,5 +113,5 @@ public class InteractionServiceJdo extends AbstractService implements Interactio
     
     @Inject
     private InteractionContext interactionContext;
-    
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishedEvent.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishedEvent.java b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishedEvent.java
index cb782d0..afc2be0 100644
--- a/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishedEvent.java
+++ b/component/objectstore/jdo/jdo-applib/src/main/java/org/apache/isis/objectstore/jdo/applib/service/publish/PublishedEvent.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.annotation.NotPersisted;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.Transactional;
 import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.applib.services.publish.EventType;
 
@@ -46,7 +47,7 @@ import org.apache.isis.applib.services.publish.EventType;
             value="SELECT FROM org.apache.isis.objectstore.jdo.applib.service.publish.PublishedEvent WHERE state == :state ORDER BY timestamp")
 })
 @Immutable
-public class PublishedEvent {
+public class PublishedEvent implements Transactional {
 
     public static enum State {
         QUEUED, PROCESSED
@@ -114,10 +115,12 @@ public class PublishedEvent {
      */
     @javax.jdo.annotations.Column(length=36)
     @Programmatic
+    @Override
     public String getTransactionId() {
         return transactionId;
     }
 
+    @Override
     public void setTransactionId(final String transactionId) {
         this.transactionId = transactionId;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/clock/Clock.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/clock/Clock.java b/core/applib/src/main/java/org/apache/isis/applib/clock/Clock.java
index 0cb67aa..3ceca74 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/clock/Clock.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/clock/Clock.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.applib.clock;
 
+import java.sql.Timestamp;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.TimeZone;
@@ -132,6 +133,10 @@ public abstract class Clock {
         }
     }
 
+    public static Timestamp getTimeAsJavaSqlTimestamp() {
+        return new java.sql.Timestamp(getTimeAsDateTime().getMillis());
+    }
+
     /**
      * Allows subclasses to remove their implementation.
      * 
@@ -166,6 +171,7 @@ public abstract class Clock {
      */
     protected abstract long time();
 
+
 }
 
 final class SystemClock extends Clock {

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/services/Transactional.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/Transactional.java b/core/applib/src/main/java/org/apache/isis/applib/services/Transactional.java
new file mode 100644
index 0000000..c760c2c
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/Transactional.java
@@ -0,0 +1,43 @@
+/**
+ *  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.applib.services;
+
+
+/**
+ * Mix-in interface for objects (usually created by service implementations) that are be persistable, 
+ * and so can be associated with the the GUID of the Isis transaction in which they were
+ * created.
+ * 
+ * <p>
+ * Other services can then use this transaction Id as a &quot;foreign key&quot; to store other
+ * persistent information.  They may then use contributed actions/collections to render such aggregated
+ * information back to the user.
+ */
+public interface Transactional {
+
+    /**
+     * The unique identifier (a GUID) of the transaction in which this interaction occurred.
+     * 
+     * <p>
+     * Note that this is the same as the Isis transaction guid as found in the JDO applib's
+     * <tt>PublishedEvent</tt>.
+     */
+    public String getTransactionId();
+
+    public void setTransactionId(final String transactionId);
+
+}    

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/services/interaction/Interaction.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/Interaction.java b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/Interaction.java
index 381d6ce..0aae248 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/Interaction.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/Interaction.java
@@ -57,25 +57,6 @@ public interface Interaction {
      */
     public abstract void setStartedAt(Timestamp startedAt);
     
-    // //////////////////////////////////////
-    
-    /**
-     * The unique identifier (a GUID) for this interaction occurred.
-     * 
-     * <p>
-     * Note that this is <i>not</i> the same as the Isis transaction guid, as found in the JDO applib's
-     * <tt>PublishedEvent</tt>.  In general there could be several transactions within a single interaction.
-     */
-    @Disabled
-    public abstract String getGuid();
-
-    /**
-     * <b>NOT API</b>: intended to be called only by the framework.
-     * 
-     * <p>
-     * Implementation notes: set when the Isis transaction is started.
-     */
-    public abstract void setGuid(String guid);
     
     // //////////////////////////////////////
     

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/services/interaction/InteractionDefault.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/InteractionDefault.java b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/InteractionDefault.java
index d95c2bf..abaca4f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/InteractionDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/InteractionDefault.java
@@ -119,18 +119,6 @@ public class InteractionDefault implements Interaction {
         this.user = user;
     }
 
-    // //////////////////////////////////////
-
-    private String guid;
-    public String getGuid() {
-        return guid;
-    }
-
-    @Override
-    public void setGuid(String guid) {
-        this.guid = guid;
-    }
-
 
     // //////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/services/interaction/spi/InteractionFactory.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/spi/InteractionFactory.java b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/spi/InteractionFactory.java
index e9b17bc..e8a4458 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/interaction/spi/InteractionFactory.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/interaction/spi/InteractionFactory.java
@@ -16,6 +16,8 @@
  */
 package org.apache.isis.applib.services.interaction.spi;
 
+import java.util.UUID;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.interaction.Interaction;
 
@@ -32,7 +34,10 @@ import org.apache.isis.applib.services.interaction.Interaction;
 public interface InteractionFactory {
 
     @Programmatic
-    Interaction start();
+    Interaction create();
+    
+    @Programmatic
+    void startTransaction(Interaction interaction, UUID transactionId);
     
     @Programmatic
     void complete(final Interaction interaction);

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventMetadata.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventMetadata.java b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventMetadata.java
index cf10cb1..88b40c7 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventMetadata.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/publish/EventMetadata.java
@@ -38,7 +38,13 @@ public class EventMetadata {
     private final String title;
     private final EventType eventType;
     
-    public EventMetadata(UUID transactionId, int sequence, EventType eventType, String user, long timestamp, String title) {
+    public EventMetadata(
+            final UUID transactionId, 
+            final int sequence, 
+            final EventType eventType, 
+            final String user, 
+            final long timestamp, 
+            final String title) {
         this.transactionId = transactionId;
         this.sequence = sequence;
         this.user = user;

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index d21de9b..b67539e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -241,7 +241,7 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
         
         startRequestOnRequestScopedServices(registeredServices);
 
-        startInteractionIfConfigured();
+        createInteractionIfConfigured();
         
         createServiceAdapters(registeredServices);
         
@@ -300,34 +300,47 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
         }
     }
 
-    private void startInteractionIfConfigured() {
+    private void createInteractionIfConfigured() {
         final InteractionContext ic = getServiceOrNull(InteractionContext.class);
         if(ic == null) {
             return;
         } 
         final InteractionFactory interactionFactory = getServiceOrNull(InteractionFactory.class);
-        final Interaction interaction = interactionFactory != null ? interactionFactory.start() : new InteractionDefault();
+        final Interaction interaction = interactionFactory != null ? interactionFactory.create() : new InteractionDefault();
         ic.setInteraction(interaction);
 
-        if(interaction.getGuid() == null) {
-            interaction.setGuid(UUID.randomUUID().toString());
-        }
         if(interaction.getStartedAt() == null) {
-            //interaction.setStartedAt(Clock.getTimeAsDateTime());
-            interaction.setStartedAt(new java.sql.Timestamp(new java.util.Date().getTime()));
+            interaction.setStartedAt(Clock.getTimeAsJavaSqlTimestamp());
         }
         if(interaction.getUser() == null) {
             interaction.setUser(getAuthenticationSession().getUserName());
         }
         
-        // the remaining 3 properties are set further down the call-stack, if an action is actually performed
+        // the remaining properties are set further down the call-stack, if an action is actually performed
         // interaction.getActionIdentifier()
-        // interaction.getDescription()
-        // interaction.getArguments()
+        // interaction.getTargetClass()
+        // interaction.getTargetAction()
         // interaction.getTarget()
+        // interaction.getArguments()
     }
 
 
+    /**
+     * Called by IsisTransactionManager on start
+     */
+    public void startInteractionIfConfigured(final UUID transactionId) {
+        final InteractionContext interactionContext = getServiceOrNull(InteractionContext.class);
+        if(interactionContext == null) {
+            return;
+        } 
+        final InteractionFactory interactionFactory = getServiceOrNull(InteractionFactory.class);
+        if(interactionFactory == null) {
+            return;
+        } 
+        final Interaction interaction = interactionContext.getInteraction();
+        interactionFactory.startTransaction(interaction, transactionId);
+    }
+
 
     /**
      * @return - the service, or <tt>null</tt> if no service registered of specified type.
@@ -406,11 +419,12 @@ public class PersistenceSession implements Persistor, EnlistedObjectDirtying, To
             final InteractionFactory interactionFactory = getServiceOrNull(InteractionFactory.class);
             if(interactionFactory != null) {
                 final Interaction interaction = interactionContext.getInteraction();
+                UUID guid = getTransactionManager().getTransaction().getGuid();
                 interactionFactory.complete(interaction);
             }
         }
     }
-
+    
     private void endRequestOnRequestScopeServices() {
         for (final Object service : servicesInjector.getRegisteredServices()) {
             if(service instanceof RequestScopedService) {

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/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 7fe4684..55a60d1 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
@@ -277,10 +277,12 @@ public class IsisTransactionManager implements SessionScopedComponent {
         if (getTransaction() == null || getTransaction().getState().isComplete()) {
             noneInProgress = true;
 
-            createTransaction();
+            IsisTransaction isisTransaction = createTransaction();
             transactionLevel = 0;
 
             transactionalResource.startTransaction();
+            
+            persistenceSession.startInteractionIfConfigured(isisTransaction.getGuid());
         }
 
         transactionLevel++;

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
index 737e0a2..f1dba71 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
@@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import java.util.Collections;
+import java.util.UUID;
 
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
@@ -96,7 +97,7 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
     @Test
     public void endTransactionDecrementsTransactionLevel() throws Exception {
         // setup
-        context.ignoring(mockObjectStore);
+        context.ignoring(mockObjectStore, mockPersistenceSession);
         transactionManager.startTransaction();
         transactionManager.startTransaction();
 
@@ -109,11 +110,17 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
     public void endTransactionCommitsTransactionWhenLevelDecrementsDownToZero() throws Exception {
         // setup
         context.ignoring(mockObjectStore);
+        context.checking(new Expectations() {
+            {
+                oneOf(mockPersistenceSession).startInteractionIfConfigured(with(any(UUID.class)));
+            }
+        });
         transactionManager.startTransaction();
 
+        
         context.checking(new Expectations() {
             {
-                one(mockPersistenceSession).objectChangedAllDirty();
+                oneOf(mockPersistenceSession).objectChangedAllDirty();
             }
         });
         assertThat(transactionManager.getTransactionLevel(), is(1));

http://git-wip-us.apache.org/repos/asf/isis/blob/bd535780/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/Interactions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/Interactions.java b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/Interactions.java
index 072172c..522d8b3 100644
--- a/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/Interactions.java
+++ b/example/application/quickstart_wicket_restful_jdo/webapp/src/main/java/webapp/prototyping/Interactions.java
@@ -17,6 +17,7 @@
 package webapp.prototyping;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Prototype;
@@ -46,7 +47,7 @@ public class Interactions extends InteractionServiceJdo {
     @MemberOrder(name="Prototyping", sequence="94.3")
     @Prototype
     @Override
-    public InteractionJdo findByGuid(String guid) {
+    public InteractionJdo findByGuid(UUID guid) {
         return super.findByGuid(guid);
     }