You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/01/19 11:09:27 UTC

[21/24] isis git commit: ISIS-785: introduces CollectionSemanticsFacet for both OneToManyParameter and also OneToManyAssociation, and use to capture from the param type/return type using FacetMethodParam or FacetMethod, earlier on.

ISIS-785: introduces CollectionSemanticsFacet for both OneToManyParameter and also OneToManyAssociation, and use to capture from the param type/return type using FacetMethodParam or FacetMethod, earlier on.

The previous design, which attempted to infer CollectionSemantics later on, was broken because the TypedFacetHolder#getType / #setType capture only the element type of the collection, not the type of the collection itself.

This commit also extends CollectionSemantics to add in SORTED_SET as well as SET.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/69753e24
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/69753e24
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/69753e24

Branch: refs/heads/maint-1.13.3
Commit: 69753e24b23e1e1c0b2682e54b047560b69226d6
Parents: a6a79e4
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 16:05:29 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 16:05:29 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetedMethod.java    |   7 ++
 ...llectionAccessorFacetViaAccessorFactory.java |   3 +
 .../semantics/CollectionSemantics.java          | 104 +++++++++++++++++++
 .../semantics/CollectionSemanticsFacet.java     |  29 ++++++
 .../CollectionSemanticsFacetDefault.java        |  47 +++++++++
 .../spec/feature/OneToManyFeature.java          |  50 +--------
 .../OneToManyActionParameterContributee.java    |   6 +-
 .../OneToManyActionParameterDefault.java        |   6 +-
 .../OneToManyActionParameterMixedIn.java        |   6 +-
 .../specimpl/OneToManyAssociationDefault.java   |   6 +-
 .../viewer/wicket/model/models/ScalarModel.java |  44 +++++++-
 11 files changed, 246 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
index 490866d..c2d6410 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethod.java
@@ -32,6 +32,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacetDefault;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
@@ -124,6 +126,11 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
 
             // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
             if(featureType == FeatureType.ACTION_PARAMETER_COLLECTION) {
+
+                final CollectionSemanticsFacet semanticsFacet =
+                        CollectionSemanticsFacetDefault.forParamType(parameterType, fmp);
+                FacetUtil.addFacet(semanticsFacet);
+
                 TypeOfFacet typeOfFacet = specificationLoader.inferFromGenericParamType(fmp, parameterType, genericParameterType);
 
                 if(typeOfFacet == null ) {

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index 2b63b52..edf3083 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -29,6 +29,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import org.apache.isis.core.metamodel.facets.MethodPrefixConstants;
 import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacetDefault;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal;
@@ -58,6 +59,8 @@ public class CollectionAccessorFacetViaAccessorFactory
                         getDeploymentCategory(), getConfiguration(), getSpecificationLoader(),
                         getAuthenticationSessionProvider(), adapterManager
                 ));
+
+        FacetUtil.addFacet(CollectionSemanticsFacetDefault.forCollection(accessorMethod, holder));
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
new file mode 100644
index 0000000..9cb5887
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemantics.java
@@ -0,0 +1,104 @@
+/*
+ *  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.collparam.semantics;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+public enum CollectionSemantics {
+    LIST {
+        @Override
+        public Object emptyCollectionOf(final Class<?> elementClass) {
+            return new ArrayList<>();
+        }
+    }, ARRAY {
+        @Override
+        public Object emptyCollectionOf(final Class<?> elementClass) {
+            return Array.newInstance(elementClass, 0);
+        }
+    }, SORTED_SET {
+        @Override
+        public Object emptyCollectionOf(final Class<?> elementClass) {
+            return new TreeSet<>();
+        }
+    }, SET {
+        @Override
+        public Object emptyCollectionOf(final Class<?> elementClass) {
+            return new HashSet<>();
+        }
+    }, OTHER {
+        @Override
+        public Object emptyCollectionOf(final Class<?> elementClass) {
+            return new ArrayList<>();
+        }
+    };
+
+    public static CollectionSemantics of(final Class<?> accessorReturnType) {
+        if (!Collection.class.isAssignableFrom(accessorReturnType)) {
+            return ARRAY;
+        }
+        if (List.class.isAssignableFrom(accessorReturnType)) {
+            return LIST;
+        }
+        if (SortedSet.class.isAssignableFrom(accessorReturnType)) {
+            return SORTED_SET;
+        }
+        if (Set.class.isAssignableFrom(accessorReturnType)) {
+            return SET;
+        }
+        return OTHER;
+    }
+
+    /**
+     * The corresponding class is not a subclass of {@link Collection}.
+     */
+    public boolean isArray() {
+        return this == ARRAY;
+    }
+
+    public boolean isList() {
+        return this == LIST;
+    }
+
+    public boolean isSet() {
+        return this == SET || this == SORTED_SET;
+    }
+
+    /**
+     * For example, {@link Queue}, or some other 3rd party implementation of
+     * {@link Collection}.
+     */
+    public boolean isOther() {
+        return this == OTHER;
+    }
+
+    public boolean isListOrArray() {
+        return isList() || isArray();
+    }
+
+    public abstract Object emptyCollectionOf(final Class<?> elementClass);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacet.java
new file mode 100644
index 0000000..258357f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacet.java
@@ -0,0 +1,29 @@
+/*
+ *  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.collparam.semantics;
+
+import org.apache.isis.core.metamodel.facets.SingleValueFacet;
+
+/**
+ * Represents the semantics of an collection.
+ */
+public interface CollectionSemanticsFacet extends SingleValueFacet<CollectionSemantics> {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacetDefault.java
new file mode 100644
index 0000000..6ef7655
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collparam/semantics/CollectionSemanticsFacetDefault.java
@@ -0,0 +1,47 @@
+/*
+ *  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.collparam.semantics;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
+
+public class CollectionSemanticsFacetDefault extends SingleValueFacetAbstract<CollectionSemantics> implements
+        CollectionSemanticsFacet {
+
+    public static Class<? extends Facet> type() {
+        return CollectionSemanticsFacet.class;
+    }
+
+    public static CollectionSemanticsFacet forCollection(final Method collectionAccessorMethod, final FacetHolder holder) {
+        return new CollectionSemanticsFacetDefault(CollectionSemantics.of(collectionAccessorMethod.getReturnType()), holder);
+    }
+
+    public static CollectionSemanticsFacet forParamType(final Class<?> paramClass, final FacetHolder holder) {
+        return new CollectionSemanticsFacetDefault(CollectionSemantics.of(paramClass), holder);
+    }
+
+    private CollectionSemanticsFacetDefault(final CollectionSemantics collectionSemantics, final FacetHolder holder) {
+        super(type(), collectionSemantics, holder);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyFeature.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyFeature.java
index 3ffc9f9..017aa6b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyFeature.java
@@ -19,10 +19,7 @@
 
 package org.apache.isis.core.metamodel.spec.feature;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
 
 /**
  * Base interface for {@link OneToManyAssociation} only.
@@ -38,51 +35,6 @@ import java.util.Set;
  */
 public interface OneToManyFeature extends ObjectFeature {
 
-    public enum CollectionSemantics {
-        LIST, ARRAY, SET, OTHER;
-
-        /**
-         * The corresponding class is not a subclass of {@link Collection}.
-         */
-        public boolean isArray() {
-            return this == ARRAY;
-        }
-
-        public boolean isList() {
-            return this == LIST;
-        }
-
-        public boolean isSet() {
-            return this == SET;
-        }
-
-        /**
-         * For example, {@link Queue}, or some other 3rdparty implementation of
-         * {@link Collection}.
-         */
-        public boolean isOther() {
-            return this == OTHER;
-        }
-
-        public boolean isListOrArray() {
-            return isList() || isArray();
-        }
-    }
-
     CollectionSemantics getCollectionSemantics();
 
-    public static class Util {
-        public static CollectionSemantics semanticsOf(final Class<?> underlyingClass) {
-            if (!Collection.class.isAssignableFrom(underlyingClass)) {
-                return CollectionSemantics.ARRAY;
-            }
-            if (List.class.isAssignableFrom(underlyingClass)) {
-                return CollectionSemantics.LIST;
-            }
-            if (Set.class.isAssignableFrom(underlyingClass)) {
-                return CollectionSemantics.SET;
-            }
-            return CollectionSemantics.OTHER;
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
index afaa1a0..9707bd0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
@@ -18,8 +18,9 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyActionParameterContributee
         extends ObjectActionParameterContributeeAbstract
@@ -35,7 +36,6 @@ public class OneToManyActionParameterContributee
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return OneToManyFeature.Util.semanticsOf(underlyingClass);
+        return getFacet(CollectionSemanticsFacet.class).value();
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java
index 72ba757..dc30800 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java
@@ -21,8 +21,9 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyActionParameterDefault extends ObjectActionParameterAbstract implements OneToManyActionParameter {
 
@@ -35,8 +36,7 @@ public class OneToManyActionParameterDefault extends ObjectActionParameterAbstra
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return OneToManyFeature.Util.semanticsOf(underlyingClass);
+        return getFacet(CollectionSemanticsFacet.class).value();
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java
index f51a2a0..117067f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java
@@ -17,8 +17,9 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyActionParameterMixedIn
         extends ObjectActionParameterMixedInAbstract
@@ -32,7 +33,6 @@ public class OneToManyActionParameterMixedIn
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return OneToManyFeature.Util.semanticsOf(underlyingClass);
+        return getFacet(CollectionSemanticsFacet.class).value();
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
----------------------------------------------------------------------
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 ca55eee..fc3f2fd 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
@@ -32,6 +32,8 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToF
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
 import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
@@ -44,7 +46,6 @@ import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyAssociationDefault extends ObjectAssociationAbstract implements OneToManyAssociation {
 
@@ -65,8 +66,7 @@ public class OneToManyAssociationDefault extends ObjectAssociationAbstract imple
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return OneToManyFeature.Util.semanticsOf(underlyingClass);
+        return getFacet(CollectionSemanticsFacet.class).value();
     }
 
     //region > visible, usable

http://git-wip-us.apache.org/repos/asf/isis/blob/69753e24/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 1f60e44..fbfd78e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -37,6 +37,9 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
@@ -47,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsPr
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
@@ -280,6 +284,11 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
                         property.get(parentAdapter, InteractionInitiatedBy.USER);
                 scalarModel.setObject(associatedAdapter);
             }
+
+            @Override
+            public ObjectAdapter load(final ScalarModel scalarModel) {
+                return scalarModel.loadFromSuper();
+            }
         },
         PARAMETER {
             @Override
@@ -481,6 +490,29 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
                 final ObjectAdapter defaultAdapter = actionParameter.getDefault(parentAdapter);
                 scalarModel.setObject(defaultAdapter);
             }
+
+            @Override
+            public ObjectAdapter load(final ScalarModel scalarModel) {
+                final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
+                final ObjectActionParameter actionParameter = parameterMemento
+                        .getActionParameter(scalarModel.getSpecificationLoader());
+                final ObjectAdapter objectAdapter = scalarModel.loadFromSuper();
+
+                if(objectAdapter != null) {
+                    return objectAdapter;
+                }
+                if(actionParameter.getFeatureType() == FeatureType.ACTION_PARAMETER_SCALAR) {
+                    return objectAdapter;
+                }
+
+                // return an empty collection
+                final OneToManyActionParameter otmap = (OneToManyActionParameter) actionParameter;
+                final CollectionSemantics collectionSemantics = otmap.getCollectionSemantics();
+                final TypeOfFacet typeOfFacet = actionParameter.getFacet(TypeOfFacet.class);
+                final Class<?> elementType = typeOfFacet.value();
+                final Object emptyCollection = collectionSemantics.emptyCollectionOf(elementType);
+                return scalarModel.getCurrentSession().getPersistenceSession().adapterFor(emptyCollection);
+            }
         };
 
         private static List<ObjectAdapter> choicesAsList(final ObjectAdapter[] choices) {
@@ -543,12 +575,22 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
         public abstract void init(ScalarModel scalarModel);
         public abstract void reset(ScalarModel scalarModel);
 
+        public abstract ObjectAdapter load(final ScalarModel scalarModel);
     }
 
     private final Kind kind;
     
     private final ObjectAdapterMemento parentObjectAdapterMemento;
-    
+
+    @Override
+    public ObjectAdapter load() {
+        return kind.load(this);
+    }
+
+    private ObjectAdapter loadFromSuper() {
+        return super.load();
+    }
+
 
     /**
      * Populated only if {@link #getKind()} is {@link Kind#PARAMETER}