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 2020/01/16 17:30:21 UTC

[isis] branch master updated: ISIS-2265: prepares removal of StandaloneList

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 8bf9fff  ISIS-2265: prepares removal of StandaloneList
8bf9fff is described below

commit 8bf9fff5c934f56e0e50ab2d62ccde9d1118c09e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 16 18:30:08 2020 +0100

    ISIS-2265: prepares removal of StandaloneList
    
    also decouples PersistenceSession from ObjectAdapter
---
 .../java/org/apache/isis/applib/tree/TreeNode.java |  1 +
 .../ClassSubstitutorForCollections.java            |  6 +-
 .../apache/isis/core/metamodel/spec/Container.java | 18 +++---
 .../isis/core/metamodel/spec/FreeStandingList.java | 70 +++++++++-------------
 .../isis/core/metamodel/spec/ManagedObject.java    | 16 +++++
 .../specloader/SpecificationLoaderDefault.java     | 13 ++--
 .../specimpl/ObjectSpecificationAbstract.java      |  6 +-
 ...neList.java => CollectionFacetOnContainer.java} | 18 +++---
 ...st.java => ObjectSpecificationOnContainer.java} | 14 ++---
 .../ValueTypeProviderForCollections.java           |  4 +-
 .../persistence/session/PersistenceSession.java    | 12 +---
 .../repository/RepositoryServiceDefault.java       |  2 -
 .../PersistenceQueryFindAllInstancesProcessor.java |  7 +--
 ...sistenceQueryFindUsingApplibQueryProcessor.java |  3 +-
 .../queries/PersistenceQueryProcessor.java         |  9 ++-
 .../queries/PersistenceQueryProcessorAbstract.java | 12 ++--
 .../persistence/PersistenceSession5.java           | 44 +++++++-------
 17 files changed, 128 insertions(+), 127 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java b/api/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
index 927ad3b..2fbdd00 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/tree/TreeNode.java
@@ -30,6 +30,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.internal.base._NullSafe;
 
+//@Container
 public interface TreeNode<T> {
 
     // -- VALUE
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorForCollections.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorForCollections.java
index a690888..b9a5996 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorForCollections.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutorForCollections.java
@@ -31,7 +31,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
+import org.apache.isis.core.metamodel.spec.Container;
 
 @Component
 @Named("isisMetaModel.ClassSubstitutorForCollections")
@@ -40,8 +40,8 @@ public class ClassSubstitutorForCollections implements ClassSubstitutor {
 
     @Override
     public Class<?> getClass(@lombok.NonNull @org.springframework.lang.NonNull Class<?> cls) {
-        if(FreeStandingList.class.isAssignableFrom(cls)) {
-            return FreeStandingList.class;
+        if(Container.class.isAssignableFrom(cls)) {
+            return Container.class;
         }
         // legacy
         if(Vector.class.isAssignableFrom(cls)) {
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Container.java
similarity index 66%
copy from persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Container.java
index 9e10702..b62272d 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Container.java
@@ -16,15 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries;
+package org.apache.isis.core.metamodel.spec;
 
-import java.util.List;
+/**
+ * possibly just temporary for refactoring
+ * 
+ * @since 2.0
+ */
+public interface Container {
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQuery;
+    ObjectSpecification getElementSpecification();
 
-public interface PersistenceQueryProcessor<T extends PersistenceQuery> {
-    List<ObjectAdapter> process(T query);
-}
+    String titleString();
 
-// Copyright (c) Naked Objects Group Ltd.
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/FreeStandingList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/FreeStandingList.java
index 8a9fcea..5b43e41 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/FreeStandingList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/FreeStandingList.java
@@ -19,65 +19,47 @@
 
 package org.apache.isis.core.metamodel.spec;
 
-import java.util.AbstractList;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.commons.ToString;
 
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+
 /**
  * A list returned from an action, ie not associated or owned by any entity.
  */
-public class FreeStandingList extends AbstractList<ManagedObject> {
-
-    private final List<ManagedObject> instances;
-    private final ObjectSpecification instanceSpecification;
-
-    public static <T extends ManagedObject> FreeStandingList of(
-            final ObjectSpecification instanceSpecification, 
-            final List<T> instances) {
-
-        return new FreeStandingList(instanceSpecification, instances.stream()
-                .map(x->(T)x)
-                .collect(Collectors.toList()));
+@RequiredArgsConstructor(staticName = "of")
+public class FreeStandingList implements Container {
+
+    @Getter(onMethod = @__(@Override))
+    @NonNull private final ObjectSpecification elementSpecification;
+    @NonNull private final Can<ManagedObject> elements;
+    
+    public Stream<ManagedObject> stream() {
+        return elements.stream();
     }
 
-    private FreeStandingList(
-            final ObjectSpecification instanceSpecification, 
-            final List<ManagedObject> instances) {
-
-        this.instanceSpecification = instanceSpecification;
-        this.instances = instances;
-    }
-
-    /**
-     * Required implementation of {@link AbstractList}.
-     */
-    @Override
-    public ManagedObject get(final int index) {
-        return instances.get(index);
-    }
-
-    /**
-     * Required implementation of {@link AbstractList}.
-     */
-    @Override
     public int size() {
-        return instances.size();
-    }
-
-    public ObjectSpecification getElementSpecification() {
-        return instanceSpecification;
+        return elements.size();
     }
 
+    @Override
     public String titleString() {
-        return instanceSpecification.getPluralName() + ", " + size();
+        switch(elements.getCardinality()) {
+        case ONE:
+            return getElementSpecification().getSingularName();
+        default:
+            return getElementSpecification().getPluralName() + ", " + size();
+        }
     }
 
     @Override
     public String toString() {
         final ToString s = new ToString(this);
-        s.append("elements", instanceSpecification.getFullIdentifier());
+        s.append("elements", getElementSpecification().getFullIdentifier());
 
         // title
         String title;
@@ -88,9 +70,11 @@ public class FreeStandingList extends AbstractList<ManagedObject> {
         }
         s.append("title", title);
 
-        s.append("vector", instances);
+        s.append("vector", elements);
 
         return s.toString();
     }
 
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 33aa57b..3e34ff6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -33,6 +33,7 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.domain.DomainObjectList;
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._Tuples.Indexed;
 import org.apache.isis.core.commons.internal.collections._Arrays;
 import org.apache.isis.core.commons.internal.collections._Lists;
@@ -281,6 +282,21 @@ public interface ManagedObject {
                 .map(ManagedObject::unwrapSingle)
                 .collect(_Lists.toUnmodifiable());
     }
+    
+    /**
+     * 
+     * @param adapters
+     * @return non-null, unmodifiable
+     */
+    public static List<Object> unwrapMultipleAsList(@Nullable final Can<? extends ManagedObject> adapters) {
+        if (adapters == null) {
+            return Collections.emptyList();
+        }
+        return adapters.stream()
+                .map(ManagedObject::unwrapSingle)
+                .collect(_Lists.toUnmodifiable());
+    }
+
 
     /**
      * 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
index 4e27c28..cbae7c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderDefault.java
@@ -56,7 +56,7 @@ import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutor
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorDefault;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorForCollections;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
+import org.apache.isis.core.metamodel.spec.Container;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
@@ -64,7 +64,7 @@ import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.isis.core.metamodel.specloader.specimpl.IntrospectionState;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
-import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
+import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnContainer;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.core.metamodel.valuetypes.ValueTypeProviderDefault;
@@ -374,7 +374,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         }
 
         requires(upTo, "upTo");
-
+        
         val substitutedType = classSubstitutorRegistry.getClass(type);
         if (substitutedType == null) {
             return null;
@@ -454,7 +454,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
      */
     private ObjectSpecification createSpecification(final Class<?> cls) {
 
-        if(isMetamodelFullyIntrospected() && isisConfiguration.getCore().getMetaModel().getIntrospector().isLockAfterFullIntrospection()) {
+        if(isMetamodelFullyIntrospected() 
+                && isisConfiguration.getCore().getMetaModel().getIntrospector().isLockAfterFullIntrospection()) {
             throw _Exceptions.illegalState(
                     "Cannot introspect class '%s' because the metamodel has been fully introspected and is now locked. " +
                     "One reason this can happen is if you are attempting to invoke an action through the WrapperFactory " +
@@ -465,9 +466,9 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
 
         // ... and create the specs
         final ObjectSpecificationAbstract objectSpec;
-        if (FreeStandingList.class.isAssignableFrom(cls)) {
+        if (Container.class.isAssignableFrom(cls)) {
 
-            objectSpec = new ObjectSpecificationOnStandaloneList(facetProcessor, postProcessor);
+            objectSpec = new ObjectSpecificationOnContainer(facetProcessor, postProcessor);
             objectSpec.setMetaModelContext(metaModelContext);
 
         } else {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 196bfea..7f5bd90 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -88,7 +88,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
-import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
+import org.apache.isis.core.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnContainer;
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 
 import static org.apache.isis.core.commons.internal.base._NullSafe.stream;
@@ -704,7 +704,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
      * The association with the given {@link ObjectAssociation#getId() id}.
      *
      * <p>
-     * This is overridable because {@link ObjectSpecificationOnStandaloneList}
+     * This is overridable because {@link ObjectSpecificationOnContainer}
      * simply returns <tt>null</tt>.
      *
      * <p>
@@ -712,7 +712,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
      *
      * <p>
      * TODO: could this be made final? (ie does the framework ever call this
-     * method for an {@link ObjectSpecificationOnStandaloneList})
+     * method for an {@link ObjectSpecificationOnContainer})
      */
     @Override
     public ObjectAssociation getAssociation(final String id) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnContainer.java
similarity index 76%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnContainer.java
index f5e1fc2..10ed085 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/CollectionFacetOnContainer.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl.standalonelist;
 
-import java.util.List;
 import java.util.function.Supplier;
 import java.util.stream.Stream;
 
@@ -30,19 +29,18 @@ import org.apache.isis.core.metamodel.spec.FreeStandingList;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
-import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
+import lombok.val;
 
-public class CollectionFacetOnStandaloneList extends CollectionFacetAbstract {
+public class CollectionFacetOnContainer extends CollectionFacetAbstract {
 
-    public CollectionFacetOnStandaloneList(final FacetHolder holder) {
+    public CollectionFacetOnContainer(final FacetHolder holder) {
         super(holder);
     }
 
     @Override
-    public <T extends ManagedObject> Stream<T> stream(T wrappedObjectList) {
-        final List<ManagedObject> list = collection(wrappedObjectList);
-        return list.stream()
-                .map(x->uncheckedCast(x));
+    public Stream<ManagedObject> stream(ManagedObject wrappedObjectList) {
+        val list = unwrap(wrappedObjectList);
+        return list.stream();
     }
 
     /**
@@ -51,7 +49,7 @@ public class CollectionFacetOnStandaloneList extends CollectionFacetAbstract {
      */
     @Override
     public int size(final ManagedObject wrappedInstanceCollectionVector) {
-        return collection(wrappedInstanceCollectionVector).size();
+        return unwrap(wrappedInstanceCollectionVector).size();
     }
 
     @Override
@@ -66,7 +64,7 @@ public class CollectionFacetOnStandaloneList extends CollectionFacetAbstract {
 
     // -- HELPER
 
-    private List<ManagedObject> collection(final ManagedObject wrappedObjectList) {
+    private FreeStandingList unwrap(final ManagedObject wrappedObjectList) {
         return (FreeStandingList) wrappedObjectList.getPojo();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnContainer.java
similarity index 92%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnContainer.java
index e8855f2..f998da9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnContainer.java
@@ -27,8 +27,8 @@ import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetDefaultToObject;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.classname.ObjectSpecIdFacetOnStandaloneList;
 import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.Container;
 import org.apache.isis.core.metamodel.spec.ElementSpecificationProvider;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -42,9 +42,9 @@ import static org.apache.isis.core.commons.internal.base._With.mapIfPresentElse;
 
 /**
  * A custom {@link ObjectSpecification} that is designed to treat the
- * {@link FreeStandingList} class as a "standalone" collection.
+ * {@link Container} class as a "standalone" collection.
  */
-public class ObjectSpecificationOnStandaloneList extends ObjectSpecificationAbstract {
+public class ObjectSpecificationOnContainer extends ObjectSpecificationAbstract {
 
     private static final String NAME = "Instances";
     private static final String DESCRIBED_AS = "Typed instances";
@@ -52,10 +52,10 @@ public class ObjectSpecificationOnStandaloneList extends ObjectSpecificationAbst
 
     // -- constructor
 
-    public ObjectSpecificationOnStandaloneList(
+    public ObjectSpecificationOnContainer(
             final FacetProcessor facetProcessor,
             final PostProcessor postProcessor) {
-        super(FreeStandingList.class, NAME, facetProcessor, postProcessor);
+        super(Container.class, NAME, facetProcessor, postProcessor);
         this.specId = ObjectSpecId.of(getCorrespondingClass().getName());
 
         FacetUtil.addFacet(
@@ -70,7 +70,7 @@ public class ObjectSpecificationOnStandaloneList extends ObjectSpecificationAbst
     protected void introspectTypeHierarchy() {
         loadSpecOfSuperclass(Object.class);
 
-        addFacet(new CollectionFacetOnStandaloneList(this));
+        addFacet(new CollectionFacetOnContainer(this));
         addFacet(new TypeOfFacetDefaultToObject(this) {
         });
 
@@ -120,7 +120,7 @@ public class ObjectSpecificationOnStandaloneList extends ObjectSpecificationAbst
 
     @Override
     public String getTitle(ManagedObject contextAdapterIfAny, ManagedObject targetAdapter) {
-        return ((FreeStandingList) targetAdapter.getPojo()).titleString();
+        return ((Container) targetAdapter.getPojo()).titleString();
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForCollections.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForCollections.java
index 98f9415..8939891 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForCollections.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueTypeProviderForCollections.java
@@ -31,7 +31,7 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.OrderPrecedence;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
+import org.apache.isis.core.metamodel.spec.Container;
 
 @Component
 @Named("isisMetaModel.ValueTypeProviderCollections")
@@ -44,7 +44,7 @@ public class ValueTypeProviderForCollections implements ValueTypeProvider {
                     ValueTypeDefinition.collection(List.class),
                     ValueTypeDefinition.collection(Set.class),
                     ValueTypeDefinition.collection(SortedSet.class),
-                    ValueTypeDefinition.collection(FreeStandingList.class)
+                    ValueTypeDefinition.collection(Container.class)
                 ));
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
index 4bc5c02..07fbb25 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/session/PersistenceSession.java
@@ -20,12 +20,12 @@ package org.apache.isis.core.runtime.persistence.session;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.context._Context;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.EntityState;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -88,14 +88,8 @@ public interface PersistenceSession {
     /**@since 2.0*/
     Map<RootOid, Object> fetchPersistentPojos(List<RootOid> rootOids);
 
-    // -------------------------------------------------------------------------------------------------
-    // -- API NOT STABLE YET - SUBJECT TO REFACTORING
-    // -------------------------------------------------------------------------------------------------
-    
-    // -- TODO remove ObjectAdapter references from API
-
-    <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
-    <T> ObjectAdapter firstMatchingQuery(final Query<T> query);
+    Can<ManagedObject> allMatchingQuery(final Query<?> query);
+    Optional<ManagedObject> firstMatchingQuery(final Query<?> query);
 
     /**
      * Removes the specified object from the system. The specified object's data
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
index 27717fa..6d02c05 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/repository/RepositoryServiceDefault.java
@@ -186,8 +186,6 @@ public class RepositoryServiceDefault implements RepositoryService {
         return _Casts.uncheckedCast(ManagedObject.unwrapMultipleAsList(allMatching));
     }
 
-
-
     @Override
     public <T> Optional<T> uniqueMatch(final Class<T> type, final Predicate<T> predicate) {
         final List<T> instances = allMatches(type, predicate, 0, 2); // No need to fetch more than 2.
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index b52e100..4e43990 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -18,9 +18,8 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries;
 
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession5;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQueryFindAllInstances;
 
@@ -35,7 +34,7 @@ public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryP
     }
 
     @Override
-    public List<ObjectAdapter> process(final PersistenceQueryFindAllInstances persistenceQuery) {
+    public Can<ManagedObject> process(final PersistenceQueryFindAllInstances persistenceQuery) {
 
         val spec = persistenceQuery.getSpecification();
         val cls = spec.getCorrespondingClass();
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index 16abee0..0852cde 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -24,6 +24,7 @@ import java.util.Map;
 
 import javax.jdo.Query;
 
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -46,7 +47,7 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
     }
 
     @Override
-    public List<ObjectAdapter> process(final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
+    public Can<ManagedObject> process(final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
         final String queryName = persistenceQuery.getQueryName();
         final ObjectSpecification objectSpec = persistenceQuery.getSpecification();
 
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java
index 9e10702..e5c1d2c 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessor.java
@@ -18,13 +18,12 @@
  */
 package org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries;
 
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQuery;
 
 public interface PersistenceQueryProcessor<T extends PersistenceQuery> {
-    List<ObjectAdapter> process(T query);
+    
+    Can<ManagedObject> process(T query);
 }
 
-// Copyright (c) Naked Objects Group Ltd.
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
index 49695d5..9ae40d7 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/datanucleus/persistence/queries/PersistenceQueryProcessorAbstract.java
@@ -25,14 +25,18 @@ import javax.jdo.listener.InstanceLifecycleEvent;
 import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.assertions._Assert;
 import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.persistence.jdo.applib.services.IsisJdoSupport_v3_2;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisLifecycleListener;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession5;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQuery;
 
+import lombok.val;
+
 public abstract class PersistenceQueryProcessorAbstract<T extends PersistenceQuery>
 implements PersistenceQueryProcessor<T> {
 
@@ -49,9 +53,9 @@ implements PersistenceQueryProcessor<T> {
      * {@link IsisLifecycleListener#postLoad(InstanceLifecycleEvent) {
      * to be called.
      */
-    protected List<ObjectAdapter> loadAdapters(final List<?> pojos) {
-        final List<ObjectAdapter> adapters = _Lists.newArrayList();
-        for (final Object pojo : pojos) {
+    protected Can<ManagedObject> loadAdapters(final List<?> pojos) {
+        val adapters = _Lists.<ManagedObject>newArrayList();
+        for (val pojo : pojos) {
             // ought not to be necessary, however for some queries it seems that the
             // lifecycle listener is not called
             ObjectAdapter adapter;
@@ -66,7 +70,7 @@ implements PersistenceQueryProcessor<T> {
             }
             adapters.add(adapter);
         }
-        return adapters;
+        return Can.ofCollection(adapters);
     }
 
     // -- HELPER
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 0f2e508..482e024 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -26,6 +26,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import static java.util.Objects.requireNonNull;
 
@@ -48,6 +49,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.iactn.Interaction;
 import org.apache.isis.applib.services.xactn.TransactionService;
+import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
@@ -57,7 +59,6 @@ import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.PojoRefreshException;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedCallbackFacet;
 import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedLifecycleEventFacet;
@@ -73,9 +74,9 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFa
 import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.EntityState;
-import org.apache.isis.core.metamodel.spec.FreeStandingList;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.persistence.jdo.applib.exceptions.NotPersistableException;
 import org.apache.isis.persistence.jdo.applib.exceptions.UnsupportedFindException;
 import org.apache.isis.persistence.jdo.applib.fixturestate.FixturesInstalledStateHolder;
@@ -92,7 +93,6 @@ import org.apache.isis.persistence.jdo.datanucleus5.persistence.command.Persiste
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQuery;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.core.security.authentication.AuthenticationSession;
 
 import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
 
@@ -220,7 +220,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         completeCommandFromInteractionAndClearDomainEvents();
 
-        //TODO[2125] shold no longer be required		
+        //TODO[2125] should no longer be required		
         //		try {
         //			val currentTransaction = transactionManager.getCurrentTransaction();
         //			transactionManager.flushTransaction(currentTransaction);
@@ -307,17 +307,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         interaction.clear();
     }
 
-    // -- QuerySubmitter impl, findInstancesInTransaction
     @Override
-    public <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query) {
-        final ObjectAdapter instances = findInstancesInTransaction(query, QueryCardinality.MULTIPLE);
-        return CollectionFacet.Utils.toAdapterList(instances);
+    public Can<ManagedObject> allMatchingQuery(final Query<?> query) {
+        val instances = findInstancesInTransaction(query, QueryCardinality.MULTIPLE);
+        return instances;
     }
+    
     @Override
-    public <T> ObjectAdapter firstMatchingQuery(final Query<T> query) {
-        final ObjectAdapter instances = findInstancesInTransaction(query, QueryCardinality.SINGLE);
-        final List<ObjectAdapter> list = CollectionFacet.Utils.toAdapterList(instances);
-        return list.size() > 0 ? list.get(0) : null;
+    public Optional<ManagedObject> firstMatchingQuery(final Query<?> query) {
+        val instances = findInstancesInTransaction(query, QueryCardinality.SINGLE);
+        return instances.getFirst();
     }
 
     /**
@@ -330,7 +329,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * @throws org.apache.isis.persistence.jdo.applib.exceptions.UnsupportedFindException
      *             if the criteria is not support by this persistor
      */
-    private <T> ObjectAdapter findInstancesInTransaction(final Query<T> query, final QueryCardinality cardinality) {
+    private Can<ManagedObject> findInstancesInTransaction(
+            final Query<?> query, 
+            final QueryCardinality cardinality) {
+        
         if (log.isDebugEnabled()) {
             log.debug("findInstances using (applib) Query: {}", query);
         }
@@ -343,11 +345,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         final PersistenceQueryProcessor<? extends PersistenceQuery> processor = lookupProcessorFor(persistenceQuery);
 
-        final List<ObjectAdapter> instances = transactionService.executeWithinTransaction(
+        final Can<ManagedObject> instances = transactionService.executeWithinTransaction(
                 ()->processPersistenceQuery(processor, persistenceQuery) );
-        final ObjectSpecification specification = persistenceQuery.getSpecification();
-        final FreeStandingList results = FreeStandingList.of(specification, instances);
-        return adapterFor(results);
+        
+        return instances;
+        
+        //XXX legacy of
+        //final ObjectSpecification specification = persistenceQuery.getSpecification();
+        //final FreeStandingList results = FreeStandingList.of(specification, instances);
+        //return adapterFor(results);
     }
 
     /**
@@ -378,7 +384,7 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return processor;
     }
     @SuppressWarnings("unchecked")
-    private <Q extends PersistenceQuery> List<ObjectAdapter> processPersistenceQuery(
+    private <Q extends PersistenceQuery> Can<ManagedObject> processPersistenceQuery(
             final PersistenceQueryProcessor<Q> persistenceQueryProcessor,
             final PersistenceQuery persistenceQuery) {
         return persistenceQueryProcessor.process((Q) persistenceQuery);
@@ -863,8 +869,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
 
-
-
 }