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 10:53:10 UTC

[isis] 05/06: ISIS-1976: let package o.a.i.c.metamodel.adapter.oid only expose interfaces

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 e49e8b8b8c00f8777981e75d3f3c4321e0344bb6
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 26 12:46:17 2018 +0200

    ISIS-1976: let package o.a.i.c.metamodel.adapter.oid only expose
    interfaces
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../isis/core/metamodel/adapter/oid/Oid.java       |  45 ++++-
 .../core/metamodel/adapter/oid/Oid_Marshaller.java |   4 +-
 .../oid/{ParentedOid.java => Oid_Parented.java}    |  32 ++--
 .../adapter/oid/{RootOid.java => Oid_Root.java}    |  86 +++------
 .../isis/core/metamodel/adapter/oid/Oid_Value.java | 109 +++++++++++
 .../core/metamodel/adapter/oid/ParentedOid.java    | 170 ++---------------
 .../isis/core/metamodel/adapter/oid/RootOid.java   | 207 +--------------------
 .../oid/CollectionOidTest_valueSemantics.java      |  15 +-
 .../oid/OidMarshallerTest_roundtripping.java       |   6 +-
 ...dDefaultTest_valueSemantics_whenPersistent.java |  13 +-
 ...idDefaultTest_valueSemantics_whenTransient.java |  13 +-
 .../transaction/PojoAdapterBuilder.java            |   2 +-
 .../transaction/PojoAdapterBuilder.java            |   2 +-
 .../ObjectAdapterContext_NewIdentifier.java        |   2 +-
 .../persistence/adaptermanager/OidProviders.java   |  12 +-
 .../restfulobjects/server/util/OidUtils.java       |   2 +-
 16 files changed, 233 insertions(+), 487 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 8473a0f..06706b8 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
@@ -26,6 +26,8 @@ import org.apache.isis.core.commons.encoding.Encodable;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.schema.common.v1.BookmarkObjectState;
+import org.apache.isis.schema.common.v1.OidDto;
 
 
 /**
@@ -63,7 +65,7 @@ public interface Oid extends Encodable {
     boolean isPersistent();
     
     default boolean isValue() {
-        return false;
+        return false; // default, only overridden by Oid_Value
     }
 
     public static enum State {
@@ -110,6 +112,29 @@ public interface Oid extends Encodable {
                 throw _Exceptions.unmatchedCase(this);
             }
         }
+        
+        public Bookmark bookmarkOf(RootOid rootOid) {
+            final String objectType = asBookmarkObjectState().getCode() + rootOid.getObjectSpecId().asString();
+            final String identifier = rootOid.getIdentifier();
+            return new Bookmark(objectType, identifier);
+        }
+
+        public OidDto toOidDto(RootOid rootOid) {
+
+            final OidDto oidDto = new OidDto();
+
+            oidDto.setType(rootOid.getObjectSpecId().asString());
+            oidDto.setId(rootOid.getIdentifier());
+
+            final Bookmark.ObjectState objectState = asBookmarkObjectState();
+            final BookmarkObjectState bookmarkState = objectState.toBookmarkState();
+            // persistent is assumed if not specified...
+            oidDto.setObjectState(
+                    bookmarkState != BookmarkObjectState.PERSISTENT ? bookmarkState : null);
+
+            return oidDto;
+        }
+        
     }
     
     // -- MARSHALLING
@@ -153,17 +178,21 @@ public interface Oid extends Encodable {
     /** for convenience*/
     public static final class Factory {
         
+        public static RootOid value() {
+            return Oid_Value.INSTANCE;
+        }
+        
         public static RootOid ofBookmark(final Bookmark bookmark) {
-            return RootOid.of(ObjectSpecId.of(bookmark.getObjectType()), 
+            return Oid_Root.of(ObjectSpecId.of(bookmark.getObjectType()), 
                     bookmark.getIdentifier(), State.from(bookmark), Version.empty());
         }
 
         public static RootOid viewmodelOf(ObjectSpecId objectSpecId, String mementoStr) {
-            return RootOid.of(objectSpecId, mementoStr, State.VIEWMODEL, Version.empty());
+            return Oid_Root.of(objectSpecId, mementoStr, State.VIEWMODEL, Version.empty());
         }
         
         public static RootOid transientOf(final ObjectSpecId objectSpecId, final String identifier) {
-            return RootOid.of(objectSpecId, identifier, State.TRANSIENT, Version.empty());
+            return Oid_Root.of(objectSpecId, identifier, State.TRANSIENT, Version.empty());
         }
 
         public static RootOid persistentOf(final ObjectSpecId objectSpecId, final String identifier) {
@@ -183,18 +212,18 @@ public interface Oid extends Encodable {
         }
 
         public static RootOid persistentOf(final ObjectSpecId objectSpecId, final String identifier, final Long versionSequence, final String versionUser, final Long versionUtcTimestamp) {
-            return RootOid.of(objectSpecId, identifier, State.PERSISTENT, 
+            return Oid_Root.of(objectSpecId, identifier, State.PERSISTENT, 
                     Version.Factory.ifPresent(versionSequence, versionUser, versionUtcTimestamp));
         }
 
         // -- PARENTED COLLECTIONS
         
         public static ParentedOid collectionOfOneToMany(RootOid parentRootOid, OneToManyAssociation otma) {
-            return ParentedOid.ofName(parentRootOid, otma.getId());
+            return Oid_Parented.ofName(parentRootOid, otma.getId());
         }
 
-        public static ParentedOid collectionOfName(RootOid parentRootOid, String name) {
-            return ParentedOid.ofName(parentRootOid, name);
+        public static ParentedOid parentedOfName(RootOid parentRootOid, String name) {
+            return Oid_Parented.ofName(parentRootOid, name);
         }
 
         
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 dff0ef3..ebc1323 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
@@ -195,7 +195,7 @@ final class Oid_Marshaller implements Oid.Marshaller, Oid.Unmarshaller {
             if(aggregateOidParts.isEmpty()) {
                 ensureCorrectType(oidStr, requestedType, RootOid.class);
                 return _Casts.uncheckedCast(
-                        RootOid.of(ObjectSpecId.of(rootObjectType), rootIdentifier, state, version));
+                        Oid_Root.of(ObjectSpecId.of(rootObjectType), rootIdentifier, state, version));
             } else {
                 throw new RuntimeException("Aggregated Oids are no longer supported");
             }
@@ -206,7 +206,7 @@ final class Oid_Marshaller implements Oid.Marshaller, Oid.Unmarshaller {
 
             RootOid parentOid = this.unmarshal(parentOidStr, RootOid.class);
             ensureCorrectType(oidStr, requestedType, ParentedOid.class);
-            return _Casts.uncheckedCast( ParentedOid.ofName(parentOid, collectionName) );
+            return _Casts.uncheckedCast( Oid_Parented.ofName(parentOid, collectionName) );
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
similarity index 83%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
index c071022..bc6f835 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
@@ -22,17 +22,13 @@ package org.apache.isis.core.metamodel.adapter.oid;
 import static org.apache.isis.commons.internal.base._With.requires;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.Objects;
 
 import org.apache.isis.core.commons.encoding.DataInputExtended;
 import org.apache.isis.core.commons.encoding.DataOutputExtended;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 
-/**
- * Used as the {@link Oid} for collections.
- */
-public final class ParentedOid implements Serializable, Oid {
+final class Oid_Parented implements ParentedOid {
 
     private static final long serialVersionUID = 1L;
 
@@ -42,17 +38,18 @@ public final class ParentedOid implements Serializable, Oid {
     private final RootOid parentRootOid;
 
     // package private to support testing
-    static ParentedOid ofName(RootOid parentRootOid, String name) {
-        return new ParentedOid(parentRootOid, name);
+    static Oid_Parented ofName(RootOid parentRootOid, String name) {
+        return new Oid_Parented(parentRootOid, name);
     }
     
-    private ParentedOid(RootOid parentRootOid, String name) {
+    private Oid_Parented(RootOid parentRootOid, String name) {
         requires(parentRootOid, "parentRootOid");
         this.parentRootOid = parentRootOid;
         this.name = name;
         this.hashCode = calculateHash();
     }
 
+    @Override
     public RootOid getParentOid() {
         return parentRootOid;
     }
@@ -87,8 +84,8 @@ public final class ParentedOid implements Serializable, Oid {
     // enstring
     // /////////////////////////////////////////////////////////
 
-    public static ParentedOid deString(String oidStr) {
-        return Oid.unmarshaller().unmarshal(oidStr, ParentedOid.class);
+    public static Oid_Parented deString(String oidStr) {
+        return Oid.unmarshaller().unmarshal(oidStr, Oid_Parented.class);
     }
 
 
@@ -108,11 +105,11 @@ public final class ParentedOid implements Serializable, Oid {
     // /////////////////////////////////////////////////////////
 
 
-    public ParentedOid(DataInputExtended inputStream) throws IOException {
-        this(ParentedOid.deString(inputStream.readUTF()));
+    public Oid_Parented(DataInputExtended inputStream) throws IOException {
+        this(Oid_Parented.deString(inputStream.readUTF()));
     }
 
-    private ParentedOid(ParentedOid oid) throws IOException {
+    private Oid_Parented(Oid_Parented oid) throws IOException {
         this.parentRootOid = oid.getParentOid();
         this.name = oid.name;
         this.hashCode = calculateHash();
@@ -128,6 +125,7 @@ public final class ParentedOid implements Serializable, Oid {
     // Properties
     // /////////////////////////////////////////////////////////
 
+    @Override
     public String getName() {
         return name;
     }
@@ -159,10 +157,10 @@ public final class ParentedOid implements Serializable, Oid {
         if (getClass() != other.getClass()) {
             return false;
         }
-        return equals((ParentedOid) other);
+        return equals((Oid_Parented) other);
     }
 
-    public boolean equals(final ParentedOid other) {
+    public boolean equals(final Oid_Parented other) {
         return Objects.equals(other.getParentOid(), getParentOid()) && Objects.equals(other.name, name);
     }
 
@@ -185,8 +183,8 @@ public final class ParentedOid implements Serializable, Oid {
      * When the RootOid is persisted, all its &quot;children&quot;
      * need updating similarly.
      */
-    public ParentedOid asPersistent(RootOid newParentRootOid) {
-        return new ParentedOid(newParentRootOid, name);
+    public Oid_Parented asPersistent(RootOid newParentRootOid) {
+        return new Oid_Parented(newParentRootOid, name);
     }
 
 
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/Oid_Root.java
similarity index 63%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
index 67e9280..d6e547b 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/Oid_Root.java
@@ -22,42 +22,39 @@ package org.apache.isis.core.metamodel.adapter.oid;
 import static org.apache.isis.commons.internal.base._With.requires;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.util.Objects;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.encoding.DataInputExtended;
 import org.apache.isis.core.commons.encoding.DataOutputExtended;
 import org.apache.isis.core.commons.url.UrlDecoderUtil;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
 
-public class RootOid implements Oid, Serializable {
+final class Oid_Root implements RootOid {
 
     // -- fields
     private final static long serialVersionUID = 1L;
 
     private final ObjectSpecId objectSpecId;
     private final String identifier;
-    private final State state;
+    private final Oid.State state;
     private final int hashCode;
 
     // not part of equality check
     private Version version;
 
 
-    public static RootOid of(final ObjectSpecId objectSpecId, final String identifier, final State state) {
+    public static Oid_Root of(final ObjectSpecId objectSpecId, final String identifier, final State state) {
         return of(objectSpecId, identifier, state, Version.empty());
     }
     
-    public static RootOid of(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
-        return new RootOid(objectSpecId, identifier, state, version);
+    public static Oid_Root of(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
+        return new Oid_Root(objectSpecId, identifier, state, version);
     }
     
-    private RootOid(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
+    private Oid_Root(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
 
         requires(objectSpecId, "objectSpecId");
         requires(identifier, "identifier");
@@ -75,9 +72,9 @@ public class RootOid implements Oid, Serializable {
     }
 
     // -- Encodeable
-    public RootOid(final DataInputExtended input) throws IOException {
+    public Oid_Root(final DataInputExtended input) throws IOException {
         final String oidStr = input.readUTF();
-        final RootOid oid = Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
+        final Oid_Root oid = Oid.unmarshaller().unmarshal(oidStr, Oid_Root.class);
         this.objectSpecId = oid.objectSpecId;
         this.identifier = oid.identifier;
         this.state = oid.state;
@@ -96,13 +93,13 @@ public class RootOid implements Oid, Serializable {
     }
 
     // -- deString'able, enString
-    public static RootOid deStringEncoded(final String urlEncodedOidStr) {
+    public static Oid_Root deStringEncoded(final String urlEncodedOidStr) {
         final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
         return deString(oidStr);
     }
 
-    public static RootOid deString(final String oidStr) {
-        return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
+    public static Oid_Root deString(final String oidStr) {
+        return Oid.unmarshaller().unmarshal(oidStr, Oid_Root.class);
     }
 
     @Override
@@ -117,10 +114,12 @@ public class RootOid implements Oid, Serializable {
 
 
     // -- Properties
+    @Override
     public ObjectSpecId getObjectSpecId() {
         return objectSpecId;
     }
 
+    @Override
     public String getIdentifier() {
         return identifier;
     }
@@ -152,32 +151,16 @@ public class RootOid implements Oid, Serializable {
         this.version = version;
     }
 
-
-    // -- asBookmark, asOidDto
+    @Override
     public Bookmark asBookmark() {
-        final String objectType = state.asBookmarkObjectState().getCode() + getObjectSpecId().asString();
-        final String identifier = getIdentifier();
-        return new Bookmark(objectType, identifier);
+        return state.bookmarkOf(this);
     }
-
+    
+    @Override
     public OidDto asOidDto() {
-
-        final OidDto oidDto = new OidDto();
-
-        oidDto.setType(getObjectSpecId().asString());
-        oidDto.setId(getIdentifier());
-
-        final Bookmark.ObjectState objectState = state.asBookmarkObjectState();
-        final BookmarkObjectState bookmarkState = objectState.toBookmarkState();
-        // persistent is assumed if not specified...
-        oidDto.setObjectState(
-                bookmarkState != BookmarkObjectState.PERSISTENT ? bookmarkState : null);
-
-        return oidDto;
+        return state.toOidDto(this);
     }
-
-
-
+    
     // -- equals, hashCode
 
     private int calculateHash() {
@@ -195,10 +178,10 @@ public class RootOid implements Oid, Serializable {
         if (getClass() != other.getClass()) {
             return false;
         }
-        return equals((RootOid) other);
+        return equals((Oid_Root) other);
     }
 
-    public boolean equals(final RootOid other) {
+    public boolean equals(final Oid_Root other) {
         return Objects.equals(objectSpecId, other.getObjectSpecId()) && 
                 Objects.equals(identifier, other.getIdentifier()) && 
                 Objects.equals(state, other.state);
@@ -209,37 +192,10 @@ public class RootOid implements Oid, Serializable {
         return hashCode;
     }
 
-
-
     // -- toString
     @Override
     public String toString() {
         return enString();
     }
 
-    // -- ROOT-ID SUPPORT FOR VALUE
-    
-    private RootOid() { identifier=null; objectSpecId=null; state=null; hashCode=0;};
-    
-    private static final RootOid VALUE_OID = new RootOid() {
-        private static final long serialVersionUID = 2L;
-        @Override public boolean isValue() { return true; }
-//        @Override public boolean isTransient() { return false; }
-//        @Override public boolean isPersistent() { return false; }
-//        @Override public boolean isViewModel() { return false; }
-        
-        @Override public boolean isTransient() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public boolean isPersistent() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public boolean isViewModel() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public String toString() { return "VALUE_OID"; }
-        
-    };
-    
-    public static RootOid value() {
-        return VALUE_OID;
-    }
-    
-    // --
-
-
 }
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
new file mode 100644
index 0000000..09df592
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
@@ -0,0 +1,109 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import java.io.IOException;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.commons.encoding.DataOutputExtended;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.schema.common.v1.OidDto;
+
+final class Oid_Value implements RootOid {
+    
+    private final static long serialVersionUID = 1L;
+    
+    static final Oid_Value INSTANCE = new Oid_Value();
+
+    @Override
+    public String enString() {
+        return null;
+    }
+
+    @Override
+    public String enStringNoVersion() {
+        return null;
+    }
+
+    @Override
+    public Version getVersion() {
+        return null;
+    }
+
+    @Override
+    public void setVersion(Version version) {
+    }
+
+    @Override
+    public boolean isValue() { 
+        return true; 
+    }
+    
+    @Override
+    public boolean isTransient() {
+        return false;
+    }
+
+    @Override
+    public boolean isViewModel() {
+        return false;
+    }
+
+    @Override
+    public boolean isPersistent() {
+        return false;
+    }
+
+    @Override
+    public void encode(DataOutputExtended outputStream) throws IOException {
+    }
+
+    @Override
+    public ObjectSpecId getObjectSpecId() {
+        return null;
+    }
+
+    @Override
+    public String getIdentifier() {
+        return null;
+    }
+    
+    @Override
+    public String toString() {
+        return "VALUE_OID";
+    }
+    
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    @Override
+    public Bookmark asBookmark() {
+        return null;
+    }
+
+    @Override
+    public OidDto asOidDto() {
+        return null;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
index c071022..76e2f91 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
@@ -19,176 +19,28 @@
 
 package org.apache.isis.core.metamodel.adapter.oid;
 
-import static org.apache.isis.commons.internal.base._With.requires;
-
-import java.io.IOException;
 import java.io.Serializable;
-import java.util.Objects;
 
-import org.apache.isis.core.commons.encoding.DataInputExtended;
-import org.apache.isis.core.commons.encoding.DataOutputExtended;
-import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.commons.url.UrlDecoderUtil;
 
 /**
  * Used as the {@link Oid} for collections.
  */
-public final class ParentedOid implements Serializable, Oid {
-
-    private static final long serialVersionUID = 1L;
+public interface ParentedOid extends Serializable, Oid {
 
-    private final String name;
-    private final int hashCode;
+    RootOid getParentOid();
 
-    private final RootOid parentRootOid;
+    String getName();
 
-    // package private to support testing
-    static ParentedOid ofName(RootOid parentRootOid, String name) {
-        return new ParentedOid(parentRootOid, name);
-    }
+    // -- DECODE FROM STRING
     
-    private ParentedOid(RootOid parentRootOid, String name) {
-        requires(parentRootOid, "parentRootOid");
-        this.parentRootOid = parentRootOid;
-        this.name = name;
-        this.hashCode = calculateHash();
-    }
-
-    public RootOid getParentOid() {
-        return parentRootOid;
-    }
-
-    @Override
-    public Version getVersion() {
-        return parentRootOid.getVersion();
-    }
-
-    @Override
-    public void setVersion(Version version) {
-        parentRootOid.setVersion(version);
-    }
-
-    @Override
-    public boolean isTransient() {
-        return getParentOid().isTransient();
-    }
-
-    @Override
-    public boolean isViewModel() {
-        return getParentOid().isViewModel();
-    }
-
-    @Override
-    public boolean isPersistent() {
-        return getParentOid().isPersistent();
+    public static ParentedOid deStringEncoded(final String urlEncodedOidStr) {
+        final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
+        return deString(oidStr);
     }
-
-
-    // /////////////////////////////////////////////////////////
-    // enstring
-    // /////////////////////////////////////////////////////////
-
-    public static ParentedOid deString(String oidStr) {
-        return Oid.unmarshaller().unmarshal(oidStr, ParentedOid.class);
-    }
-
-
-    @Override
-    public String enString() {
-        return Oid.marshaller().marshal(this);
-    }
-
-    @Override
-    public String enStringNoVersion() {
-        return Oid.marshaller().marshalNoVersion(this);
-    }
-
-
-    // /////////////////////////////////////////////////////////
-    // encodeable
-    // /////////////////////////////////////////////////////////
-
-
-    public ParentedOid(DataInputExtended inputStream) throws IOException {
-        this(ParentedOid.deString(inputStream.readUTF()));
-    }
-
-    private ParentedOid(ParentedOid oid) throws IOException {
-        this.parentRootOid = oid.getParentOid();
-        this.name = oid.name;
-        this.hashCode = calculateHash();
-    }
-
-
-    @Override
-    public void encode(DataOutputExtended outputStream) throws IOException {
-        outputStream.writeUTF(enString());
-    }
-
-    // /////////////////////////////////////////////////////////
-    // Properties
-    // /////////////////////////////////////////////////////////
-
-    public String getName() {
-        return name;
-    }
-
-
-    // /////////////////////////////////////////////////////////
-    // toString
-    // /////////////////////////////////////////////////////////
-
-    @Override
-    public String toString() {
-        return enString();
-    }
-
-
-
-    // /////////////////////////////////////////////////////////
-    // Value semantics
-    // /////////////////////////////////////////////////////////
-
-    @Override
-    public boolean equals(final Object other) {
-        if (other == this) {
-            return true;
-        }
-        if (other == null) {
-            return false;
-        }
-        if (getClass() != other.getClass()) {
-            return false;
-        }
-        return equals((ParentedOid) other);
-    }
-
-    public boolean equals(final ParentedOid other) {
-        return Objects.equals(other.getParentOid(), getParentOid()) && Objects.equals(other.name, name);
-    }
-
-
-    @Override
-    public int hashCode() {
-        return hashCode;
-    }
-
-    private int calculateHash() {
-        return Objects.hash(getParentOid(), name);
-    }
-
-
-    // /////////////////////////////////////////////////////////
-    // asPersistent
-    // /////////////////////////////////////////////////////////
-
-    /**
-     * When the RootOid is persisted, all its &quot;children&quot;
-     * need updating similarly.
-     */
-    public ParentedOid asPersistent(RootOid newParentRootOid) {
-        return new ParentedOid(newParentRootOid, name);
+    
+    public static ParentedOid deString(String enString) {
+        return Oid.unmarshaller().unmarshal(enString, ParentedOid.class);
     }
 
-
-
 }
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 67e9280..4c483cb 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
@@ -19,83 +19,25 @@
 
 package org.apache.isis.core.metamodel.adapter.oid;
 
-import static org.apache.isis.commons.internal.base._With.requires;
-
-import java.io.IOException;
 import java.io.Serializable;
-import java.util.Objects;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.commons.encoding.DataInputExtended;
-import org.apache.isis.core.commons.encoding.DataOutputExtended;
 import org.apache.isis.core.commons.url.UrlDecoderUtil;
-import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.schema.common.v1.BookmarkObjectState;
 import org.apache.isis.schema.common.v1.OidDto;
 
-public class RootOid implements Oid, Serializable {
-
-    // -- fields
-    private final static long serialVersionUID = 1L;
+public interface RootOid extends Oid, Serializable {
 
-    private final ObjectSpecId objectSpecId;
-    private final String identifier;
-    private final State state;
-    private final int hashCode;
+    ObjectSpecId getObjectSpecId();
 
-    // not part of equality check
-    private Version version;
+    String getIdentifier();
 
+    Bookmark asBookmark();
 
-    public static RootOid of(final ObjectSpecId objectSpecId, final String identifier, final State state) {
-        return of(objectSpecId, identifier, state, Version.empty());
-    }
+    OidDto asOidDto();
     
-    public static RootOid of(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
-        return new RootOid(objectSpecId, identifier, state, version);
-    }
+    // -- DECODE FROM STRING
     
-    private RootOid(final ObjectSpecId objectSpecId, final String identifier, final State state, final Version version) {
-
-        requires(objectSpecId, "objectSpecId");
-        requires(identifier, "identifier");
-        requires(state, "state");
-
-        // too slow...
-        // Ensure.ensureThatArg(identifier, is(not(IsisMatchers.contains("#"))), "identifier '" + identifier + "' contains a '#' symbol");
-        // Ensure.ensureThatArg(identifier, is(not(IsisMatchers.contains("@"))), "identifier '" + identifier + "' contains an '@' symbol");
-
-        this.objectSpecId = objectSpecId;
-        this.identifier = identifier;
-        this.state = state;
-        this.version = version;
-        this.hashCode = calculateHash();
-    }
-
-    // -- Encodeable
-    public RootOid(final DataInputExtended input) throws IOException {
-        final String oidStr = input.readUTF();
-        final RootOid oid = Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
-        this.objectSpecId = oid.objectSpecId;
-        this.identifier = oid.identifier;
-        this.state = oid.state;
-        
-        requires(objectSpecId, "objectSpecId");
-        requires(identifier, "identifier");
-        requires(state, "state");
-        
-        this.version = oid.version;
-        this.hashCode = calculateHash();
-    }
-
-    @Override
-    public void encode(final DataOutputExtended output) throws IOException {
-        output.writeUTF(enString());
-    }
-
-    // -- deString'able, enString
     public static RootOid deStringEncoded(final String urlEncodedOidStr) {
         final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
         return deString(oidStr);
@@ -105,141 +47,4 @@ public class RootOid implements Oid, Serializable {
         return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
     }
 
-    @Override
-    public String enString() {
-        return Oid.marshaller().marshal(this);
-    }
-
-    @Override
-    public String enStringNoVersion() {
-        return Oid.marshaller().marshalNoVersion(this);
-    }
-
-
-    // -- Properties
-    public ObjectSpecId getObjectSpecId() {
-        return objectSpecId;
-    }
-
-    public String getIdentifier() {
-        return identifier;
-    }
-
-    @Override
-    public boolean isTransient() {
-        return state.isTransient();
-    }
-
-    @Override
-    public boolean isViewModel() {
-        return state.isViewModel();
-    }
-
-    @Override
-    public boolean isPersistent() {
-        return state.isPersistent();
-    }
-
-    // -- Version
-
-    @Override
-    public Version getVersion() {
-        return version;
-    }
-
-    @Override
-    public void setVersion(final Version version) {
-        this.version = version;
-    }
-
-
-    // -- asBookmark, asOidDto
-    public Bookmark asBookmark() {
-        final String objectType = state.asBookmarkObjectState().getCode() + getObjectSpecId().asString();
-        final String identifier = getIdentifier();
-        return new Bookmark(objectType, identifier);
-    }
-
-    public OidDto asOidDto() {
-
-        final OidDto oidDto = new OidDto();
-
-        oidDto.setType(getObjectSpecId().asString());
-        oidDto.setId(getIdentifier());
-
-        final Bookmark.ObjectState objectState = state.asBookmarkObjectState();
-        final BookmarkObjectState bookmarkState = objectState.toBookmarkState();
-        // persistent is assumed if not specified...
-        oidDto.setObjectState(
-                bookmarkState != BookmarkObjectState.PERSISTENT ? bookmarkState : null);
-
-        return oidDto;
-    }
-
-
-
-    // -- equals, hashCode
-
-    private int calculateHash() {
-        return Objects.hash(objectSpecId, identifier, state);
-    }
-
-    @Override
-    public boolean equals(final Object other) {
-        if (other == null) {
-            return false;
-        }
-        if (other == this) {
-            return true;
-        }
-        if (getClass() != other.getClass()) {
-            return false;
-        }
-        return equals((RootOid) other);
-    }
-
-    public boolean equals(final RootOid other) {
-        return Objects.equals(objectSpecId, other.getObjectSpecId()) && 
-                Objects.equals(identifier, other.getIdentifier()) && 
-                Objects.equals(state, other.state);
-    }
-
-    @Override
-    public int hashCode() {
-        return hashCode;
-    }
-
-
-
-    // -- toString
-    @Override
-    public String toString() {
-        return enString();
-    }
-
-    // -- ROOT-ID SUPPORT FOR VALUE
-    
-    private RootOid() { identifier=null; objectSpecId=null; state=null; hashCode=0;};
-    
-    private static final RootOid VALUE_OID = new RootOid() {
-        private static final long serialVersionUID = 2L;
-        @Override public boolean isValue() { return true; }
-//        @Override public boolean isTransient() { return false; }
-//        @Override public boolean isPersistent() { return false; }
-//        @Override public boolean isViewModel() { return false; }
-        
-        @Override public boolean isTransient() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public boolean isPersistent() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public boolean isViewModel() { throw _Exceptions.unexpectedCodeReach(); }
-        @Override public String toString() { return "VALUE_OID"; }
-        
-    };
-    
-    public static RootOid value() {
-        return VALUE_OID;
-    }
-    
-    // --
-
-
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/CollectionOidTest_valueSemantics.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/CollectionOidTest_valueSemantics.java
index b0fa18e..6baa11a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/CollectionOidTest_valueSemantics.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/CollectionOidTest_valueSemantics.java
@@ -21,28 +21,27 @@ package org.apache.isis.core.metamodel.adapter.oid;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.isis.core.metamodel.adapter.oid.Oid.State;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
 
 public class CollectionOidTest_valueSemantics extends ValueTypeContractTestAbstract<ParentedOid> {
 
-    private final RootOid parent = RootOid.of(ObjectSpecId.of("CUS"), "123", State.PERSISTENT);
-    private final RootOid otherParent = RootOid.of(ObjectSpecId.of("CUS"), "124", State.PERSISTENT);
+    private final RootOid parent = Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "123");
+    private final RootOid otherParent = Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "124");
 
     @Override
     protected List<ParentedOid> getObjectsWithSameValue() {
         return Arrays.asList(
-                ParentedOid.ofName(parent, "456"),
-                ParentedOid.ofName(parent, "456"),
-                ParentedOid.ofName(parent, "456"));
+                Oid.Factory.parentedOfName(parent, "456"),
+                Oid.Factory.parentedOfName(parent, "456"),
+                Oid.Factory.parentedOfName(parent, "456"));
     }
 
     @Override
     protected List<ParentedOid> getObjectsWithDifferentValue() {
         return Arrays.asList(
-                ParentedOid.ofName(otherParent, "456"),
-                ParentedOid.ofName(parent, "457"));
+                Oid.Factory.parentedOfName(otherParent, "456"),
+                Oid.Factory.parentedOfName(parent, "457"));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_roundtripping.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_roundtripping.java
index 0aef2d8..1ce00c0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_roundtripping.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_roundtripping.java
@@ -53,7 +53,7 @@ public class OidMarshallerTest_roundtripping {
     @Test
     public void collectionOid_withNoVersion() {
         RootOid parentOid = Factory.persistentOf(ObjectSpecId.of("CUS"), "123");
-        ParentedOid oid = ParentedOid.ofName(parentOid, "items");
+        ParentedOid oid = Factory.parentedOfName(parentOid, "items");
         
         final String enString = oid.enString();
         final ParentedOid deString = ParentedOid.deString(enString);
@@ -63,10 +63,10 @@ public class OidMarshallerTest_roundtripping {
     @Test
     public void collectionOid_withVersion() {
         RootOid parentOid = Factory.persistentOf(ObjectSpecId.of("CUS"), "123", 90807L);
-        ParentedOid oid = ParentedOid.ofName(parentOid, "items");
+        ParentedOid oid = Factory.parentedOfName(parentOid, "items");
         
         final String enString = oid.enString();
-        final ParentedOid deString = ParentedOid.deString(enString);
+        final ParentedOid deString = Oid.unmarshaller().unmarshal(enString, ParentedOid.class);
         assertThat(deString, is(oid));
         assertThat(deString.getParentOid().getVersion(), is(parentOid.getVersion())); // assert separately because not part of equality check
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenPersistent.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenPersistent.java
index d39b1be..7fd4921 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenPersistent.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenPersistent.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.adapter.oid;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.isis.core.metamodel.adapter.oid.Oid.State;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
 
@@ -30,17 +29,17 @@ public class RootOidDefaultTest_valueSemantics_whenPersistent extends ValueTypeC
     @Override
     protected List<RootOid> getObjectsWithSameValue() {
         return Arrays.asList(
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.PERSISTENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.PERSISTENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.PERSISTENT));
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "123"));
     }
 
     @Override
     protected List<RootOid> getObjectsWithDifferentValue() {
         return Arrays.asList(
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.TRANSIENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "124", State.PERSISTENT),
-                RootOid.of(ObjectSpecId.of("CUX"), "123", State.PERSISTENT));
+                Oid.Factory.transientOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "124"),
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUX"), "123"));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenTransient.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenTransient.java
index d7fffdf..9c84324 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenTransient.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/RootOidDefaultTest_valueSemantics_whenTransient.java
@@ -21,7 +21,6 @@ package org.apache.isis.core.metamodel.adapter.oid;
 import java.util.Arrays;
 import java.util.List;
 
-import org.apache.isis.core.metamodel.adapter.oid.Oid.State;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.unittestsupport.value.ValueTypeContractTestAbstract;
 
@@ -30,18 +29,18 @@ public class RootOidDefaultTest_valueSemantics_whenTransient extends ValueTypeCo
     @Override
     protected List<RootOid> getObjectsWithSameValue() {
         return Arrays.asList(
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.TRANSIENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.TRANSIENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.TRANSIENT)
+                Oid.Factory.transientOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.transientOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.transientOf(ObjectSpecId.of("CUS"), "123")
             );
     }
 
     @Override
     protected List<RootOid> getObjectsWithDifferentValue() {
         return Arrays.asList(
-                RootOid.of(ObjectSpecId.of("CUS"), "123", State.PERSISTENT),
-                RootOid.of(ObjectSpecId.of("CUS"), "124", State.TRANSIENT),
-                RootOid.of(ObjectSpecId.of("CUX"), "123", State.TRANSIENT));
+                Oid.Factory.persistentOf(ObjectSpecId.of("CUS"), "123"),
+                Oid.Factory.transientOf(ObjectSpecId.of("CUS"), "124"),
+                Oid.Factory.transientOf(ObjectSpecId.of("CUX"), "123"));
     }
 
 }
diff --git a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
index f627329..2974c01 100644
--- a/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
+++ b/core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
@@ -94,7 +94,7 @@ public class PojoAdapterBuilder {
         }, COLLECTION {
             @Override
             Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String collectionId) {
-                return Oid.Factory.collectionOfName(rootOid, collectionId);
+                return Oid.Factory.parentedOfName(rootOid, collectionId);
             }
         }, VALUE {
             @Override
diff --git a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
index abdd3da..e5f3681 100644
--- a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PojoAdapterBuilder.java
@@ -94,7 +94,7 @@ public class PojoAdapterBuilder {
         }, COLLECTION {
             @Override
             Oid oidFor(RootOid rootOid, ObjectSpecId objectSpecId, String collectionId) {
-                return Oid.Factory.collectionOfName(rootOid, collectionId);
+                return Oid.Factory.parentedOfName(rootOid, collectionId);
             }
         }, VALUE {
             @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
index da71211..ef0038e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
@@ -73,7 +73,7 @@ class ObjectAdapterContext_NewIdentifier {
         final String identifier = persistenceSession.identifierFor(pojo);
         
         final ObjectSpecId objectSpecId = spec.getSpecId();
-        return RootOid.of(objectSpecId, identifier, Oid.State.PERSISTENT);
+        return Oid.Factory.persistentOf(objectSpecId, identifier);
     }
     
 }
\ 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 8a77f0f..1af8f5b 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
@@ -60,7 +60,7 @@ public class OidProviders {
         @Override
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
             final String identifier = PersistenceSession.SERVICE_IDENTIFIER;
-            return RootOid.of(spec.getSpecId(), identifier, Oid.State.PERSISTENT);
+            return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
         }
 
     }
@@ -82,10 +82,10 @@ public class OidProviders {
             final boolean isRecognized = persistenceSession.isRecognized(pojo);
             if(isRecognized) {
                 final String identifier = persistenceSession.identifierFor(pojo);
-                return RootOid.of(spec.getSpecId(), identifier, Oid.State.PERSISTENT);
+                return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
             } else {
                 final String identifier = UUID.randomUUID().toString();
-                return RootOid.of(spec.getSpecId(), identifier, Oid.State.TRANSIENT);    
+                return Oid.Factory.transientOf(spec.getSpecId(), identifier);    
             }
         }
         
@@ -100,7 +100,7 @@ public class OidProviders {
 
         @Override
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            return RootOid.value();
+            return Oid.Factory.value();
         }
 
     }
@@ -116,7 +116,7 @@ public class OidProviders {
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
             final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
             final String identifier = recreatableObjectFacet.memento(pojo);
-            return RootOid.of(spec.getSpecId(), identifier, Oid.State.VIEWMODEL);
+            return Oid.Factory.viewmodelOf(spec.getSpecId(), identifier);
         }
 
     }
@@ -131,7 +131,7 @@ public class OidProviders {
         @Override
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
             final String identifier = UUID.randomUUID().toString();
-            return RootOid.of(spec.getSpecId(), identifier, Oid.State.TRANSIENT);
+            return Oid.Factory.transientOf(spec.getSpecId(), identifier);
         }
 
     }
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
index 6793401..4a8ae7a 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
@@ -110,7 +110,7 @@ public final class OidUtils {
         // ("*") from the specId, meaning that the marshalling logic above in RootOidDefault.deString() creates an
         // oid in the wrong state.  The code below checks for this and recreates the oid with the current state of 'view model'
         if(!rootOid.isViewModel()) {
-            return RootOid.of(rootOid.getObjectSpecId(), rootOid.getIdentifier(), Oid.State.VIEWMODEL);
+            return Oid.Factory.viewmodelOf(rootOid.getObjectSpecId(), rootOid.getIdentifier());
         }
         return rootOid;
     }