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 2020/01/15 12:30:19 UTC

[isis] branch master updated: ISIS-2158: remove Oid.isTransient()

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 9c8235d  ISIS-2158: remove Oid.isTransient()
9c8235d is described below

commit 9c8235d4b9f7d67778bf6f8b938f7aab119b1125
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Jan 15 13:30:05 2020 +0100

    ISIS-2158: remove Oid.isTransient()
---
 .../isis/core/metamodel/adapter/oid/Oid.java       |  6 ---
 .../objectadapter/ObjectAdapterContext.java        |  4 +-
 ...ctAdapterContext_ObjectAdapterByIdProvider.java | 17 +------
 .../persistence/PersistenceSession5.java           | 20 ++++----
 .../viewer/wicket/model/models/ActionModel.java    | 10 ++--
 .../viewer/services/mementos/ObjectMarshaller.java |  2 +-
 .../services/mementos/ObjectMementoLegacy.java     | 59 +---------------------
 .../services/mementos/ObjectUnmarshaller.java      | 49 ++++++++----------
 8 files changed, 40 insertions(+), 127 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 bd53147..c2ba21e 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
@@ -45,12 +45,6 @@ public interface Oid extends Serializable {
         return false; // default, only overridden by Oid_Value
     }
     
-    @Deprecated
-    default boolean isTransient() {
-        return false;
-    }
-
-    
     /**
      * {@link ObjectSpecId} of the domain object this instance is representing, or when parented,
      * the ObjectSpecId of the parent domain object. When representing a value returns {@code null}.   
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
index ebebdf7..39fe8f1 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
@@ -238,9 +238,7 @@ final public class ObjectAdapterContext {
 
         Objects.requireNonNull(persistentOid);
         _Assert.assertFalse("expected to not be a parented collection", rootAdapter.isParentedCollection());
-        if(persistentOid.isTransient()) {
-            throw _Exceptions.unrecoverable("hintRootOid must be persistent");
-        }
+        
         final ObjectSpecId hintRootOidObjectSpecId = persistentOid.getObjectSpecId();
         final ObjectSpecId adapterObjectSpecId = rootAdapter.getSpecification().getSpecId();
         if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_ObjectAdapterByIdProvider.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_ObjectAdapterByIdProvider.java
index ad60571..73d8f98 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_ObjectAdapterByIdProvider.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext_ObjectAdapterByIdProvider.java
@@ -18,13 +18,7 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus5.objectadapter;
 
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Stream;
-
 import org.apache.isis.core.commons.internal.assertions._Assert;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.ObjectNotFoundException;
@@ -32,7 +26,6 @@ import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.PojoRecreationException;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.context.session.RuntimeContext;
@@ -192,15 +185,9 @@ class ObjectAdapterContext_ObjectAdapterByIdProvider  {
         final ObjectSpecification spec =
                 specificationLoader.lookupBySpecIdElseLoad(rootOid.getObjectSpecId());
         final Object pojo;
-        if(rootOid.isTransient()) {
-            pojo = objectAdapterContext.instantiateAndInjectServices(spec);
-        } else {
-            final String memento = rootOid.getIdentifier();
-            pojo = recreateViewModel(spec, memento);
-        }
-
+        final String memento = rootOid.getIdentifier();
+        pojo = recreateViewModel(spec, memento);
         _Assert.assertFalse("Pojo most likely should not be an Oid", (pojo instanceof Oid));
-
         return pojo;
     }
 
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 8f3be6c..a97f99c 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -740,11 +740,18 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      */
     @Override
     public void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(final Persistable pojo) {
-        final ObjectAdapter adapter = adapterFor(pojo);
+        val adapter = adapterFor(pojo);
+        
+        val state = ManagedObject._entityState(adapter);
 
-        final RootOid rootOid = (RootOid) adapter.getOid(); // ok since this is for a Persistable
+        if (state.isAttached()) {
+            // updating;
+            // the callback and transaction.enlist are done in the preDirty callback
+            // (can't be done here, as the enlist requires to capture the 'before' values)
+            CallbackFacet.Util.callCallback(adapter, UpdatedCallbackFacet.class);
+            objectAdapterContext.postLifecycleEventIfRequired(adapter, UpdatedLifecycleEventFacet.class);
 
-        if (rootOid.isTransient()) {
+        } else {
             // persisting
 
             objectAdapterContext.asPersistent(adapter, this);
@@ -753,13 +760,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
             objectAdapterContext.postLifecycleEventIfRequired(adapter, PersistedLifecycleEventFacet.class);
 
             changedObjectsServiceInternal.enlistCreated(adapter);
-
-        } else {
-            // updating;
-            // the callback and transaction.enlist are done in the preDirty callback
-            // (can't be done here, as the enlist requires to capture the 'before' values)
-            CallbackFacet.Util.callCallback(adapter, UpdatedCallbackFacet.class);
-            objectAdapterContext.postLifecycleEventIfRequired(adapter, UpdatedLifecycleEventFacet.class);
         }
         
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 5c2c99d..fa5e5084 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -69,11 +69,11 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
 import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PageParameterNames;
-import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 
 import lombok.val;
 
@@ -274,12 +274,8 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For
             PageParameters pageParameters) {
         
         val rootOid = oidFor(pageParameters);
-        if(rootOid.isTransient()) {
-            return null;
-        } else {
-            val memento = commonContext.mementoFor(rootOid);
-            return EntityModel.ofMemento(commonContext, memento);
-        }
+        val memento = commonContext.mementoFor(rootOid);
+        return EntityModel.ofMemento(commonContext, memento);
     }
 
     private static RootOid oidFor(final PageParameters pageParameters) {
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMarshaller.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMarshaller.java
index 80ffd47..000a0cf 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMarshaller.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMarshaller.java
@@ -138,7 +138,7 @@ final class ObjectMarshaller {
 
         val refSpec = referencedAdapter.getSpecification();
         
-        if (refSpec.isParented() || refOid.isTransient()) {
+        if (refSpec.isParented()) {
             
             if(!oids.contains(refOid)) {
                 oids.add(refOid);
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
index ca8ed36..9871136 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectMementoLegacy.java
@@ -27,9 +27,7 @@ import java.util.function.Function;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.hint.HintStore;
-import org.apache.isis.core.commons.internal.assertions._Assert;
 import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.commons.internal.memento._Mementos.Memento;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -292,47 +290,8 @@ final class ObjectMementoLegacy implements Serializable {
                 return oam.persistentOidStr;
             }
 
-        },
-        /**
-         * Uses Isis' own {@link Memento}, to capture the state of a transient
-         * object.
-         */
-        TRANSIENT {
-            /**
-             * {@link ConcurrencyChecking} is ignored for transients.
-             */
-            @Override
-            public ManagedObject recreateObject(
-                    ObjectMementoLegacy memento,
-                    ObjectUnmarshaller objectUnmarshaller, 
-                    SpecificationLoader specificationLoader) {
-                
-                return objectUnmarshaller.recreateObject(memento.transientMemento);
-            }
-
-            @Override
-            public boolean equals(ObjectMementoLegacy oam, ObjectMementoLegacy other) {
-                return other.recreateStrategy == TRANSIENT && oam.transientMemento.equals(other.transientMemento);
-            }
-
-            @Override
-            public int hashCode(ObjectMementoLegacy oam) {
-                return oam.transientMemento.hashCode();
-            }
-
-            @Override
-            public String toString(final ObjectMementoLegacy oam) {
-                return oam.transientMemento.toString();
-            }
-
-            @Override
-            public void resetVersion(
-                    ObjectMementoLegacy memento,
-                    ObjectUnmarshaller objectUnmarshaller,
-                    SpecificationLoader specificationLoader) {
-            }
         };
-
+        
         public abstract ManagedObject recreateObject(
                 ObjectMementoLegacy memento,
                 ObjectUnmarshaller objectUnmarshaller,
@@ -398,14 +357,6 @@ final class ObjectMementoLegacy implements Serializable {
     private String hintId;
 
     /**
-     * The current value, if {@link RecreateStrategy#TRANSIENT}, will be <tt>null</tt> otherwise.
-     *
-     * <p>
-     * Also, populated only if {@link #getCardinality() sort} is {@link Cardinality#SCALAR scalar}
-     */
-    private Data transientMemento;
-
-    /**
      * populated only if {@link #getCardinality() sort} is {@link Cardinality#VECTOR vector}
      */
     private ArrayList<ObjectMementoLegacy> list;
@@ -433,8 +384,6 @@ final class ObjectMementoLegacy implements Serializable {
         } 
         // -- //
 
-        _Assert.assertFalse("expected not to be transient", rootOid.isTransient());
-
         this.cardinality = Cardinality.SCALAR;
 
         this.persistentOidStr = rootOid.enString();
@@ -477,12 +426,6 @@ final class ObjectMementoLegacy implements Serializable {
         }
 
         val rootOid = (RootOid) ManagedObject._identify(adapter);
-        if (rootOid.isTransient()) {
-            transientMemento = new ObjectMarshaller().toData(adapter);
-            recreateStrategy = RecreateStrategy.TRANSIENT;
-            return;
-        }
-
         persistentOidStr = rootOid.enString();
         bookmark = rootOid.asBookmark();
         if(adapter.getPojo() instanceof HintStore.HintIdProvider) {
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectUnmarshaller.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectUnmarshaller.java
index 5f22e6d..5504c18 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectUnmarshaller.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/services/mementos/ObjectUnmarshaller.java
@@ -87,12 +87,17 @@ final class ObjectUnmarshaller {
                     IsisSession.currentOrElseNull());
 
         } else {
-            _Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
+            _Assert.assertTrue("oid must be a RootOid representing an object because spec "
+                    + "is not a collection and cannot be a value", oid instanceof RootOid);
             RootOid typedOid = (RootOid) oid;
             // recreate an adapter for the original OID
             adapter = adapterForOid(typedOid);
 
-            updateObject(adapter, data);
+            if (!(data instanceof ObjectData)) {
+                throw new IsisException("Expected ObjectData but got " + data.getClass());
+            }
+            
+            updateObject(adapter, (ObjectData)data);
         }
 
         if (log.isDebugEnabled()) {
@@ -123,8 +128,9 @@ final class ObjectUnmarshaller {
         val referencedAdapter = adapterForOid(rootOid);
 
         if (data instanceof ObjectData) {
-            if (rootOid.isTransient()) {
-                updateObject(referencedAdapter, data);
+            val state = ManagedObject._entityState(referencedAdapter);
+            if (state.isDetached()) {
+                updateObject(referencedAdapter, (ObjectData)data);
             }
         }
         return referencedAdapter;
@@ -132,16 +138,14 @@ final class ObjectUnmarshaller {
 
 
 
-    private void updateObject(final ManagedObject adapter, final Data data) {
+    private void updateObject(final ManagedObject adapter, final ObjectData data) {
         
         val oid = objectManager.identifyObject(adapter);
         
         if (!Objects.equals(oid, data.getOid())) {
             throw new IllegalArgumentException(
-                    "This memento can only be used to update the ObjectAdapter with the Oid " + data.getOid() + " but is " + oid);
-        }
-        if (!(data instanceof ObjectData)) {
-            throw new IsisException("Expected ObjectData but got " + data.getClass());
+                    "This memento can only be used to update the ObjectAdapter with the Oid " 
+                            + data.getOid() + " but is " + oid);
         }
 
         updateFieldsAndResolveState(adapter, data);
@@ -167,32 +171,23 @@ final class ObjectUnmarshaller {
     private void updateFieldsAndResolveState(final ManagedObject adapter, final Data data) {
 
         val spec = adapter.getSpecification();
-        
-        boolean dataIsTransient = data.getOid().isTransient();
 
-        if (!dataIsTransient) {
-            updateFields(adapter, data);
+        val objectData = (ObjectData) data;
+        if (objectData.hasAnyField()) {
             
-        } else if (dataIsTransient 
-                && ManagedObject._entityState(adapter).isDetached()) {
-            updateFields(adapter, data);
-
-        } else if (spec.isParented()) {
-            // this branch is kind-a wierd, I think it's to handle aggregated adapters.
-            updateFields(adapter, data);
-
-        } else {
-            final ObjectData od = (ObjectData) data;
-            if (od.hasAnyField()) {
+            // TODO this is an experimental predicate, what's actually needed here?
+            if (spec.isValue() || spec.isParentedOrFreeCollection()) { 
                 throw _Exceptions.unrecoverableFormatted(
                         "Resolve state (for %s) inconsistent with fact that data exists for fields", 
-                        adapter); 
+                        spec); 
             }
+            
+            updateFields(adapter, objectData);
         }
+
     }
 
-    private void updateFields(final ManagedObject adapter, final Data state) {
-        val objectData = (ObjectData) state;
+    private void updateFields(final ManagedObject adapter, final ObjectData objectData) {
         
         adapter.getSpecification().streamAssociations(Contributed.EXCLUDED)
         .filter(field->{