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 20:26:01 UTC
[isis] 19/24: ISIS-1976: decouple implementations of
PersistenceSession and ObjcetAdapterProvider from each other
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 a7ccf6aa8a94de1dc26741f2027b75fd3c6390ae
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 4 08:04:49 2018 +0200
ISIS-1976: decouple implementations of PersistenceSession and
ObjcetAdapterProvider from each other
Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
.../system/persistence/PersistenceSession5.java | 30 +++++-----
.../persistence/PersistenceQueryFactory.java | 11 ++--
.../system/persistence/PersistenceSession.java | 6 +-
.../system/persistence/PersistenceSessionBase.java | 6 +-
.../adaptermanager/ObjectAdapterContext.java | 13 +++++
...bjectAdapterContext_ObjectAdapterProvider.java} | 66 ++++++++++++++--------
6 files changed, 81 insertions(+), 51 deletions(-)
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 9910f32..05ff2b7 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
@@ -131,7 +131,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
private ObjectAdapterContext objectAdapterContext;
- private PersistenceSession5_ObjectAdapterProvider objectAdapterProviderMixin;
/**
* Initialize the object store so that calls to this object store access
@@ -161,8 +160,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
}
objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector, authenticationSession, specificationLoader, this);
- objectAdapterProviderMixin = new PersistenceSession5_ObjectAdapterProvider(this, objectAdapterContext);
-
+
persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
final IsisLifecycleListener.PersistenceSessionLifecycleManagement psLifecycleMgmt = this;
@@ -837,15 +835,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
// -- lazilyLoaded
-
- ObjectAdapter mapPersistent(final Persistable pojo) {
- if (persistenceManager.getObjectId(pojo) == null) {
- return null;
- }
- final RootOid oid = createPersistentOrViewModelOid(pojo);
- final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
- return adapter;
- }
+//
+// 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
@@ -1421,7 +1419,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
* Create a new {@link Oid#isTransient() transient} {@link Oid} for the
* supplied pojo, uniquely distinguishable from any other {@link Oid}.
*/
- final RootOid createTransientOrViewModelOid(final Object pojo) {
+ @Override
+ public final RootOid createTransientOrViewModelOid(final Object pojo) {
return newIdentifier(pojo, Type.TRANSIENT);
}
@@ -1560,7 +1559,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=["
@@ -1687,10 +1686,9 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
@Override
public ObjectAdapterProvider getObjectAdapterProvider() {
- return objectAdapterProviderMixin;
+ return objectAdapterContext.getObjectAdapterProvider();
}
-
}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
index 42a2494..5ef2f09 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
@@ -19,14 +19,17 @@
package org.apache.isis.core.runtime.system.persistence;
import java.util.Map;
+import java.util.function.Function;
+
import com.google.common.collect.Maps;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
import org.apache.isis.applib.query.Query;
import org.apache.isis.applib.query.QueryDefault;
import org.apache.isis.applib.query.QueryFindAllInstances;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
@@ -38,10 +41,10 @@ public class PersistenceQueryFactory {
private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFactory.class);
private final SpecificationLoader specificationLoader;
- private final ObjectAdapterProvider adapterProvider;
+ private final Function<Object, ObjectAdapter> adapterProvider;
PersistenceQueryFactory(
- final ObjectAdapterProvider adapterProvider,
+ final Function<Object, ObjectAdapter> adapterProvider,
final SpecificationLoader specificationLoader) {
this.specificationLoader = specificationLoader;
this.adapterProvider = adapterProvider;
@@ -80,7 +83,7 @@ public class PersistenceQueryFactory {
for (final Map.Entry<String, Object> entry : argumentsByParameterName.entrySet()) {
final String parameterName = entry.getKey();
final Object argument = argumentsByParameterName.get(parameterName);
- final ObjectAdapter argumentAdapter = argument != null ? adapterProvider.adapterFor(argument) : null;
+ final ObjectAdapter argumentAdapter = argument != null ? adapterProvider.apply(argument) : null;
argumentsAdaptersByParameterName.put(parameterName, argumentAdapter);
}
return argumentsAdaptersByParameterName;
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 aade4e5..8f53003 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
@@ -98,6 +98,7 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
void close();
+ RootOid createTransientOrViewModelOid(Object pojo);
RootOid createPersistentOrViewModelOid(Object pojo);
ObjectAdapter createTransientInstance(ObjectSpecification spec);
@@ -121,7 +122,9 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
* Convenient equivalent to {@code getPersistenceManager()}.
* @return
*/
- PersistenceManager pm();
+ default PersistenceManager pm() {
+ return getPersistenceManager();
+ }
List<ObjectAdapter> getServices();
@@ -175,5 +178,6 @@ public interface PersistenceSession extends ObjectAdapterProvider, Transactional
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 f91f778..fc14368 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
@@ -132,7 +132,7 @@ abstract class PersistenceSessionBase implements PersistenceSession {
// sub-components
this.persistenceQueryFactory = new PersistenceQueryFactory(
- this.getObjectAdapterProvider(),
+ obj->this.getObjectAdapterProvider().adapterFor(obj),
this.specificationLoader);
this.transactionManager = new IsisTransactionManager(this, /*authenticationSession,*/ servicesInjector);
@@ -177,10 +177,6 @@ abstract class PersistenceSessionBase implements PersistenceSession {
return persistenceManager;
}
- @Override
- public PersistenceManager pm() {
- return persistenceManager;
- }
@Override
public IsisConfiguration getConfiguration() {
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 29855e3..f1dd2ad 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
@@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.ensure.IsisAssertException;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
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;
@@ -55,6 +56,7 @@ public class ObjectAdapterContext {
private final ServicesInjector servicesInjector;
private final SpecificationLoader specificationLoader;
private final ObjectAdapterContext_Consistency consistencyMixin;
+ private final ObjectAdapterContext_ObjectAdapterProvider objectAdapterProviderMixin;
private final ObjectAdapterContext_AdapterManager adapterManagerMixin;
private final ObjectAdapterContext_MementoSupport mementoSupportMixin;
@@ -65,6 +67,7 @@ public class ObjectAdapterContext {
PersistenceSession persistenceSession) {
this.consistencyMixin = new ObjectAdapterContext_Consistency(this);
+ this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession);
this.adapterManagerMixin = new ObjectAdapterContext_AdapterManager(this, persistenceSession);
this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
@@ -226,6 +229,16 @@ public class ObjectAdapterContext {
adapterManagerMixin.removeAdapterFromCache(adapter);
}
+ // -- OBJECT ADAPTER PROVIDER SUPPORT
+
+ public ObjectAdapter addPersistentToCache(final Object pojo) {
+ return objectAdapterProviderMixin.addPersistentToCache(pojo);
+ }
+
+ public ObjectAdapterProvider getObjectAdapterProvider() {
+ return objectAdapterProviderMixin;
+ }
+
// -- MEMENTO SUPPORT
public static interface MementoRecreateObjectSupport {
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
similarity index 66%
rename from core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 5c8b85d..90351bb 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -16,14 +16,14 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.isis.core.runtime.system.persistence;
+package org.apache.isis.core.runtime.system.persistence.adaptermanager;
import java.util.function.Function;
-import org.datanucleus.enhancement.Persistable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+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;
@@ -31,25 +31,31 @@ import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
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.persistence.adaptermanager.ObjectAdapterContext;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterProvider {
-
- private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5_ObjectAdapterProvider.class);
-
- protected final PersistenceSession5 holder;
- protected final ObjectAdapterContext objectAdapterContext;
-
- // -- open
-
- PersistenceSession5_ObjectAdapterProvider(PersistenceSession5 holder, ObjectAdapterContext objectAdapterContext) {
- this.holder = holder;
+/**
+ *
+ * @since 2.0.0-M2
+ */
+class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvider {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterContext_ObjectAdapterProvider.class);
+ private final ObjectAdapterContext objectAdapterContext;
+ private final PersistenceSession persistenceSession;
+ private final SpecificationLoader specificationLoader;
+ private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin;
+
+ ObjectAdapterContext_ObjectAdapterProvider(ObjectAdapterContext objectAdapterContext,
+ PersistenceSession persistenceSession) {
this.objectAdapterContext = objectAdapterContext;
+ this.persistenceSession = persistenceSession;
+ this.specificationLoader = persistenceSession.getServicesInjector().getSpecificationLoader();
+ this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
}
@Override
public ObjectAdapter adapterFor(Object pojo) {
- //return holder.getObjectAdapterProvider().adapterFor(pojo);
if(pojo == null) {
return null;
@@ -60,7 +66,7 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
}
// Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
- final RootOid rootOid = holder.createTransientOrViewModelOid(pojo);
+ final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
return objectAdapterContext.mapAndInjectServices(newAdapter);
@@ -68,7 +74,6 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
@Override
public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) {
- //return holder.getObjectAdapterProvider().adapterFor(pojo, parentAdapter, collection);
assert parentAdapter != null;
assert collection != null;
@@ -97,9 +102,18 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
return objectAdapterContext.adapterForViewModel(viewModelPojo, rootOidFactory);
}
+ protected ObjectAdapter addPersistentToCache(final Object pojo) {
+ if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) {
+ return null;
+ }
+ final RootOid oid = persistenceSession.createPersistentOrViewModelOid(pojo);
+ final ObjectAdapter adapter = objectAdapterContext.addRecreatedPojoToCache(oid, pojo);
+ return adapter;
+ }
+
// -- HELPER
- protected ObjectAdapter existingOrValueAdapter(Object pojo) {
+ private ObjectAdapter existingOrValueAdapter(Object pojo) {
// attempt to locate adapter for the pojo
ObjectAdapter adapter = objectAdapterContext.lookupAdapterByPojo(pojo);
@@ -107,9 +121,12 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
return adapter;
}
+ // equivalent to isInstanceOfPersistable = pojo instanceof Persistable;
+ final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
+
// pojo may have been lazily loaded by object store, but we haven't yet seen it
- if (pojo instanceof Persistable) {
- adapter = holder.mapPersistent((Persistable) pojo);
+ if (isInstanceOfPersistable) {
+ adapter = addPersistentToCache(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?
@@ -122,7 +139,7 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
}
// need to create (and possibly map) the adapter.
- final ObjectSpecification objSpec = holder.specificationLoader.loadSpecification(pojo.getClass());
+ final ObjectSpecification objSpec = specificationLoader.loadSpecification(pojo.getClass());
// we create value facets as standalone (so not added to maps)
if (objSpec.containsFacet(ValueFacet.class)) {
@@ -134,7 +151,6 @@ public class PersistenceSession5_ObjectAdapterProvider implements ObjectAdapterP
}
-}
-
-
-
+
+
+}
\ No newline at end of file