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/06 16:12:53 UTC

[isis] 06/18: ISIS-1976: prepare removal of OA's lookup by pojo map

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 b3e78b7d479aa168a89e48261ffa759a7e178e78
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 5 18:21:35 2018 +0200

    ISIS-1976: prepare removal of OA's lookup by pojo map
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../metamodel/adapter/ObjectAdapterProvider.java   | 17 ++++++-
 ...ObjectAdapterContext_ObjectAdapterProvider.java | 57 ++++++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)

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 ba81787..e799f5d 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
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.function.Function;
 
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -36,6 +37,12 @@ public interface ObjectAdapterProvider {
     // -- INTERFACE
 
     /**
+     * @param pojo
+     * @return oid for the given domain object 
+     */
+    Oid oidFor(Object domainObject);
+    
+    /**
      * @return standalone (value) or root adapter
      */
     ObjectAdapter adapterFor(Object domainObject);
@@ -44,7 +51,7 @@ public interface ObjectAdapterProvider {
      * @return collection adapter.
      */
     ObjectAdapter adapterFor(
-            final Object pojo,
+            final Object domainObject,
             final ObjectAdapter parentAdapter,
             OneToManyAssociation collection);
 
@@ -72,6 +79,11 @@ public interface ObjectAdapterProvider {
         ObjectAdapterProvider getObjectAdapterProvider();
         
         @Programmatic
+        default Oid oidFor(Object domainObject) {
+            return getObjectAdapterProvider().oidFor(domainObject);
+        }
+        
+        @Programmatic
         default ObjectAdapter adapterFor(Object domainObject) {
             return getObjectAdapterProvider().adapterFor(domainObject);
         }
@@ -102,6 +114,9 @@ public interface ObjectAdapterProvider {
         }
         
     }
+
+
+    
     
 
 }
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 f54643d..ba820e3 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
@@ -28,6 +28,7 @@ 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.Oid;
 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;
@@ -63,6 +64,20 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
     }
 
     @Override
+    public Oid oidFor(Object pojo) {
+        if(pojo == null) {
+            return null;
+        }
+        final Oid persistentOrValueOid = persistentOrValueOid(pojo);
+        if(persistentOrValueOid != null) {
+            return persistentOrValueOid;
+        }
+        // Creates a new transient root for the supplied domain object
+        final RootOid rootOid = persistenceSession.createTransientOrViewModelOid(pojo);
+        return rootOid;
+    }
+    
+    @Override
     public ObjectAdapter adapterFor(Object pojo) {
         
         if(pojo == null) {
@@ -135,6 +150,48 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
     
     // -- HELPER
     
+    private Oid persistentOrValueOid(Object pojo) {
+        
+        Oid oid;
+
+        // 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 (isInstanceOfPersistable) {
+            oid = persistentOid(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 {
+            oid = null;
+        }
+
+        if(oid != null) {
+            return oid;
+        }
+        
+        // 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)) {
+            //TODO[ISIS-1976] don't need an adapter, just its oid
+            oid = objectAdapterContext.getFactories().createStandaloneAdapter(pojo).getOid(); 
+            return oid;
+        }
+
+        return null;
+    }
+    
+    protected Oid persistentOid(final Object pojo) {
+        if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) {
+            return null;
+        }
+        final RootOid oid = persistenceSession.createPersistentOrViewModelOid(pojo);
+        return oid;
+    }
+    
     private ObjectAdapter existingOrValueAdapter(Object pojo) {
 
         // attempt to locate adapter for the pojo