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