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) {