You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/04 08:27:28 UTC
[isis] 07/07: ISIS-1976: moving responsibilities from
PersistenceSession to ObjectAdapterProvider
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 074cecf4cc708006a9f83235415729bf01b3273f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:42:54 2018 +0200
ISIS-1976: moving responsibilities from PersistenceSession to
ObjectAdapterProvider
introduces ObjectAdapterProvider.Delegating
removes AdapterManager
ports changes from DN5-plugin to DN-4 plugin
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../isis/core/metamodel/adapter/ObjectAdapter.java | 3 +-
.../metamodel/adapter/ObjectAdapterProvider.java | 44 ++
.../adapter/concurrency/ConcurrencyChecking.java | 104 ++++
.../core/metamodel/adapter/mgr/AdapterManager.java | 164 ------
.../PersistenceSessionServiceInternal.java | 37 +-
.../services/jdosupport/IsisJdoSupportDN4.java | 2 +-
.../system/persistence/IsisLifecycleListener.java | 5 +-
.../system/persistence/PersistenceSession4.java | 569 ++-------------------
.../persistence/PersistenceSession4_Decouple.java | 213 ++++++++
.../queries/PersistenceQueryProcessorAbstract.java | 3 +-
.../WrapperFactoryDefaultTest_wrappedObject.java | 8 +-
...FactoryDefaultTest_wrappedObject_transient.java | 8 +-
.../services/jdosupport/IsisJdoSupportDN5.java | 2 +-
.../system/persistence/PersistenceSession5.java | 247 +--------
.../persistence/PersistenceSession5_Decouple.java | 213 ++++++++
.../runtime/persistence/adapter/PojoAdapter.java | 4 +-
.../changes/ChangedObjectsServiceInternal.java | 4 +-
.../system/persistence/PersistenceSession.java | 61 +--
.../system/persistence/PersistenceSessionBase.java | 8 -
.../adaptermanager/ObjectAdapterContext.java | 10 +-
...ObjectAdapterContext_ObjectAdapterProvider.java | 21 +-
.../adaptermanager/RootAndCollectionAdapters.java | 3 +-
.../system/ObjectActionLayoutXmlDefaultTest.java | 15 +-
.../wicket/ConverterForObjectAdapterMemento.java | 2 +-
.../integration/wicket/WebRequestCycleForIsis.java | 6 +-
.../wicket/model/mementos/ActionMemento.java | 2 +-
.../model/mementos/ObjectAdapterMemento.java | 5 +-
.../viewer/wicket/model/models/ActionModel.java | 2 +-
.../wicket/model/models/EntityCollectionModel.java | 2 +-
.../viewer/wicket/model/models/EntityModel.java | 2 +-
.../viewer/wicket/model/models/ScalarModel.java | 2 +-
.../model/models/ScalarModelWithPending.java | 2 +-
.../viewer/wicket/model/models/ValueModel.java | 2 +-
.../actionresponse/ActionResultResponseType.java | 4 +-
.../entityactions/EntityActionLinkFactory.java | 2 +-
.../actionmenu/entityactions/LinkAndLabelUtil.java | 4 +-
.../actionmenu/serviceactions/CssMenuItem.java | 4 +-
.../serviceactions/ServiceActionLinkFactory.java | 2 +-
.../collection/AssociatedWithActionsHelper.java | 4 +-
.../ui/components/collection/CollectionPanel.java | 4 +-
.../collection/bulk/BulkActionsLinkFactory.java | 2 +-
.../CollectionContentsAsAjaxTablePanel.java | 2 +-
.../columns/ObjectAdapterToggleboxColumn.java | 2 +-
.../entity/EntityComponentFactoryAbstract.java | 2 +-
.../components/entity/fieldset/PropertyGroup.java | 6 +-
.../entity/icontitle/EntityIconAndTitlePanel.java | 2 +-
.../property/PropertyFormExecutorStrategy.java | 4 +-
.../PropertyEditPromptHeaderPanel.java | 4 +-
.../ui/components/scalars/ScalarPanelAbstract.java | 2 +-
.../components/scalars/ScalarPanelAbstract2.java | 4 +-
.../scalars/ScalarPanelSelect2Abstract.java | 4 +-
.../scalars/reference/ReferencePanel.java | 2 +-
.../widgets/breadcrumbs/BreadcrumbPanel.java | 4 +-
.../entitysimplelink/EntityLinkSimplePanel.java | 4 +-
.../linkandlabel/ActionLinkFactoryAbstract.java | 8 +-
.../ObjectAdapterMementoProviderAbstract.java | 2 +-
.../isis/viewer/wicket/ui/panels/FormAbstract.java | 2 +-
.../wicket/ui/panels/FormExecutorDefault.java | 4 +-
58 files changed, 770 insertions(+), 1089 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index ddc4dfb..a17fac2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -30,7 +30,6 @@ import org.apache.isis.core.commons.lang.ClassExtensions;
import org.apache.isis.core.commons.lang.ListExtensions;
import org.apache.isis.core.commons.lang.MethodExtensions;
import org.apache.isis.core.commons.lang.MethodUtil;
-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.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -162,7 +161,7 @@ public interface ObjectAdapter extends Instance {
* <p>
* This id allows the object to added to, stored by,
* and retrieved from the object store. Objects can be looked up by their
- * {@link Oid} from the {@link AdapterManager}.
+ * {@link Oid}.
*
* <p>
* Note that standalone value objects ("foobar", or 5, or a date),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
index cb87353..92776da 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
@@ -18,8 +18,10 @@
*/
package org.apache.isis.core.metamodel.adapter;
+import java.util.List;
import java.util.function.Function;
+import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -31,6 +33,8 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
*
*/
public interface ObjectAdapterProvider {
+
+ // -- INTERFACE
/**
* @return standalone (value) or root adapter
@@ -52,7 +56,47 @@ public interface ObjectAdapterProvider {
final Function<ObjectSpecId, RootOid> rootOidFactory);
+ List<ObjectAdapter> getServices();
+
+
+ // -- FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
+ public static interface Delegating extends ObjectAdapterProvider {
+
+ @Programmatic
+ ObjectAdapterProvider getObjectAdapterProvider();
+
+ @Programmatic
+ default ObjectAdapter adapterFor(Object domainObject) {
+ return getObjectAdapterProvider().adapterFor(domainObject);
+ }
+
+ @Programmatic
+ default ObjectAdapter adapterFor(
+ final Object pojo,
+ final ObjectAdapter parentAdapter,
+ OneToManyAssociation collection) {
+ return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
+ }
+
+ @Programmatic
+ default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
+ return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
+ }
+
+ @Programmatic
+ default ObjectAdapter adapterForViewModel(
+ final Object viewModelPojo,
+ final Function<ObjectSpecId, RootOid> rootOidFactory) {
+ return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
+ }
+
+ @Programmatic
+ default List<ObjectAdapter> getServices() {
+ return getObjectAdapterProvider().getServices();
+ }
+
+ }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java
new file mode 100644
index 0000000..355b4be
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/concurrency/ConcurrencyChecking.java
@@ -0,0 +1,104 @@
+package org.apache.isis.core.metamodel.adapter.concurrency;
+
+import java.util.concurrent.Callable;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.commons.config.IsisConfiguration;
+
+public enum ConcurrencyChecking {
+ NO_CHECK,
+ CHECK;
+
+ public static boolean isGloballyDisabled(IsisConfiguration configuration) {
+ final boolean concurrencyCheckingGloballyDisabled =
+ configuration.getBoolean("isis.persistor.disableConcurrencyChecking", false);
+ return concurrencyCheckingGloballyDisabled;
+ }
+
+
+ @Programmatic
+ public boolean isChecking() {
+ return this == CHECK;
+ }
+
+ public static ConcurrencyChecking concurrencyCheckingFor(SemanticsOf actionSemantics) {
+ return actionSemantics.isSafeInNature()
+ ? ConcurrencyChecking.NO_CHECK
+ : ConcurrencyChecking.CHECK;
+ }
+
+ /**
+ * Provides a mechanism to temporarily disable concurrency checking.
+ *
+ * <p>
+ * A {@link ThreadLocal} is used because typically there is JDO/DataNucleus code between the Isis code
+ * that wishes to disable the concurrency checking and the code (an Isis callback) that needs to
+ * check if checking has been disabled.
+ */
+ private static ThreadLocal<ConcurrencyChecking> concurrencyChecking = new ThreadLocal<ConcurrencyChecking>(){
+ @Override
+ protected ConcurrencyChecking initialValue() {
+ return CHECK;
+ };
+ };
+
+ /**
+ * Whether concurrency checking is currently enabled or disabled.
+ */
+ public static boolean isCurrentlyEnabled() {
+ return concurrencyChecking.get().isChecking();
+ }
+
+ /**
+ * Allows a caller to temporarily disable concurrency checking for the current thread.
+ */
+ public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) {
+ ConcurrencyChecking prior = null;
+ try {
+ prior = disable();
+ return callable.call();
+ } catch(Exception ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ reset(prior);
+ }
+ }
+
+ /**
+ * Recommended instead to call {@link #executeWithConcurrencyCheckingDisabled(Runnable)} or {@link #executeWithConcurrencyCheckingDisabled(Callable)}.
+ *
+ * <p>
+ * If this method is used, then make sure to call {@link #reset(ConcurrencyChecking)} afterwards, using the value returned by this method.
+ * </p>
+ *
+ * @return the value of the {@link ConcurrencyChecking} thread-local prior to disabling it (to allow for nested calls).
+ */
+ public static ConcurrencyChecking disable() {
+ final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
+ ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
+ return prior;
+ }
+
+ public static void reset(ConcurrencyChecking prior) {
+ if(prior == null) {
+ return;
+ }
+ ConcurrencyChecking.concurrencyChecking.set(prior);
+ }
+
+ /**
+ * Allows a caller to temporarily disable concurrency checking for the current thread.
+ */
+ public static void executeWithConcurrencyCheckingDisabled(final Runnable runnable) {
+ final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
+ try {
+ disable();
+ runnable.run();
+ } finally {
+ ConcurrencyChecking.concurrencyChecking.set(prior);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
deleted file mode 100644
index 70ad13e..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * 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.mgr;
-
-import java.util.concurrent.Callable;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.annotation.SemanticsOf;
-
-public interface AdapterManager /*extends ObjectAdapterProvider*/ {
-
-
- enum ConcurrencyChecking {
- NO_CHECK,
- CHECK;
-
- @Programmatic
- public boolean isChecking() {
- return this == CHECK;
- }
-
- public static ConcurrencyChecking concurrencyCheckingFor(SemanticsOf actionSemantics) {
- return actionSemantics.isSafeInNature()
- ? ConcurrencyChecking.NO_CHECK
- : ConcurrencyChecking.CHECK;
- }
-
- /**
- * Provides a mechanism to temporarily disable concurrency checking.
- *
- * <p>
- * A {@link ThreadLocal} is used because typically there is JDO/DataNucleus code between the Isis code
- * that wishes to disable the concurrency checking and the code (an Isis callback) that needs to
- * check if checking has been disabled.
- */
- private static ThreadLocal<ConcurrencyChecking> concurrencyChecking = new ThreadLocal<ConcurrencyChecking>(){
- @Override
- protected ConcurrencyChecking initialValue() {
- return CHECK;
- };
- };
-
- /**
- * Whether concurrency checking is currently enabled or disabled.
- */
- public static boolean isCurrentlyEnabled() {
- return concurrencyChecking.get().isChecking();
- }
-
- /**
- * Allows a caller to temporarily disable concurrency checking for the current thread.
- */
- public static <T> T executeWithConcurrencyCheckingDisabled(final Callable<T> callable) {
- ConcurrencyChecking prior = null;
- try {
- prior = disable();
- return callable.call();
- } catch(Exception ex) {
- throw new RuntimeException(ex);
- } finally {
- reset(prior);
- }
- }
-
- /**
- * Recommended instead to call {@link #executeWithConcurrencyCheckingDisabled(Runnable)} or {@link #executeWithConcurrencyCheckingDisabled(Callable)}.
- *
- * <p>
- * If this method is used, then make sure to call {@link #reset(ConcurrencyChecking)} afterwards, using the value returned by this method.
- * </p>
- *
- * @return the value of the {@link ConcurrencyChecking} thread-local prior to disabling it (to allow for nested calls).
- */
- public static ConcurrencyChecking disable() {
- final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
- ConcurrencyChecking.concurrencyChecking.set(ConcurrencyChecking.NO_CHECK);
- return prior;
- }
-
- public static void reset(ConcurrencyChecking prior) {
- if(prior == null) {
- return;
- }
- ConcurrencyChecking.concurrencyChecking.set(prior);
- }
-
- /**
- * Allows a caller to temporarily disable concurrency checking for the current thread.
- */
- public static void executeWithConcurrencyCheckingDisabled(final Runnable runnable) {
- final ConcurrencyChecking prior = ConcurrencyChecking.concurrencyChecking.get();
- try {
- disable();
- runnable.run();
- } finally {
- ConcurrencyChecking.concurrencyChecking.set(prior);
- }
- }
-
-
- }
-
- // -- DEPRECATIONS
-
-// /**
-// * Enable RecreatableObjectFacet to 'temporarily' map an existing pojo to an oid.
-// * @deprecated don't expose caching
-// */
-// @Programmatic @Deprecated
-// ObjectAdapter addRecreatedPojoToCache(Oid oid, Object recreatedPojo);
-//
-// /**
-// * Enable RecreatableObjectFacet to remove a 'temporarily' mapped adapter for a pojo.
-// * @deprecated don't expose caching
-// */
-// @Programmatic @Deprecated
-// void removeAdapterFromCache(ObjectAdapter adapter);
-//
-//
-// /**
-// * Gets the {@link ObjectAdapter adapter} for the specified domain object if
-// * it exists in the identity map.
-// *
-// * <p>
-// * Provided by the <tt>AdapterManager</tt> when used by framework.
-// *
-// * @param pojo
-// * - must not be <tt>null</tt>
-// * @return adapter, or <tt>null</tt> if doesn't exist.
-// * @deprecated don't expose caching
-// */
-// @Programmatic @Deprecated
-// ObjectAdapter lookupAdapterFor(Object pojo);
-//
-// /**
-// * Gets the {@link ObjectAdapter adapter} for the {@link Oid} if it exists
-// * in the identity map.
-// *
-// * @param oid
-// * - must not be <tt>null</tt>
-// * @return adapter, or <tt>null</tt> if doesn't exist.
-// * @deprecated don't expose caching
-// */
-// @Programmatic @Deprecated
-// ObjectAdapter lookupAdapterFor(Oid oid);
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
index 933ef1e..506ca6e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/persistsession/PersistenceSessionServiceInternal.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.metamodel.services.persistsession;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import java.util.function.Function;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.query.Query;
@@ -29,44 +28,10 @@ import org.apache.isis.applib.services.xactn.Transaction;
import org.apache.isis.applib.services.xactn.TransactionState;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
-public interface PersistenceSessionServiceInternal extends ObjectAdapterProvider {
-
- // -- ObjectAdapterProvider
-
- @Programmatic
- ObjectAdapterProvider getObjectAdapterProvider();
-
- @Programmatic
- default ObjectAdapter adapterFor(Object domainObject) {
- return getObjectAdapterProvider().adapterFor(domainObject);
- }
-
- @Programmatic
- default ObjectAdapter adapterFor(
- final Object pojo,
- final ObjectAdapter parentAdapter,
- OneToManyAssociation collection) {
- return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
- }
-
- @Programmatic
- default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
- return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
- }
-
- @Programmatic
- default ObjectAdapter adapterForViewModel(
- final Object viewModelPojo,
- final Function<ObjectSpecId, RootOid> rootOidFactory) {
- return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
- }
-
+public interface PersistenceSessionServiceInternal extends ObjectAdapterProvider.Delegating {
// -- instantiate
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
index 6467953..f6a104f 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN4.java
@@ -37,7 +37,7 @@ import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.runtime.persistence.ObjectPersistenceException;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
index cf2ef6f..9713474 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLifecycleListener.java
@@ -34,6 +34,8 @@ import com.google.common.collect.Maps;
import org.datanucleus.enhancement.Persistable;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
public class IsisLifecycleListener
implements AttachLifecycleListener, ClearLifecycleListener, CreateLifecycleListener, DeleteLifecycleListener,
DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLifecycleListener,
@@ -45,13 +47,12 @@ SuspendableListener {
interface PersistenceSessionLifecycleManagement {
void ensureRootObject(Persistable pojo);
- void initializeMapAndCheckConcurrency(Persistable pojo);
+ ObjectAdapter initializeMapAndCheckConcurrency(Persistable pojo);
void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(Persistable pojo);
void invokeIsisPersistingCallback(Persistable pojo);
void enlistUpdatingAndInvokeIsisUpdatingCallback(Persistable pojo);
void enlistDeletingAndInvokeIsisRemovingCallbackFacet(Persistable pojo);
- //ObjectAdapter getAdapterFor(Persistable pojo);
}
private final PersistenceSessionLifecycleManagement persistenceSession;
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index ecf5bef..a758032 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -19,8 +19,6 @@
package org.apache.isis.core.runtime.system.persistence;
import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
-import static org.apache.isis.commons.internal.functions._Predicates.equalTo;
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
import java.lang.reflect.Array;
import java.lang.reflect.Modifier;
@@ -32,7 +30,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
-import java.util.function.Function;
import javax.jdo.FetchGroup;
import javax.jdo.FetchPlan;
@@ -58,13 +55,13 @@ import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
import org.apache.isis.applib.services.iactn.Interaction;
import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.ensure.Assert;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -87,7 +84,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFac
import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedLifecycleEventFacet;
import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFacet;
import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
-import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
@@ -110,6 +106,7 @@ import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllIns
import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
import org.apache.isis.core.runtime.services.RequestScopedService;
import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
@@ -132,6 +129,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4.class);
private ObjectAdapterContext objectAdapterContext;
+ private PersistenceSession4_Decouple mixin;
/**
* Initialize the object store so that calls to this object store access
@@ -160,8 +158,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
LOG.debug("opening {}", this);
}
- objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
-
persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -175,7 +171,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
PersistenceQueryFindUsingApplibQueryDefault.class,
new PersistenceQueryFindUsingApplibQueryProcessor(this));
- initServices();
+ objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
+ mixin = new PersistenceSession4_Decouple(this, objectAdapterContext);
// tell the proxy of all request-scoped services to instantiate the underlying
// services, store onto the thread-local and inject into them...
@@ -225,25 +222,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
}
- /**
- * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
- * and have the same OIDs as in any previous sessions.
- *
- * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
- */
- @Deprecated
- private void initServices() {
- final List<Object> registeredServices = servicesInjector.getRegisteredServices();
- for (final Object service : registeredServices) {
- final ObjectAdapter serviceAdapter = adapterFor(service);
-
- // remap as Persistent if required
- if (serviceAdapter.getOid().isTransient()) {
- objectAdapterContext.remapAsPersistent(serviceAdapter, null, this);
- }
- }
- }
-
private Command createCommand() {
final Command command = commandService.create();
@@ -369,9 +347,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
interaction.clear();
}
-
-
-
// -- QuerySubmitter impl, findInstancesInTransaction
@Override
public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
@@ -711,7 +686,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
Objects.requireNonNull(oid);
- final ObjectAdapter adapter = lookupAdapterFor(oid);
+ final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(oid);
if (adapter != null) {
return adapter;
}
@@ -723,7 +698,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
LOG.debug("getObject; oid={}", oid);
final Object pojo = loadPersistentPojo(oid);
- return addRecreatedPojoToCache(oid, pojo);
+ return objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
}
});
}
@@ -733,7 +708,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// -- loadPersistentPojo
- private Object loadPersistentPojo(final RootOid rootOid) {
+ //TODO[ISIS-1976] used by mixin
+ Object loadPersistentPojo(final RootOid rootOid) {
Object result;
try {
@@ -765,7 +741,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
return result;
}
- private Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
+ //TODO[ISIS-1976] used by mixin
+ Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
if(rootOids.isEmpty()) {
return zip(rootOids, Collections.emptyList());
@@ -828,21 +805,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
-
- // -- lazilyLoaded
-
- private ObjectAdapter mapPersistent(final Persistable pojo) {
- if (persistenceManager.getObjectId(pojo) == null) {
- return null;
- }
- final RootOid oid = createPersistentOrViewModelOid(pojo);
- final ObjectAdapter adapter = addRecreatedPojoToCache(oid, pojo);
- return adapter;
- }
-
-
-
-
// -- refreshRootInTransaction, refreshRoot, resolve
/**
@@ -941,7 +903,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
makePersistentTransactionAssumed(adapter);
// clear out the map of transient -> persistent
- PersistenceSession4.this.persistentByTransient.clear();
+ // already empty // PersistenceSession5.this.persistentByTransient.clear();
}
});
@@ -1070,159 +1032,18 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
persistenceManager.flush();
}
-
- // -- getAggregateRoot, remappedFrom
-
- private Map<Oid, Oid> persistentByTransient = _Maps.newHashMap();
+ // -- getAggregateRoot
@Override
public ObjectAdapter getAggregateRoot(final ParentedCollectionOid collectionOid) {
final Oid rootOid = collectionOid.getRootOid();
- ObjectAdapter rootadapter = lookupAdapterFor(rootOid);
- if(rootadapter == null) {
- final Oid parentOidNowPersisted = remappedFrom(rootOid);
- rootadapter = lookupAdapterFor(parentOidNowPersisted);
- }
+ ObjectAdapter rootadapter = objectAdapterContext.lookupAdapterFor(rootOid);
return rootadapter;
}
- /**
- * To support ISIS-234; keep track, for the duration of the transaction only,
- * of the old transient {@link Oid}s and their corresponding persistent {@link Oid}s.
- */
- private Oid remappedFrom(final Oid transientOid) {
- return persistentByTransient.get(transientOid);
- }
-
// -- AdapterManager implementation
@Override
- public ObjectAdapter lookupAdapterFor(final Object pojo) {
- Objects.requireNonNull(pojo);
-
- return objectAdapterContext.lookupAdapterByPojo(pojo);
- }
-
- @Override
- public ObjectAdapter lookupAdapterFor(final Oid oid) {
- Objects.requireNonNull(oid);
- ensureMapsConsistent(oid);
-
- return objectAdapterContext.lookupAdapterById(oid);
- }
-
-
- private ObjectAdapter existingOrValueAdapter(Object pojo) {
-
- // attempt to locate adapter for the pojo
- ObjectAdapter adapter = lookupAdapterFor(pojo);
- if (adapter != null) {
- return adapter;
- }
-
- // pojo may have been lazily loaded by object store, but we haven't yet seen it
- if (pojo instanceof Persistable) {
- adapter = mapPersistent((Persistable) pojo);
-
- // TODO: could return null if the pojo passed in !dnIsPersistent() || !dnIsDetached()
- // in which case, we would ought to map as a transient object, rather than fall through and treat as a value?
- } else {
- adapter = null;
- }
-
- if(adapter != null) {
- return adapter;
- }
-
- // need to create (and possibly map) the adapter.
- final ObjectSpecification objSpec = specificationLoader.loadSpecification(pojo.getClass());
-
- // we create value facets as standalone (so not added to maps)
- if (objSpec.containsFacet(ValueFacet.class)) {
- adapter = objectAdapterContext.getFactories().createStandaloneAdapter(pojo);
- return adapter;
- }
-
- return null;
- }
-
-
-
- /**
- * Fail early if any problems.
- */
- private void ensureMapsConsistent(final ObjectAdapter adapter) {
- if (adapter.isValue()) {
- return;
- }
- if (adapter.isParentedCollection()) {
- return;
- }
- ensurePojoAdapterMapConsistent(adapter);
- ensureOidAdapterMapConsistent(adapter);
- }
-
- /**
- * Fail early if any problems.
- * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
- */
- @Deprecated
- private void ensureMapsConsistent(final Oid oid) {
- Objects.requireNonNull(oid);
-
- final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
- if (adapter == null) {
- return;
- }
- ensureOidAdapterMapConsistent(adapter);
- ensurePojoAdapterMapConsistent(adapter);
- }
-
- private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
- final Object adapterPojo = adapter.getObject();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(adapterPojo);
-
- if(adapterPojo == null) {
- // nothing to check
- return;
- }
- ensureMapConsistent(adapter, adapterAccordingToMap, "PojoAdapterMap");
- }
-
- private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
- final Oid adapterOid = adapter.getOid();
- final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterById(adapterOid);
-
- if(adapterOid == null) {
- // nothing to check
- return;
- }
- ensureMapConsistent(adapter, adapterAccordingToMap, "OidAdapterMap");
- }
-
- private void ensureMapConsistent(
- final ObjectAdapter adapter,
- final ObjectAdapter adapterAccordingToMap,
- final String mapName) {
-
- final Oid adapterOid = adapter.getOid();
-
- // take care not to touch the pojo, since it might have been deleted.
-
- if(adapterAccordingToMap == null) {
- throw new IllegalStateException("mismatch in "
- + mapName
- + ": provided adapter's OID: " + adapterOid + "; but no adapter found in map");
- }
- ensureThatArg(
- adapter, equalTo(adapterAccordingToMap),
- ()->"mismatch in "
- + mapName
- + ": provided adapter's OID: " + adapterOid + ", \n"
- + "but map's adapter's OID was: " + adapterAccordingToMap.getOid());
- }
-
- @Override
public ObjectAdapter adapterForAny(RootOid rootOid) {
final ObjectSpecId specId = rootOid.getObjectSpecId();
@@ -1259,180 +1080,23 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
- return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
- }
-
- private Map<RootOid,ObjectAdapter> adaptersFor(
+ public Map<RootOid, ObjectAdapter> adaptersFor(
final List<RootOid> rootOids,
final ConcurrencyChecking concurrencyChecking) {
- final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
-
- List<RootOid> notYetLoadedOids = _Lists.newArrayList();
- for (RootOid rootOid : rootOids) {
- // attempt to locate adapter for the Oid
- ObjectAdapter adapter = lookupAdapterFor(rootOid);
- // handle view models or transient
- if (adapter == null) {
- if (rootOid.isTransient() || rootOid.isViewModel()) {
- final Object pojo = recreatePojoTransientOrViewModel(rootOid);
- adapter = addRecreatedPojoToCache(rootOid, pojo);
- sync(concurrencyChecking, adapter, rootOid);
- }
- }
- if (adapter != null) {
- adapterByOid.put(rootOid, adapter);
- } else {
- // persistent oid, to load in bulk
- notYetLoadedOids.add(rootOid);
- }
- }
-
- // recreate, in bulk, all those not yet loaded
- final Map<RootOid, Object> pojoByOid = loadPersistentPojos(notYetLoadedOids);
- for (Map.Entry<RootOid, Object> entry : pojoByOid.entrySet()) {
- final RootOid rootOid = entry.getKey();
- final Object pojo = entry.getValue();
- if(pojo != null) {
- ObjectAdapter adapter;
- try {
- adapter = addRecreatedPojoToCache(rootOid, pojo);
- adapterByOid.put(rootOid, adapter);
- } catch(ObjectNotFoundException ex) {
- throw ex; // just rethrow
- } catch(RuntimeException ex) {
- throw new PojoRecreationException(rootOid, ex);
- }
- sync(concurrencyChecking, adapter, rootOid);
- } else {
- // null indicates it couldn't be loaded
- // do nothing here...
- }
+ return mixin.adaptersFor(rootOids, concurrencyChecking);
}
- return adapterByOid;
- }
-
- /**
- * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
- * {@link ConcurrencyChecking#NO_CHECK no checking}.
- *
- * <p>
- * This method will <i>always</i> return an object, possibly indicating it is persistent; so make sure that you
- * know that the oid does indeed represent an object you know exists.
- * </p>
- */
- @Override
- public ObjectAdapter adapterFor(final RootOid rootOid) {
- return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
- }
-
-
- /**
- * Either returns an existing {@link ObjectAdapter adapter} (as per
- * {@link #lookupAdapterFor(Oid)}), otherwise re-creates an adapter with the
- * specified (persistent) {@link Oid}.
- *
- * <p>
- * Typically called when the {@link Oid} is already known, that is, when
- * resolving an already-persisted object. Is also available for
- * <tt>Memento</tt> support however, so {@link Oid} could also represent a
- * {@link Oid#isTransient() transient} object.
- *
- * <p>
- * The pojo itself is recreated by delegating to a {@link AdapterManager}.
- *
- * <p>
- * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
- * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
- * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
- * If the version differs, then a {@link ConcurrencyException} is thrown.
- *
- * <p>
- * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
- * will be {@link RootOid#setVersion(Version) set} to the current
- * value. This allows the client to retry if they wish.
- *
- * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
- */
@Override
public ObjectAdapter adapterFor(
final RootOid rootOid,
final ConcurrencyChecking concurrencyChecking) {
- // attempt to locate adapter for the Oid
- ObjectAdapter adapter = lookupAdapterFor(rootOid);
- if (adapter == null) {
- // else recreate
- try {
- final Object pojo;
- if(rootOid.isTransient() || rootOid.isViewModel()) {
- pojo = recreatePojoTransientOrViewModel(rootOid);
- } else {
- pojo = loadPersistentPojo(rootOid);
- }
- adapter = addRecreatedPojoToCache(rootOid, pojo);
- } catch(ObjectNotFoundException ex) {
- throw ex; // just rethrow
- } catch(RuntimeException ex) {
- throw new PojoRecreationException(rootOid, ex);
+ return mixin.adapterFor(rootOid, concurrencyChecking);
}
- }
-
- // sync versions of original, with concurrency checking if required
- sync(concurrencyChecking, adapter, rootOid);
-
- return adapter;
- }
-
-
- private void sync(
- final ConcurrencyChecking concurrencyChecking,
- final ObjectAdapter adapter, final RootOid rootOid) {
- // sync versions of original, with concurrency checking if required
- Oid adapterOid = adapter.getOid();
- if(adapterOid instanceof RootOid) {
- final RootOid recreatedOid = (RootOid) adapterOid;
- final RootOid originalOid = rootOid;
-
- try {
- if(concurrencyChecking.isChecking()) {
-
- // check for exception, but don't throw if suppressed through thread-local
- final Version otherVersion = originalOid.getVersion();
- final Version thisVersion = recreatedOid.getVersion();
- if( thisVersion != null &&
- otherVersion != null &&
- thisVersion.different(otherVersion)) {
-
- if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
- LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
- final String currentUser = authenticationSession.getUserName();
- throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
- } else {
- LOG.info("concurrency conflict detected but suppressed, on {} ({})", recreatedOid, otherVersion);
- }
- }
- }
- } finally {
- final Version originalVersion = originalOid.getVersion();
- final Version recreatedVersion = recreatedOid.getVersion();
- if(recreatedVersion != null && (
- originalVersion == null ||
- recreatedVersion.different(originalVersion))
- ) {
- if(LOG.isDebugEnabled()) {
- LOG.debug("updating version in oid, on {} ({}) to ({})", originalOid, originalVersion, recreatedVersion);
- }
- originalOid.setVersion(recreatedVersion);
- }
- }
- }
- }
-
- private Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
+ //TODO[ISIS-1976] used by mixin
+ Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
final ObjectSpecification spec =
specificationLoader.lookupBySpecId(rootOid.getObjectSpecId());
final Object pojo;
@@ -1449,168 +1113,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
return pojo;
}
- @Override
- public ObjectAdapter adapterFor(final Object pojo) {
-
- if(pojo == null) {
- return null;
- }
- final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
- if(existingOrValueAdapter != null) {
- return existingOrValueAdapter;
- }
-
-
- // Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
- final RootOid rootOid = createTransientOrViewModelOid(pojo);
- final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-
- return mapAndInjectServices(newAdapter);
- }
-
- @Override
- public ObjectAdapter adapterFor(final Object pojo, final ObjectAdapter parentAdapter, final OneToManyAssociation collection) {
-
- assert parentAdapter != null;
- assert collection != null;
-
- final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
- if(existingOrValueAdapter != null) {
- return existingOrValueAdapter;
- }
-
- ensureMapsConsistent(parentAdapter);
-
- // the List, Set etc. instance gets wrapped in its own adapter
- final ObjectAdapter newAdapter = objectAdapterContext.getFactories()
- .createCollectionAdapter(pojo, parentAdapter, collection);
-
- return mapAndInjectServices(newAdapter);
- }
-
-
-
-
- /**
- * Either returns an existing {@link ObjectAdapter adapter} (as per
- * {@link #lookupAdapterFor(Object)} or {@link #lookupAdapterFor(Oid)}), otherwise
- * re-creates an adapter with the specified (persistent) {@link Oid}.
- *
- * <p>
- * Typically called when the {@link Oid} is already known, that is, when
- * resolving an already-persisted object. Is also available for
- * <tt>Memento</tt> support however, so {@link Oid} could also represent a
- * {@link Oid#isTransient() transient} object.
- *
- * @param oid
- * @param recreatedPojo - already known to the object store impl, or a service
- */
- @Override
- public ObjectAdapter addRecreatedPojoToCache(final Oid oid, final Object recreatedPojo) {
-
- // attempt to locate adapter for the pojo
- // REVIEW: this check is possibly redundant because the pojo will most likely
- // have just been instantiated, so won't yet be in any maps
- final ObjectAdapter adapterLookedUpByPojo = lookupAdapterFor(recreatedPojo);
- if (adapterLookedUpByPojo != null) {
- return adapterLookedUpByPojo;
- }
-
- // attempt to locate adapter for the Oid
- final ObjectAdapter adapterLookedUpByOid = lookupAdapterFor(oid);
- if (adapterLookedUpByOid != null) {
- return adapterLookedUpByOid;
- }
-
- final ObjectAdapter createdAdapter = createRootOrAggregatedAdapter(oid, recreatedPojo);
- return mapAndInjectServices(createdAdapter);
- }
-
- /**
- * Removes the specified object from both the identity-adapter map, and the
- * pojo-adapter map.
- *
- * <p>
- * This indicates that the object is no longer in use, and therefore that no
- * objects exists within the system.
- *
- * <p>
- * If an {@link ObjectAdapter adapter} is removed while its pojo still is
- * referenced then a subsequent interaction of that pojo will create a
- * different {@link ObjectAdapter adapter}.
- *
- * <p>
- * TODO: should do a cascade remove of any aggregated objects.
- */
- @Override
- public void removeAdapterFromCache(final ObjectAdapter adapter) {
- ensureMapsConsistent(adapter);
- objectAdapterContext.removeAdapter(adapter);
- }
-
-
- /**
- * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
- */
- @Deprecated
- private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
- removeAdapterFromCache(adapter);
- adapter.replacePojo(pojo);
- mapAndInjectServices(adapter);
- }
-
-
- private ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
- final ObjectAdapter createdAdapter;
- if(oid instanceof RootOid) {
- final RootOid rootOid = (RootOid) oid;
- createdAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
- } else /*if (oid instanceof CollectionOid)*/ {
- final ParentedCollectionOid collectionOid = (ParentedCollectionOid) oid;
- createdAdapter = objectAdapterContext.getFactories().createCollectionAdapter(pojo, collectionOid);
- }
- return createdAdapter;
- }
-
-
-
- private ObjectAdapter mapAndInjectServices(final ObjectAdapter adapter) {
- // since the whole point of this method is to map an adapter that's just been created.
- // so we *don't* call ensureMapsConsistent(adapter);
-
- Assert.assertNotNull(adapter);
- final Object pojo = adapter.getObject();
- Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
-
- if (LOG.isDebugEnabled()) {
- // don't interact with the underlying object because may be a ghost
- // and would trigger a resolve
- // don't call toString() on adapter because calls hashCode on
- // underlying object, may also trigger a resolve.
- LOG.debug("adding identity for adapter with oid={}", adapter.getOid());
- }
-
- // value adapters are not mapped (but all others - root and aggregated adapters - are)
- if (adapter.isValue()) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("not mapping value adapter");
- }
- servicesInjector.injectServicesInto(pojo);
- return adapter;
- }
-
- objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
-
- // must inject after mapping, otherwise infinite loop
- servicesInjector.injectServicesInto(pojo);
-
- return adapter;
- }
-
-
-
-
-
// -- TransactionManager delegate methods
protected IsisTransaction getCurrentTransaction() {
return transactionManager.getCurrentTransaction();
@@ -1630,7 +1132,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public void initializeMapAndCheckConcurrency(final Persistable pojo) {
+ public ObjectAdapter initializeMapAndCheckConcurrency(final Persistable pojo) {
final Persistable pc = pojo;
// need to do eagerly, because (if a viewModel then) a
@@ -1640,7 +1142,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
final Version datastoreVersion = getVersionIfAny(pc);
final RootOid originalOid;
- ObjectAdapter adapter = lookupAdapterFor(pojo);
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
if (adapter != null) {
ensureRootObject(pojo);
originalOid = (RootOid) adapter.getOid();
@@ -1648,7 +1150,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
final Version originalVersion = adapter.getVersion();
// sync the pojo held by the adapter with that just loaded
- remapRecreatedPojo(adapter, pojo);
+ objectAdapterContext.remapRecreatedPojo(adapter, pojo);
// since there was already an adapter, do concurrency check
// (but don't set abort cause if checking is suppressed through thread-local)
@@ -1676,11 +1178,11 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// it appears to be possible that there is already an adapter for this Oid,
// ie from ObjectStore#resolveImmediately()
- adapter = lookupAdapterFor(originalOid);
+ adapter = objectAdapterContext.lookupAdapterFor(originalOid);
if (adapter != null) {
- remapRecreatedPojo(adapter, pojo);
+ objectAdapterContext.remapRecreatedPojo(adapter, pojo);
} else {
- adapter = addRecreatedPojoToCache(originalOid, pojo);
+ adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo);
CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class);
postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class);
@@ -1688,6 +1190,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
adapter.setVersion(datastoreVersion);
+
+ return objectAdapterContext.lookupAdapterFor(pojo);
}
// -- create...Oid (main API)
@@ -1695,7 +1199,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
* Create a new {@link Oid#isTransient() transient} {@link Oid} for the
* supplied pojo, uniquely distinguishable from any other {@link Oid}.
*/
- private final RootOid createTransientOrViewModelOid(final Object pojo) {
+ @Override
+ public final RootOid createTransientOrViewModelOid(final Object pojo) {
return newIdentifier(pojo, Type.TRANSIENT);
}
@@ -1764,7 +1269,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
*/
@Override
public void invokeIsisPersistingCallback(final Persistable pojo) {
- final ObjectAdapter adapter = lookupAdapterFor(pojo);
+ final ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
if (adapter == null) {
// not expected.
return;
@@ -1825,7 +1330,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
@Override
public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
- ObjectAdapter adapter = lookupAdapterFor(pojo);
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo);
if (adapter == null) {
// seen this happen in the case when a parent entity (LeaseItem) has a collection of children
// objects (LeaseTerm) for which we haven't had a loaded callback fired and so are not yet
@@ -1834,7 +1339,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// it seems reasonable in this case to simply map into Isis here ("just-in-time"); presumably
// DN would not be calling this callback if the pojo was not persistent.
- adapter = mapPersistent(pojo);
+ adapter = objectAdapterContext.addPersistentToCache(pojo);
if (adapter == null) {
throw new RuntimeException(
"DN could not find objectId for pojo (unexpected) and so could not map into Isis; pojo=["
@@ -1947,13 +1452,13 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
- return objectAdapterContext.specificationForViewModel(viewModelPojo);
+ public MementoRecreateObjectSupport mementoSupport() {
+ return objectAdapterContext.mementoSupport();
}
@Override
- public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
- return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
+ public ObjectAdapterProvider getObjectAdapterProvider() {
+ return objectAdapterContext.getObjectAdapterProvider();
}
}
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java
new file mode 100644
index 0000000..de33ef0
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4_Decouple.java
@@ -0,0 +1,213 @@
+/*
+ * 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.runtime.system.persistence;
+
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
+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.Version;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.persistence.PojoRecreationException;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+
+class PersistenceSession4_Decouple {
+
+ private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4_Decouple.class);
+ private final PersistenceSession4 holder;
+ private final ObjectAdapterContext objectAdapterContext;
+ private final AuthenticationSession authenticationSession;
+ private final boolean concurrencyCheckingGloballyEnabled;
+
+ protected PersistenceSession4_Decouple(PersistenceSession4 holder, ObjectAdapterContext objectAdapterContext) {
+ this.holder = holder;
+ this.objectAdapterContext = objectAdapterContext;
+ this.authenticationSession = holder.getAuthenticationSession();
+ this.concurrencyCheckingGloballyEnabled = !ConcurrencyChecking.isGloballyDisabled(holder.getConfiguration());
+ }
+
+ /**
+ * Either returns an existing {@link ObjectAdapter adapter} (as per
+ * {@link #lookupAdapterFor(Oid)}), otherwise re-creates an adapter with the
+ * specified (persistent) {@link Oid}.
+ *
+ * <p>
+ * Typically called when the {@link Oid} is already known, that is, when
+ * resolving an already-persisted object. Is also available for
+ * <tt>Memento</tt> support however, so {@link Oid} could also represent a
+ * {@link Oid#isTransient() transient} object.
+ *
+ * <p>
+ * The pojo itself is recreated by delegating to a {@link AdapterManager}.
+ *
+ * <p>
+ * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
+ * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
+ * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
+ * If the version differs, then a {@link ConcurrencyException} is thrown.
+ *
+ * <p>
+ * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
+ * will be {@link RootOid#setVersion(Version) set} to the current
+ * value. This allows the client to retry if they wish.
+ *
+ * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
+ */
+ public ObjectAdapter adapterFor(
+ final RootOid rootOid,
+ final ConcurrencyChecking concurrencyChecking) {
+
+ // attempt to locate adapter for the Oid
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
+ if (adapter == null) {
+ // else recreate
+ try {
+ final Object pojo;
+ if(rootOid.isTransient() || rootOid.isViewModel()) {
+ pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+ } else {
+ pojo = holder.loadPersistentPojo(rootOid);
+ }
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ } catch(ObjectNotFoundException ex) {
+ throw ex; // just rethrow
+ } catch(RuntimeException ex) {
+ throw new PojoRecreationException(rootOid, ex);
+ }
+ }
+
+ // sync versions of original, with concurrency checking if required
+ syncVersion(concurrencyChecking, adapter, rootOid);
+
+ return adapter;
+
+ }
+
+ protected Map<RootOid,ObjectAdapter> adaptersFor(
+ final List<RootOid> rootOids,
+ final ConcurrencyChecking concurrencyChecking) {
+
+ final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
+
+ List<RootOid> notYetLoadedOids = _Lists.newArrayList();
+ for (RootOid rootOid : rootOids) {
+ // attempt to locate adapter for the Oid
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
+ // handle view models or transient
+ if (adapter == null) {
+ if (rootOid.isTransient() || rootOid.isViewModel()) {
+ final Object pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ syncVersion(concurrencyChecking, adapter, rootOid);
+ }
+ }
+ if (adapter != null) {
+ adapterByOid.put(rootOid, adapter);
+ } else {
+ // persistent oid, to load in bulk
+ notYetLoadedOids.add(rootOid);
+ }
+ }
+
+ // recreate, in bulk, all those not yet loaded
+ final Map<RootOid, Object> pojoByOid = holder.loadPersistentPojos(notYetLoadedOids);
+ for (Map.Entry<RootOid, Object> entry : pojoByOid.entrySet()) {
+ final RootOid rootOid = entry.getKey();
+ final Object pojo = entry.getValue();
+ if(pojo != null) {
+ ObjectAdapter adapter;
+ try {
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ adapterByOid.put(rootOid, adapter);
+ } catch(ObjectNotFoundException ex) {
+ throw ex; // just rethrow
+ } catch(RuntimeException ex) {
+ throw new PojoRecreationException(rootOid, ex);
+ }
+ syncVersion(concurrencyChecking, adapter, rootOid);
+ } else {
+ // null indicates it couldn't be loaded
+ // do nothing here...
+ }
+ }
+
+ return adapterByOid;
+ }
+
+ private void syncVersion(
+ final ConcurrencyChecking concurrencyChecking,
+ final ObjectAdapter adapter, final RootOid rootOid) {
+ // sync versions of original, with concurrency checking if required
+ Oid adapterOid = adapter.getOid();
+ if(adapterOid instanceof RootOid) {
+ final RootOid recreatedOid = (RootOid) adapterOid;
+ final RootOid originalOid = rootOid;
+
+ try {
+ if(concurrencyChecking.isChecking()) {
+
+ // check for exception, but don't throw if suppressed through thread-local
+ final Version otherVersion = originalOid.getVersion();
+ final Version thisVersion = recreatedOid.getVersion();
+ if( thisVersion != null &&
+ otherVersion != null &&
+ thisVersion.different(otherVersion)) {
+
+ if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
+ LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
+ final String currentUser = authenticationSession.getUserName();
+ throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
+ } else {
+ LOG.info("concurrency conflict detected but suppressed, on {} ({})", recreatedOid, otherVersion);
+ }
+ }
+ }
+ } finally {
+ final Version originalVersion = originalOid.getVersion();
+ final Version recreatedVersion = recreatedOid.getVersion();
+ if(recreatedVersion != null && (
+ originalVersion == null ||
+ recreatedVersion.different(originalVersion))
+ ) {
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("updating version in oid, on {} ({}) to ({})", originalOid, originalVersion, recreatedVersion);
+ }
+ originalOid.setVersion(recreatedVersion);
+ }
+ }
+ }
+ }
+
+
+
+
+}
+
+
+
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
index b121d26..e7a7182 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -55,8 +55,7 @@ implements PersistenceQueryProcessor<T> {
ObjectAdapter adapter;
if(pojo instanceof Persistable) {
// an entity
- persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
- adapter = persistenceSession.lookupAdapterFor(pojo);
+ adapter = persistenceSession.initializeMapAndCheckConcurrency((Persistable) pojo);
} else {
// a value type
adapter = persistenceSession.adapterFor(pojo);
diff --git a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
index 7885ba4..f343937 100644
--- a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
@@ -40,7 +40,7 @@ import org.apache.isis.applib.services.wrapper.WrapperFactory;
import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
@@ -87,7 +87,7 @@ public class WrapperFactoryDefaultTest_wrappedObject {
public ExpectedException expectedException = ExpectedException.none();
@Mock
- private AdapterManager mockAdapterManager;
+ private ObjectAdapterProvider mockAdapterManager;
@Mock
private AuthenticationSessionProvider mockAuthenticationSessionProvider;
@Mock
@@ -210,8 +210,8 @@ public class WrapperFactoryDefaultTest_wrappedObject {
allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
will(returnValue(session));
- allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
- will(returnValue(mockEmployeeAdapter));
+// allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+// will(returnValue(mockEmployeeAdapter));
allowing(mockAdapterManager).adapterFor(employeeDO);
will(returnValue(mockEmployeeAdapter));
diff --git a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
index b1dce48..1e4385d 100644
--- a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject_transient.java
@@ -43,7 +43,7 @@ import org.apache.isis.applib.services.wrapper.events.PropertyVisibilityEvent;
import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.core.metamodel.consent.Allow;
import org.apache.isis.core.metamodel.consent.Consent;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -79,7 +79,7 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
public final JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
@Mock
- private AdapterManager mockAdapterManager;
+ private ObjectAdapterProvider mockAdapterManager;
@Mock
private AuthenticationSessionProvider mockAuthenticationSessionProvider;
@Mock
@@ -159,8 +159,8 @@ public class WrapperFactoryDefaultTest_wrappedObject_transient {
allowing(mockDeploymentCategoryProvider).getDeploymentCategory();
will(returnValue(DeploymentCategory.PRODUCTION));
- allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
- will(returnValue(mockEmployeeAdapter));
+// allowing(mockAdapterManager).lookupAdapterFor(employeeDO);
+// will(returnValue(mockEmployeeAdapter));
allowing(mockAdapterManager).adapterFor(employeeDO);
will(returnValue(mockEmployeeAdapter));
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
index 7446265..f418f65 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/applib/services/jdosupport/IsisJdoSupportDN5.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.runtime.persistence.ObjectPersistenceException;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index f10fb70..e5bc65c 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -30,7 +30,6 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
-import java.util.function.Function;
import javax.jdo.FetchGroup;
import javax.jdo.FetchPlan;
@@ -56,15 +55,13 @@ import org.apache.isis.applib.services.command.Command;
import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
import org.apache.isis.applib.services.iactn.Interaction;
import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.ensure.Assert;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -131,6 +128,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
private ObjectAdapterContext objectAdapterContext;
+ private PersistenceSession5_Decouple mixin;
/**
* Initialize the object store so that calls to this object store access
@@ -171,8 +169,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
persistenceQueryProcessorByClass.put(
PersistenceQueryFindUsingApplibQueryDefault.class,
new PersistenceQueryFindUsingApplibQueryProcessor(this));
-
+
objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
+ mixin = new PersistenceSession5_Decouple(this, objectAdapterContext);
// tell the proxy of all request-scoped services to instantiate the underlying
// services, store onto the thread-local and inject into them...
@@ -221,20 +220,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
}
}
-
- @Override
- public List<ObjectAdapter> getServices() {
- final List<Object> services = servicesInjector.getRegisteredServices();
- final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
- for (final Object servicePojo : services) {
- ObjectAdapter serviceAdapter = objectAdapterContext.lookupAdapterFor(servicePojo);
- if(serviceAdapter == null) {
- throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
- }
- serviceAdapters.add(serviceAdapter);
- }
- return serviceAdapters;
- }
private Command createCommand() {
final Command command = commandService.create();
@@ -717,7 +702,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// -- loadPersistentPojo
- private Object loadPersistentPojo(final RootOid rootOid) {
+ //TODO[ISIS-1976] used by mixin
+ Object loadPersistentPojo(final RootOid rootOid) {
Object result;
try {
@@ -749,7 +735,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
return result;
}
- private Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
+ //TODO[ISIS-1976] used by mixin
+ Map<RootOid,Object> loadPersistentPojos(final List<RootOid> rootOids) {
if(rootOids.isEmpty()) {
return zip(rootOids, Collections.emptyList());
@@ -812,19 +799,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
-
- // -- lazilyLoaded
-//
-// private ObjectAdapter addPersistentToCache(final Persistable pojo) {
-// if (persistenceManager.getObjectId(pojo) == null) {
-// return null;
-// }
-// final RootOid oid = createPersistentOrViewModelOid(pojo);
-// final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
-// return adapter;
-// }
-
-
// -- refreshRootInTransaction, refreshRoot, resolve
/**
@@ -1098,180 +1072,23 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public Map<RootOid, ObjectAdapter> adaptersFor(final List<RootOid> rootOids) {
- return adaptersFor(rootOids, AdapterManager.ConcurrencyChecking.NO_CHECK);
- }
-
- private Map<RootOid,ObjectAdapter> adaptersFor(
- final List<RootOid> rootOids,
- final AdapterManager.ConcurrencyChecking concurrencyChecking) {
-
- final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
-
- List<RootOid> notYetLoadedOids = _Lists.newArrayList();
- for (RootOid rootOid : rootOids) {
- // attempt to locate adapter for the Oid
- ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
- // handle view models or transient
- if (adapter == null) {
- if (rootOid.isTransient() || rootOid.isViewModel()) {
- final Object pojo = recreatePojoTransientOrViewModel(rootOid);
- adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
- sync(concurrencyChecking, adapter, rootOid);
- }
- }
- if (adapter != null) {
- adapterByOid.put(rootOid, adapter);
- } else {
- // persistent oid, to load in bulk
- notYetLoadedOids.add(rootOid);
- }
- }
-
- // recreate, in bulk, all those not yet loaded
- final Map<RootOid, Object> pojoByOid = loadPersistentPojos(notYetLoadedOids);
- for (Map.Entry<RootOid, Object> entry : pojoByOid.entrySet()) {
- final RootOid rootOid = entry.getKey();
- final Object pojo = entry.getValue();
- if(pojo != null) {
- ObjectAdapter adapter;
- try {
- adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
- adapterByOid.put(rootOid, adapter);
- } catch(ObjectNotFoundException ex) {
- throw ex; // just rethrow
- } catch(RuntimeException ex) {
- throw new PojoRecreationException(rootOid, ex);
- }
- sync(concurrencyChecking, adapter, rootOid);
- } else {
- // null indicates it couldn't be loaded
- // do nothing here...
- }
- }
+ public Map<RootOid, ObjectAdapter> adaptersFor(
+ final List<RootOid> rootOids,
+ final ConcurrencyChecking concurrencyChecking) {
- return adapterByOid;
+ return mixin.adaptersFor(rootOids, concurrencyChecking);
}
- /**
- * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
- * {@link ConcurrencyChecking#NO_CHECK no checking}.
- *
- * <p>
- * This method will <i>always</i> return an object, possibly indicating it is persistent; so make sure that you
- * know that the oid does indeed represent an object you know exists.
- * </p>
- */
- @Override
- public ObjectAdapter adapterFor(final RootOid rootOid) {
- return adapterFor(rootOid, AdapterManager.ConcurrencyChecking.NO_CHECK);
- }
-
-
- /**
- * Either returns an existing {@link ObjectAdapter adapter} (as per
- * {@link #lookupAdapterFor(Oid)}), otherwise re-creates an adapter with the
- * specified (persistent) {@link Oid}.
- *
- * <p>
- * Typically called when the {@link Oid} is already known, that is, when
- * resolving an already-persisted object. Is also available for
- * <tt>Memento</tt> support however, so {@link Oid} could also represent a
- * {@link Oid#isTransient() transient} object.
- *
- * <p>
- * The pojo itself is recreated by delegating to a {@link AdapterManager}.
- *
- * <p>
- * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
- * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
- * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
- * If the version differs, then a {@link ConcurrencyException} is thrown.
- *
- * <p>
- * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
- * will be {@link RootOid#setVersion(Version) set} to the current
- * value. This allows the client to retry if they wish.
- *
- * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
- */
@Override
public ObjectAdapter adapterFor(
final RootOid rootOid,
- final AdapterManager.ConcurrencyChecking concurrencyChecking) {
-
- // attempt to locate adapter for the Oid
- ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
- if (adapter == null) {
- // else recreate
- try {
- final Object pojo;
- if(rootOid.isTransient() || rootOid.isViewModel()) {
- pojo = recreatePojoTransientOrViewModel(rootOid);
- } else {
- pojo = loadPersistentPojo(rootOid);
- }
- adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
- } catch(ObjectNotFoundException ex) {
- throw ex; // just rethrow
- } catch(RuntimeException ex) {
- throw new PojoRecreationException(rootOid, ex);
- }
- }
-
- // sync versions of original, with concurrency checking if required
- sync(concurrencyChecking, adapter, rootOid);
+ final ConcurrencyChecking concurrencyChecking) {
- return adapter;
+ return mixin.adapterFor(rootOid, concurrencyChecking);
}
-
-
- private void sync(
- final AdapterManager.ConcurrencyChecking concurrencyChecking,
- final ObjectAdapter adapter, final RootOid rootOid) {
- // sync versions of original, with concurrency checking if required
- Oid adapterOid = adapter.getOid();
- if(adapterOid instanceof RootOid) {
- final RootOid recreatedOid = (RootOid) adapterOid;
- final RootOid originalOid = rootOid;
-
- try {
- if(concurrencyChecking.isChecking()) {
-
- // check for exception, but don't throw if suppressed through thread-local
- final Version otherVersion = originalOid.getVersion();
- final Version thisVersion = recreatedOid.getVersion();
- if( thisVersion != null &&
- otherVersion != null &&
- thisVersion.different(otherVersion)) {
-
- if(concurrencyCheckingGloballyEnabled && AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
- LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
- final String currentUser = authenticationSession.getUserName();
- throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
- } else {
- LOG.info("concurrency conflict detected but suppressed, on {} ({})", recreatedOid, otherVersion);
- }
- }
- }
- } finally {
- final Version originalVersion = originalOid.getVersion();
- final Version recreatedVersion = recreatedOid.getVersion();
- if(recreatedVersion != null && (
- originalVersion == null ||
- recreatedVersion.different(originalVersion))
- ) {
- if(LOG.isDebugEnabled()) {
- LOG.debug("updating version in oid, on {} ({}) to ({})", originalOid, originalVersion, recreatedVersion);
- }
- originalOid.setVersion(recreatedVersion);
- }
- }
- }
- }
-
- private Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
+ //TODO[ISIS-1976] used by mixin
+ Object recreatePojoTransientOrViewModel(final RootOid rootOid) {
final ObjectSpecification spec =
specificationLoader.lookupBySpecId(rootOid.getObjectSpecId());
final Object pojo;
@@ -1288,16 +1105,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
return pojo;
}
- /**
- * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
- */
- @Deprecated
- private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
- objectAdapterContext.removeAdapterFromCache(adapter);
- adapter.replacePojo(pojo);
- objectAdapterContext.mapAndInjectServices(adapter);
- }
-
// -- TransactionManager delegate methods
protected IsisTransaction getCurrentTransaction() {
return transactionManager.getCurrentTransaction();
@@ -1334,7 +1141,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
final Version originalVersion = adapter.getVersion();
// sync the pojo held by the adapter with that just loaded
- remapRecreatedPojo(adapter, pojo);
+ objectAdapterContext.remapRecreatedPojo(adapter, pojo);
// since there was already an adapter, do concurrency check
// (but don't set abort cause if checking is suppressed through thread-local)
@@ -1346,7 +1153,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
otherVersion != null &&
thisVersion.different(otherVersion)) {
- if (AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
+ if (ConcurrencyChecking.isCurrentlyEnabled()) {
LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
final String currentUser = authenticationSession.getUserName();
final ConcurrencyException abortCause = new ConcurrencyException(currentUser, thisOid,
@@ -1364,7 +1171,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// ie from ObjectStore#resolveImmediately()
adapter = objectAdapterContext.lookupAdapterFor(originalOid);
if (adapter != null) {
- remapRecreatedPojo(adapter, pojo);
+ objectAdapterContext.remapRecreatedPojo(adapter, pojo);
} else {
adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo);
@@ -1374,7 +1181,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
adapter.setVersion(datastoreVersion);
-
+
return objectAdapterContext.lookupAdapterFor(pojo);
}
@@ -1634,26 +1441,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
@Override
- public ObjectSpecification specificationForViewModel(Object viewModelPojo) {
- return objectAdapterContext.specificationForViewModel(viewModelPojo);
- }
-
- @Override
- public ObjectAdapter adapterForViewModel(Object viewModelPojo, Function<ObjectSpecId, RootOid> rootOidFactory) {
- return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
- }
-
- @Override
public MementoRecreateObjectSupport mementoSupport() {
return objectAdapterContext.mementoSupport();
}
-
+
@Override
public ObjectAdapterProvider getObjectAdapterProvider() {
return objectAdapterContext.getObjectAdapterProvider();
}
-
+
}
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java
new file mode 100644
index 0000000..492857b
--- /dev/null
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_Decouple.java
@@ -0,0 +1,213 @@
+/*
+ * 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.runtime.system.persistence;
+
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
+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.Version;
+import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.persistence.PojoRecreationException;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext;
+
+class PersistenceSession5_Decouple {
+
+ private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5_Decouple.class);
+ private final PersistenceSession5 holder;
+ private final ObjectAdapterContext objectAdapterContext;
+ private final AuthenticationSession authenticationSession;
+ private final boolean concurrencyCheckingGloballyEnabled;
+
+ protected PersistenceSession5_Decouple(PersistenceSession5 holder, ObjectAdapterContext objectAdapterContext) {
+ this.holder = holder;
+ this.objectAdapterContext = objectAdapterContext;
+ this.authenticationSession = holder.getAuthenticationSession();
+ this.concurrencyCheckingGloballyEnabled = !ConcurrencyChecking.isGloballyDisabled(holder.getConfiguration());
+ }
+
+ /**
+ * Either returns an existing {@link ObjectAdapter adapter} (as per
+ * {@link #lookupAdapterFor(Oid)}), otherwise re-creates an adapter with the
+ * specified (persistent) {@link Oid}.
+ *
+ * <p>
+ * Typically called when the {@link Oid} is already known, that is, when
+ * resolving an already-persisted object. Is also available for
+ * <tt>Memento</tt> support however, so {@link Oid} could also represent a
+ * {@link Oid#isTransient() transient} object.
+ *
+ * <p>
+ * The pojo itself is recreated by delegating to a {@link AdapterManager}.
+ *
+ * <p>
+ * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
+ * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
+ * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
+ * If the version differs, then a {@link ConcurrencyException} is thrown.
+ *
+ * <p>
+ * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
+ * will be {@link RootOid#setVersion(Version) set} to the current
+ * value. This allows the client to retry if they wish.
+ *
+ * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
+ */
+ public ObjectAdapter adapterFor(
+ final RootOid rootOid,
+ final ConcurrencyChecking concurrencyChecking) {
+
+ // attempt to locate adapter for the Oid
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
+ if (adapter == null) {
+ // else recreate
+ try {
+ final Object pojo;
+ if(rootOid.isTransient() || rootOid.isViewModel()) {
+ pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+ } else {
+ pojo = holder.loadPersistentPojo(rootOid);
+ }
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ } catch(ObjectNotFoundException ex) {
+ throw ex; // just rethrow
+ } catch(RuntimeException ex) {
+ throw new PojoRecreationException(rootOid, ex);
+ }
+ }
+
+ // sync versions of original, with concurrency checking if required
+ syncVersion(concurrencyChecking, adapter, rootOid);
+
+ return adapter;
+
+ }
+
+ protected Map<RootOid,ObjectAdapter> adaptersFor(
+ final List<RootOid> rootOids,
+ final ConcurrencyChecking concurrencyChecking) {
+
+ final Map<RootOid, ObjectAdapter> adapterByOid = _Maps.newLinkedHashMap();
+
+ List<RootOid> notYetLoadedOids = _Lists.newArrayList();
+ for (RootOid rootOid : rootOids) {
+ // attempt to locate adapter for the Oid
+ ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(rootOid);
+ // handle view models or transient
+ if (adapter == null) {
+ if (rootOid.isTransient() || rootOid.isViewModel()) {
+ final Object pojo = holder.recreatePojoTransientOrViewModel(rootOid);
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ syncVersion(concurrencyChecking, adapter, rootOid);
+ }
+ }
+ if (adapter != null) {
+ adapterByOid.put(rootOid, adapter);
+ } else {
+ // persistent oid, to load in bulk
+ notYetLoadedOids.add(rootOid);
+ }
+ }
+
+ // recreate, in bulk, all those not yet loaded
+ final Map<RootOid, Object> pojoByOid = holder.loadPersistentPojos(notYetLoadedOids);
+ for (Map.Entry<RootOid, Object> entry : pojoByOid.entrySet()) {
+ final RootOid rootOid = entry.getKey();
+ final Object pojo = entry.getValue();
+ if(pojo != null) {
+ ObjectAdapter adapter;
+ try {
+ adapter = objectAdapterContext.addRecreatedPojoToCache(rootOid, pojo);
+ adapterByOid.put(rootOid, adapter);
+ } catch(ObjectNotFoundException ex) {
+ throw ex; // just rethrow
+ } catch(RuntimeException ex) {
+ throw new PojoRecreationException(rootOid, ex);
+ }
+ syncVersion(concurrencyChecking, adapter, rootOid);
+ } else {
+ // null indicates it couldn't be loaded
+ // do nothing here...
+ }
+ }
+
+ return adapterByOid;
+ }
+
+ private void syncVersion(
+ final ConcurrencyChecking concurrencyChecking,
+ final ObjectAdapter adapter, final RootOid rootOid) {
+ // sync versions of original, with concurrency checking if required
+ Oid adapterOid = adapter.getOid();
+ if(adapterOid instanceof RootOid) {
+ final RootOid recreatedOid = (RootOid) adapterOid;
+ final RootOid originalOid = rootOid;
+
+ try {
+ if(concurrencyChecking.isChecking()) {
+
+ // check for exception, but don't throw if suppressed through thread-local
+ final Version otherVersion = originalOid.getVersion();
+ final Version thisVersion = recreatedOid.getVersion();
+ if( thisVersion != null &&
+ otherVersion != null &&
+ thisVersion.different(otherVersion)) {
+
+ if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
+ LOG.info("concurrency conflict detected on {} ({})", recreatedOid, otherVersion);
+ final String currentUser = authenticationSession.getUserName();
+ throw new ConcurrencyException(currentUser, recreatedOid, thisVersion, otherVersion);
+ } else {
+ LOG.info("concurrency conflict detected but suppressed, on {} ({})", recreatedOid, otherVersion);
+ }
+ }
+ }
+ } finally {
+ final Version originalVersion = originalOid.getVersion();
+ final Version recreatedVersion = recreatedOid.getVersion();
+ if(recreatedVersion != null && (
+ originalVersion == null ||
+ recreatedVersion.different(originalVersion))
+ ) {
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("updating version in oid, on {} ({}) to ({})", originalOid, originalVersion, recreatedVersion);
+ }
+ originalOid.setVersion(recreatedVersion);
+ }
+ }
+ }
+ }
+
+
+
+
+}
+
+
+
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 3a17eeb..91a32a7 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -26,7 +26,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.exceptions.IsisException;
import org.apache.isis.core.commons.util.ToString;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -203,7 +203,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
otherVersion != null &&
thisVersion.different(otherVersion)) {
- if(AdapterManager.ConcurrencyChecking.isCurrentlyEnabled()) {
+ if(ConcurrencyChecking.isCurrentlyEnabled()) {
LOG.info("concurrency conflict detected on {} ({})", thisOid, otherVersion);
final String currentUser = authenticationSession.getUserName();
throw new ConcurrencyException(currentUser, thisOid, thisVersion, otherVersion);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
index eec9ef0..5807edf 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
@@ -35,7 +35,7 @@ import org.apache.isis.applib.annotation.PublishingChangeKind;
import org.apache.isis.applib.services.HasTransactionId;
import org.apache.isis.applib.services.WithTransactionScope;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.Contributed;
import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -228,7 +228,7 @@ public class ChangedObjectsServiceInternal implements WithTransactionScope {
}
private Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> capturePostValuesAndDrain(final Map<AdapterAndProperty, PreAndPostValues> changedObjectProperties) {
- return AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Set<Map.Entry<AdapterAndProperty, PreAndPostValues>>>() {
+ return ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Callable<Set<Map.Entry<AdapterAndProperty, PreAndPostValues>>>() {
@Override
public Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> call() {
final Map<AdapterAndProperty, PreAndPostValues> processedObjectProperties = Maps.newLinkedHashMap();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 8f53003..1df596c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.runtime.system.persistence;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
import javax.jdo.PersistenceManager;
@@ -29,20 +28,18 @@ import org.apache.isis.core.commons.components.SessionScopedComponent;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.core.runtime.persistence.objectstore.transaction.PersistenceCommand;
import org.apache.isis.core.runtime.persistence.objectstore.transaction.TransactionalResource;
import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterContext.MementoRecreateObjectSupport;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
-public interface PersistenceSession extends ObjectAdapterProvider, TransactionalResource, SessionScopedComponent {
+public interface PersistenceSession extends ObjectAdapterProvider.Delegating, TransactionalResource, SessionScopedComponent {
// -- CONSTANTS
@@ -62,38 +59,32 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
*/
public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
-
- // -- OBJECT ADAPTER PROVIDER
-
- ObjectAdapterProvider getObjectAdapterProvider();
- default ObjectAdapter adapterFor(Object domainObject) {
- return getObjectAdapterProvider().adapterFor(domainObject);
- }
- default ObjectAdapter adapterFor(
- final Object pojo,
- final ObjectAdapter parentAdapter,
- OneToManyAssociation collection) {
- return getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
- }
- default ObjectSpecification specificationForViewModel(final Object viewModelPojo) {
- return getObjectAdapterProvider().specificationForViewModel(viewModelPojo);
- }
- default ObjectAdapter adapterForViewModel(
- final Object viewModelPojo,
- final Function<ObjectSpecId, RootOid> rootOidFactory) {
- return getObjectAdapterProvider().adapterForViewModel(viewModelPojo, rootOidFactory);
- }
-
//---
-
+
MementoRecreateObjectSupport mementoSupport();
-
- ObjectAdapter adapterFor(RootOid rootOid);
- ObjectAdapter adapterFor(RootOid oid, AdapterManager.ConcurrencyChecking concurrencyChecking);
+
+ ObjectAdapter adapterFor(RootOid rootOid, ConcurrencyChecking concurrencyChecking);
+ Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids, ConcurrencyChecking concurrencyChecking);
ObjectAdapter adapterForAny(RootOid rootOid);
- Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids);
<T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
+ /**
+ * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
+ * {@link ConcurrencyChecking#NO_CHECK no checking}.
+ *
+ * <p>
+ * This method will <i>always</i> return an object, possibly indicating it is persistent; so make sure that you
+ * know that the oid does indeed represent an object you know exists.
+ * </p>
+ */
+ default ObjectAdapter adapterFor(final RootOid rootOid) {
+ return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
+ }
+
+ default Map<RootOid, ObjectAdapter> adaptersFor(List<RootOid> rootOids) {
+ return adaptersFor(rootOids, ConcurrencyChecking.NO_CHECK);
+ }
+
// --
void close();
@@ -126,8 +117,6 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
return getPersistenceManager();
}
- List<ObjectAdapter> getServices();
-
ServicesInjector getServicesInjector();
IsisTransactionManager getTransactionManager();
@@ -174,10 +163,10 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
void refreshRoot(ObjectAdapter adapter);
void resolve(Object parent);
-
+
boolean isTransient(Object pojo);
boolean isRepresentingPersistent(Object pojo);
boolean isDestroyed(Object pojo);
-
+
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index fc14368..6fc8284 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -92,9 +92,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
*/
protected final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = _Maps.newHashMap();
-
- protected final boolean concurrencyCheckingGloballyEnabled;
-
// -- CONSTRUCTOR
/**
@@ -137,11 +134,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
this.transactionManager = new IsisTransactionManager(this, /*authenticationSession,*/ servicesInjector);
this.state = State.NOT_INITIALIZED;
-
- final boolean concurrencyCheckingGloballyDisabled =
- this.configuration.getBoolean("isis.persistor.disableConcurrencyChecking", false);
- this.concurrencyCheckingGloballyEnabled = !concurrencyCheckingGloballyDisabled;
-
}
// -- GETTERS
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index b002242..0a37968 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -443,7 +443,15 @@ public class ObjectAdapterContext {
return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
}
-
+ /**
+ * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+ */
+ @Deprecated
+ public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
+ removeAdapterFromCache(adapter);
+ adapter.replacePojo(pojo);
+ mapAndInjectServices(adapter);
+ }
}
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 90351bb..483b2ab 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -18,16 +18,19 @@
*/
package org.apache.isis.core.runtime.system.persistence.adaptermanager;
+import java.util.List;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -43,6 +46,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectAdapterProvider.class);
private final ObjectAdapterContext objectAdapterContext;
private final PersistenceSession persistenceSession;
+ private final ServicesInjector servicesInjector;
private final SpecificationLoader specificationLoader;
private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin;
@@ -50,7 +54,8 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
PersistenceSession persistenceSession) {
this.objectAdapterContext = objectAdapterContext;
this.persistenceSession = persistenceSession;
- this.specificationLoader = persistenceSession.getServicesInjector().getSpecificationLoader();
+ this.servicesInjector = persistenceSession.getServicesInjector();
+ this.specificationLoader = servicesInjector.getSpecificationLoader();
this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
}
@@ -111,6 +116,20 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
return adapter;
}
+ @Override
+ public List<ObjectAdapter> getServices() {
+ final List<Object> services = servicesInjector.getRegisteredServices();
+ final List<ObjectAdapter> serviceAdapters = _Lists.newArrayList();
+ for (final Object servicePojo : services) {
+ ObjectAdapter serviceAdapter = objectAdapterContext.lookupAdapterFor(servicePojo);
+ if(serviceAdapter == null) {
+ throw new IllegalStateException("ObjectAdapter for service " + servicePojo + " does not exist?!?");
+ }
+ serviceAdapters.add(serviceAdapter);
+ }
+ return serviceAdapters;
+ }
+
// -- HELPER
private ObjectAdapter existingOrValueAdapter(Object pojo) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
index f81a169..9577ef1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/RootAndCollectionAdapters.java
@@ -28,7 +28,6 @@ import com.google.common.collect.Maps;
import org.apache.isis.core.commons.ensure.Assert;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -37,7 +36,7 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
/**
* A root {@link ObjectAdapter adapter} along with aggregated {@link ObjectAdapter adapters}
* for any of its {@link OneToManyAssociation collection}s that are currently present in
- * the {@link AdapterManager map}s.
+ * the {@link ObjectAdapterContext}s map.
*
* <p>
* Used for "impact analysis" when persisting transient root objects; all aggregated adapters
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
index 1142349..64d98b1 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionLayoutXmlDefaultTest.java
@@ -19,6 +19,11 @@
package org.apache.isis.core.runtime.system;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
import com.google.common.collect.Lists;
import org.jmock.Expectations;
@@ -31,7 +36,6 @@ import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.services.message.MessageService;
import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
import org.apache.isis.core.commons.config.IsisConfigurationDefault;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.facets.FacetedMethod;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
@@ -42,11 +46,6 @@ import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
public class ObjectActionLayoutXmlDefaultTest {
@Rule
@@ -62,8 +61,8 @@ public class ObjectActionLayoutXmlDefaultTest {
private AuthenticationSessionProvider mockAuthenticationSessionProvider;
@Mock
private SpecificationLoader mockSpecificationLoader;
- @Mock
- private AdapterManager mockAdapterManager;
+// @Mock
+// private AdapterManager mockAdapterManager;
@Mock
private MessageService mockMessageService;
@Mock
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
index ff3ce43..0abe928 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
@@ -27,7 +27,7 @@ import org.apache.wicket.util.convert.IConverter;
import org.apache.isis.commons.internal.exceptions._Exceptions;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
index 063a88a..29fa24b 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/WebRequestCycleForIsis.java
@@ -55,7 +55,7 @@ import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerForType;
import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
@@ -104,7 +104,7 @@ public class WebRequestCycleForIsis extends AbstractRequestCycleListener {
{
if(handler instanceof RenderPageRequestHandler) {
- AdapterManager.ConcurrencyChecking.disable();
+ ConcurrencyChecking.disable();
final MetaModelInvalidException mmie = IsisContext.getMetaModelInvalidExceptionIfAny();
@@ -131,7 +131,7 @@ public class WebRequestCycleForIsis extends AbstractRequestCycleListener {
LOG.debug("onRequestHandlerExecuted: handler: {}", handler);
if(handler instanceof RenderPageRequestHandler) {
- AdapterManager.ConcurrencyChecking.reset(AdapterManager.ConcurrencyChecking.CHECK);
+ ConcurrencyChecking.reset(ConcurrencyChecking.CHECK);
}
if (getIsisSessionFactory().inSession()) {
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
index 0ad4b81..2ebf8bf 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ActionMemento.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.model.mementos;
import java.io.Serializable;
import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.ActionType;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index c303667..f4079cb 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -32,8 +32,7 @@ import org.apache.isis.applib.services.hint.HintStore;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.Oid;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -279,7 +278,7 @@ public class ObjectAdapterMemento implements Serializable {
*/
TRANSIENT {
/**
- * {@link AdapterManager.ConcurrencyChecking} is ignored for transients.
+ * {@link ConcurrencyChecking} is ignored for transients.
*/
@Override
ObjectAdapter recreateAdapter(
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index a6e767f..27d7602 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.value.LocalResourcePath;
import org.apache.isis.applib.value.NamedWithMimeType;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.consent.Consent;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 08d18c1..fafc912 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -35,7 +35,7 @@ import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.commons.factory.InstanceUtil;
import org.apache.isis.core.commons.lang.ClassUtil;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 153880f..318f41d 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -32,7 +32,7 @@ import org.apache.isis.applib.annotation.BookmarkPolicy;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.layout.component.CollectionLayoutData;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 94ec782..37abc9f 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -34,7 +34,7 @@ import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.consent.Consent;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index e3460b4..4193c65 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -23,7 +23,7 @@ import org.apache.wicket.model.Model;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
/**
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index 5567f50..2f4698e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -20,7 +20,7 @@
package org.apache.isis.viewer.wicket.model.models;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index 3919e52..23a111e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -29,7 +29,7 @@ import org.apache.wicket.request.IRequestHandler;
import org.apache.isis.applib.value.Blob;
import org.apache.isis.applib.value.Clob;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.facets.actcoll.typeof.ElementSpecificationProviderFromTypeOfFacet;
import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -167,7 +167,7 @@ public enum ActionResultResponseType {
// was throwing an exception when rebuild grid after invoking action
// not certain why that would be the case, but think it should be
// safe to simply disable while recreating the page to re-render back to user.
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
new Callable<EntityPage>() {
@Override public EntityPage call() throws Exception {
return new EntityPage(actualAdapter, exIfAny);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index 0012604..7a9589d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
index 441449c..1a53ee9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/LinkAndLabelUtil.java
@@ -26,7 +26,7 @@ import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
@@ -50,7 +50,7 @@ public final class LinkAndLabelUtil {
final EntityModel parentEntityModel = scalarModelForAssociation.getParentEntityModel();
- final ObjectAdapter parentAdapter = parentEntityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ final ObjectAdapter parentAdapter = parentEntityModel.load(ConcurrencyChecking.NO_CHECK);
final OneToOneAssociation oneToOneAssociation =
scalarModelForAssociation.getPropertyMemento().getProperty(scalarModelForAssociation.getSpecificationLoader());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
index 153abf5..60ceca2 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/CssMenuItem.java
@@ -35,7 +35,7 @@ import org.apache.wicket.model.Model;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.consent.Consent;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
@@ -356,7 +356,7 @@ class CssMenuItem implements Serializable {
final boolean separator = serviceAndAction.separator;
final ServiceActionLinkFactory actionLinkFactory = serviceAndAction.linkAndLabelFactory;
- final ObjectAdapter serviceAdapter = targetEntityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ final ObjectAdapter serviceAdapter = targetEntityModel.load(ConcurrencyChecking.NO_CHECK);
final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
if (serviceSpec.isHidden()) {
return null;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
index b38d224..10ce792 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionLinkFactory.java
@@ -22,7 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.actionmenu.serviceactions;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
index 56717c9..483ba3a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
@@ -27,7 +27,7 @@ import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.spec.ActionType;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -72,7 +72,7 @@ public class AssociatedWithActionsHelper implements Serializable {
private ObjectSpecification getObjectSpecification(final IsisSessionFactory isisSessionFactory) {
final ObjectAdapterMemento parentOam = collectionModel.getParentObjectAdapterMemento();
final ObjectAdapter parentAdapter = parentOam.getObjectAdapter(
- AdapterManager.ConcurrencyChecking.NO_CHECK,
+ ConcurrencyChecking.NO_CHECK,
isisSessionFactory.getCurrentSession().getPersistenceSession(),
isisSessionFactory.getSpecificationLoader());
return parentAdapter.getSpecification();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
index b8fc79e..d00e2ac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
@@ -30,7 +30,7 @@ import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
@@ -76,7 +76,7 @@ BulkActionsProvider {
final OneToManyAssociation otma = collectionModel.getCollectionMemento().getCollection(collectionModel.getSpecificationLoader());
final EntityModel entityModel = collectionModel.getEntityModel();
- final ObjectAdapter adapter = entityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ final ObjectAdapter adapter = entityModel.load(ConcurrencyChecking.NO_CHECK);
final List<ObjectAction> associatedActions =
ObjectAction.Util.findForAssociation(adapter, otma, getDeploymentCategory());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
index 6d5f320..0bfde98 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/bulk/BulkActionsLinkFactory.java
@@ -33,7 +33,7 @@ import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.authentication.MessageBroker;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.services.ServicesInjector;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index ea582a4..a9f13fa 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -36,7 +36,7 @@ import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.layout.grid.Grid;
import org.apache.isis.applib.services.tablecol.TableColumnOrderService;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.facetapi.Facet;
import org.apache.isis.core.metamodel.facets.WhereValueFacet;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
index 17f7709..0bceaf0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
@@ -28,7 +28,7 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulato
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.viewer.wicket.model.common.OnConcurrencyExceptionHandler;
import org.apache.isis.viewer.wicket.model.common.OnSelectionHandler;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
index 53ed51d..fa005b3 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
@@ -23,7 +23,7 @@ import org.apache.wicket.Component;
import org.apache.wicket.model.IModel;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
index 557fe46..6210a0d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
@@ -39,7 +39,7 @@ import org.apache.isis.applib.annotation.Where;
import org.apache.isis.applib.layout.component.FieldSet;
import org.apache.isis.applib.layout.component.PropertyLayoutData;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.ObjectSpecificationException;
@@ -154,7 +154,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
final List<PropertyLayoutData> properties = this.fieldSet.getProperties();
// changed to NO_CHECK because more complex BS3 layouts trip concurrency exception
// (haven't investigated as to why).
- final ObjectAdapter adapter = getModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ final ObjectAdapter adapter = getModel().load(ConcurrencyChecking.NO_CHECK);
return getObjectAssociations(properties, adapter);
}
@@ -223,7 +223,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
final Component component = getComponentFactoryRegistry()
.addOrReplaceComponent(container, ID_PROPERTY, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
- final ObjectAdapter adapter = entityModel.load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ final ObjectAdapter adapter = entityModel.load(ConcurrencyChecking.NO_CHECK);
final List<ObjectAction> associatedActions =
ObjectAction.Util.findForAssociation(adapter, otoa, getDeploymentCategory());
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index 5bf0981..19abdeb 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -30,7 +30,7 @@ import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.ResourceReference;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
index 1129be6..b2a3607 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyFormExecutorStrategy.java
@@ -24,7 +24,7 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
import org.apache.isis.viewer.wicket.ui.panels.FormExecutorStrategy;
@@ -81,7 +81,7 @@ public class PropertyFormExecutorStrategy implements FormExecutorStrategy<Scalar
// not certain why that would be the case, but (following similar code for action prompt)
// think it should be safe to simply disable while recreating the page to re-render back to user.
final EntityPage entityPage =
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
new Callable<EntityPage>() {
@Override public EntityPage call() throws Exception {
return new EntityPage(resultAdapter, null);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
index e3d5df0..031e3fd 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -22,7 +22,7 @@ import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
@@ -37,7 +37,7 @@ public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
super(id, model);
- ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ ObjectAdapter targetAdapter = model.getParentEntityModel().load(ConcurrencyChecking.NO_CHECK);
getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index cf3a427..3a43d4f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -37,7 +37,7 @@ import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.Where;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index ea35cf2..967df08 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -43,7 +43,7 @@ import org.apache.wicket.model.Model;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.PromptStyle;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
@@ -373,7 +373,7 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
if(facet != null) {
final ObjectAdapter parentAdapter =
- model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+ model.getParentEntityModel().load(ConcurrencyChecking.NO_CHECK);
final String cssClass = facet.cssClass(parentAdapter);
CssClassAppender.appendCssClassTo(this, cssClass);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index d8bba2b..ac142ce 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -34,7 +34,7 @@ import org.apache.wicket.validation.ValidationError;
import org.wicketstuff.select2.ChoiceProvider;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -216,7 +216,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
}
final ObjectAdapter proposedAdapter = proposedValue.getObjectAdapter(
- AdapterManager.ConcurrencyChecking.NO_CHECK,
+ ConcurrencyChecking.NO_CHECK,
getPersistenceSession(), getSpecificationLoader());
final String reasonIfAny = scalarModel.validate(proposedAdapter);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index a6fb350..9dbfc8f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -23,7 +23,7 @@ import java.util.List;
import org.apache.isis.commons.internal.collections._Lists;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
index 93bd41e..dbb6ca1 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
@@ -34,7 +34,7 @@ import org.wicketstuff.select2.Select2Choice;
import org.wicketstuff.select2.Settings;
import org.apache.isis.core.commons.authentication.MessageBroker;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
import org.apache.isis.core.metamodel.adapter.oid.RootOid;
import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
@@ -76,7 +76,7 @@ public class BreadcrumbPanel extends PanelAbstract<IModel<Void>> {
}
private String titleFor(final EntityModel model) {
- return model.getObjectAdapterMemento().getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK,
+ return model.getObjectAdapterMemento().getObjectAdapter(ConcurrencyChecking.NO_CHECK,
model.getPersistenceSession(), model.getSpecificationLoader()).titleString(null);
}
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
index 680a1b1..7831d2f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
@@ -24,7 +24,7 @@ import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.FormComponentPanel;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentFactory;
import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -48,7 +48,7 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
// this is a bit of a hack, but getting a concurrency exception when click on a tab
// which simply holds a newly modified reference.
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Runnable() {
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(new Runnable() {
@Override
public void run() {
buildGui();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index 8ca8128..1f64308 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -36,7 +36,7 @@ import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.isis.applib.annotation.PromptStyle;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.postprocessors.param.ActionParameterDefaultsFacetFromAssociatedCollection;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -114,7 +114,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
return null;
}
final ObjectAdapter objectAdapter = input.getObjectAdapter(
- AdapterManager.ConcurrencyChecking.NO_CHECK,
+ ConcurrencyChecking.NO_CHECK,
persistenceSession, specificationLoader);
return objectAdapter != null ? objectAdapter.getObject() : null;
}
@@ -173,7 +173,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
// REVIEW: I wonder if this is still needed after the ISIS-1613 rework?
final ActionPromptHeaderPanel titlePanel =
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
new Callable<ActionPromptHeaderPanel>() {
@Override
public ActionPromptHeaderPanel call() throws Exception {
@@ -239,7 +239,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
// was throwing an exception when rebuild grid after invoking action
// not certain why that would be the case, but think it should be
// safe to simply disable while recreating the page to re-render back to user.
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
new Callable<EntityPage>() {
@Override public EntityPage call() throws Exception {
return new EntityPage(targetAdapter, null);
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index 9d8b1fe..ba95c6f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -28,7 +28,7 @@ import org.apache.wicket.util.string.Strings;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.system.context.IsisContext;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 3b0816b..ee2fd89 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -24,7 +24,7 @@ import org.apache.wicket.markup.html.form.IFormSubmitter;
import org.apache.wicket.model.IModel;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index e40b060..4ddd22b 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -46,7 +46,7 @@ import org.apache.isis.applib.services.message.MessageService;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.authentication.MessageBroker;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -316,7 +316,7 @@ implements FormExecutor {
// was throwing an exception when rebuild grid after invoking action
// not certain why that would be the case, but think it should be
// safe to simply disable while recreating the page to re-render back to user.
- AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+ ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
new Callable<EntityPage>() {
@Override public EntityPage call() throws Exception {
return new EntityPage(targetAdapter, ex);