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 2012/08/23 10:20:53 UTC

svn commit: r1376402 - in /incubator/isis/trunk/framework: core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ core/metamodel/src/test/java/org/apache/isi...

Author: danhaywood
Date: Thu Aug 23 08:20:52 2012
New Revision: 1376402

URL: http://svn.apache.org/viewvc?rev=1376402&view=rev
Log:
ISIS-248: move concurrency checking into the Persistor

- more precisely, the AdapterManagerDefault does the check
- ConcurrencyException reworked to generate a better error message, and moved to core.metamodel
- version field removed from PojoAdapter, version info now held within its Oid
- checking behaviour added to RootOid

Added:
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ConcurrencyException.java
    incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest_differs.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault_aggregateAdapters.java
      - copied, changed from r1376137, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java
Removed:
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/ConcurrencyException.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java
Modified:
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefault.java
    incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java
    incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/persistence/IsisLifecycleListener.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnection.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/test/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnectionTest.java
    incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapter.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapterFactory.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
    incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
    incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/field/TextField.java
    incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/view/message/ExceptionMessageContent.java
    incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/Context.java
    incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java Thu Aug 23 08:20:52 2012
@@ -71,5 +71,6 @@ public interface Oid extends Encodable {
             return code;
         }
     }
+
     
 }

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java Thu Aug 23 08:20:52 2012
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.adapter.oid;
 
+import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 
@@ -45,6 +46,11 @@ import org.apache.isis.core.metamodel.sp
 public interface RootOid extends TypedOid {
 
     String getIdentifier();
+    
+    void setVersion(Version version);
+
+    void checkLock(String currentUser, RootOid oid);
+
 
     /**
      * Returns a new RootOid for the same {@link #getObjectSpecId()}, but persistent and with the specified {@link #getIdentifier() identifier}.
@@ -87,4 +93,5 @@ public interface RootOid extends TypedOi
     
     Comparison compareAgainst(RootOid oid2);
 
+
 }

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefault.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefault.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefault.java Thu Aug 23 08:20:52 2012
@@ -31,13 +31,17 @@ import org.apache.isis.core.commons.enco
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.commons.matchers.IsisMatchers;
 import org.apache.isis.core.commons.url.UrlEncodingUtils;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.log4j.Logger;
 
 import com.google.common.base.Objects;
 
 public final class RootOidDefault implements Serializable, RootOid {
 
+    private final static Logger LOG = Logger.getLogger(RootOidDefault.class);
+
     private static final long serialVersionUID = 1L;
 
     private final ObjectSpecId objectSpecId;
@@ -45,7 +49,7 @@ public final class RootOidDefault implem
     private final State state;
     
     // not part of equality check
-    private final Version version;
+    private Version version;
 
     private int cachedHashCode;
 
@@ -202,7 +206,6 @@ public final class RootOidDefault implem
     // ////////////////////////////////////////////
     // asPersistent
     // ////////////////////////////////////////////
-
     
     @Override
     public RootOidDefault asPersistent(String identifier) {
@@ -213,11 +216,20 @@ public final class RootOidDefault implem
     }
 
 
+    // ////////////////////////////////////////////
+    // Version
+    // ////////////////////////////////////////////
+
 	public Version getVersion() {
 		return version;
 	}
 
     @Override
+    public void setVersion(Version version) {
+        this.version = version;
+    }
+
+    @Override
     public Comparison compareAgainst(RootOid other) {
         if(!equals(other)) {
             return Comparison.NOT_EQUIVALENT;
@@ -270,7 +282,18 @@ public final class RootOidDefault implem
         return enString(new OidMarshaller());
     }
 
-    
-
+    @Override
+    public void checkLock(String currentUser, RootOid otherOid) {
+        Version otherVersion = otherOid.getVersion();
+        if(version == null || otherVersion == null) {
+            return;
+        }
+        if (version.different(otherVersion)) {
+            LOG.info("concurrency conflict on " + this + " (" + otherVersion + ")");
+            throw new ConcurrencyException(currentUser, this, version, otherVersion);
+        }
+    }
 
+    
+    
 }

Added: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ConcurrencyException.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ConcurrencyException.java?rev=1376402&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ConcurrencyException.java (added)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/ConcurrencyException.java Thu Aug 23 08:20:52 2012
@@ -0,0 +1,66 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.version;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
+
+public class ConcurrencyException extends IsisException {
+    
+    private static final long serialVersionUID = 1L;
+
+    private static String buildMessage(String currentUser, Oid oid, Version staleVersion, Version datastoreVersion) {
+        
+        final StringBuilder buf = new StringBuilder();
+        buf.append(currentUser != null? currentUser + " " : "");
+        buf.append(" attempted to update ").append(oid.enStringNoVersion(getOidMarshaller()));
+        buf.append(", however this object has since been modified");
+        if(datastoreVersion.getUser() != null) {
+            buf.append(" by ").append(datastoreVersion.getUser());
+        }
+        if(datastoreVersion.getTime() != null) {
+            buf.append(" at ").append(datastoreVersion.getTime());
+        }
+        buf.append(" [").append(staleVersion.getSequence()).append(" vs ").append(datastoreVersion.getSequence()).append("]");
+        
+        return buf.toString();
+    }
+
+    private final Oid oid;
+
+    public ConcurrencyException(final String currentUser, final Oid oid, final Version staleVersion, final Version datastoreVersion) {
+        this(buildMessage(currentUser, oid, staleVersion, datastoreVersion), oid);
+    }
+
+    public ConcurrencyException(final String message, final Oid oid) {
+        super(message);
+        this.oid = oid;
+    }
+
+    public Oid getOid() {
+        return oid;
+    }
+    
+    private static OidMarshaller getOidMarshaller() {
+        return new OidMarshaller();
+    }
+
+}

Modified: incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java Thu Aug 23 08:20:52 2012
@@ -58,6 +58,11 @@ public class Version implements Serializ
     // factory methods
     // ///////////////////////////////////////////////////////
 
+
+    public static Version create(final Long sequence) {
+        return create(sequence, null, (Long)null);
+    }
+
     public static Version create(String sequence, String user, String utcTimestamp) {
         if(sequence == null) { 
             return null;
@@ -194,7 +199,7 @@ public class Version implements Serializ
      * version will normally cause a concurrency exception.
      */
     public boolean different(Version version) {
-        return !equals(this);
+        return !equals(version);
     }
     
     

Modified: incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java (original)
+++ incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java Thu Aug 23 08:20:52 2012
@@ -64,10 +64,9 @@ public class VersionTest {
     }
 
     @Test
-    public void different_and_sequence_and_equals() throws Exception {
+    public void sequence_and_toString() throws Exception {
         final Version testVersion = new Version(extended);
         
-        assertFalse(testVersion.different(version));
         assertTrue(testVersion.sequence().length() > 0);
         assertTrue(testVersion.getSequence() == 0);
         assertTrue(testVersion.toString().length() > 0);

Added: incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest_differs.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest_differs.java?rev=1376402&view=auto
==============================================================================
--- incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest_differs.java (added)
+++ incubator/isis/trunk/framework/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest_differs.java Thu Aug 23 08:20:52 2012
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.version;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+public class VersionTest_differs {
+    
+
+    private Version version1, version2;
+
+
+    @Test
+    public void whenEqual() throws Exception {
+        version1 = Version.create(123L);
+        version2 = Version.create(123L);
+        assertThat(version1.different(version2), is(false));
+    }
+
+    
+    @Test
+    public void whenNotEqual() throws Exception {
+        version1 = Version.create(123L);
+        version2 = Version.create(124L);
+        assertThat(version1.different(version2), is(true));
+    }
+
+}

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/persistence/IsisLifecycleListener.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/persistence/IsisLifecycleListener.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/persistence/IsisLifecycleListener.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/jdo/jdo-datanucleus/src/main/java/org/apache/isis/runtimes/dflt/objectstores/jdo/datanucleus/persistence/IsisLifecycleListener.java Thu Aug 23 08:20:52 2012
@@ -26,6 +26,7 @@ import org.apache.isis.core.metamodel.ad
 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.RootOid;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacet;
@@ -33,7 +34,6 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedCallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.PersistorUtil;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.OidGenerator;
@@ -118,7 +118,7 @@ public class IsisLifecycleListener imple
 
 	public void postLoadProcessingFor(final PersistenceCapable pojo) {
 
-		final Version pojoVersion = getVersionIfAny(pojo);
+		final Version datastoreVersion = getVersionIfAny(pojo);
         
         final RootOid oid ;
         ObjectAdapter adapter = getAdapterManager().getAdapterFor(pojo);
@@ -132,9 +132,9 @@ public class IsisLifecycleListener imple
             getPersistenceSession().remapRecreatedPojo(adapter, pojo);
 
             // since there was already an adapter, do concurrency check
-            if(previousVersion != null && pojoVersion != null) {
-            	if(previousVersion.different(pojoVersion)) {
-            	    getCurrentTransaction().addException(new ConcurrencyException(adapter, pojoVersion));
+            if(previousVersion != null && datastoreVersion != null) {
+            	if(previousVersion.different(datastoreVersion)) {
+            	    getCurrentTransaction().addException(new ConcurrencyException(getAuthenticationSession().getUserName(), oid, previousVersion, datastoreVersion));
             	}
             }
         } else {
@@ -154,7 +154,7 @@ public class IsisLifecycleListener imple
             PersistorUtil.startResolving(adapter);
             PersistorUtil.endResolving(adapter);
         }
-        adapter.setVersion(pojoVersion);
+        adapter.setVersion(datastoreVersion);
 
         ensureFrameworksInAgreement(pojo);
 	}

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnection.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnection.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnection.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnection.java Thu Aug 23 08:20:52 2012
@@ -29,9 +29,10 @@ import java.io.PrintWriter;
 
 import org.apache.log4j.Logger;
 
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlStoreException;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.file.server.Util;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectNotFoundException;
 
 public class ClientConnection {
@@ -92,10 +93,10 @@ public class ClientConnection {
             // TODO create better exceptions (requires way to restore
             // object/version)
             if (data.startsWith("{")) {
-                throw new ConcurrencyException(data, (Throwable) null);
+                throw new ConcurrencyException(data, null);
 
             } else {
-                throw new ConcurrencyException(data, (Throwable) null);
+                throw new ConcurrencyException(data, null);
 
             }
         } else if (!status.equals("ok")) {

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/main/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/FileServerDb.java Thu Aug 23 08:20:52 2012
@@ -29,12 +29,12 @@ import java.util.zip.CRC32;
 
 import org.apache.log4j.Logger;
 
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlCommandContext;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.NoSqlStoreException;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.NoSqlDataDatabase;
 import org.apache.isis.runtimes.dflt.objectstores.nosql.db.StateReader;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
 
 public class FileServerDb implements NoSqlDataDatabase {

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/test/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnectionTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/test/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnectionTest.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/test/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnectionTest.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/nosql/src/test/java/org/apache/isis/runtimes/dflt/objectstores/nosql/db/file/ClientConnectionTest.java Thu Aug 23 08:20:52 2012
@@ -31,8 +31,9 @@ import org.apache.log4j.Logger;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.IoUtils;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectNotFoundException;
 
 public class ClientConnectionTest {

Modified: incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/objectstores/sql/sql-impl/src/main/java/org/apache/isis/runtimes/dflt/objectstores/sql/auto/AutoMapper.java Thu Aug 23 08:20:52 2012
@@ -32,6 +32,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
 import org.apache.isis.core.metamodel.adapter.util.InvokeUtils;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.SerialNumberVersion;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacet;
@@ -51,7 +52,6 @@ import org.apache.isis.runtimes.dflt.obj
 import org.apache.isis.runtimes.dflt.objectstores.sql.TitleMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.VersionMapping;
 import org.apache.isis.runtimes.dflt.objectstores.sql.mapping.FieldMapping;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectNotFoundException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.PersistorUtil;
 import org.apache.isis.runtimes.dflt.runtime.persistence.query.PersistenceQueryFindByPattern;

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapter.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapter.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapter.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapter.java Thu Aug 23 08:20:52 2012
@@ -25,6 +25,7 @@ import static org.hamcrest.CoreMatchers.
 import org.apache.log4j.Logger;
 
 import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.commons.exceptions.IsisException;
@@ -35,6 +36,8 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.oid.AggregatedOid;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedOid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.spec.ElementSpecificationProvider;
@@ -42,8 +45,8 @@ import org.apache.isis.core.metamodel.sp
 import org.apache.isis.core.metamodel.spec.InstanceAbstract;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;
 
@@ -53,28 +56,31 @@ public class PojoAdapter extends Instanc
 
     private static final int INCOMPLETE_COLLECTION = -1;
 
-    private final SpecificationLoaderSpi specificationLoader;
+    private final SpecificationLoader specificationLoader;
     private final AdapterManager objectAdapterLookup;
     private final Localization localization;
     
     private Object pojo;
     private Oid oid;
-    private Version version;
     private ResolveState resolveState;
 
     private String defaultTitle;
 
     private ElementSpecificationProvider elementSpecificationProvider;
 
+    private AuthenticationSession authenticationSession;
+
 
     // ///////////////////////////////////////////////////////////////////
     // Constructor, finalizer
     // ///////////////////////////////////////////////////////////////////
 
-    public PojoAdapter(final Object pojo, final Oid oid, SpecificationLoaderSpi specificationLoader, AdapterManager objectAdapterLookup, Localization localization) {
+    public PojoAdapter(final Object pojo, final Oid oid, SpecificationLoader specificationLoader, AdapterManager adapterManager, Localization localization, AuthenticationSession authenticationSession) {
         this.specificationLoader = specificationLoader;
-        this.objectAdapterLookup = objectAdapterLookup;
+        this.objectAdapterLookup = adapterManager;
         this.localization = localization;
+        this.authenticationSession = authenticationSession;
+        
         if (pojo instanceof ObjectAdapter) {
             throw new IsisException("Adapter can't be used to adapt an adapter: " + pojo);
         }
@@ -314,23 +320,25 @@ public class PojoAdapter extends Instanc
         if(isParented()) {
             return getAggregateRoot().getVersion();
         } else {
-            return version;
+            return getOid().getVersion();
         }
     }
 
 
     @Override
-    public void checkLock(final Version version) {
+    public void checkLock(final Version otherVersion) {
         if(isParented()) {
-            getAggregateRoot().checkLock(version);
+            getAggregateRoot().checkLock(otherVersion);
             return;
         }
-        if (this.version != null && this.version.different(version)) {
-            LOG.info("concurrency conflict on " + this + " (" + version + ")");
-            throw new ConcurrencyException(this, version);
+        final Version version = getOid().getVersion();
+        if (version != null && version.different(otherVersion)) {
+            LOG.info("concurrency conflict on " + this + " (" + otherVersion + ")");
+            throw new ConcurrencyException(getAuthenticationSession().getUserName(), getOid(), version, otherVersion);
         }
     }
 
+
     @Override
     public void setVersion(final Version version) {
         if(isParented()) {
@@ -338,12 +346,14 @@ public class PojoAdapter extends Instanc
             return;
         }
         if (shouldSetVersion(version)) {
-            this.version = version;
+            RootOid rootOid = (RootOid) getOid(); // since not parented
+            rootOid.setVersion(version);
         }
     }
 
-    private boolean shouldSetVersion(final Version version) {
-        return this.version == null || version == null || version.different(this.version);
+    private boolean shouldSetVersion(final Version otherVersion) {
+        final Version version = getOid().getVersion();
+        return version == null || otherVersion == null || otherVersion.different(version);
     }
 
     // ///////////////////////////////////////////////////////////////////
@@ -459,7 +469,10 @@ public class PojoAdapter extends Instanc
         } else {
             str.append("specification", getSpecification().getShortIdentifier());
         }
-        str.append("version", version == null ? null : version.sequence());
+        if(getOid() != null) {
+            final Version version = getOid().getVersion();
+            str.append("version", version != null ? version.sequence() : null);
+        }
     }
 
     // ///////////////////////////////////////////////////////////////////
@@ -536,5 +549,8 @@ public class PojoAdapter extends Instanc
         return IsisContext.getPersistenceSession();
     }
 
+    protected AuthenticationSession getAuthenticationSession() {
+        return authenticationSession;
+    }
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapterFactory.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapterFactory.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapterFactory.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapter/PojoAdapterFactory.java Thu Aug 23 08:20:52 2012
@@ -20,6 +20,7 @@
 package org.apache.isis.runtimes.dflt.runtime.persistence.adapter;
 
 import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -29,8 +30,14 @@ import org.apache.isis.runtimes.dflt.run
 public class PojoAdapterFactory implements ObjectAdapterFactory {
 
     @Override
-    public PojoAdapter createAdapter(final Object pojo, final Oid oid, AdapterManager objectAdapterLookup) {
-        return new PojoAdapter(pojo, oid, getSpecificationLoader(), objectAdapterLookup, getLocalization());
+    public PojoAdapter createAdapter(final Object pojo, final Oid oid, AdapterManager adapterManager) {
+        return new PojoAdapter(pojo, oid, getSpecificationLoader(), adapterManager, getLocalization(), getAuthenticationSession());
+    }
+
+    
+    
+    protected AuthenticationSession getAuthenticationSession() {
+        return IsisContext.getAuthenticationSession();
     }
 
     protected SpecificationLoaderSpi getSpecificationLoader() {

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault.java Thu Aug 23 08:20:52 2012
@@ -29,6 +29,7 @@ import java.util.Iterator;
 
 import org.apache.log4j.Logger;
 
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.ensure.Ensure;
@@ -283,9 +284,17 @@ public class AdapterManagerDefault imple
         }
         
         final Object pojo = pojoRecreator.recreatePojo(typedOid);
-        return mapRecreatedPojo(typedOid, pojo);
+        ObjectAdapter adapter = mapRecreatedPojo(typedOid, pojo);
+        
+        Oid adapterOid = adapter.getOid();
+        if(adapterOid instanceof RootOid) {
+            final RootOid recreatedOid = (RootOid) adapterOid;
+            final RootOid originalOid = (RootOid) typedOid;
+            recreatedOid.checkLock(getAuthenticationSession().getUserName(), originalOid);
+        }
+        return adapter;
     }
-    
+
     
     @Override
     public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
@@ -751,5 +760,10 @@ public class AdapterManagerDefault imple
         return IsisContext.getPersistenceSession().getServicesInjector();
     }
 
+    protected AuthenticationSession getAuthenticationSession() {
+        return IsisContext.getAuthenticationSession();
+    }
+    
+
 
 }

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransaction.java Thu Aug 23 08:20:52 2012
@@ -33,6 +33,7 @@ import java.util.Set;
 
 import org.apache.isis.core.commons.components.TransactionScopedComponent;
 import org.apache.isis.core.commons.ensure.Ensure;
+import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
@@ -40,7 +41,6 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ObjectPersistenceException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
@@ -176,7 +176,7 @@ public class IsisTransaction implements 
     private final IsisTransactionManager transactionManager;
     private final MessageBroker messageBroker;
     private final UpdateNotifier updateNotifier;
-    private final List<ObjectPersistenceException> exceptions = Lists.newArrayList();
+    private final List<IsisException> exceptions = Lists.newArrayList();
 
     private State state;
 
@@ -286,11 +286,11 @@ public class IsisTransaction implements 
         Ensure.ensureThatArg(exceptions.isEmpty(), is(true), "exceptions list is not empty");
     }
 
-    public void addException(ObjectPersistenceException exception) {
+    public void addException(IsisException exception) {
         exceptions.add(exception);
     }
     
-    public List<ObjectPersistenceException> getExceptionsIfAny() {
+    public List<IsisException> getExceptionsIfAny() {
         return Collections.unmodifiableList(exceptions);
     }
 

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/main/java/org/apache/isis/runtimes/dflt/runtime/system/transaction/IsisTransactionManager.java Thu Aug 23 08:20:52 2012
@@ -32,6 +32,7 @@ import org.apache.log4j.Logger;
 
 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.runtimes.dflt.runtime.persistence.ObjectPersistenceException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.TransactionalResource;
@@ -289,7 +290,7 @@ public class IsisTransactionManager impl
             // once the contract/API for the objectstore is better tied down, hopefully can simplify this...
             //
             
-            List<ObjectPersistenceException> exceptions = this.getTransaction().getExceptionsIfAny();
+            List<IsisException> exceptions = this.getTransaction().getExceptionsIfAny();
             if(exceptions.isEmpty()) {
             
                 if (LOG.isDebugEnabled()) {
@@ -337,15 +338,15 @@ public class IsisTransactionManager impl
     }
 
 
-    private ObjectPersistenceException exceptionToThrowFrom(List<ObjectPersistenceException> exceptions) {
+    private IsisException exceptionToThrowFrom(List<IsisException> exceptions) {
         if(exceptions.size() == 1) {
             return exceptions.get(0);
         } 
         final StringBuilder buf = new StringBuilder();
-        for (ObjectPersistenceException ope : exceptions) {
+        for (IsisException ope : exceptions) {
             buf.append(ope.getMessage()).append("\n");
         }
-        return new ObjectPersistenceException(buf.toString());
+        return new IsisException(buf.toString());
     }
     
 

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adapterfactory/pojo/PojoAdapterTest.java Thu Aug 23 08:20:52 2012
@@ -31,16 +31,17 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 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.RootOidDefault;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.testsupport.jmock.JUnitRuleMockery2;
 import org.apache.isis.core.testsupport.jmock.JUnitRuleMockery2.Mode;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.runtimes.dflt.runtime.persistence.objectstore.transaction.PojoAdapterBuilder;
 
@@ -59,6 +60,8 @@ public class PojoAdapterTest {
     @Mock
     private SpecificationLoaderSpi mockSpecificationLoader;
     @Mock
+    private AuthenticationSession mockAuthenticationSession;
+    @Mock
     private AdapterManager mockObjectAdapterLookup;
     @Mock
     private Localization mockLocalization;
@@ -67,7 +70,7 @@ public class PojoAdapterTest {
     public void setUp() throws Exception {
         domainObject = new RuntimeTestPojo();
         
-        adapter = new PojoAdapter(domainObject, RootOidDefault.create(ObjectSpecId.of("CUS"), "1"), mockSpecificationLoader, mockObjectAdapterLookup, mockLocalization);
+        adapter = new PojoAdapter(domainObject, RootOidDefault.create(ObjectSpecId.of("CUS"), "1"), mockSpecificationLoader, mockObjectAdapterLookup, mockLocalization, mockAuthenticationSession);
         adapter.setVersion(mockVersion);
         
         allowUnimportantMethodCallsOn(mockVersion);
@@ -77,10 +80,16 @@ public class PojoAdapterTest {
     private void allowUnimportantMethodCallsOn(final Version version) {
         context.checking(new Expectations() {
             {
+                allowing(version).getSequence();
+                allowing(version).getUtcTimestamp();
                 allowing(version).sequence();
                 allowing(version).getUser();
+                
                 allowing(version).getTime();
                 will(returnValue(new Date()));
+                
+                allowing(mockAuthenticationSession).getUserName();
+                will(returnValue("fredbloggs"));
             }
         });
     }
@@ -127,7 +136,7 @@ public class PojoAdapterTest {
     @Test(expected=ConcurrencyException.class)
     public void checkLock_whenVersionsDifferent() throws Exception {
 
-        adapter = PojoAdapterBuilder.create().with(mockSpecificationLoader).withTitleString("some pojo").with(mockVersion).build();
+        adapter = PojoAdapterBuilder.create().with(mockSpecificationLoader).withTitleString("some pojo").with(mockVersion).with(mockAuthenticationSession).build();
         
         context.checking(new Expectations() {
             {

Copied: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault_aggregateAdapters.java (from r1376137, incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java)
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault_aggregateAdapters.java?p2=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault_aggregateAdapters.java&p1=incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java&r1=1376137&r2=1376402&rev=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/AdapterManagerDefault_aggregateAdapters.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/adaptermanager/AdapterManagerDefault_aggregateAdapters.java Thu Aug 23 08:20:52 2012
@@ -17,7 +17,7 @@
  *  under the License.
  */
 
-package org.apache.isis.runtimes.dflt.runtime.persistence;
+package org.apache.isis.runtimes.dflt.runtime.persistence.adaptermanager;
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.junit.Assert.assertEquals;
@@ -34,6 +34,7 @@ import org.junit.Test;
 import org.apache.isis.applib.annotation.Aggregated;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.adapter.ResolveState;
@@ -78,6 +79,7 @@ public class AdapterManagerDefault_aggre
         public Customer x() { return null; }
     }
 
+
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
@@ -87,30 +89,35 @@ public class AdapterManagerDefault_aggre
     @Mock
     private RuntimeContext mockRuntimeContext;
     
-    private AdapterManagerDefault adapterManager;
-    
-    private ObjectAdapter persistentParentAdapter;
-    private ObjectAdapter aggregatedAdapter;
-
-    private Name aggregatedObject;
-    private ObjectAdapterFactory adapterFactory;
-
-
-    private IsisMetaModel isisMetaModel;
-
     @Mock
     private OidGenerator mockOidGenerator;
 
-    private Customer rootObject;
-
     @Mock
     protected Localization mockLocalization;
     
+    @Mock
+    private AuthenticationSession mockAuthenticationSession;
+    
+    private IsisMetaModel isisMetaModel;
+    
+    private ObjectAdapterFactory adapterFactory;
+    
+    private AdapterManagerDefault adapterManager;
+    
+    private Customer rootObject;
+    private Name aggregatedObject;
+    
+    private ObjectAdapter persistentParentAdapter;
+    private ObjectAdapter aggregatedAdapter;
+
+    
+    
     @Before
     public void setUp() throws Exception {
         Logger.getRootLogger().setLevel(Level.OFF);
 
         context.ignoring(mockRuntimeContext);
+        context.ignoring(mockAuthenticationSession);
         
         isisMetaModel = IsisMetaModel.builder(mockRuntimeContext, new ProgrammingModelFacetsJava5()).withServices(new CustomerRepository()).build();
         isisMetaModel.init();
@@ -124,6 +131,11 @@ public class AdapterManagerDefault_aggre
             protected SpecificationLoaderSpi getSpecificationLoader() {
                 return isisMetaModel.getSpecificationLoader();
             }
+            
+            @Override
+            protected AuthenticationSession getAuthenticationSession() {
+                return mockAuthenticationSession;
+            }
         };
 
         adapterManager = new AdapterManagerDefault(new PojoRecreatorDefault()) {

Modified: incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java (original)
+++ incubator/isis/trunk/framework/runtimes/dflt/runtime/src/test/java/org/apache/isis/runtimes/dflt/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java Thu Aug 23 08:20:52 2012
@@ -24,6 +24,7 @@ import java.util.Iterator;
 import com.google.common.base.Splitter;
 
 import org.apache.isis.applib.profiles.Localization;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 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.AggregatedOid;
@@ -34,6 +35,7 @@ import org.apache.isis.core.metamodel.ad
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.runtimes.dflt.runtime.persistence.adapter.PojoAdapter;
 
@@ -47,8 +49,7 @@ public class PojoAdapterBuilder {
     // override; else will delegate to SpecificationLoader
     private ObjectSpecification objectSpec;
     
-    // substitute the SpecLoader
-    private SpecificationLoaderSpi specificationLoader;
+    private SpecificationLoader specificationLoader;
     
     private AdapterManager objectAdapterLookup;
     
@@ -66,6 +67,8 @@ public class PojoAdapterBuilder {
 
     private Localization localization;
 
+    private AuthenticationSession authenticationSession;
+
     
     public static enum Persistence {
         TRANSIENT {
@@ -200,11 +203,16 @@ public class PojoAdapterBuilder {
         return this;
     }
     
-    public PojoAdapterBuilder with(SpecificationLoaderSpi specificationLoader) {
+    public PojoAdapterBuilder with(SpecificationLoader specificationLoader) {
         this.specificationLoader = specificationLoader;
         return this;
     }
     
+    public PojoAdapterBuilder with(AuthenticationSession authenticationSession) {
+        this.authenticationSession = authenticationSession;
+        return this;
+    }
+    
     public PojoAdapterBuilder with(Localization localization) {
         this.localization = localization;
         return this;
@@ -223,7 +231,7 @@ public class PojoAdapterBuilder {
     public PojoAdapter build() {
         final RootOid rootOid = persistence.createOid(objectSpecId, identifier);
         final Oid oid = type.oidFor(rootOid, objectSpecId, aggregatedId);
-        final PojoAdapter pojoAdapter = new PojoAdapter(pojo, oid, specificationLoader, objectAdapterLookup, localization) {
+        final PojoAdapter pojoAdapter = new PojoAdapter(pojo, oid, specificationLoader, objectAdapterLookup, localization, authenticationSession) {
             @Override
             public ObjectSpecification getSpecification() { return objectSpec != null? objectSpec: super.getSpecification(); }
             @Override

Modified: incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/field/TextField.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/field/TextField.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/field/TextField.java (original)
+++ incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/field/TextField.java Thu Aug 23 08:20:52 2012
@@ -27,9 +27,9 @@ import org.apache.log4j.Logger;
 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.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.object.parseable.InvalidEntryException;
 import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.viewer.dnd.drawing.Canvas;
 import org.apache.isis.viewer.dnd.drawing.Color;
 import org.apache.isis.viewer.dnd.drawing.ColorsAndFonts;

Modified: incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/view/message/ExceptionMessageContent.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/view/message/ExceptionMessageContent.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/view/message/ExceptionMessageContent.java (original)
+++ incubator/isis/trunk/framework/viewer/dnd/src/main/java/org/apache/isis/viewer/dnd/view/message/ExceptionMessageContent.java Thu Aug 23 08:20:52 2012
@@ -24,10 +24,10 @@ import org.apache.isis.core.commons.exce
 import org.apache.isis.core.commons.lang.NameUtils;
 import org.apache.isis.core.commons.lang.ThrowableUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.Veto;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.viewer.dnd.drawing.Image;
 import org.apache.isis.viewer.dnd.view.Content;
 import org.apache.isis.viewer.dnd.view.UserActionSet;

Modified: incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/Context.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/Context.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/Context.java (original)
+++ incubator/isis/trunk/framework/viewer/html/src/main/java/org/apache/isis/viewer/html/context/Context.java Thu Aug 23 08:20:52 2012
@@ -36,10 +36,10 @@ import org.apache.isis.core.commons.ensu
 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.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.runtime.userprofile.UserProfile;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.AdapterManagerSpi;
 import org.apache.isis.runtimes.dflt.runtime.system.persistence.PersistenceSession;

Modified: incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java
URL: http://svn.apache.org/viewvc/incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java?rev=1376402&r1=1376401&r2=1376402&view=diff
==============================================================================
--- incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java (original)
+++ incubator/isis/trunk/framework/viewer/scimpi/scimpi-dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/action/ActionAction.java Thu Aug 23 08:20:52 2012
@@ -27,6 +27,8 @@ import org.apache.isis.core.commons.auth
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.Veto;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
@@ -34,7 +36,6 @@ import org.apache.isis.core.metamodel.fa
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.runtimes.dflt.runtime.persistence.ConcurrencyException;
 import org.apache.isis.runtimes.dflt.runtime.system.context.IsisContext;
 import org.apache.isis.runtimes.dflt.runtime.system.transaction.MessageBroker;
 import org.apache.isis.viewer.scimpi.dispatcher.Action;
@@ -122,7 +123,7 @@ public class ActionAction implements Act
                 }
                 context.setRequestPath(view);
                 if (message != null) {
-                    final MessageBroker messageBroker = IsisContext.getMessageBroker();
+                    final MessageBroker messageBroker = getMessageBroker();
                     messageBroker.addMessage(message);
                 }
                 if (override != null) {
@@ -148,17 +149,15 @@ public class ActionAction implements Act
                 final String view = context.getParameter("_" + ERROR);
                 context.setRequestPath(view, Dispatcher.ACTION);
 
-                final MessageBroker messageBroker = IsisContext.getMessageBroker();
+                final MessageBroker messageBroker = getMessageBroker();
                 messageBroker.addWarning(error);
             }
-
         } catch (final ConcurrencyException e) {
-            ObjectAdapter object = IsisContext.getPersistenceSession().getAdapterManager().getAdapterFor(e.getSource()); 
-            String exceptionMessage = e.getMessage();
-            String user = exceptionMessage.substring(0, exceptionMessage.indexOf(" "));
-            String errorMessage = "The data for '" + object.titleString() + "' was changed by " + user
+            final ObjectAdapter adapter = getAdapterManager().getAdapterFor(e.getOid()); 
+            String user = adapter.getOid().getVersion().getUser();
+            String errorMessage = "The data for '" + adapter.titleString() + "' was changed by " + user
                     + ". Please repeat the action based on those changes.";
-            IsisContext.getMessageBroker().addMessage(errorMessage);
+            getMessageBroker().addMessage(errorMessage);
 
             entryState.setForm(formId);
             context.addVariable(ENTRY_FIELDS, entryState, Scope.REQUEST);
@@ -175,8 +174,8 @@ public class ActionAction implements Act
             context.setRequestPath(view, Dispatcher.ACTION);
 
         } catch (final RuntimeException e) {
-            IsisContext.getMessageBroker().getMessages();
-            IsisContext.getMessageBroker().getWarnings();
+            getMessageBroker().getMessages();
+            getMessageBroker().getWarnings();
             IsisContext.getUpdateNotifier().clear();
             IsisContext.getUpdateNotifier().clear();
             throw e;
@@ -274,4 +273,19 @@ public class ActionAction implements Act
     @Override
     public void debug(final DebugBuilder debug) {
     }
+    
+
+    ///////////////////////////////////////////////////////////////////////////
+    // from context
+    ///////////////////////////////////////////////////////////////////////////
+    
+    protected MessageBroker getMessageBroker() {
+        return IsisContext.getMessageBroker();
+    }
+
+    protected AdapterManager getAdapterManager() {
+        return IsisContext.getPersistenceSession().getAdapterManager();
+    }
+
+
 }