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 2019/12/06 12:12:32 UTC

[isis] branch master updated: ISIS-2177: let have any Oid provide the specId (not just RootOid)

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 148171d  ISIS-2177: let have any Oid provide the specId (not just RootOid)
148171d is described below

commit 148171d8a7dd196a534d59c92c7e40ac143386c4
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Dec 6 13:12:19 2019 +0100

    ISIS-2177: let have any Oid provide the specId (not just RootOid)
---
 .../org/apache/isis/metamodel/adapter/oid/Oid.java |  6 ++++
 .../isis/metamodel/adapter/oid/Oid_Parented.java   | 22 +++++++++------
 .../apache/isis/metamodel/adapter/oid/RootOid.java |  2 --
 .../isis/runtime/memento/CollectionData.java       |  4 +--
 .../java/org/apache/isis/runtime/memento/Data.java |  6 +++-
 .../org/apache/isis/runtime/memento/Memento.java   | 32 +++++++++++-----------
 .../apache/isis/runtime/memento/ObjectData.java    |  8 +++---
 .../isis/runtime/memento/StandaloneData.java       |  9 +++---
 8 files changed, 51 insertions(+), 38 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid.java
index 9dfd5ee..bf51220 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid.java
@@ -58,6 +58,12 @@ public interface Oid extends Serializable {
     default boolean isValue() {
         return false; // default, only overridden by Oid_Value
     }
+    
+    /**
+     * {@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}.   
+     */
+    ObjectSpecId getObjectSpecId();
 
     // -- MARSHALLING
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid_Parented.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid_Parented.java
index 46a8966..b4c3640 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid_Parented.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/Oid_Parented.java
@@ -22,7 +22,7 @@ package org.apache.isis.metamodel.adapter.oid;
 import java.io.IOException;
 import java.util.Objects;
 
-import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.metamodel.spec.ObjectSpecId;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
@@ -30,7 +30,7 @@ final class Oid_Parented implements ParentedOid {
 
     private static final long serialVersionUID = 1L;
 
-    private final String name;
+    private final String oneToManyId;
     private final int hashCode;
 
     private final RootOid parentRootOid;
@@ -42,7 +42,7 @@ final class Oid_Parented implements ParentedOid {
     private Oid_Parented(RootOid parentRootOid, String oneToManyId) {
         requires(parentRootOid, "parentRootOid");
         this.parentRootOid = parentRootOid;
-        this.name = oneToManyId;
+        this.oneToManyId = oneToManyId;
         this.hashCode = calculateHash();
     }
 
@@ -50,6 +50,11 @@ final class Oid_Parented implements ParentedOid {
     public RootOid getParentOid() {
         return parentRootOid;
     }
+    
+    @Override
+    public ObjectSpecId getObjectSpecId() {
+        return getParentOid().getObjectSpecId();
+    }
 
     @Override
     public boolean isTransient() {
@@ -77,13 +82,13 @@ final class Oid_Parented implements ParentedOid {
 
     private Oid_Parented(Oid_Parented oid) throws IOException {
         this.parentRootOid = oid.getParentOid();
-        this.name = oid.name;
+        this.oneToManyId = oid.oneToManyId;
         this.hashCode = calculateHash();
     }
 
     @Override
     public String getName() {
-        return name;
+        return oneToManyId;
     }
 
 
@@ -115,7 +120,8 @@ final class Oid_Parented implements ParentedOid {
     }
 
     public boolean equals(final Oid_Parented other) {
-        return Objects.equals(other.getParentOid(), getParentOid()) && Objects.equals(other.name, name);
+        return Objects.equals(other.getParentOid(), getParentOid()) 
+                && Objects.equals(other.oneToManyId, oneToManyId);
     }
 
 
@@ -125,7 +131,7 @@ final class Oid_Parented implements ParentedOid {
     }
 
     private int calculateHash() {
-        return Objects.hash(getParentOid(), name);
+        return Objects.hash(getParentOid(), oneToManyId);
     }
 
     /**
@@ -133,7 +139,7 @@ final class Oid_Parented implements ParentedOid {
      * need updating similarly.
      */
     public Oid_Parented asPersistent(RootOid newParentRootOid) {
-        return new Oid_Parented(newParentRootOid, name);
+        return new Oid_Parented(newParentRootOid, oneToManyId);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/RootOid.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/RootOid.java
index a5dc556..6d92531 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/RootOid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/RootOid.java
@@ -26,8 +26,6 @@ import org.apache.isis.schema.common.v1.OidDto;
 
 public interface RootOid extends Oid {
 
-    ObjectSpecId getObjectSpecId();
-
     String getIdentifier();
 
     Bookmark asBookmark();
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/CollectionData.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/CollectionData.java
index 289f4b7..fbec284 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/CollectionData.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/CollectionData.java
@@ -30,8 +30,8 @@ final class CollectionData extends Data {
     private final static long serialVersionUID = 1L;
     private final Data[] elements;
 
-    public CollectionData(final Oid oid, final String className, final Data[] elements) {
-        super(oid, className);
+    public CollectionData(final Oid oid, final Data[] elements) {
+        super(oid);
         this.elements = elements;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Data.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Data.java
index f039157..fc236a9 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Data.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Data.java
@@ -24,6 +24,7 @@ import java.io.Serializable;
 import javax.annotation.Nullable;
 
 import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.spec.ObjectSpecId;
 
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -40,6 +41,9 @@ class Data implements Serializable {
      * @apiNote could be <tt>null</tt> if represents a value (standalone adapter).
      */
     @Getter @Nullable private final Oid oid;
-    @Getter private final String specId;
 
+    public ObjectSpecId getObjectSpecId() {
+        return oid.getObjectSpecId();
+    }
+    
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
index 8f7fc53..fb459e4 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
@@ -25,20 +25,22 @@ import java.util.List;
 import org.apache.isis.commons.exceptions.UnknownTypeException;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.metamodel.facets.properties.update.modify.PropertySetterFacet;
 import org.apache.isis.metamodel.spec.ManagedObject;
-import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
 import lombok.Getter;
+import lombok.ToString;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -50,7 +52,7 @@ import lombok.extern.log4j.Log4j2;
  * easily. Also for a persistent objects only the reference's {@link Oid}s are
  * held, avoiding the need for serializing the whole object graph.
  */
-@Log4j2
+@Log4j2 @ToString
 class Memento implements Serializable {
 
     private final static long serialVersionUID = 1L;
@@ -71,15 +73,10 @@ class Memento implements Serializable {
         if (data == null) {
             return null;
         }
-        val spec = specLoader.lookupBySpecIdElseLoad(ObjectSpecId.of(data.getSpecId()));
+        val spec = specLoader.lookupBySpecIdElseLoad(data.getObjectSpecId());
         val oid = data.getOid();
         return mementoStore.adapterOfMemento(spec, oid, data);
     }
-
-    @Override
-    public String toString() {
-        return "[" + (data == null ? null : data.getSpecId() + "/" + data.getOid() + data) + "]";
-    }
     
     // -- HELPER
 
@@ -99,16 +96,15 @@ class Memento implements Serializable {
                 .collect(_Arrays.toArray(Data.class, CollectionFacet.Utils.size(adapter)));
 
         val elementOid = ManagedObject._identify(adapter);
-        val elementSpec = adapter.getSpecification();
         
-        return new CollectionData(elementOid, elementSpec.getFullIdentifier(), collData);
+        return new CollectionData(elementOid, collData);
     }
 
     private ObjectData createObjectData(ManagedObject adapter) {
         val oid = ManagedObject._identify(adapter);
         oids.add(oid);
         val spec = adapter.getSpecification();
-        val data = new ObjectData(oid, spec.getFullIdentifier());
+        val data = new ObjectData(oid);
 
         spec.streamAssociations(Contributed.EXCLUDED)
         .filter(association->{
@@ -156,8 +152,12 @@ class Memento implements Serializable {
 
         val refOid = ManagedObject._identify(referencedAdapter);
 
-        if (refOid == null || refOid.isValue()) {
-            return createStandaloneData(referencedAdapter);
+        if (refOid == null) {
+            throw _Exceptions.unexpectedCodeReach();
+        }
+        
+        if (refOid.isValue()) {
+            return createStandaloneData(refOid, referencedAdapter);
         }
 
         val refSpec = referencedAdapter.getSpecification();
@@ -170,11 +170,11 @@ class Memento implements Serializable {
             }
         }
 
-        return new Data(refOid, refSpec.getFullIdentifier());
+        return new Data(refOid);
     }
 
-    private Data createStandaloneData(ManagedObject adapter) {
-        return new StandaloneData(adapter);
+    private Data createStandaloneData(RootOid rootOid, ManagedObject adapter) {
+        return new StandaloneData(rootOid, adapter);
     }
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
index e880f51..2a522b4 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
@@ -29,14 +29,14 @@ import lombok.NoArgsConstructor;
 
 final class ObjectData extends Data {
 
-    private static final long serialVersionUID = 3772154051989942219L;
+    private static final long serialVersionUID = 2L;
     
     private final Map<String, Object> fields = new HashMap<String, Object>();
 
-    public ObjectData(final Oid oid, final String className) {
-        super(oid, className);
+    public ObjectData(final Oid oid) {
+        super(oid);
     }
-
+    
     public void addField(final String fieldName, final Object entry) {
         if (fields.containsKey(fieldName)) {
             throw new IllegalArgumentException("Field already entered " + fieldName);
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
index be39cd9..3312bb2 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
@@ -22,9 +22,9 @@ package org.apache.isis.runtime.memento;
 import java.io.Serializable;
 
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.metamodel.spec.ManagedObject;
-import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
 import lombok.val;
@@ -36,8 +36,8 @@ final class StandaloneData extends Data {
     private String objectAsEncodedString;
     private Serializable objectAsSerializable;
 
-    public StandaloneData(ManagedObject adapter) {
-        super(null, adapter.getSpecification().getFullIdentifier());
+    public StandaloneData(RootOid rootOid, ManagedObject adapter) {
+        super(rootOid);
 
         final Object object = adapter.getPojo();
         if (object instanceof Serializable) {
@@ -61,8 +61,7 @@ final class StandaloneData extends Data {
         if (objectAsSerializable != null) {
             return objectAdapterProvider.adapterFor(objectAsSerializable);
         } else {
-            val spec = 
-                    specificationLoader.lookupBySpecIdElseLoad(ObjectSpecId.of(getSpecId()));
+            val spec = specificationLoader.lookupBySpecIdElseLoad(getObjectSpecId());
             val encodeableFacet = spec.getFacet(EncodableFacet.class);
             return encodeableFacet.fromEncodedString(objectAsEncodedString);
         }