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();
+ }
+
+
}