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/08 23:13:47 UTC

[isis] 06/06: ISIS-1976: let OAs for values also have an Oid

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 2ce76eb32b2e1d363b8957d3e28cd4086dd499af
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Sep 9 01:10:04 2018 +0200

    ISIS-1976: let OAs for values also have an Oid
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/core/metamodel/adapter/oid/Oid.java       |  19 ++-
 .../isis/core/metamodel/adapter/oid/RootOid.java   |   4 -
 .../runtime/persistence/adapter/PojoAdapter.java   |  12 +-
 .../PersistenceSessionServiceInternalDefault.java  |   4 +-
 .../adaptermanager/ObjectAdapterContext.java       |   2 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java | 132 ++-------------------
 .../persistence/adaptermanager/OidProviders.java   |  21 +---
 .../model/mementos/ObjectAdapterMemento.java       |   5 -
 8 files changed, 27 insertions(+), 172 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
index 0b9a201..e087e12 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
@@ -59,16 +59,15 @@ public interface Oid extends Encodable {
     boolean isViewModel();
 
     boolean isPersistent();
+    
+    default boolean isValue() {
+        return false;
+    }
 
     public static enum State {
-        PERSISTENT("P"),
-        TRANSIENT("T"),
-        VIEWMODEL("V");
-
-        private final String code;
-        private State(final String code) {
-            this.code = code;
-        }
+        PERSISTENT,
+        TRANSIENT,
+        VIEWMODEL;
 
         public boolean isTransient() {
             return this == TRANSIENT;
@@ -80,10 +79,6 @@ public interface Oid extends Encodable {
             return this == PERSISTENT;
         }
 
-        public String getCode() {
-            return code;
-        }
-
         public static State from(final Bookmark bookmark) {
             final Bookmark.ObjectState objectState = bookmark.getObjectState();
             return from(objectState);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
index 2f67f7e..7cbb26d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
@@ -284,10 +284,6 @@ public class RootOid implements TypedOid, Serializable {
 
     // -- ROOT-ID SUPPORT FOR VALUE
     
-    public boolean isValue() {
-        return false;
-    }
-    
     private RootOid() { identifier=null; objectSpecId=null; state=null; };
     
     private static final RootOid VALUE_OID = new RootOid() {
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 a83c9a8..da29ebe 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
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.runtime.persistence.adapter;
 
+import static org.apache.isis.commons.internal.base._With.requires;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,13 +54,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
     private final SpecificationLoader specificationLoader;
     private final PersistenceSession persistenceSession;
 
-    /**
-     * can be {@link #replacePojo(Object) replace}d.
-     */
     private final Object pojo;
-    /**
-     * can be {@link #replaceOid(Oid) replace}d.
-     */
     private final Oid oid;
 
     /**
@@ -81,7 +77,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
             throw new IsisException("Adapter can't be used to adapt an adapter: " + pojo);
         }
         this.pojo = pojo;
-        this.oid = oid;
+        this.oid = requires(oid, "oid");
     }
     
     // -- getSpecification
@@ -122,7 +118,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
     @Override
     public boolean isValue() {
-        return oid == null;
+        return oid.isValue();
     }
 
     // -- isTransient, representsPersistent, isDestroyed
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
index f7d944c..5ee3b82 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/persistsession/PersistenceSessionServiceInternalDefault.java
@@ -89,11 +89,11 @@ public class PersistenceSessionServiceInternalDefault implements PersistenceSess
     @Override
     public Bookmark bookmarkFor(Object domainObject) {
         final ObjectAdapter adapter = getPersistenceSession().adapterFor(domainObject);
-        final Oid oid = adapter.getOid();
-        if(oid == null) {
+        if(adapter.isValue()) {
             // values cannot be bookmarked
             return null;
         }
+        final Oid oid = adapter.getOid();
         if(!(oid instanceof RootOid)) {
             // must be root
             return null;
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 fa273bc..c43ec56 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
@@ -139,7 +139,7 @@ public class ObjectAdapterContext {
             PersistenceSession persistenceSession) {
         
         this.consistencyMixin = new ObjectAdapterContext_Consistency(this);
-        this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession, authenticationSession);
+        this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, persistenceSession);
         this.adapterManagerMixin = new ObjectAdapterContext_AdapterManager(this, persistenceSession);
         this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
         this.serviceLookupMixin = new ObjectAdapterContext_ServiceLookup(this, servicesInjector);
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 3e1041f..e3c4cd9 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,8 +18,9 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
+import static org.apache.isis.commons.internal.base._With.requires;
+
 import java.util.List;
-import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -27,21 +28,15 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
-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;
 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.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.factories.OidFactory;
 
@@ -58,64 +53,40 @@ 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 AuthenticationSession authenticationSession;
     private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader; 
-    private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin;
     private final OidFactory oidFactory; 
     
     ObjectAdapterContext_ObjectAdapterProvider(ObjectAdapterContext objectAdapterContext,
-            PersistenceSession persistenceSession, AuthenticationSession authenticationSession) {
+            PersistenceSession persistenceSession) {
         this.objectAdapterContext = objectAdapterContext;
         this.persistenceSession = persistenceSession;
-        this.authenticationSession = authenticationSession;
         this.servicesInjector = persistenceSession.getServicesInjector();
         this.specificationLoader = servicesInjector.getSpecificationLoader();
-        this.isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
         
         this.oidFactory = OidFactory.builder(pojo->specificationLoader.loadSpecification(pojo.getClass()))
                 .add(new OidProviders.OidForServices())
                 .add(new OidProviders.OidForValues())
                 .add(new OidProviders.OidForViewModels())
                 .add(new OidProviders.OidForPersistables())
-                .add(new OidProviders.OidForMixins())
-                .add(new OidProviders.OidForStandaloneCollections())
+                .add(new OidProviders.OidForOthers())
                 .build();
     }
 
-//    @Override
-//    public Oid oidFor(Object pojo) {
-//        if(pojo == null) {
-//            return null;
-//        }
-//        final Oid persistentOrValueOid = persistentOrValueOid(pojo);
-//        if(persistentOrValueOid != null) {
-//            return persistentOrValueOid;
-//        }
-//        final RootOid rootOid = objectAdapterContext.rootOidFor(pojo);
-//        
-//        return rootOid;
-//    }
-    
     @Override
     public ObjectAdapter adapterFor(Object pojo) {
-        
+
         if(pojo == null) {
             return null;
         }
-        
+
         final  ObjectAdapter existing = objectAdapterContext.lookupAdapterByPojo(pojo);
         if (existing != null) {
             return existing;
         }
         
         final RootOid rootOid = oidFactory.oidFor(pojo);
-        if(rootOid.isValue()) {
-            return objectAdapterContext.getFactories().createRootAdapter(pojo, null); 
-        }
-        
         final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
-
         return objectAdapterContext.mapAndInjectServices(newAdapter);
     }
     
@@ -123,12 +94,12 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
     @Override
     public ObjectAdapter adapterFor(Object pojo, ObjectAdapter parentAdapter, OneToManyAssociation collection) {
 
-        assert parentAdapter != null;
-        assert collection != null;
+        requires(parentAdapter, "parentAdapter");
+        requires(collection, "collection");
 
-        final ObjectAdapter existingOrValueAdapter = existingOrValueAdapter(pojo);
-        if(existingOrValueAdapter != null) {
-            return existingOrValueAdapter;
+        final  ObjectAdapter existing = objectAdapterContext.lookupAdapterByPojo(pojo);
+        if (existing != null) {
+            return existing;
         }
 
         objectAdapterContext.ensureMapsConsistent(parentAdapter);
@@ -184,86 +155,5 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
         .collect(Collectors.toList());
     }
     
-//    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;
-//    }
-    
-//    private Oid persistentOid(final Object pojo) {
-//        if (persistenceSession.getPersistenceManager().getObjectId(pojo) == null) {
-//            return null;
-//        }
-//        final RootOid oid = objectAdapterContext.createPersistentOrViewModelOid(pojo);
-//        return oid;
-//    }
-    
-    private ObjectAdapter existingOrValueAdapter(Object pojo) {
-
-        // attempt to locate adapter for the pojo
-        ObjectAdapter adapter = objectAdapterContext.lookupAdapterByPojo(pojo);
-        if (adapter != null) {
-            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 (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?
-        } 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;
-    }
-
-
-    
    
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
index e01e83e..afcd193 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
@@ -79,11 +79,11 @@ public class OidProviders {
 
     }
     
-    public static class OidForMixins implements OidProvider {
+    public static class OidForOthers implements OidProvider {
 
         @Override
         public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return spec.isMixin();
+            return true; // try to handle anything
         }
 
         @Override
@@ -95,22 +95,5 @@ public class OidProviders {
 
     }
     
-    public static class OidForStandaloneCollections implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return true; //FIXME spec.isParentedOrFreeCollection() && !spec.isParented();
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-            final String identifier = persistenceSession.identifierFor(pojo, Oid.State.TRANSIENT);
-            return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT);
-        }
-
-    }
-    
-    
 
 }
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 f422f28..243cbac 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
@@ -432,11 +432,6 @@ public class ObjectAdapterMemento implements Serializable {
         }
 
         final RootOid oid = (RootOid) adapter.getOid();
-        
-        if(oid==null) {
-            System.out.println("!!! "+adapter.getSpecification());
-        }
-        
         if (oid.isTransient()) {
             transientMemento = new Memento(adapter);
             type = Type.TRANSIENT;