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/02/11 09:34:45 UTC

[isis] branch 2033-IoC updated: ISIS-2033: lets UniversalOid no longer inherit from RootOid

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

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


The following commit(s) were added to refs/heads/2033-IoC by this push:
     new f7d8e1a  ISIS-2033: lets UniversalOid no longer inherit from RootOid
f7d8e1a is described below

commit f7d8e1a8cb137129623329e39aa320a3cd6889fb
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Feb 11 10:34:34 2019 +0100

    ISIS-2033: lets UniversalOid no longer inherit from RootOid
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-2033
---
 .../core/metamodel/adapter/oid/Oid_Universal.java  | 118 ++++++++++---------
 .../core/metamodel/adapter/oid/UniversalOid.java   |  39 +++----
 .../context/managers}/AuthorityDescriptor.java     |   2 +-
 .../context/managers}/ContextHandler.java          |   8 +-
 .../context/managers}/ContextManager.java          |   2 +-
 .../system/context/managers/Converters.java        |  79 +++++++++++++
 .../managers/Converters_Implementations.java       | 128 +++++++++++++++++++++
 .../context/managers}/ManagedObjectResolver.java   |  11 +-
 .../context/managers}/UniversalContextManager.java |   6 +-
 .../managers}/UniversalObjectManager.java          | 114 +++---------------
 .../persistence/IsisLegacyJdoContextHandler.java   |   6 +-
 .../adaptermanager/ObjectAdapterContext.java       |   2 +-
 ...ctAdapterContext_ObjectAdapterByIdProvider.java |  31 ++---
 ...ObjectAdapterContext_ObjectAdapterProvider.java |   2 +-
 .../ObjectAdapterContext_OidProviders.java         |  77 +++++++------
 .../wicket/ConverterForObjectAdapter.java          |  20 ++--
 .../model/mementos/ObjectAdapterMemento.java       |  55 +++++----
 .../wicket/model/models/EntityCollectionModel.java |  13 ++-
 .../modules/spring/SpringDataJPADemoHandler.java   |   6 +-
 19 files changed, 433 insertions(+), 286 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Universal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Universal.java
index 4f33110..2bbd783 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Universal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Universal.java
@@ -19,37 +19,48 @@
 
 package org.apache.isis.core.metamodel.adapter.oid;
 
-import java.io.IOException;
 import java.net.URI;
+import java.util.ArrayList;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.commons.internal.debug._Probe;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.uri._URI;
-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;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import lombok.Setter;
 import lombok.val;
 
 @RequiredArgsConstructor(staticName="of")
 final class Oid_Universal implements UniversalOid {
 
-    private final static long serialVersionUID = 1L;
-	private final static _Probe probe = _Probe.unlimited().label("Oid_Universal");
+    //private final static long serialVersionUID = 1L;
+	//private final static _Probe probe = _Probe.unlimited().label("Oid_Universal");
     
-	private final URI universalId;
-	@Getter @Setter private Version version;
+	@Getter(onMethod=@__({@Override})) private final URI objectUri;
+	
+	@Getter(lazy=true, onMethod=@__({@Override}))
+	private final Version version = parseVersion();
+	
+	@Getter(lazy=true, onMethod=@__({@Override})) 
+	private final ObjectSpecId objectSpecId = parseObjectSpecId();
+	
+	@Override
+	public String getIdentifier() {
+		return getObjectUri().getQuery();
+	}
 	
 	@Override
-	public ObjectSpecId getObjectSpecId() {
+	public String toString() {
+		return enString();
+	}
+	
+	// -- HELPER
+	
+	private ObjectSpecId parseObjectSpecId() {
 		
-		val path = universalId().getPath();
+		val path = getObjectUri().getPath();
 		
 		val firstPathEntry = _Strings.splitThenStream(path, "/")
 		.filter(_Strings::isNotEmpty)
@@ -58,83 +69,78 @@ final class Oid_Universal implements UniversalOid {
 		
 		return ObjectSpecId.of(firstPathEntry);
 	}
-
-	@Override
-	public String getIdentifier() {
-		return universalId().getQuery();
+	
+	private Version parseVersion() {
+		val versionEncoded = getObjectUri().getFragment();
+		if(_Strings.isEmpty(versionEncoded)) {
+			return null;
+		}
+		
+		val parts = new ArrayList<String>(3);
+		_Strings.splitThenStream(versionEncoded, ":") // see org.apache.isis.core.metamodel.adapter.oid.Oid_Marshaller.SEPARATOR
+		.forEach(parts::add);
+		
+		final String versionSequence = parts.get(0);
+        final String versionUser = parts.get(1);
+        final String versionUtcTimestamp = parts.get(2);
+        final Version version = Version.Factory.parse(versionSequence, versionUser, versionUtcTimestamp);
+		return version;
 	}
+	
 
-	@Override
-	public Bookmark asBookmark() {
+	//@Override
+	private Bookmark asBookmark() {
 		
 		//TODO [2033] bad place to do this here, change API ?
 		//probe.println("NOT IMPLEMENTED: 'asBookmark()'");
 		
 		final String objectType = getObjectSpecId().asString(); 
 				//asBookmarkObjectState().getCode() + rootOid.getObjectSpecId().asString();
-        final String identifier = universalId().getQuery();
+        final String identifier = getObjectUri().getQuery();
         		//rootOid.getIdentifier();
         
         return new Bookmark(objectType, identifier);
 
 	}
 
-	@Override
-	public OidDto asOidDto() {
-		_Exceptions.throwNotImplemented();
-		
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public String enString() {
-		if(version==null) {
+	//@Override
+	private String enString() {
+		val version = getVersion(); 
+		if(Version.isEmpty(version)) {
 			return enStringNoVersion();
 		}
-		return _URI.uriBuilder(universalId)
+		val plain = _URI.uriBuilder(objectUri)
 				.fragment(version.enString())
 				.build()
 				.toURI()
 				.toString();
+		
+		return plain;
 	}
 
-	@Override
-	public String enStringNoVersion() {
-		return universalId.toString();
+	//@Override
+	private String enStringNoVersion() {
+		return objectUri.toString();
 	}
 
-	@Override
-	public boolean isTransient() {
+	//@Override
+	private boolean isTransient() {
 		return false;
 	}
 
-	@Override
-	public boolean isViewModel() {
+	//@Override
+	private boolean isViewModel() {
 		return false;
 	}
 
-	@Override
-	public boolean isPersistent() {
+	//@Override
+	private boolean isPersistent() {
 		return true;
 	}
 
-	@Override
-	public Oid copy() {
-		return of(universalId());
-	}
-
-	@Override
-	public void encode(DataOutputExtended outputStream) throws IOException {
-		_Exceptions.throwNotImplemented();
-		
-		// TODO Auto-generated method stub
-		
-	}
-
-	@Override
-	public URI universalId() {
-		return universalId;
+	//@Override
+	private UniversalOid copy() {
+		return of(getObjectUri());
 	}
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/UniversalOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/UniversalOid.java
index 85cadb3..baf82cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/UniversalOid.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/UniversalOid.java
@@ -1,35 +1,24 @@
 package org.apache.isis.core.metamodel.adapter.oid;
 
 import java.net.URI;
-import java.net.URISyntaxException;
 
-import org.apache.isis.commons.internal.base._Either;
-import org.apache.isis.commons.internal.uri._URI;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 
-import lombok.val;
+public interface UniversalOid /*extends RootOid*/ {
 
-public interface UniversalOid extends RootOid {
+	URI getObjectUri();
 
-	URI universalId();
-
-	static _Either<UniversalOid, URISyntaxException> parseUri(String uriString) {
-		
-		if(!_URI.isUoid(uriString)) {
-			
-			val ex = new URISyntaxException(uriString, "Does not match _URI#isUoid.");
-			return _Either.right(ex);	
-		}
-		
-		try {
-			val uri = new URI(uriString);
-			
-			return _Either.left(Oid.Factory.universal(uri));
-			
-		} catch (URISyntaxException ex) {
-		
-			return _Either.right(ex);
-		}
-		
+	// -- FROM (ROOT) OID
+	
+	ObjectSpecId getObjectSpecId();
+	String getIdentifier();
+	Version getVersion();
+	
+	// -- FACTORIES
+	
+	static UniversalOid of(URI uri) {
+		return Oid.Factory.universal(uri);
 	}
 	
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/AuthorityDescriptor.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/AuthorityDescriptor.java
similarity index 93%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/AuthorityDescriptor.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/AuthorityDescriptor.java
index 39fc8a4..c36203c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/AuthorityDescriptor.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/AuthorityDescriptor.java
@@ -1,4 +1,4 @@
-package org.apache.isis.core.runtime.contextmanger;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import org.apache.isis.commons.internal.uri._URI;
 import org.apache.isis.commons.internal.uri._URI.ContainerType;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextHandler.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextHandler.java
similarity index 76%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextHandler.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextHandler.java
index 29defff..719b946 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextHandler.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextHandler.java
@@ -1,4 +1,4 @@
-package org.apache.isis.core.runtime.contextmanger;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import java.net.URI;
 
@@ -18,10 +18,10 @@ public interface ContextHandler extends ManagedObjectResolver {
 	
 	/**
 	 * To support chain-of-responsibility pattern.
-	 * @param uri
-	 * @return whether this manager sees itself responsible to manage objects represented by given uri
+	 * @param objectUri
+	 * @return whether this manager sees itself responsible to manage objects represented by given objectUri
 	 */
-	boolean recognizes(URI uri);
+	boolean recognizes(URI objectUri);
 	
 
 	
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextManager.java
similarity index 86%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextManager.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextManager.java
index 0e48200..ec788ca 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ContextManager.java
@@ -1,4 +1,4 @@
-package org.apache.isis.core.runtime.contextmanger;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import java.util.Optional;
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters.java
new file mode 100644
index 0000000..244c8f1
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters.java
@@ -0,0 +1,79 @@
+package org.apache.isis.core.runtime.system.context.managers;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+
+import lombok.val;
+
+/**
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+public final class Converters {
+	
+	public static FromUriConverter fromUriConverter() {
+		return Converters_Implementations.fromUriConverter;
+	}
+
+	public static ToUriConverter toUriConverter() {
+		return Converters_Implementations.toUriConverter;
+	}
+	
+	// -- FROM URI CONVERTER
+	
+	public static interface FromUriConverter {
+		String encodeToString(@Nullable URI objectUri);
+		String encodeToBase64(URI objectUri);
+		RootOid toRootOid(@Nullable URI objectUri);
+	}
+	
+	// -- TO URI CONVERTER
+	
+	public static interface ToUriConverter {
+		
+		_Either<URI, URISyntaxException> decodeFromString(String uriString);
+		_Either<URI, URISyntaxException> decodeFromBase64(String base64EncodedUriString);
+		
+		default URI decodeFromStringElseFail(String encoded) {
+			val uriOrError = decodeFromString(encoded);
+	    	if(uriOrError.isRight()) {
+	    		
+	    		// TODO [2033] legacy support if required could be ...
+	    		// final RootOid rootOid = RootOid.deStringEncoded(value);
+	    		
+	    		throw _Exceptions.unrecoverable("Object-URI decoding failed.", uriOrError.rightIfAny());	
+	    	}
+			return uriOrError.leftIfAny();
+		}
+
+		default URI toURI(ObjectSpecId specId, String identifier) {
+			val objectManager = UniversalObjectManager.current();
+			val authority = objectManager.authorityForElseFail(specId);
+			val uri = authority.toUoidDtoBuilder(specId)
+					.query(identifier)
+					.build()
+					.toURI();		
+
+			return uri; 
+		}
+		
+		URI toURI(RootOid rootOid);
+
+
+		
+	}
+		
+	// --
+	
+
+	
+	
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters_Implementations.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters_Implementations.java
new file mode 100644
index 0000000..47bfa08
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/Converters_Implementations.java
@@ -0,0 +1,128 @@
+package org.apache.isis.core.runtime.system.context.managers;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.isis.commons.internal.base._Bytes;
+import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.uri._URI;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.oid.UniversalOid;
+import org.apache.isis.core.runtime.system.context.managers.Converters.FromUriConverter;
+import org.apache.isis.core.runtime.system.context.managers.Converters.ToUriConverter;
+
+import lombok.val;
+
+/**
+ * 
+ * @since 2.0.0-M3
+ *
+ */
+final class Converters_Implementations {
+	
+	private static class FromUriConverterDefault implements FromUriConverter {
+
+		@Override
+		public String encodeToString(URI objectUri) {
+			if (objectUri == null) {
+	            return null;
+	        }
+			return objectUri.toString();
+		}
+		
+		@Override
+		public String encodeToBase64(URI objectUri) {
+			if (objectUri == null) {
+	            return null;
+	        }
+			
+			val raw = _Strings.toBytes(encodeToString(objectUri), UTF_8);
+			val encoded = _Bytes.asUrlBase64.apply(raw);
+			return _Strings.ofBytes(encoded, UTF_8);
+		}
+		
+
+		@Override
+		public RootOid toRootOid(URI objectUri) {
+			if (objectUri == null) {
+	            return null;
+	        }
+			
+			val uoid = UniversalOid.of(objectUri);
+			val specId = uoid.getObjectSpecId();
+			val identifier = uoid.getIdentifier();
+			val versionEncoded = uoid.getVersion();
+			
+			//FIXME [2033] no version support
+			return Oid.Factory.persistentOf(specId, identifier);
+		}
+		
+	}
+	
+	private static class ToUriConverterDefault implements ToUriConverter {
+
+		@Override
+		public _Either<URI, URISyntaxException> decodeFromString(String uriString) {
+				
+			if(!_URI.isUoid(uriString)) {
+				
+				val ex = new URISyntaxException(uriString, "Does not match _URI#isUoid.");
+				return _Either.right(ex);	
+			}
+			
+			try {
+				val uri = new URI(uriString);
+				
+				return _Either.left(uri);
+				
+			} catch (URISyntaxException ex) {
+			
+				return _Either.right(ex);
+			}
+			
+		}
+		
+		@Override
+		public _Either<URI, URISyntaxException> decodeFromBase64(String base64) {
+			
+			val base64Bytes = _Strings.toBytes(base64, UTF_8);
+			val plainBytes = _Bytes.ofUrlBase64.apply(base64Bytes);
+			val plain = _Strings.ofBytes(plainBytes, UTF_8);
+			
+			return decodeFromString(plain);
+		}
+
+		@Override
+		public URI toURI(RootOid rootOid) {
+			
+			val specId = rootOid.getObjectSpecId();
+			val identifier = rootOid.getIdentifier();
+			val version = rootOid.getVersion();
+			
+			val objectManager = UniversalObjectManager.current();
+			val authority = objectManager.authorityForElseFail(specId);
+			
+			val uriBuilder = authority.toUoidDtoBuilder(specId)
+					.query(identifier);
+			
+			if(version!=null) {
+				uriBuilder.fragment(version.enString());
+			}
+			
+			return uriBuilder
+					.build()
+					.toURI();
+		}
+		
+	}
+
+	// -- STATIC INSTANCES
+	
+	final static FromUriConverter fromUriConverter = new FromUriConverterDefault();
+	final static ToUriConverter toUriConverter = new ToUriConverterDefault();
+	
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ManagedObjectResolver.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
similarity index 83%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ManagedObjectResolver.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
index 5ba8694..89ffdfc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/ManagedObjectResolver.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/ManagedObjectResolver.java
@@ -1,4 +1,4 @@
-package org.apache.isis.core.runtime.contextmanger;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import java.net.URI;
 import java.util.Optional;
@@ -24,16 +24,15 @@ public interface ManagedObjectResolver {
 	 * @param managedObject
 	 * @return identifier 
 	 */
-	URI identifierOf(ManagedObject managedObject);
-	
+	URI uriOf(ManagedObject managedObject);
 	
 	/**
 	 * Retrieve a reference to the ManagedObject as identified by the identifier. 
 	 * @param specId 
-	 * @param identifier
+	 * @param uri
 	 * @return
 	 */
-	Instance<ManagedObject> resolve(ObjectSpecId specId, URI identifier);
+	Instance<ManagedObject> resolve(ObjectSpecId specId, URI uri);
 	
 	
 	/**
@@ -44,7 +43,7 @@ public interface ManagedObjectResolver {
 	 */
 	default Instance<ManagedObject> resolve(UniversalOid universalOid) {
 		val spec = universalOid.getObjectSpecId();
-		return resolve(spec, universalOid.universalId());
+		return resolve(spec, universalOid.getObjectUri());
 	}
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/UniversalContextManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
similarity index 92%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/UniversalContextManager.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
index 4972e78..e76359c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/contextmanger/UniversalContextManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalContextManager.java
@@ -1,4 +1,4 @@
-package org.apache.isis.core.runtime.contextmanger;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
@@ -22,7 +22,7 @@ public class UniversalContextManager implements ContextManager {
 	@Inject Instance<ContextHandler> contextHandlers;
 	
 	@Override
-	public URI identifierOf(ManagedObject managedObject) {
+	public URI uriOf(ManagedObject managedObject) {
 		
 		requires(managedObject, "managedObject");
 		
@@ -33,7 +33,7 @@ public class UniversalContextManager implements ContextManager {
 			throw _Exceptions.unrecoverable(msg); 
 		}
 		
-		val uri = resolver.identifierOf(managedObject);
+		val uri = resolver.uriOf(managedObject);
 		
 		return uri;
 		
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/UniversalObjectManager.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
similarity index 52%
rename from core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/UniversalObjectManager.java
rename to core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
index 25d4094..af72db0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/UniversalObjectManager.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/managers/UniversalObjectManager.java
@@ -1,24 +1,18 @@
-package org.apache.isis.core.runtime.system.persistence;
+package org.apache.isis.core.runtime.system.context.managers;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
-import java.net.URISyntaxException;
+import java.net.URI;
 import java.util.stream.Stream;
 
-import javax.annotation.Nullable;
-
-import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 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.UniversalOid;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.runtime.contextmanger.AuthorityDescriptor;
-import org.apache.isis.core.runtime.contextmanger.ContextManager;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSession;
@@ -39,91 +33,31 @@ public interface UniversalObjectManager {
 
 	// -- INTERFACE
 	
-	OidEncoder getOidEncoder();
-	OidDecoder getOidDecoder();
-	
 	AuthorityDescriptor authorityForElseFail(ObjectSpecId specId);
 	
-	Stream<ObjectAdapter> resolve(Stream<UniversalOid> uoids);
-	ObjectAdapter resolve(UniversalOid uoid);
+	Stream<ObjectAdapter> resolve(Stream<URI> objectUris);
+	ObjectAdapter resolve(URI objectUri);
 
 	// -- RESULT CONTAINER 
 	
 	@Value(staticConstructor="of")
 	static final class ResolveResult {
-		@Getter private final UniversalOid uoid; 
+		@Getter private final URI objectUri; 
 		@Getter private final ManagedObject managedObject;
 		
 		public ObjectAdapter toObjectAdapter(IsisSession isisSession) {
 			val pojo = managedObject.getPojo();
-			return pojo!=null 
-					? PojoAdapter.of(pojo, uoid, isisSession)
-							: null;
-		}
-		
-	}
-	
-	// -- OID ENCODER / DECODER
-	
-	static interface OidEncoder {
-		String encodeToString(@Nullable UniversalOid oid);
-
-		default String encodeToStringWithLegacySupport(@Nullable Oid oid) {
-			if (oid == null) {
-	            return null;
-	        }
-			if(oid instanceof UniversalOid) {
-	    		return encodeToString((UniversalOid) oid);
+			if(pojo==null) {
+				return null;
 			}
-			// legacy support ...
-			_Probe.warnNotImplementedYet("instead we should convert a concrete RootOid to a UniversalOid");
-			// FIXME [2033] instead we should convert a concrete RootOid to a UniversalOid
-	    	return oid.enString();
+			val converter = Converters.fromUriConverter();
+			val rootOid = converter.toRootOid(objectUri);
+			return PojoAdapter.of(pojo, rootOid, isisSession);
 		}
-	}
-	
-	static interface OidDecoder {
-		_Either<UniversalOid, URISyntaxException> decodeFromString(String encoded);
 		
-		default UniversalOid decodeFromStringElseFail(String encoded) {
-			val uoidOrError = decodeFromString(encoded);
-	    	if(uoidOrError.isRight()) {
-	    		
-	    		// TODO [2033] legacy support if required could be ...
-	    		// final RootOid rootOid = RootOid.deStringEncoded(value);
-	    		
-	    		throw _Exceptions.unrecoverable("Oid decoding failed.", uoidOrError.rightIfAny());	
-	    	}
-			return uoidOrError.leftIfAny();
-		}
 	}
 	
-	// --
 	
-	static class Codecs {
-		
-		private static class UniversalOidEncoder implements OidEncoder {
-
-			@Override
-			public String encodeToString(@Nullable UniversalOid oid) {
-				if (oid == null) {
-		            return null;
-		        }
-		        return oid.enString();
-			}
-			
-		}
-		
-		private static class UniversalOidDecoder implements OidDecoder {
-
-			@Override
-			public _Either<UniversalOid, URISyntaxException> decodeFromString(String encoded) {
-				return UniversalOid.parseUri(encoded);
-			}
-			
-		}
-		
-	}
 	
 	// -- SAMPLE - TODO [2033] just for proof of concept, needs refinement
 	
@@ -138,20 +72,20 @@ public interface UniversalObjectManager {
 		
 			
 		@Override
-		public Stream<ObjectAdapter> resolve(Stream<UniversalOid> uoids) {
+		public Stream<ObjectAdapter> resolve(Stream<URI> objectUris) {
 			val contextManager = this.contextManager.get();
 			val isisSession = IsisSession.currentIfAny();
 			
 			probe.println("resolve multiple ...");
 			
-			return stream(uoids)
-					.flatMap(uoid->{
+			return stream(objectUris)
+					.flatMap(objectUri->{
 						
-						probe.println(1, "resolving %s", uoid.enString());
+						probe.println(1, "resolving %s", objectUri);
 						
-						val instance = contextManager.resolve(uoid);
+						val instance = contextManager.resolve(UniversalOid.of(objectUri));
 						return instance.stream()
-						.map(managedObject->ResolveResult.of(uoid, managedObject)
+						.map(managedObject->ResolveResult.of(objectUri, managedObject)
 								.toObjectAdapter(isisSession))
 						.filter(_NullSafe::isPresent);
 					})
@@ -159,15 +93,15 @@ public interface UniversalObjectManager {
 		}
 
 		@Override
-		public ObjectAdapter resolve(UniversalOid uoid) {
+		public ObjectAdapter resolve(URI objectUri) {
 			val contextManager = this.contextManager.get();
-			val instance = contextManager.resolve(uoid);
+			val instance = contextManager.resolve(UniversalOid.of(objectUri));
 			
     		if(instance.isResolvable()) {
     			val managedObject = instance.get();
     			val isisSession = IsisSession.currentIfAny();
     			
-    			return ResolveResult.of(uoid, managedObject).toObjectAdapter(isisSession);
+    			return ResolveResult.of(objectUri, managedObject).toObjectAdapter(isisSession);
     			
     		} else if(instance.isAmbiguous()) {
     			
@@ -183,16 +117,6 @@ public interface UniversalObjectManager {
 		}
 
 		@Override
-		public OidEncoder getOidEncoder() {
-			return new Codecs.UniversalOidEncoder();
-		}
-
-		@Override
-		public OidDecoder getOidDecoder() {
-			return new Codecs.UniversalOidDecoder();
-		}
-
-		@Override
 		public AuthorityDescriptor authorityForElseFail(ObjectSpecId specId) {
 			
 			// given the specId, try to resolve 'containerType', 'contextType' and 'contextId'
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLegacyJdoContextHandler.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLegacyJdoContextHandler.java
index 7fa8ab3..b4ddf30 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLegacyJdoContextHandler.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/IsisLegacyJdoContextHandler.java
@@ -22,9 +22,9 @@ import org.apache.isis.core.metamodel.spec.ManagedObject.SimpleManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.contextmanger.AuthorityDescriptor;
-import org.apache.isis.core.runtime.contextmanger.ContextHandler;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.context.managers.AuthorityDescriptor;
+import org.apache.isis.core.runtime.system.context.managers.ContextHandler;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 
 import lombok.val;
@@ -49,7 +49,7 @@ public class IsisLegacyJdoContextHandler implements ContextHandler {
 	}
 
 	@Override
-	public URI identifierOf(ManagedObject managedObject) {
+	public URI uriOf(ManagedObject managedObject) {
     	try {
 			return identifierForPersistable(managedObject.getPojo(), managedObject.getSpecification());
 		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index 42c9245..1ecedc8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -40,9 +40,9 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.contextmanger.ContextManager;
 import org.apache.isis.core.runtime.memento.Data;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.context.managers.ContextManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
index e55101d..e70e769 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterByIdProvider.java
@@ -38,11 +38,11 @@ import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.contextmanger.ContextManager;
 import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
 import org.apache.isis.core.runtime.persistence.PojoRecreationException;
+import org.apache.isis.core.runtime.system.context.managers.ContextManager;
+import org.apache.isis.core.runtime.system.context.managers.UniversalObjectManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.UniversalObjectManager;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -118,7 +118,7 @@ class ObjectAdapterContext_ObjectAdapterByIdProvider implements ObjectAdapterByI
             final RootOid rootOid,
             final ConcurrencyChecking concurrencyChecking) {
                 
-        /* FIXME [ISIS-1976] SPI for adapterFor(RootOid)
+        /* FIXME [2033] SPI for adapterFor(RootOid)
          * https://github.com/apache/isis/pull/121#discussion_r215889748
          * 
          * Eventually I'm hoping that this code will simplify and then become pluggable.
@@ -136,18 +136,23 @@ class ObjectAdapterContext_ObjectAdapterByIdProvider implements ObjectAdapterByI
          * generalization of that concept).
          */
     	
-    	
-    	if(rootOid instanceof UniversalOid) {
-    		
-    		Objects.requireNonNull(rootOid);
-    		
-    		val universalOid = (UniversalOid) rootOid;
-    		val objectManager = UniversalObjectManager.current();
-    		
-    		return objectManager.resolve(universalOid);
+    	// this should never be called to resolve for other then legacy JDO
+    	//FIXME [2033] remove guard
+    	if(!rootOid.enStringNoVersion().contains("SimpleObject")) {
+    		throw _Exceptions.unexpectedCodeReach();
     	}
     	
-        //FIXME [ISIS-1976] remove guard
+//    	if(rootOid instanceof UniversalOid) {
+//    		
+//    		Objects.requireNonNull(rootOid);
+//    		
+//    		val universalOid = (UniversalOid) rootOid;
+//    		val objectManager = UniversalObjectManager.current();
+//    		
+//    		return objectManager.resolve(universalOid);
+//    	}
+    	
+        //FIXME [2033] remove guard
         final ObjectAdapter serviceAdapter = objectAdapterContext.lookupServiceAdapterFor(rootOid);
         if (serviceAdapter != null) {
             //throw _Exceptions.unexpectedCodeReach();
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 0653f12..6d97c68 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -77,7 +77,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
                 .add(new ObjectAdapterContext_OidProviders.OidForServices())
                 .add(new ObjectAdapterContext_OidProviders.OidForValues())
                 .add(new ObjectAdapterContext_OidProviders.OidForViewModels())
-                .add(new ObjectAdapterContext_OidProviders.OidForPersistent())
+//                .add(new ObjectAdapterContext_OidProviders.OidForPersistent())
                 .add(new ObjectAdapterContext_OidProviders.OidForOthers())
                 .build();
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
index 12e949d..96f59fe 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
@@ -23,17 +23,17 @@ import java.util.UUID;
 
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._Tuples;
-import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.runtime.contextmanger.ContextManager;
-import org.apache.isis.core.runtime.contextmanger.ManagedObjectResolver;
 import org.apache.isis.core.runtime.system.SystemConstants;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.context.managers.ContextManager;
+import org.apache.isis.core.runtime.system.context.managers.Converters;
+import org.apache.isis.core.runtime.system.context.managers.Converters.FromUriConverter;
+import org.apache.isis.core.runtime.system.context.managers.ManagedObjectResolver;
 import org.apache.isis.core.runtime.system.persistence.adaptermanager.factories.OidFactory.OidProvider;
 
 import lombok.val;
@@ -71,41 +71,44 @@ class ObjectAdapterContext_OidProviders {
         }
 
     }
-
-    static class OidForPersistent implements OidProvider {
-
-        private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
-
-        @Override
-        public boolean isHandling(ManagedObject managedObject) {
-            // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
-            final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin
-            		.isPersistenceEnhanced(managedObject.getPojo().getClass());
-            return isInstanceOfPersistable;
-        }
-
-        @Override
-        public RootOid oidFor(ManagedObject managedObject) {
-        	val pojo = managedObject.getPojo();
-        	val spec = managedObject.getSpecification();
-        	
-            final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-            final boolean isRecognized = persistenceSession.isRecognized(pojo);
-            if(isRecognized) {
-                final String identifier = persistenceSession.identifierFor(pojo);
-                return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
-            } else {
-                final String identifier = UUID.randomUUID().toString();
-                return Oid.Factory.transientOf(spec.getSpecId(), identifier);    
-            }
-        }
-        
-    }
+    
+//TODO [2033] is now handled through OidForManagedContexts
+//    
+//    static class OidForPersistent implements OidProvider {
+//
+//        private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
+//
+//        @Override
+//        public boolean isHandling(ManagedObject managedObject) {
+//            // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
+//            final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin
+//            		.isPersistenceEnhanced(managedObject.getPojo().getClass());
+//            return isInstanceOfPersistable;
+//        }
+//
+//        @Override
+//        public RootOid oidFor(ManagedObject managedObject) {
+//        	val pojo = managedObject.getPojo();
+//        	val spec = managedObject.getSpecification();
+//        	
+//            final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
+//            final boolean isRecognized = persistenceSession.isRecognized(pojo);
+//            if(isRecognized) {
+//                final String identifier = persistenceSession.identifierFor(pojo);
+//                return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
+//            } else {
+//                final String identifier = UUID.randomUUID().toString();
+//                return Oid.Factory.transientOf(spec.getSpecId(), identifier);    
+//            }
+//        }
+//        
+//    }
 
     static class OidForManagedContexts implements OidProvider {
 
     	final _Lazy<ContextManager> contextManager = _Lazy.of(()->
     		IsisContext.getServiceRegistry().lookupServiceElseFail(ContextManager.class));
+    	final FromUriConverter converter = Converters.fromUriConverter();
     	
     	private _Tuples.Tuple2<Object, ManagedObjectResolver> latestLookup; // acts as a cache
     	
@@ -133,9 +136,9 @@ class ObjectAdapterContext_OidProviders {
         			Objects.equals(pojo, latestLookup.get_1()))
         			? latestLookup.get_2() // use cache
         					: contextManager.get().resolverForIfAny(spec);
-        			
-    		val objectIdUri = managedObjectResolver.identifierOf(managedObject);
-    		return Oid.Factory.universal(objectIdUri);
+
+        	val objectUri = managedObjectResolver.uriOf(managedObject);
+        	return converter.toRootOid(objectUri);
         }
         
     }
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
index 61352a6..2410124 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapter.java
@@ -23,7 +23,9 @@ import java.util.Locale;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.runtime.system.persistence.UniversalObjectManager;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.runtime.system.context.managers.Converters;
+import org.apache.isis.core.runtime.system.context.managers.UniversalObjectManager;
 import org.apache.wicket.util.convert.IConverter;
 
 import lombok.val;
@@ -44,10 +46,10 @@ public class ConverterForObjectAdapter implements IConverter<ObjectAdapter> {
     public ObjectAdapter convertToObject(final String value, final Locale locale) {
     	
     	val objectManager = UniversalObjectManager.current();
-    	val decoder = objectManager.getOidDecoder();
-    	val uoid = decoder.decodeFromStringElseFail(value);
+    	val decoder = Converters.toUriConverter();
+    	val objectUri = decoder.decodeFromStringElseFail(value);
     	
-    	return objectManager.resolve(uoid);
+    	return objectManager.resolve(objectUri);
     }
 
     /**
@@ -55,12 +57,12 @@ public class ConverterForObjectAdapter implements IConverter<ObjectAdapter> {
      */
     @Override
     public String convertToString(final ObjectAdapter adapter, final Locale locale) {
+    	val rootOid = (RootOid) adapter.getOid();
+    	val toUriConverter = Converters.toUriConverter();
+    	val encoder = Converters.fromUriConverter();
     	
-    	val oid = adapter.getOid();
-    	val objectManager = UniversalObjectManager.current();
-    	val encoder = objectManager.getOidEncoder();
-    	
-    	return encoder.encodeToStringWithLegacySupport(oid);
+    	val objectUri = toUriConverter.toURI(rootOid);
+    	return encoder.encodeToString(objectUri);
     }
 
 }
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index 0651202..eb7f1b9 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -37,7 +37,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.adapter.oid.UniversalOid;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -46,8 +45,9 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.memento.Memento;
 import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
+import org.apache.isis.core.runtime.system.context.managers.Converters;
+import org.apache.isis.core.runtime.system.context.managers.UniversalObjectManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.UniversalObjectManager;
 
 import lombok.val;
 
@@ -79,12 +79,14 @@ public class ObjectAdapterMemento implements Serializable {
 	public static ObjectAdapterMemento createForList(
 			final ArrayList<ObjectAdapterMemento> list,
 			final ObjectSpecId objectSpecId) {
+		
 		return new ObjectAdapterMemento(list, objectSpecId);
 	}
 
 	public static ObjectAdapterMemento createForList(
 			final Collection<ObjectAdapterMemento> list,
 			final ObjectSpecId objectSpecId) {
+		
 		return list != null ? createForList(_Lists.newArrayList(list), objectSpecId) :  null;
 	}
 
@@ -100,6 +102,7 @@ public class ObjectAdapterMemento implements Serializable {
 					final ConcurrencyChecking concurrencyChecking,
 					final PersistenceSession persistenceSession,
 					final SpecificationLoader specificationLoader) {
+				
 				return oam.type.getAdapter(oam, concurrencyChecking, persistenceSession, specificationLoader);
 			}
 
@@ -133,8 +136,10 @@ public class ObjectAdapterMemento implements Serializable {
 			@Override
 			public ObjectAdapter asAdapter(
 					final ObjectAdapterMemento oam,
-					final ConcurrencyChecking concurrencyChecking, final PersistenceSession persistenceSession,
+					final ConcurrencyChecking concurrencyChecking, 
+					final PersistenceSession persistenceSession,
 					final SpecificationLoader specificationLoader) {
+				
 				final List<Object> listOfPojos =
 						_Lists.map(oam.list, Functions.toPojo(persistenceSession, specificationLoader));
 
@@ -173,7 +178,8 @@ public class ObjectAdapterMemento implements Serializable {
 
 		public abstract ObjectAdapter asAdapter(
 				final ObjectAdapterMemento oam,
-				final ConcurrencyChecking concurrencyChecking, final PersistenceSession persistenceSession,
+				final ConcurrencyChecking concurrencyChecking, 
+				final PersistenceSession persistenceSession,
 				final SpecificationLoader specificationLoader);
 
 		public abstract int hashCode(final ObjectAdapterMemento oam);
@@ -196,6 +202,7 @@ public class ObjectAdapterMemento implements Serializable {
 					final ConcurrencyChecking concurrencyChecking,
 					final PersistenceSession persistenceSession,
 					final SpecificationLoader specificationLoader) {
+				
 				ObjectSpecId objectSpecId = oam.objectSpecId;
 				ObjectSpecification objectSpec = SpecUtils.getSpecificationFor(objectSpecId, specificationLoader);
 				final EncodableFacet encodableFacet = objectSpec.getFacet(EncodableFacet.class);
@@ -220,7 +227,8 @@ public class ObjectAdapterMemento implements Serializable {
 			@Override
 			public void resetVersion(
 					ObjectAdapterMemento objectAdapterMemento,
-					final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+					final PersistenceSession persistenceSession, 
+					final SpecificationLoader specificationLoader) {
 			}
 		},
 		/**
@@ -232,13 +240,16 @@ public class ObjectAdapterMemento implements Serializable {
 			ObjectAdapter recreateAdapter(
 					final ObjectAdapterMemento oam,
 					ConcurrencyChecking concurrencyChecking,
-					final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+					final PersistenceSession persistenceSession, 
+					final SpecificationLoader specificationLoader) {
 
 				if(_URI.isUoid(oam.persistentOidStr)) {
-					val uri = URI.create(oam.persistentOidStr);
-					val oid = Oid.Factory.universal(uri);
-					val objAdapter = persistenceSession.adapterFor(oid, concurrencyChecking);
-					return objAdapter;
+					
+					val objectManager = UniversalObjectManager.current();
+					val decoder = Converters.toUriConverter();
+					val objectUri = decoder.decodeFromStringElseFail(oam.persistentOidStr);
+					
+					return objectManager.resolve(objectUri);
 				}
 
 				RootOid oid = Oid.unmarshaller().unmarshal(oam.persistentOidStr, RootOid.class);
@@ -296,7 +307,9 @@ public class ObjectAdapterMemento implements Serializable {
 			ObjectAdapter recreateAdapter(
 					final ObjectAdapterMemento oam,
 					final ConcurrencyChecking concurrencyChecking,
-					final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+					final PersistenceSession persistenceSession, 
+					final SpecificationLoader specificationLoader) {
+				
 				return oam.transientMemento.recreateObject();
 			}
 
@@ -327,13 +340,15 @@ public class ObjectAdapterMemento implements Serializable {
 				final ConcurrencyChecking concurrencyChecking,
 				final PersistenceSession persistenceSession,
 				final SpecificationLoader specificationLoader) {
+			
 			return recreateAdapter(nom, concurrencyChecking, persistenceSession, specificationLoader);
 		}
 
 		abstract ObjectAdapter recreateAdapter(
 				final ObjectAdapterMemento nom,
 				final ConcurrencyChecking concurrencyChecking,
-				final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
+				final PersistenceSession persistenceSession, 
+				final SpecificationLoader specificationLoader);
 
 		public abstract boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other);
 		public abstract int hashCode(ObjectAdapterMemento objectAdapterMemento);
@@ -342,7 +357,8 @@ public class ObjectAdapterMemento implements Serializable {
 
 		public abstract void resetVersion(
 				ObjectAdapterMemento objectAdapterMemento,
-				final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
+				final PersistenceSession persistenceSession, 
+				final SpecificationLoader specificationLoader);
 	}
 
 
@@ -635,7 +651,7 @@ public class ObjectAdapterMemento implements Serializable {
 			return objectAdapterMemento->Oid.Factory.ofBookmark(objectAdapterMemento.asBookmark());
 		}
 
-		public static Function<ObjectAdapterMemento, UniversalOid> toUoid() {
+		public static Function<ObjectAdapterMemento, URI> toUri() {
 
 			return objectAdapterMemento->{
 
@@ -644,16 +660,9 @@ public class ObjectAdapterMemento implements Serializable {
 				val identifier = bookmark.getIdentifier();
 				//val state = Oid_State.from(bookmark); // ignored
 				//val version = Version.empty(); // ignored
-
-				val objectManager = UniversalObjectManager.current();
-				val authority = objectManager.authorityForElseFail(specId);
 				
-				val uri = authority.toUoidDtoBuilder(specId)
-						.query(identifier)
-						.build()
-						.toURI();		
-
-				return Oid.Factory.universal(uri);
+				val decoder = Converters.toUriConverter();
+				return decoder.toURI(specId, identifier);
 
 			};
 		}
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index ee5757f..87ed48e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.wicket.model.models;
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 import java.io.Serializable;
+import java.net.URI;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -47,8 +48,8 @@ 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.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.context.managers.UniversalObjectManager;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.UniversalObjectManager;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -100,11 +101,13 @@ UiHintContainer {
 
             private Stream<ObjectAdapter> loadInBulk(final EntityCollectionModel model) {
 
-                final Stream<UniversalOid> uoids = stream(model.mementoList)
-                        .map(ObjectAdapterMemento.Functions.toUoid());
+            	val objectManager = UniversalObjectManager.current();
+            	
+                final Stream<URI> objectUris = stream(model.mementoList)
+                        .map(ObjectAdapterMemento.Functions.toUri());
+                
                 
-                val objectManager = UniversalObjectManager.current();
-                return objectManager.resolve(uoids);
+                return objectManager.resolve(objectUris);
             }
             
             private Stream<ObjectAdapter> loadOneByOne(final EntityCollectionModel model) {
diff --git a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringDataJPADemoHandler.java b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringDataJPADemoHandler.java
index 5a35a82..429b308 100644
--- a/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringDataJPADemoHandler.java
+++ b/example/application/simpleapp/module-spring/src/main/java/domainapp/modules/spring/SpringDataJPADemoHandler.java
@@ -22,8 +22,8 @@ import org.apache.isis.core.metamodel.spec.ManagedObject.SimpleManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.contextmanger.AuthorityDescriptor;
-import org.apache.isis.core.runtime.contextmanger.ContextHandler;
+import org.apache.isis.core.runtime.system.context.managers.AuthorityDescriptor;
+import org.apache.isis.core.runtime.system.context.managers.ContextHandler;
 import org.springframework.context.ApplicationContext;
 
 import domainapp.modules.spring.dom.customer.Customer;
@@ -38,7 +38,7 @@ public class SpringDataJPADemoHandler implements ContextHandler {
 	@Inject SpecificationLoader specLoader;
 
 	@Override
-	public URI identifierOf(ManagedObject managedObject) {
+	public URI uriOf(ManagedObject managedObject) {
     	try {
 			return identifierForCustomer(managedObject.getPojo(), managedObject.getSpecification());
 		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException