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/26 11:47:36 UTC

[isis] 01/02: ISIS-1976: fixes memento cloning

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

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

commit c4b7d12aaae6223b2a2f85893f5c1ae79b00f3de
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 26 13:40:51 2018 +0200

    ISIS-1976: fixes memento cloning
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../apache/isis/core/metamodel/adapter/oid/Oid.java   |  4 +---
 .../core/metamodel/adapter/oid/Oid_Marshaller.java    | 19 +++++++++++--------
 .../isis/core/metamodel/adapter/oid/Oid_Parented.java |  5 +++++
 .../isis/core/metamodel/adapter/oid/Oid_Root.java     |  6 ++++++
 .../isis/core/metamodel/adapter/oid/Oid_Value.java    |  5 +++++
 .../isis/core/metamodel/adapter/oid/RootOid.java      |  1 +
 .../isis/core/metamodel/adapter/version/Version.java  | 12 ++++++++++++
 .../core/metamodel/adapter/version/VersionTest.java   | 16 ++++++++--------
 .../org/apache/isis/core/runtime/memento/Memento.java |  4 +---
 9 files changed, 50 insertions(+), 22 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 d7441e9..089416b 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
@@ -157,9 +157,7 @@ public interface Oid extends Encodable {
         
     }
 
-
-
-    
+    Oid copy();
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java
index bed9fa9..3a5aa9f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java
@@ -225,10 +225,14 @@ final class Oid_Marshaller implements Oid.Marshaller, Oid.Unmarshaller {
     }
 
 
-    private <T> void ensureCorrectType(String oidStr, Class<T> requestedType, final Class<? extends Oid> actualType) {
+    private <T> void ensureCorrectType(String oidStr, Class<T> requestedType, 
+            final Class<? extends Oid> actualType) {
+        
         if(!requestedType.isAssignableFrom(actualType)) {
-            throw new IllegalArgumentException("OID '" + oidStr + "' does not represent a " +
-                    actualType.getSimpleName());
+            throw new IllegalArgumentException(
+                    String.format("OID '%s' was unmarshealled to type '%s' which cannot be assigned "
+                            + "to requested type '%s'",
+                            oidStr, actualType.getSimpleName(), requestedType.getSimpleName()) );
         }
     }
 
@@ -269,16 +273,15 @@ final class Oid_Marshaller implements Oid.Marshaller, Oid.Unmarshaller {
 
     @Override
     public final String marshal(Version version) {
-        if(version == null) {
+        if(Version.isEmpty(version)) {
             return "";
         }
         final String versionUser = version.getUser();
-        return SEPARATOR_VERSION + version.getSequence() + SEPARATOR + _Strings.nullToEmpty(versionUser) + SEPARATOR + nullToEmpty(version.getUtcTimestamp());
+        return SEPARATOR_VERSION + version.getSequence() + SEPARATOR 
+                + _Strings.nullToEmpty(versionUser) + SEPARATOR + 
+                (version.hasTimestamp() ? version.getUtcTimestamp() : "");
     }
 
-    private static String nullToEmpty(Object obj) {
-        return obj == null? "": "" + obj;
-    }
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
index bc6f835..2f4544d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
@@ -187,6 +187,11 @@ final class Oid_Parented implements ParentedOid {
         return new Oid_Parented(newParentRootOid, name);
     }
 
+    @Override
+    public Oid copy() {
+        return ofName((RootOid) parentRootOid.copy(), name);
+    }
+
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
index 03c67ba..98f1d67 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
@@ -198,4 +198,10 @@ final class Oid_Root implements RootOid {
         return enString();
     }
 
+    @Override
+    public Oid copy() {
+        // these are all immutable ...
+        return of(objectSpecId, identifier, state, version);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
index 09df592..a376e08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
@@ -106,4 +106,9 @@ final class Oid_Value implements RootOid {
         return null;
     }
 
+    @Override
+    public Oid copy() {
+        return this; // immutable singleton, just reuse
+    }
+
 }
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 4c483cb..4972587 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
@@ -46,5 +46,6 @@ public interface RootOid extends Oid, Serializable {
     public static RootOid deString(final String oidStr) {
         return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
     }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java
index 5ffb94f..e562b56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/version/Version.java
@@ -69,7 +69,17 @@ public final class Version implements Serializable, Encodable {
         return new Version(sequence, user, utcTimestamp);
     }
     
+    // -- LOGIC FOR EMPTY
+    
+    public static boolean isEmpty(Version version) {
+        return version == Factory.EMPTY_VERSION;
+    }
+    
+    public boolean hasTimestamp() {
+        return utcTimestamp!=Factory.EMPTY_TIMESTAMP;
+    }
 
+    
     // -- constructor, fields
     private final long sequence;
     private final String user;
@@ -236,4 +246,6 @@ public final class Version implements Serializable, Encodable {
 
 
 
+
+
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java
index bcefefc..b572436 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/version/VersionTest.java
@@ -38,35 +38,35 @@ public class VersionTest {
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
     
     @Mock
-    private DataInputExtended extended;
+    private DataInputExtended input;
 
     @Mock
-    private DataOutputExtended outputExtended;
+    private DataOutputExtended output;
 
     @Mock
     private Version version;;
 
     @Before
     public void setUp() throws Exception {
-        context.ignoring(extended);
+        context.ignoring(input);
     }
     
     @Test
     public void instantiate_usingDataInputExtended() throws Exception {
-        new Version(extended);
+        new Version(input);
     }
 
     @Test
     public void encode() throws Exception {
-        context.ignoring(outputExtended);
+        context.ignoring(output);
         
-        final Version oidVersion = new Version(extended);
-        oidVersion.encode(outputExtended);
+        final Version oidVersion = new Version(input);
+        oidVersion.encode(output);
     }
 
     @Test
     public void sequence_and_toString() throws Exception {
-        final Version testVersion = new Version(extended);
+        final Version testVersion = new Version(input);
         
         assertTrue(testVersion.sequence().length() > 0);
         assertTrue(testVersion.getSequence() == 0);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
index f052bb2..c2f7675 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
@@ -167,9 +167,7 @@ public class Memento implements Serializable {
 
     private static <T extends Oid> T clone(final T oid) {
         if(oid == null) { return null; }
-        if(oid.isValue()) { return oid; } // immutable, so just reuse
-        final String oidStr = oid.enString();
-        return _Casts.uncheckedCast(Oid.unmarshaller().unmarshal(oidStr, oid.getClass()));
+        return _Casts.uncheckedCast(oid.copy()); 
     }
 
     private Data createStandaloneData(final ObjectAdapter adapter) {