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 22:18:10 UTC

[isis] branch master updated: ISIS-2265: refactoring CollectionUtils into CollectionFacet.Utils

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 4aa672f  ISIS-2265: refactoring CollectionUtils into CollectionFacet.Utils
4aa672f is described below

commit 4aa672f8ecd40f80224d484821a8562c4b0a8e51
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 16 23:17:10 2020 +0100

    ISIS-2265: refactoring CollectionUtils into CollectionFacet.Utils
---
 .../core/metamodel/facets/CollectionUtils.java     | 129 -------------------
 ...ctionInvocationFacetForDomainEventAbstract.java |  18 +--
 .../CollectionAccessorFacetViaAccessor.java        |  17 ++-
 .../facets/collections/modify/CollectionFacet.java | 139 +++++++++++++++++----
 .../autocomplete/AutoCompleteFacetAbstract.java    |   7 +-
 .../ActionParameterAutoCompleteFacetViaMethod.java |  18 ++-
 .../method/ActionChoicesFacetViaMethod.java        |  20 ++-
 .../ActionParameterChoicesFacetViaMethod.java      |  18 ++-
 .../method/PropertyAutoCompleteFacetMethod.java    |  16 +--
 .../method/PropertyChoicesFacetViaMethod.java      |  39 ++++--
 ...arameterChoicesFacetFromParentedCollection.java |   3 +-
 .../classsubstitutor/ClassSubstitutor.java         |  10 ++
 .../isis/core/metamodel/spec/ManagedObject.java    |  21 ++--
 .../specimpl/OneToManyAssociationDefault.java      |   3 +-
 .../core/metamodel/util/snapshot/IsisSchema.java   |   3 +-
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |   4 +-
 ...tilsTest.java => CollectionFacetUtilsTest.java} |  15 +--
 .../domainobjects/ActionResultReprRenderer.java    |   2 +-
 .../ObjectCollectionReprRenderer.java              |   2 +-
 .../ContentNegotiationServiceOrgApacheIsisV1.java  |   4 +-
 20 files changed, 229 insertions(+), 259 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/CollectionUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/CollectionUtils.java
deleted file mode 100644
index b84b0b0..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/CollectionUtils.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets;
-
-import java.util.AbstractList;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.function.Function;
-import java.util.stream.Stream;
-
-import org.apache.isis.core.commons.internal.base._Casts;
-import org.apache.isis.core.commons.internal.base._With;
-import org.apache.isis.core.commons.internal.collections._Arrays;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.commons.internal.collections._Sets;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-public final class CollectionUtils {
-
-    private CollectionUtils() {
-    }
-
-    public static Object[] getCollectionAsObjectArray(
-            final Object optionPojo, 
-            final ObjectSpecification spec, 
-            final ObjectManager objectManger) {
-        
-        final ManagedObject collection = objectManger.adapt(optionPojo);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        
-//        {//TODO[2158] migrate
-//            val mo = ManagedObject.forPojo(optionPojo);
-//            val collectionFacet =  CollectionFacet.Utils.getCollectionFacetFromSpec(mo);
-//            _Assert.assertEquals("expected same", 
-//                    facet, collectionFacet);
-//        }
-
-        final Stream<ManagedObject> objectAdapters = 
-                CollectionFacet.Utils.streamAdapters(collection);
-
-        return objectAdapters
-                .map(nextElement->nextElement != null? nextElement.getPojo(): null)
-                .collect(_Arrays.toArray(Object.class, facet.size(collection)));
-    }
-
-    private final static Map<Class<?>, Function<Iterable<Object>, Object>> factoriesByType = _With.hashMap(
-            map-> {
-                // specific list implementations
-                map.put(CopyOnWriteArrayList.class, _Lists::newConcurrentList);
-                map.put(LinkedList.class, _Lists::newLinkedList);
-                map.put(ArrayList.class, _Lists::newArrayList);
-                map.put(AbstractList.class, _Lists::newArrayList);
-
-                // specific set implementations
-                map.put(CopyOnWriteArraySet.class, _Sets::newCopyOnWriteArraySet);
-                map.put(LinkedHashSet.class, _Sets::newLinkedHashSet);
-                map.put(HashSet.class, _Sets::newHashSet);
-                map.put(TreeSet.class, _Sets::newTreeSet);
-                map.put(AbstractSet.class, _Sets::newLinkedHashSet);
-
-                // interfaces
-                map.put(List.class, _Lists::newArrayList);
-                map.put(SortedSet.class, _Sets::newTreeSet);
-                map.put(Set.class, _Sets::newLinkedHashSet);
-                map.put(Collection.class, _Lists::newArrayList);
-            });
-
-    /**
-     * Copies the iterable into the specified type.
-     */
-    public static Object copyOf(final Iterable<Object> iterable, final Class<?> requiredType) {
-
-        if(iterable == null) {
-            throw new IllegalArgumentException("Iterable must be provided");
-        }
-        if(requiredType == null) {
-            throw new IllegalArgumentException("RequiredType must be provided");
-        }
-
-        final Function<Iterable<Object>, Object> factory = factoriesByType.get(requiredType);
-        if(factory!=null) {
-            return factory.apply(iterable);
-        }
-
-        // array
-        if (requiredType.isArray()) {
-            Class<?> componentType = requiredType.getComponentType();
-
-            @SuppressWarnings("rawtypes") Iterable rawIterable = iterable;
-            return _Arrays.toArray(_Casts.uncheckedCast(rawIterable), componentType);
-        }
-
-        // not recognized
-        return null;
-
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 56551e9..3be74a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -26,8 +26,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.apache.isis.applib.NonRecoverableException;
 import org.apache.isis.applib.RecoverableException;
@@ -57,7 +55,6 @@ import org.apache.isis.core.metamodel.commons.MethodInvocationPreprocessor;
 import org.apache.isis.core.metamodel.commons.ThrowableExtensions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.DomainEventHelper;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actions.publish.PublishedActionFacet;
@@ -363,15 +360,12 @@ implements ImperativeFacet {
 
         if(result instanceof Collection || result.getClass().isArray()) {
 
-            final Stream<ManagedObject> adapters = CollectionFacet.Utils.streamAdapters(resultAdapter);
-
-            final Object visibleObjects =
-                    CollectionUtils.copyOf(
-                            adapters
-                            .filter(ManagedObject.VisibilityUtil.filterOn(interactionInitiatedBy))
-                            .map(ManagedObject::unwrapSingle)
-                            .collect(Collectors.toList()),
-                            method.getReturnType());
+            val requiredContainerType = method.getReturnType();
+            
+            val visiblePojoStream = ManagedObject.VisibilityUtil
+                    .streamVisiblePojos(resultAdapter, interactionInitiatedBy);
+            
+            final Object visibleObjects = CollectionFacet.Utils.collect(visiblePojoStream, requiredContainerType); 
 
             if (visibleObjects != null) {
                 return getObjectManager().adapt(visibleObjects);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
index 1dbd4a0..d5c3aa4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessor.java
@@ -24,11 +24,10 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -76,14 +75,12 @@ implements ImperativeFacet {
 
         final boolean filterForVisibility = getConfiguration().getCore().getMetaModel().isFilterVisibility();
         if(filterForVisibility) {
-            final List<ManagedObject> visibleAdapters =
-                    ManagedObject.VisibilityUtil.visibleAdapters(
-                            collectionAdapter,
-                            interactionInitiatedBy);
-            final Object visibleObjects =
-                    CollectionUtils.copyOf(
-                            _Lists.map(visibleAdapters, ManagedObject::unwrapSingle),
-                            method.getReturnType());
+            
+            val visiblePojoStream = ManagedObject.VisibilityUtil
+                    .streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
+            
+            final Object visibleObjects = CollectionFacet.Utils.collect(visiblePojoStream, method.getReturnType());
+            
             if (visibleObjects != null) {
                 return visibleObjects;
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
index 906d0e1..eadfb88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/modify/CollectionFacet.java
@@ -19,20 +19,42 @@
 
 package org.apache.isis.core.metamodel.facets.collections.modify;
 
+import java.util.AbstractList;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
-import java.util.function.Function;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.function.Supplier;
+import java.util.stream.Collector;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.isis.core.commons.internal.base._Casts;
+import javax.annotation.Nullable;
+
+import org.apache.isis.core.commons.internal.base._With;
+import org.apache.isis.core.commons.internal.collections._Arrays;
+import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 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._With.requires;
+
 import lombok.val;
+import lombok.experimental.UtilityClass;
 
 /**
  * Attached to {@link ObjectSpecification}s that represent a collection.
@@ -79,34 +101,105 @@ public interface CollectionFacet extends Facet {
      * {@link #getFacetHolder() holder}.
      */
     TypeOfFacet getTypeOfFacet();
-
-    public static class Utils {
-
-        public static CollectionFacet getCollectionFacetFromSpec(ManagedObject objectRepresentingCollection) {
-            val collectionSpec = objectRepresentingCollection.getSpecification();
-            return collectionSpec.getFacet(CollectionFacet.class);
+    
+    // -- UTILS
+    
+    public static Optional<CollectionFacet> lookup(@Nullable ManagedObject container) {
+        if(container==null) {
+            return Optional.empty();
         }
+        val collectionSpec = container.getSpecification();
+        return Optional.ofNullable(collectionSpec.getFacet(CollectionFacet.class));
+    }
 
-        public static int size(ManagedObject collection) {
-            val collectionFacet = getCollectionFacetFromSpec(collection);
-            return collectionFacet.size(collection);
-        }
+    public static int elementCount(@Nullable ManagedObject container) {
+        return lookup(container)
+                .map(collectionFacet->collectionFacet.size(container))
+                .orElse(0);
+    }
+    
+    public static Stream<ManagedObject> streamAdapters(ManagedObject container) {
+        return lookup(container)
+                .map(collectionFacet->collectionFacet.stream(container))
+                .orElse(Stream.empty());
+    }
+    
+    public static Object[] toArrayOfPojos(ManagedObject container) {
+        val elementAdapters = streamAdapters(container)
+                .collect(Collectors.toList());
+        return ManagedObject.unwrapMultipleAsArray(elementAdapters);
+    }
 
-        public static <T extends ManagedObject> Stream<T> streamAdapters(T collectionAdapter) {
-            val collectionFacet = getCollectionFacetFromSpec(collectionAdapter);
-            return Utils.<T>downCast(collectionFacet.stream(collectionAdapter));
-        }
+    @UtilityClass
+    public static class Utils {
+        
+        /**
+         * Copies the iterable into the specified type.
+         */
+        @SuppressWarnings({ "rawtypes", "unchecked" })
+        public static Object collect(
+                final Stream<?> stream, 
+                final Class<?> requiredType) {
+            
+            requires(stream, "stream");
+            requires(requiredType, "requiredType");
+
+            Stream rawStream = stream;
+            
+            val factoryIfAny = factoriesByType.get(requiredType);
+            if(factoryIfAny!=null) {
+                Supplier rawFactory = factoryIfAny;
+                Collector rawCollector = Collectors.toCollection(rawFactory);
+                return rawStream.collect(rawCollector);
+            }
+
+            // array
+            if (requiredType.isArray()) {
+                Class<?> elementType = requiredType.getComponentType();
+                return rawStream.collect(_Arrays.toArray(elementType));
+            }
+            
+            // not recognized
+            return null;
 
-        public static <T extends ManagedObject> List<T> toAdapterList(T collectionAdapter) {
-            return streamAdapters(collectionAdapter)
-                    .collect(Collectors.toList());
         }
 
-        private static <T extends ManagedObject> Stream<T> downCast(Stream<ManagedObject> stream) {
-            final Function<ManagedObject, T> uncheckedCast = _Casts::uncheckedCast;
-            return stream.map(uncheckedCast);
+        public static Object[] collectAsPojoArray(
+                final Stream<Object> pojoStream, 
+                final ObjectSpecification spec, 
+                final ObjectManager objectManger) {
+            
+            val optionPojo = pojoStream.collect(Collectors.toList());
+            final ManagedObject collection = objectManger.adapt(optionPojo);
+            return toArrayOfPojos(collection);
         }
-
+        
+        
+        // -- HELPER
+        
+        private final static Map<Class<?>, Supplier<Collection<?>>> factoriesByType = _With.hashMap(
+                map-> {
+                    // specific list implementations
+                    map.put(CopyOnWriteArrayList.class, _Lists::newConcurrentList);
+                    map.put(LinkedList.class, _Lists::newLinkedList);
+                    map.put(ArrayList.class, _Lists::newArrayList);
+                    map.put(AbstractList.class, _Lists::newArrayList);
+
+                    // specific set implementations
+                    map.put(CopyOnWriteArraySet.class, _Sets::newCopyOnWriteArraySet);
+                    map.put(LinkedHashSet.class, _Sets::newLinkedHashSet);
+                    map.put(HashSet.class, _Sets::newHashSet);
+                    map.put(TreeSet.class, _Sets::newTreeSet);
+                    map.put(AbstractSet.class, _Sets::newLinkedHashSet);
+
+                    // interfaces
+                    map.put(List.class, _Lists::newArrayList);
+                    map.put(SortedSet.class, _Sets::newTreeSet);
+                    map.put(Set.class, _Sets::newLinkedHashSet);
+                    map.put(Collection.class, _Lists::newArrayList);
+                });
+        
     }
+    
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
index f303af6..e1aca1e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/autocomplete/AutoCompleteFacetAbstract.java
@@ -90,13 +90,12 @@ implements AutoCompleteFacet {
                 });
 
         // check a collection was returned
-        if(CollectionFacet.Utils.getCollectionFacetFromSpec(resultAdapter) == null) {
+        if(CollectionFacet.lookup(resultAdapter) == null) {
             return Collections.emptyList();
         }
 
-        return CollectionFacet.Utils.streamAdapters(resultAdapter)
-        .filter(ManagedObject.VisibilityUtil.filterOn(interactionInitiatedBy))
-        .collect(Collectors.toList());
+        return ManagedObject.VisibilityUtil.streamVisibleAdapters(resultAdapter, interactionInitiatedBy)
+                .collect(Collectors.toList());
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
index f07f92f..ea8ee12 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
@@ -25,16 +25,16 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.core.commons.internal._Constants;
-import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacetAbstract;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+import lombok.val;
 
 public class ActionParameterAutoCompleteFacetViaMethod 
 extends ActionParameterAutoCompleteFacetAbstract 
@@ -94,15 +94,11 @@ implements ImperativeFacet {
         final FacetedMethodParameter facetedMethodParameter = (FacetedMethodParameter) getFacetHolder();
         final Class<?> parameterType = facetedMethodParameter.getType();
 
-        final List<ManagedObject> visibleAdapters =
-                ManagedObject.VisibilityUtil.visibleAdapters(
-                        collectionAdapter,
-                        interactionInitiatedBy);
-        final List<Object> visibleObjects =
-                _Lists.map(visibleAdapters, ManagedObject::unwrapSingle);
+        val visiblePojoStream = ManagedObject.VisibilityUtil
+                .streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
 
-        final ObjectSpecification parameterSpec = getSpecification(parameterType);
-        return CollectionUtils.getCollectionAsObjectArray(visibleObjects, parameterSpec, getObjectManager());
+        val parameterSpec = getSpecification(parameterType);
+        return CollectionFacet.Utils.collectAsPojoArray(visiblePojoStream, parameterSpec, getObjectManager());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
index 9f2ddf5..daeff8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethod.java
@@ -24,15 +24,13 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacetAbstract;
 import org.apache.isis.core.metamodel.spec.DomainModelException;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.val;
 
@@ -91,21 +89,17 @@ public class ActionChoicesFacetViaMethod extends ActionChoicesFacetAbstract impl
             final Object collectionOrArray,
             final Class<?> parameterType,
             final InteractionInitiatedBy interactionInitiatedBy) {
+        
         if (collectionOrArray == null) {
             return null;
         }
 
-        final ManagedObject collectionAdapter = getObjectManager().adapt(collectionOrArray);
-
-        final List<ManagedObject> visibleAdapters =
-                ManagedObject.VisibilityUtil.visibleAdapters(
-                        collectionAdapter,
-                        interactionInitiatedBy);
-        final List<Object> filteredObjects =
-                _Lists.map(visibleAdapters, ManagedObject::unwrapSingle);
+        val collectionAdapter = getObjectManager().adapt(collectionOrArray);
+        val visiblePojoStream = ManagedObject.VisibilityUtil
+                .streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
 
-        final ObjectSpecification parameterSpec = getSpecification(parameterType);
-        return CollectionUtils.getCollectionAsObjectArray(filteredObjects, parameterSpec, getObjectManager());
+        val parameterSpec = getSpecification(parameterType);
+        return CollectionFacet.Utils.collectAsPojoArray(visiblePojoStream, parameterSpec, getObjectManager());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index f3571d2..3d6dd22 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -25,15 +25,15 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.core.commons.internal._Constants;
-import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+import lombok.val;
 
 public class ActionParameterChoicesFacetViaMethod 
 extends ActionParameterChoicesFacetAbstract 
@@ -82,15 +82,11 @@ implements ImperativeFacet {
         final FacetedMethodParameter facetedMethodParameter = (FacetedMethodParameter) getFacetHolder();
         final Class<?> parameterType = facetedMethodParameter.getType();
 
-        final List<ManagedObject> visibleAdapters =
-                ManagedObject.VisibilityUtil.visibleAdapters(
-                        objectAdapter,
-                        interactionInitiatedBy);
-        final List<Object> visibleObjects =
-                _Lists.map(visibleAdapters, ManagedObject::unwrapSingle);
+        val visiblePjoStream = ManagedObject.VisibilityUtil
+                .streamVisiblePojos(objectAdapter, interactionInitiatedBy);
 
-        final ObjectSpecification parameterSpec = getSpecification(parameterType);
-        return CollectionUtils.getCollectionAsObjectArray(visibleObjects, parameterSpec, getObjectManager());
+        val parameterSpec = getSpecification(parameterType);
+        return CollectionFacet.Utils.collectAsPojoArray(visiblePjoStream, parameterSpec, getObjectManager());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
index d4e8ee6..a6cfb63 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethod.java
@@ -24,16 +24,14 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.val;
 
@@ -88,15 +86,11 @@ public class PropertyAutoCompleteFacetMethod extends PropertyAutoCompleteFacetAb
         final FacetedMethod facetedMethod = (FacetedMethod) getFacetHolder();
         final Class<?> propertyType = facetedMethod.getType();
 
-        final List<ManagedObject> visibleAdapters =
-                ManagedObject.VisibilityUtil.visibleAdapters(
-                        collectionAdapter,
-                        interactionInitiatedBy);
-        final List<Object> filteredObjects =
-                _Lists.map(visibleAdapters, ManagedObject::unwrapSingle);
+        val visiblePojoStream = ManagedObject.VisibilityUtil
+                .streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
 
-        final ObjectSpecification propertySpec = getSpecification(propertyType);
-        return CollectionUtils.getCollectionAsObjectArray(filteredObjects, propertySpec, getObjectManager());
+        val propertySpec = getSpecification(propertyType);
+        return CollectionFacet.Utils.collectAsPojoArray(visiblePojoStream, propertySpec, getObjectManager());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
index cf85c80..72ed3ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethod.java
@@ -24,14 +24,15 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.core.metamodel.commons.ObjectExtensions;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.CollectionUtils;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+import lombok.val;
 
 public class PropertyChoicesFacetViaMethod extends PropertyChoicesFacetAbstract implements ImperativeFacet {
 
@@ -66,16 +67,36 @@ public class PropertyChoicesFacetViaMethod extends PropertyChoicesFacetAbstract
     public Object[] getChoices(
             final ManagedObject owningAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-
+        
+        
         final Object options = ManagedObject.InvokeUtil.invoke(method, owningAdapter);
         if (options == null) {
             return null;
         }
-        if (options.getClass().isArray()) {
-            return ObjectExtensions.asArray(options);
-        }
-        final ObjectSpecification specification = getSpecificationLoader().loadSpecification(choicesClass);
-        return CollectionUtils.getCollectionAsObjectArray(options, specification, getObjectManager());
+
+        val collectionAdapter = getObjectManager().adapt(options);
+
+        final FacetedMethod facetedMethod = (FacetedMethod) getFacetHolder();
+        final Class<?> propertyType = facetedMethod.getType();
+
+        val visiblePojoStream = ManagedObject.VisibilityUtil
+                .streamVisiblePojos(collectionAdapter, interactionInitiatedBy);
+
+        val propertySpec = getSpecification(propertyType);
+        return CollectionFacet.Utils.collectAsPojoArray(visiblePojoStream, propertySpec, getObjectManager());
+        
+        
+        //XXX legacy of
+
+//        final Object options = ManagedObject.InvokeUtil.invoke(method, owningAdapter);
+//        if (options == null) {
+//            return null;
+//        }
+//        if (options.getClass().isArray()) {
+//            return ObjectExtensions.asArray(options);
+//        }
+//        final ObjectSpecification specification = getSpecificationLoader().loadSpecification(choicesClass);
+//        return CollectionUtils.getCollectionAsObjectArray(options, specification, getObjectManager());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
index 719fd5c..51701b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
@@ -51,8 +51,7 @@ public class ActionParameterChoicesFacetFromParentedCollection extends ActionPar
 
         final ManagedObject parentAdapter = determineParentAdapter(target);
         final ManagedObject objectAdapter = otma.get(parentAdapter, interactionInitiatedBy);
-        final List<ManagedObject> objectAdapters = CollectionFacet.Utils.toAdapterList(objectAdapter);
-        return ManagedObject.unwrapMultipleAsArray(objectAdapters);
+        return CollectionFacet.toArrayOfPojos(objectAdapter);
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutor.java
index c870f26..f6290cc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/classsubstitutor/ClassSubstitutor.java
@@ -19,10 +19,20 @@
 
 package org.apache.isis.core.metamodel.services.classsubstitutor;
 
+import java.util.function.Supplier;
+
+import lombok.Value;
+
 /**
  * Provides capability to translate or ignore classes.
  */
 public interface ClassSubstitutor {
+    
+    @Value
+    static class Substitution<S> {
+        Class<S> substitutedType;
+        Supplier<S> factory;
+    }
 
     Class<?> getClass(@lombok.NonNull @org.springframework.lang.NonNull Class<?> cls);
 }
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 3e34ff6..640490d 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
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
@@ -366,19 +365,27 @@ public interface ManagedObject {
         }
 
         /**
-         * Filters a collection (an adapter around either a Collection or an Object[]) and returns a list of
+         * Filters a collection (an adapter around either a Collection or an Object[]) and returns a stream of
          * {@link ManagedObject}s of those that are visible (as per any facet(s) installed on the element class
          * of the collection).
-         *  @param collectionAdapter - an adapter around a collection (as returned by a getter of a collection, or of an autoCompleteNXxx() or choicesNXxx() method, etc
+         * @param collectionAdapter - an adapter around a collection (as returned by a getter of a collection, or of an autoCompleteNXxx() or choicesNXxx() method, etc
          * @param interactionInitiatedBy
          */
-        public static List<ManagedObject> visibleAdapters(
+        public static Stream<ManagedObject> streamVisibleAdapters(
                 final ManagedObject collectionAdapter,
                 final InteractionInitiatedBy interactionInitiatedBy) {
     
-            return CollectionFacet.Utils.streamAdapters(collectionAdapter)
-            .filter(VisibilityUtil.filterOn(interactionInitiatedBy))
-            .collect(Collectors.toList());
+            return CollectionFacet.streamAdapters(collectionAdapter)
+                    .filter(VisibilityUtil.filterOn(interactionInitiatedBy));
+        }
+        
+        public static Stream<Object> streamVisiblePojos(
+                final ManagedObject collectionAdapter,
+                final InteractionInitiatedBy interactionInitiatedBy) {
+    
+            return CollectionFacet.streamAdapters(collectionAdapter)
+                    .filter(VisibilityUtil.filterOn(interactionInitiatedBy))
+                    .map(ManagedObject::unwrapSingle);
         }
         
         /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index 8d26180..1cd5160 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -177,8 +177,7 @@ extends ObjectAssociationAbstract implements OneToManyAssociation {
         // REVIEW should we be able to determine if a collection is empty
         // without loading it?
         final ManagedObject collection = get(parentAdapter, interactionInitiatedBy);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        return facet.size(collection) == 0;
+        return CollectionFacet.elementCount(collection) == 0;
     }
 
     // -- add, clear
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/IsisSchema.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/IsisSchema.java
index 5f955d5..3523f20 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/IsisSchema.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/IsisSchema.java
@@ -174,8 +174,7 @@ final class IsisSchema {
     void setIsisCollection(final Element element, final String prefix, final String fullyQualifiedClassName, final ManagedObject collection) {
         setAttribute(element, "feature", FEATURE_COLLECTION);
         setAttribute(element, "type", prefix + ":" + fullyQualifiedClassName);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        setAttribute(element, "size", "" + facet.size(collection));
+        setAttribute(element, "size", "" + CollectionFacet.elementCount(collection));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
index e48c6cd..42957f4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/util/snapshot/XmlSnapshot.java
@@ -523,12 +523,12 @@ public class XmlSnapshot implements Snapshot {
 
             if (log.isDebugEnabled()) {
                 log.debug("includeField(Pl, Vec, Str): 1->M: {}",
-                        log("collection.size", "" + CollectionFacet.Utils.size(collection)));
+                        log("collection.size", "" + CollectionFacet.elementCount(collection)));
             }
 
             final boolean[] allFieldsNavigated = { true }; // fast non-thread-safe value reference
 
-            CollectionFacet.Utils.streamAdapters(collection).forEach(referencedObject -> {
+            CollectionFacet.streamAdapters(collection).forEach(referencedObject -> {
                 final boolean appendedXml = appendXmlThenIncludeRemaining(fieldPlace, referencedObject, names,
                         annotation);
                 if (log.isDebugEnabled()) {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionFacetUtilsTest.java
similarity index 86%
rename from core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionUtilsTest.java
rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionFacetUtilsTest.java
index a4b0af3..bb603e9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/CollectionFacetUtilsTest.java
@@ -45,13 +45,14 @@ import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 
 import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 
-public class CollectionUtilsTest {
+public class CollectionFacetUtilsTest {
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
 
-    Iterable<Object> iterable;
+    List<Object> iterable;
 
     @Before
     public void setUp() throws Exception {
@@ -77,7 +78,7 @@ public class CollectionUtilsTest {
                 Collection.class
                 );
         for (Class<?> collectionType : collectionTypes) {
-            Object o = CollectionUtils.copyOf(iterable, collectionType);
+            Object o = CollectionFacet.Utils.collect(iterable.stream(), collectionType);
             assertThat(o, is(not(nullValue())));
             assertThat(collectionType.isAssignableFrom(o.getClass()), is(true));
 
@@ -90,7 +91,7 @@ public class CollectionUtilsTest {
 
     @Test
     public void whenArray() throws Exception {
-        Object o = CollectionUtils.copyOf(iterable, String[].class);
+        Object o = CollectionFacet.Utils.collect(iterable.stream(), String[].class);
         assertThat(o instanceof String[], is(true));
 
         String[] copy = (String[])o;
@@ -99,7 +100,7 @@ public class CollectionUtilsTest {
 
     @Test
     public void whenNotSupported() throws Exception {
-        Object o = CollectionUtils.copyOf(iterable, Map.class);
+        Object o = CollectionFacet.Utils.collect(iterable.stream(), Map.class);
         assertThat(o, is(nullValue()));
     }
 
@@ -108,7 +109,7 @@ public class CollectionUtilsTest {
 
         expectedException.expect(IllegalArgumentException.class);
 
-        CollectionUtils.copyOf(iterable, null);
+        CollectionFacet.Utils.collect(iterable.stream(), null);
     }
 
     @Test
@@ -116,7 +117,7 @@ public class CollectionUtilsTest {
 
         expectedException.expect(IllegalArgumentException.class);
 
-        CollectionUtils.copyOf(null, List.class);
+        CollectionFacet.Utils.collect(null, List.class);
     }
 
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
index b24a7f3..86530a0 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ActionResultReprRenderer.java
@@ -137,7 +137,7 @@ public class ActionResultReprRenderer extends ReprRendererAbstract<ActionResultR
         case LIST:
 
             final Stream<ManagedObject> collectionAdapters =
-            CollectionFacet.Utils.streamAdapters(returnedAdapter);
+                CollectionFacet.streamAdapters(returnedAdapter);
 
             final ListReprRenderer listReprRenderer =
                     new ListReprRenderer(resourceContext, null, representation).withElementRel(Rel.ELEMENT);
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
index 626528b..d1d93e7 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectCollectionReprRenderer.java
@@ -99,7 +99,7 @@ public class ObjectCollectionReprRenderer extends AbstractObjectMemberReprRender
         final LinkFollowSpecs followHref = linkFollower.follow("href");
         boolean eagerlyRender = resourceContext.honorUiHints() && renderEagerly(valueAdapter) || !followHref.isTerminated();
 
-        final Stream<ManagedObject> elementAdapters = CollectionFacet.Utils.streamAdapters(valueAdapter);
+        final Stream<ManagedObject> elementAdapters = CollectionFacet.streamAdapters(valueAdapter);
 
         final List<JsonRepresentation> list = _Lists.newArrayList();
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
index 6aa0bdb..acb6d06 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/service/conneg/ContentNegotiationServiceOrgApacheIsisV1.java
@@ -251,7 +251,7 @@ public class ContentNegotiationServiceOrgApacheIsisV1 extends ContentNegotiation
             //final CollectionFacet collectionFacet = returnType.getFacet(CollectionFacet.class);
 
             final Stream<ManagedObject> collectionAdapters = 
-                    CollectionFacet.Utils.streamAdapters(returnedAdapter);
+                    CollectionFacet.streamAdapters(returnedAdapter);
 
             appendStreamTo(resourceContext, collectionAdapters, rootRepresentation, suppression);
 
@@ -400,7 +400,7 @@ public class ContentNegotiationServiceOrgApacheIsisV1 extends ContentNegotiation
             return;
         }
 
-        final Stream<ManagedObject> adapters = CollectionFacet.Utils.streamAdapters(valueAdapter);
+        final Stream<ManagedObject> adapters = CollectionFacet.streamAdapters(valueAdapter);
         appendStreamTo(resourceContext, adapters, representation, suppression);
     }