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:07 UTC

[01/24] isis git commit: Fixes using datanucleus.ConnectionPasswordDecrypter in CreateSchemaObjectFromClassMetadata

Repository: isis
Updated Branches:
  refs/heads/maint-1.13.3 b05ed58ed -> fadb7ec78


Fixes using datanucleus.ConnectionPasswordDecrypter in CreateSchemaObjectFromClassMetadata


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

Branch: refs/heads/maint-1.13.3
Commit: 2da7534a40437781fe9f4d230cf09d660e4082a7
Parents: b05ed58
Author: Martin Hesse <mw...@gmail.com>
Authored: Mon Jan 9 20:52:03 2017 +0700
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 09:50:27 2017 +0000

----------------------------------------------------------------------
 .../CreateSchemaObjectFromClassMetadata.java    | 38 ++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2da7534a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
index b5fe0ea..990e52d 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/CreateSchemaObjectFromClassMetadata.java
@@ -27,8 +27,11 @@ import java.util.Map;
 
 import com.google.common.base.Strings;
 
+import org.datanucleus.ClassLoaderResolver;
+import org.datanucleus.enhancer.EnhancementNucleusContextImpl;
 import org.datanucleus.metadata.AbstractClassMetaData;
 import org.datanucleus.metadata.MetaDataListener;
+import org.datanucleus.store.encryption.ConnectionEncryptionProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,7 +66,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
         final String driverName = properties.get("javax.jdo.option.ConnectionDriverName");
         final String url = properties.get("javax.jdo.option.ConnectionURL");
         final String userName = properties.get("javax.jdo.option.ConnectionUserName");
-        final String password = properties.get("javax.jdo.option.ConnectionPassword");
+        final String password = getConnectionPassword();
 
         try {
 
@@ -158,7 +161,7 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
     }
     //endregion
 
-    //region > helpers: closeSafely
+    //region > helpers: closeSafely, getConnectionPassword
     protected void closeSafely(final AutoCloseable connection) {
         if(connection != null) {
             try {
@@ -168,6 +171,37 @@ public class CreateSchemaObjectFromClassMetadata implements MetaDataListener, Da
             }
         }
     }
+        
+    // copied and adapted from org.datanucleus.store.AbstractStoreManager.getConnectionPassword()    
+    /**
+     * Convenience accessor for the password to use for the connection.
+     * Will perform decryption if the persistence property "datanucleus.ConnectionPasswordDecrypter" has
+     * also been specified.
+     * @return Password
+     */
+    private String getConnectionPassword() {
+    	String password = properties.get("javax.jdo.option.ConnectionPassword");
+        if (password != null)
+        {
+            String decrypterName = properties.get("datanucleus.ConnectionPasswordDecrypter");
+            if (decrypterName != null)
+            {
+                // Decrypt the password using the provided class
+                ClassLoaderResolver clr = new EnhancementNucleusContextImpl("JDO", properties).getClassLoaderResolver(null);
+                try
+                {
+                    Class decrypterCls = clr.classForName(decrypterName);
+                    ConnectionEncryptionProvider decrypter = (ConnectionEncryptionProvider) decrypterCls.newInstance();
+                    password = decrypter.decrypt(password);
+                }
+                catch (Exception e)
+                {
+                    LOG.warn("Error invoking decrypter class " + decrypterName, e);
+                }
+            }
+        }
+        return password;
+	}    
     //endregion
 
     //region > injected dependencies


[12/24] isis git commit: ISIS-785: implements getCollectionSemantics for OneToManyActionParameterXxx classes (generalizing similar code in OneToManyAssociation).

Posted by da...@apache.org.
ISIS-785: implements getCollectionSemantics for OneToManyActionParameterXxx classes (generalizing similar code in OneToManyAssociation).


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

Branch: refs/heads/maint-1.13.3
Commit: 5b182098e9d4d95de91beff79b07dbbd3e478781
Parents: 4639eab
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 11:59:41 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 11:59:41 2017 +0000

----------------------------------------------------------------------
 .../spec/feature/OneToManyFeature.java          | 17 +++++++++++++++++
 .../OneToManyActionParameterContributee.java    |  4 +++-
 .../OneToManyActionParameterDefault.java        |  6 +++++-
 .../OneToManyActionParameterMixedIn.java        |  4 +++-
 .../specimpl/OneToManyAssociationDefault.java   | 20 ++------------------
 5 files changed, 30 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5b182098/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 d08c751..3ffc9f9 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
@@ -20,7 +20,9 @@
 package org.apache.isis.core.metamodel.spec.feature;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.Queue;
+import java.util.Set;
 
 /**
  * Base interface for {@link OneToManyAssociation} only.
@@ -68,4 +70,19 @@ public interface OneToManyFeature extends ObjectFeature {
     }
 
     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/5b182098/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 54eae3c..4db147e 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,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyActionParameterContributee
         extends ObjectActionParameterContributeeAbstract
@@ -33,6 +34,7 @@ public class OneToManyActionParameterContributee
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        throw new RuntimeException("TODO: not yet implemented");
+        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
+        return OneToManyFeature.Util.semanticsOf(underlyingClass);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5b182098/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 890ed2a..a542f15 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,6 +21,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.facets.TypedHolder;
 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 {
 
@@ -33,6 +34,9 @@ public class OneToManyActionParameterDefault extends ObjectActionParameterAbstra
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        throw new RuntimeException("TODO: not yet implemented");
+        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
+        return OneToManyFeature.Util.semanticsOf(underlyingClass);
     }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5b182098/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 b95106c..6ca04c0 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,6 +17,7 @@
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
 public class OneToManyActionParameterMixedIn
         extends ObjectActionParameterMixedInAbstract
@@ -30,6 +31,7 @@ public class OneToManyActionParameterMixedIn
 
     @Override
     public CollectionSemantics getCollectionSemantics() {
-        throw new RuntimeException("TODO: not yet implemented");
+        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
+        return OneToManyFeature.Util.semanticsOf(underlyingClass);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5b182098/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 c9648cb..ca55eee 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
@@ -19,10 +19,6 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.util.ToString;
@@ -48,6 +44,7 @@ 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 {
 
@@ -69,20 +66,7 @@ public class OneToManyAssociationDefault extends ObjectAssociationAbstract imple
     @Override
     public CollectionSemantics getCollectionSemantics() {
         final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return semanticsOf(underlyingClass);
-    }
-
-    private 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;
+        return OneToManyFeature.Util.semanticsOf(underlyingClass);
     }
 
     //region > visible, usable


[24/24] isis git commit: ISIS-785: reworks ObjectAdapterMemento so can store a list of OAMs (equivalent to a transient list of persistent entities) as well as a single OAM (equivalent to a single persistent entity).

Posted by da...@apache.org.
ISIS-785: reworks ObjectAdapterMemento so can store a list of OAMs (equivalent to a transient list of persistent entities) as well as a single OAM (equivalent to a single persistent entity).

As of this commit (in testing with kitchensink's ReferenceObject#moveChildren) can select multiple objects in the UI, but cannot yet invoke the action.


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

Branch: refs/heads/maint-1.13.3
Commit: fadb7ec780de2a714b96b444429464e3f8b59c07
Parents: e114e6c
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 11:08:37 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 11:08:37 2017 +0000

----------------------------------------------------------------------
 .../model/mementos/ObjectAdapterMemento.java    | 208 +++++++++++++++++--
 .../viewer/wicket/model/models/EntityModel.java |  10 +
 .../viewer/wicket/model/models/ScalarModel.java |  30 +--
 .../models/ScalarModelWithMultiPending.java     |  26 +--
 .../scalars/reference/ReferencePanel.java       |   2 +-
 .../entitysimplelink/EntityLinkSimplePanel.java |  22 +-
 6 files changed, 244 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index a6ad7c5..d6d820e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -20,11 +20,15 @@
 package org.apache.isis.viewer.wicket.model.mementos;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -51,7 +55,6 @@ public class ObjectAdapterMemento implements Serializable {
     private static final long serialVersionUID = 1L;
 
     public static final OidMarshaller OID_MARSHALLER = OidMarshaller.INSTANCE;
-
     /**
      * Factory method
      */
@@ -69,8 +72,109 @@ public class ObjectAdapterMemento implements Serializable {
         return new ObjectAdapterMemento(rootOid);
     }
 
-    public Bookmark asBookmark() {
-        return bookmark;
+    public static ObjectAdapterMemento createForList(final ArrayList<ObjectAdapterMemento> list) {
+        return new ObjectAdapterMemento(list);
+    }
+
+    public static ObjectAdapterMemento createForList(final Collection<ObjectAdapterMemento> list) {
+        return list != null ? createForList(Lists.newArrayList(list)) :  null;
+    }
+
+    enum Sort {
+        /**
+         * represents a single object
+         */
+        SCALAR {
+
+            @Override
+            public ObjectAdapter asAdapter(
+                    final ObjectAdapterMemento oam,
+                    final PersistenceSession persistenceSession,
+                    final SpecificationLoader specificationLoader) {
+                return oam.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader);
+            }
+
+            @Override
+            public int hashCode(final ObjectAdapterMemento oam) {
+                return oam.type.hashCode(oam);
+            }
+
+            @Override
+            public boolean equals(final ObjectAdapterMemento oam, final Object other) {
+                if (!(other instanceof ObjectAdapterMemento)) {
+                    return false;
+                }
+                final ObjectAdapterMemento otherOam = (ObjectAdapterMemento) other;
+                if(otherOam.sort != SCALAR) {
+                    return false;
+                }
+                return oam.type.equals(oam, (ObjectAdapterMemento) other);
+            }
+
+            @Override
+            public String asString(final ObjectAdapterMemento oam) {
+                return oam.type.toString(oam);
+            }
+        },
+        /**
+         * represents a list of objects
+         */
+        VECTOR {
+
+            @Override
+            public ObjectAdapter asAdapter(
+                    final ObjectAdapterMemento oam,
+                    final PersistenceSession persistenceSession,
+                    final SpecificationLoader specificationLoader) {
+                final List<Object> listOfPojos =
+                        Lists.newArrayList(
+                            FluentIterable.from(oam.list)
+                                           .transform(Functions.toPojo(persistenceSession, specificationLoader))
+                                           .toList()
+                        );
+                return ObjectAdapter.Functions.adapterForUsing(persistenceSession).apply(listOfPojos);
+            }
+
+            @Override
+            public int hashCode(final ObjectAdapterMemento oam) {
+                return oam.list.hashCode();
+            }
+
+            @Override
+            public boolean equals(final ObjectAdapterMemento oam, final Object other) {
+                if (!(other instanceof ObjectAdapterMemento)) {
+                    return false;
+                }
+                final ObjectAdapterMemento otherOam = (ObjectAdapterMemento) other;
+                if(otherOam.sort != VECTOR) {
+                    return false;
+                }
+                return oam.list.equals(otherOam.list);
+            }
+
+            @Override
+            public String asString(final ObjectAdapterMemento oam) {
+                return oam.list.toString();
+            }
+        };
+
+        void ensure(final Sort sort) {
+            if(this == sort) {
+                return;
+            }
+            throw new IllegalStateException("Memento is not for " + sort);
+        }
+
+        public abstract ObjectAdapter asAdapter(
+                final ObjectAdapterMemento oam,
+                final PersistenceSession persistenceSession,
+                final SpecificationLoader specificationLoader);
+
+        public abstract int hashCode(final ObjectAdapterMemento oam);
+
+        public abstract boolean equals(final ObjectAdapterMemento oam, final Object other);
+
+        public abstract String asString(final ObjectAdapterMemento oam);
     }
 
     enum Type {
@@ -227,47 +331,72 @@ public class ObjectAdapterMemento implements Serializable {
                 final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
     }
 
+
+
+    private final Sort sort;
+
+    /**
+     * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+     */
     private Type type;
 
-    private final ObjectSpecId objectSpecId;
+    /**
+     * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+     */
+    private ObjectSpecId objectSpecId;
+    /**
+     * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+     */
     private String titleHint;
 
     /**
-     * The current value, if {@link Type#ENCODEABLE}.
-     * 
+     * The current value, if {@link Type#ENCODEABLE}; will be <tt>null</tt> otherwise.
+     *
      * <p>
-     * Will be <tt>null</tt> otherwise.
+     * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
      */
     private String encodableValue;
     
     /**
-     * The current value, if {@link Type#PERSISTENT}.
-     * 
+     * The current value, if {@link Type#PERSISTENT}, will be <tt>null</tt> otherwise.
+     *
      * <p>
-     * Will be <tt>null</tt> otherwise.
+     * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
      */
     private String persistentOidStr;
 
     /**
-     * The current value, if {@link Type#PERSISTENT}.
+     * The current value, if {@link Type#PERSISTENT}, will be <tt>null</tt> otherwise.
      *
      * <p>
-     * Will be <tt>null</tt> otherwise.
+     * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
      */
     private Bookmark bookmark;
 
     /**
-     * The current value, if {@link Type#TRANSIENT}.
-     * 
+     * The current value, if {@link Type#TRANSIENT}, will be <tt>null</tt> otherwise.
+     *
      * <p>
-     * Will be <tt>null</tt> otherwise.
+     * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
      */
     private Memento transientMemento;
 
+    /**
+     * opulated only if {@link #getSort() sort} is {@link Sort#VECTOR vector}
+     */
+    private ArrayList<ObjectAdapterMemento> list;
+
+    public ObjectAdapterMemento(final ArrayList<ObjectAdapterMemento> list) {
+        this.sort = Sort.VECTOR;
+        this.list = list;
+    }
+
     private ObjectAdapterMemento(final RootOid rootOid) {
 
         assert !rootOid.isTransient();
 
+        this.sort = Sort.SCALAR;
+
         this.persistentOidStr = rootOid.enString();
         this.bookmark = rootOid.asBookmark();
         this.objectSpecId = rootOid.getObjectSpecId();
@@ -278,6 +407,7 @@ public class ObjectAdapterMemento implements Serializable {
         if (adapter == null) {
             throw new IllegalArgumentException("adapter cannot be null");
         }
+        this.sort = Sort.SCALAR;
         final ObjectSpecification specification = adapter.getSpecification();
         objectSpecId = specification.getSpecId();
         init(adapter);
@@ -307,11 +437,34 @@ public class ObjectAdapterMemento implements Serializable {
         type = Type.PERSISTENT;
     }
 
+    public Sort getSort() {
+        return sort;
+    }
+
+    public ArrayList<ObjectAdapterMemento> getList() {
+        ensureVector();
+        return list;
+    }
+
+    public ObjectAdapter asAdapter(
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        return sort.asAdapter(this, persistenceSession, specificationLoader);
+    }
+
+
     public void resetVersion(
-            final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        ensureScalar();
         type.resetVersion(this, persistenceSession, specificationLoader);
     }
-    
+
+
+    public Bookmark asBookmark() {
+        ensureScalar();
+        return bookmark;
+    }
 
     /**
      * Lazily looks up {@link ObjectAdapter} if required.
@@ -327,6 +480,7 @@ public class ObjectAdapterMemento implements Serializable {
             final ConcurrencyChecking concurrencyChecking,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
+        ensureScalar();
         return type.getAdapter(this, concurrencyChecking, persistenceSession, specificationLoader);
     }
 
@@ -339,10 +493,12 @@ public class ObjectAdapterMemento implements Serializable {
      * @param adapter
      */
     public void setAdapter(final ObjectAdapter adapter) {
+        ensureScalar();
         init(adapter);
     }
 
     public ObjectSpecId getObjectSpecId() {
+        ensureScalar();
         return objectSpecId;
     }
 
@@ -354,6 +510,9 @@ public class ObjectAdapterMemento implements Serializable {
             List<ObjectAdapterMemento> list,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
+
+        ensureScalar();
+
         // REVIEW: heavy handed, ought to be possible to just compare the OIDs
         // ignoring the concurrency checking
         final ObjectAdapter currAdapter = getObjectAdapter(ConcurrencyChecking.NO_CHECK, persistenceSession,
@@ -373,12 +532,12 @@ public class ObjectAdapterMemento implements Serializable {
 
     @Override
     public int hashCode() {
-        return type.hashCode(this);
+        return sort.hashCode(this);
     }
 
     @Override
     public boolean equals(Object obj) {
-        return (obj instanceof ObjectAdapterMemento) && type.equals(this, (ObjectAdapterMemento)obj);
+        return sort.equals(this, obj);
     }
 
 
@@ -388,7 +547,7 @@ public class ObjectAdapterMemento implements Serializable {
     }
 
     public String asString() {
-        return type.toString(this);
+        return sort.asString(this);
     }
 
 
@@ -517,5 +676,14 @@ public class ObjectAdapterMemento implements Serializable {
         }
     }
 
+    private void ensureScalar() {
+        getSort().ensure(Sort.SCALAR);
+    }
+
+    private void ensureVector() {
+        getSort().ensure(Sort.VECTOR);
+    }
+
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 8cb4726..74c1c3a 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -43,6 +43,8 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -355,6 +357,14 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
         adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
     }
 
+    public void setObjectMemento(
+            final ObjectAdapterMemento memento,
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        super.setObject(memento.asAdapter(persistenceSession, specificationLoader));
+        adapterMemento = memento;
+    }
+
 
     // //////////////////////////////////////////////////////////
     // PropertyModels

http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/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 6d9cba9..d0a6c07 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
@@ -39,8 +39,6 @@ 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;
@@ -51,7 +49,6 @@ 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;
@@ -511,14 +508,20 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
                     return objectAdapter;
                 }
 
-                // return an empty collection
-                // TODO: this should probably move down into OneToManyActionParameter impl
-                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);
+
+                // hmmm... I think we should simply return null, as an indicator that there is no "pending" (see ScalarModelWithMultiPending)
+
+//                // return an empty collection
+//                // TODO: this should probably move down into OneToManyActionParameter impl
+//                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);
+
+                return objectAdapter;
+
             }
 
             @Override
@@ -873,13 +876,12 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
             @Override
             public ArrayList<ObjectAdapterMemento> getPending() {
                 final ObjectAdapterMemento pending = ScalarModel.this.getPending();
-                return Util.asMementoList(pending, getPersistenceSession(), getSpecificationLoader());
+                return pending != null ? pending.getList() : null;
             }
 
             @Override
             public void setPending(final ArrayList<ObjectAdapterMemento> pending) {
-                final ObjectAdapter list = Util.toAdapter(pending, getPersistenceSession(), getSpecificationLoader());
-                final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createOrNull(list);
+                final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createForList(pending);
                 ScalarModel.this.setPending(adapterMemento);
             }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
index e57494b..1a824cc 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
@@ -58,11 +58,12 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
                 @Override
                 public ArrayList<ObjectAdapterMemento> getObject() {
-                    if (owner.getPending() != null) {
+                    final ArrayList<ObjectAdapterMemento> pending = owner.getPending();
+                    if (pending != null) {
                         if (LOG.isDebugEnabled()) {
-                            LOG.debug("pending not null: " + owner.getPending().toString());
+                            LOG.debug("pending not null: " + pending.toString());
                         }
-                        return owner.getPending();
+                        return pending;
                     }
                     if (LOG.isDebugEnabled()) {
                         LOG.debug("pending is null");
@@ -70,11 +71,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
                     final ScalarModel scalarModel = owner.getScalarModel();
                     final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
-                    ArrayList<ObjectAdapterMemento> mementos = asMementoList(objectAdapterMemento,
-                            scalarModel.getPersistenceSession(), scalarModel.getSpecificationLoader());
-
-                    owner.setPending(mementos);
-                    return mementos;
+                    return objectAdapterMemento != null? objectAdapterMemento.getList(): null;
                 }
 
                 @Override
@@ -96,9 +93,8 @@ public interface ScalarModelWithMultiPending extends Serializable {
                             if (LOG.isDebugEnabled()) {
                                 LOG.debug(String.format("setting to pending: %s", ownerPending.toString()));
                             }
-                            final ObjectAdapter objectAdapterOfListOfPojos =
-                                    toAdapter(ownerPending, persistenceSession, specificationLoader);
-                            ownerScalarModel.setObject(objectAdapterOfListOfPojos);
+                            ownerScalarModel.setObjectMemento(
+                                    ObjectAdapterMemento.createForList(adapterMemento), persistenceSession, specificationLoader);
                         }
                     }
                 }
@@ -142,10 +138,10 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
         public static ObjectAdapterMemento toAdapterMemento(
                 final Collection<ObjectAdapterMemento> modelObject,
-                final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
-            final ObjectAdapter objectAdapter = ScalarModelWithMultiPending.Util
-                    .toAdapter(Lists.newArrayList(modelObject), persistenceSession, specificationLoader);
-            return ObjectAdapterMemento.createOrNull(objectAdapter);
+                final PersistenceSession persistenceSession,
+                final SpecificationLoader specificationLoader) {
+
+            return ObjectAdapterMemento.createForList(modelObject);
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 1d4c814..d23e63f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -240,7 +240,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
                 
                 final ComponentFactory componentFactory = 
                         getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-                final Component component = componentFactory.createComponent(entityModelForLink);
+                final Component component = componentFactory.createComponent(ComponentType.ENTITY_ICON_AND_TITLE.getWicketId(), entityModelForLink);
                 
                 componentForRegular.addOrReplace(component);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
index ed810b1..619a9f9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.unknown.UnknownModelPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
 
@@ -79,10 +80,23 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
             entityModelForLink.setRenderingHint(getEntityModel().getRenderingHint());
             
             final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
-            final Component component = componentFactory.createComponent(entityModelForLink);
-            addOrReplace(component);
-            
-            permanentlyHide(ID_ENTITY_TITLE_NULL);
+
+            if(componentFactory instanceof UnknownModelPanelFactory) {
+
+//                // TODO: this is a workaround, because the UnknownModelPanelFactory isn't resolving correctly...
+//                addOrReplace(new Label(ID_ENTITY_TITLE_NULL, "(unknown)"));
+//                permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+
+                final Component component = componentFactory.createComponent(ID_ENTITY_ICON_AND_TITLE, entityModelForLink);
+                addOrReplace(component);
+                permanentlyHide(ID_ENTITY_TITLE_NULL);
+            } else {
+                final Component component = componentFactory.createComponent(ID_ENTITY_ICON_AND_TITLE, entityModelForLink);
+                addOrReplace(component);
+                permanentlyHide(ID_ENTITY_TITLE_NULL);
+
+            }
+
         } else {
             // represent no object by a simple label displaying '(none)'
             addOrReplace(new Label(ID_ENTITY_TITLE_NULL, "(none)"));


[17/24] isis git commit: ISIS-785: splits FeatureType#ACTION_PARAMETER into #ACTION_PARAMETER_SCALAR and #ACTION_PARAMETER_COLLECTION, so able to create either OneToOneActionParameter or OneToManyActionParameter.

Posted by da...@apache.org.
ISIS-785: splits FeatureType#ACTION_PARAMETER into #ACTION_PARAMETER_SCALAR and #ACTION_PARAMETER_COLLECTION, so able to create either OneToOneActionParameter or OneToManyActionParameter.

...


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

Branch: refs/heads/maint-1.13.3
Commit: d51d4aa6beb84323b580213293b84d7877cb7e24
Parents: 8d80712
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 14:35:14 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 14:35:14 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facetapi/FeatureType.java    | 21 +++++++++---
 .../core/metamodel/facets/FacetedMethod.java    | 27 ++++++++++------
 .../facets/FacetedMethodParameter.java          |  8 +++--
 .../isis/core/metamodel/facets/TypedHolder.java |  7 ++--
 .../metamodel/facets/TypedHolderDefault.java    |  4 +--
 .../specloader/SpecificationLoader.java         | 34 ++++++++++++++++++--
 .../facetprocessor/FacetProcessor.java          | 23 +++++++------
 .../specimpl/ObjectActionDefault.java           | 10 +++---
 .../specimpl/ObjectActionParameterAbstract.java | 10 ++++--
 ...bjectActionParameterContributeeAbstract.java |  5 +--
 .../ObjectActionParameterMixedInAbstract.java   |  5 +--
 .../OneToManyActionParameterContributee.java    |  3 +-
 .../OneToManyActionParameterDefault.java        |  3 +-
 .../OneToManyActionParameterMixedIn.java        |  3 +-
 .../OneToOneActionParameterContributee.java     |  3 +-
 .../OneToOneActionParameterDefault.java         |  3 +-
 .../OneToOneActionParameterMixedIn.java         |  3 +-
 .../AbstractFacetFactoryJUnit4TestCase.java     |  3 +-
 .../facets/AbstractFacetFactoryTest.java        |  3 +-
 ...ParameterAbstractTest_getId_and_getName.java |  8 ++---
 ...ivenAuditableAnnotationFacetFactoryTest.java |  2 +-
 ...uditableFacetMarkerInterfaceFactoryTest.java |  2 +-
 ...storeIdentityAnnotationFacetFactoryTest.java |  2 +-
 ...DiscriminatorAnnotationFacetFactoryTest.java |  2 +-
 ...stenceCapableAnnotationFacetFactoryTest.java |  2 +-
 .../JdoVersionAnnotationFacetFactoryTest.java   |  2 +-
 ...FromJdoColumnAnnotationFacetFactoryTest.java |  2 +-
 ...FromJdoColumnAnnotationFacetFactoryTest.java |  2 +-
 ...NotPersistentAnnotationFacetFactoryTest.java |  2 +-
 ...JdoPrimaryKeyAnnotationFacetFactoryTest.java |  2 +-
 30 files changed, 139 insertions(+), 67 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
index 8f50ccd..20aad5b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -77,7 +77,16 @@ public enum FeatureType {
             return Identifier.actionIdentifier(type.getName(), fullMethodName, parameterTypes);
         }
     },
-    ACTION_PARAMETER("Parameter") {
+    ACTION_PARAMETER_SCALAR("Scalar Parameter") {
+        /**
+         * Always returns <tt>null</tt>.
+         */
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return null;
+        }
+    },
+    ACTION_PARAMETER_COLLECTION("Collection Parameter") {
         /**
          * Always returns <tt>null</tt>.
          */
@@ -99,7 +108,7 @@ public enum FeatureType {
     public final static List<FeatureType> COLLECTIONS_ONLY = ImmutableList.of(COLLECTION);
     public final static List<FeatureType> COLLECTIONS_AND_ACTIONS = ImmutableList.of(COLLECTION, ACTION);
     public final static List<FeatureType> ACTIONS_ONLY = ImmutableList.of(ACTION);
-    public final static List<FeatureType> PARAMETERS_ONLY = ImmutableList.of(ACTION_PARAMETER);
+    public final static List<FeatureType> PARAMETERS_ONLY = ImmutableList.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
     public final static List<FeatureType> PROPERTIES_ONLY = ImmutableList.of(PROPERTY);
     public final static List<FeatureType> PROPERTIES_AND_ACTIONS = ImmutableList.of(PROPERTY, ACTION);
     public final static List<FeatureType> OBJECTS_ONLY = ImmutableList.of(OBJECT);
@@ -111,7 +120,8 @@ public enum FeatureType {
     public final static List<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = ImmutableList.of(OBJECT, PROPERTY, COLLECTION);
     public final static List<FeatureType> OBJECTS_POST_PROCESSING_ONLY = ImmutableList.of(OBJECT_POST_PROCESSING);
 
-    public static final List<FeatureType> ACTIONS_AND_PARAMETERS = ImmutableList.of(ACTION, ACTION_PARAMETER);
+    public static final List<FeatureType> ACTIONS_AND_PARAMETERS =
+            ImmutableList.of(ACTION, ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
 
     /**
      * Use of this is discouraged; instead use multiple {@link FacetFactory}s
@@ -122,7 +132,8 @@ public enum FeatureType {
      * Use of this is discouraged; instead use multiple {@link FacetFactory}s
      * for different features.
      */
-    public final static List<FeatureType> EVERYTHING = ImmutableList.of(OBJECT, PROPERTY, COLLECTION, ACTION, ACTION_PARAMETER);
+    public final static List<FeatureType> EVERYTHING =
+            ImmutableList.of(OBJECT, PROPERTY, COLLECTION, ACTION, ACTION_PARAMETER_SCALAR);
 
     private final String name;
 
@@ -149,7 +160,7 @@ public enum FeatureType {
     }
 
     public boolean isActionParameter() {
-        return this == ACTION_PARAMETER;
+        return this == ACTION_PARAMETER_SCALAR || this == ACTION_PARAMETER_COLLECTION;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/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 e59a3e4..490866d 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
@@ -114,22 +114,29 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
             final Class<?> parameterType = parameterTypes[paramNum];
             final Type genericParameterType = genericParameterTypes[paramNum];
 
-            final FacetedMethodParameter fmp = new FacetedMethodParameter(declaringType, actionMethod, parameterType);
+            final FeatureType featureType =
+                    specificationLoader.isParamCollection(parameterType, genericParameterType)
+                            ? FeatureType.ACTION_PARAMETER_COLLECTION
+                            : FeatureType.ACTION_PARAMETER_SCALAR;
+
+            final FacetedMethodParameter fmp = new FacetedMethodParameter(featureType, declaringType, actionMethod, parameterType);
             actionParams.add(fmp);
 
             // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
-            TypeOfFacet typeOfFacet = specificationLoader.inferFromGenericParamType(fmp, parameterType, genericParameterType);
+            if(featureType == FeatureType.ACTION_PARAMETER_COLLECTION) {
+                TypeOfFacet typeOfFacet = specificationLoader.inferFromGenericParamType(fmp, parameterType, genericParameterType);
 
-            if(typeOfFacet == null ) {
-                if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
-                    typeOfFacet = specificationLoader.inferFromArrayType(fmp, parameterType);
+                if(typeOfFacet == null ) {
+                    if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
+                        typeOfFacet = specificationLoader.inferFromArrayType(fmp, parameterType);
+                    }
                 }
-            }
 
-            // copy over (corresponds to similar code for OneToManyAssociation in FacetMethodsBuilder).
-            if(typeOfFacet != null ) {
-                FacetUtil.addFacet(typeOfFacet);
-                fmp.setType(typeOfFacet.value());
+                // copy over (corresponds to similar code for OneToManyAssociation in FacetMethodsBuilder).
+                if(typeOfFacet != null ) {
+                    FacetUtil.addFacet(typeOfFacet);
+                    fmp.setType(typeOfFacet.value());
+                }
             }
 
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
index 3939093..6fdf648 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetedMethodParameter.java
@@ -29,8 +29,12 @@ public class FacetedMethodParameter extends TypedHolderDefault implements Identi
 
     private final Identifier identifier;
 
-    public FacetedMethodParameter(final Class<?> declaringType, final Method method, final Class<?> type) {
-        super(FeatureType.ACTION_PARAMETER, type);
+    public FacetedMethodParameter(
+            final FeatureType featureType,
+            final Class<?> declaringType,
+            final Method method,
+            final Class<?> type) {
+        super(featureType, type);
 
         // best we can do...
         this.identifier = FeatureType.ACTION.identifierFor(declaringType, method);

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
index d1a9868..3946037 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
@@ -34,10 +34,11 @@ public interface TypedHolder extends FacetHolder {
     public FeatureType getFeatureType();
 
     /**
-     * The type of a {@link FeatureType#PROPERTY property}, the referenced type
+     * The type of a {@link FeatureType#PROPERTY property}, the referenced (element) type
      * of a {@link FeatureType#COLLECTION collection}, the return type of an
-     * {@link FeatureType#ACTION action} and for {@link FeatureType#ACTION_PARAMETER action parameter}s
-     * either the scalar type or the inferred generic type if a collection.
+     * {@link FeatureType#ACTION action}, the type of a
+     * {@link FeatureType#ACTION_PARAMETER_SCALAR scalar action parameter}s, and the inferred
+     * element type for a {@link FeatureType#ACTION_PARAMETER_COLLECTION collection action parameter}.
      */
     public Class<?> getType();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
index a27f4b6..22cfe13 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
@@ -40,8 +40,8 @@ public class TypedHolderDefault extends FacetHolderImpl implements TypedHolder {
     }
 
     /**
-     * For {@link FeatureType#COLLECTION collection}s, and for some {@link FeatureType#ACTION_PARAMETER}s, represents the element
-     * type.
+     * For {@link FeatureType#COLLECTION collection}s and for
+     * {@link FeatureType#ACTION_PARAMETER_COLLECTION}s, represents the element type.
      */
     @Override
     public void setType(final Class<?> type) {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 757ad2d..eb34dc0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -531,11 +531,31 @@ public class SpecificationLoader implements ApplicationScopedComponent {
 
     //region > inferFromGenericParamType, inferFromGenericReturnType, inferFromArrayType
 
+    /**
+     * @return true means that either {@link #inferFromGenericParamType(Class, Type)} or {@link #inferFromArrayType(FacetHolder, Class)} will return a non-null value.
+     */
+    @Programmatic
+    public boolean isParamCollection(
+            final Class<?> parameterType,
+            final Type genericParameterType) {
+        return inferFromGenericParamType(parameterType, genericParameterType) != null || inferFromArrayType(parameterType) != null;
+    }
+
     @Programmatic
     public TypeOfFacet inferFromGenericParamType(
             final FacetHolder holder,
             final Class<?> parameterType,
             final Type genericParameterType) {
+        final Class<?> actualType = inferFromGenericParamType(parameterType, genericParameterType);
+        return actualType != null
+                ? new TypeOfFacetInferredFromGenerics(actualType, holder, this)
+                : null;
+    }
+
+    @Programmatic
+    public Class<?> inferFromGenericParamType(
+            final Class<?> parameterType,
+            final Type genericParameterType) {
 
         if(!CollectionUtils.isCollectionType(parameterType)) {
             return null;
@@ -549,7 +569,7 @@ public class SpecificationLoader implements ApplicationScopedComponent {
                 final Type actualTypeArgument = actualTypeArguments[0];
                 if(actualTypeArgument instanceof Class) {
                     final Class<?> actualType = (Class<?>) actualTypeArgument;
-                    return new TypeOfFacetInferredFromGenerics(actualType, holder, this);
+                    return actualType;
                 }
             }
         }
@@ -616,12 +636,20 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     public TypeOfFacet inferFromArrayType(
             final FacetHolder holder,
             final Class<?> type) {
-        if(!org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(type)) {
+        final Class<?> componentType = inferFromArrayType(type);
+        return componentType != null
+                ? new TypeOfFacetInferredFromArray(componentType, holder, this)
+                : null;
+    }
+
+    @Programmatic
+    public Class<?> inferFromArrayType(final Class<?> type) {
+        if(!CollectionUtils.isArrayType(type)) {
             return null;
         }
         if (type.isArray()) {
             final Class<?> componentType = type.getComponentType();
-            return new TypeOfFacetInferredFromArray(componentType, holder, this);
+            return componentType;
         }
         return null;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index 0791311..3e1d532 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -49,9 +49,6 @@ import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-
 public class FacetProcessor implements ServicesInjectorAware {
 
     private final ProgrammingModel programmingModel;
@@ -332,8 +329,7 @@ public class FacetProcessor implements ServicesInjectorAware {
     }
 
     /**
-     * Attaches all facets applicable to the provided
-     * {@link FeatureType#ACTION_PARAMETER parameter}), to the supplied
+     * Attaches all facets applicable to the provided parameter to the supplied
      * {@link FacetHolder}.
      * 
      * <p>
@@ -356,7 +352,19 @@ public class FacetProcessor implements ServicesInjectorAware {
             final int paramNum,
             final MethodRemover methodRemover,
             final FacetedMethodParameter facetedMethodParameter) {
-        final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.ACTION_PARAMETER);
+        for (FeatureType featureType : FeatureType.PARAMETERS_ONLY) {
+            processParams(introspectedClass, method, paramNum, methodRemover, facetedMethodParameter, featureType);
+        }
+    }
+
+    public void processParams(
+            final Class<?> introspectedClass,
+            final Method method,
+            final int paramNum,
+            final MethodRemover methodRemover,
+            final FacetedMethodParameter facetedMethodParameter,
+            final FeatureType featureType) {
+        final List<FacetFactory> factoryList = getFactoryListByFeatureType(featureType);
         final ProcessParameterContext processParameterContext =
                 new ProcessParameterContext(introspectedClass, method, paramNum, methodRemover, facetedMethodParameter);
         for (final FacetFactory facetFactory : factoryList) {
@@ -364,9 +372,6 @@ public class FacetProcessor implements ServicesInjectorAware {
         }
     }
 
-
-    
-    
     private List<FacetFactory> getFactoryListByFeatureType(final FeatureType featureType) {
         cacheByFeatureTypeIfRequired();
         List<FacetFactory> list = factoryListByFeatureType.get(featureType);

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 79258f7..a0bc998 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -47,7 +47,6 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
-import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
@@ -195,15 +194,16 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
 
         final List<ObjectActionParameter> parameters = Lists.newArrayList();
         for (int paramNum = 0; paramNum < parameterCount; paramNum++) {
-            final TypedHolder paramPeer = paramPeers.get(paramNum);
+            final FacetedMethodParameter paramPeer = paramPeers.get(paramNum);
 
             final ObjectSpecification specification = ObjectMemberAbstract
                     .getSpecification(getSpecificationLoader(), paramPeer.getType());
 
             // previously we threw an exception here if the specification represented a collection.  No longer!
-            final ObjectActionParameter parameter = specification.isNotCollection() ?
-                    new OneToOneActionParameterDefault(paramNum, this, paramPeer) :
-                    new OneToManyActionParameterDefault(paramNum, this, paramPeer);
+            final ObjectActionParameter parameter =
+                    paramPeer.getFeatureType() == FeatureType.ACTION_PARAMETER_SCALAR
+                            ? new OneToOneActionParameterDefault(paramNum, this, paramPeer)
+                            : new OneToManyActionParameterDefault(paramNum, this, paramPeer);
 
             parameters.add(parameter);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 9c1e2fc..89e48e6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -63,11 +63,17 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class ObjectActionParameterAbstract implements ObjectActionParameter {
 
+    private final FeatureType featureType;
     private final int number;
     private final ObjectActionDefault parentAction;
     private final TypedHolder peer;
 
-    protected ObjectActionParameterAbstract(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
+    protected ObjectActionParameterAbstract(
+            final FeatureType featureType,
+            final int number,
+            final ObjectActionDefault objectAction,
+            final TypedHolder peer) {
+        this.featureType = featureType;
         this.number = number;
         this.parentAction = objectAction;
         this.peer = peer;
@@ -75,7 +81,7 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     @Override
     public FeatureType getFeatureType() {
-        return FeatureType.ACTION_PARAMETER;
+        return featureType;
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
index 448c8aa..47e4ce9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 public abstract class ObjectActionParameterContributeeAbstract
@@ -32,11 +33,11 @@ public abstract class ObjectActionParameterContributeeAbstract
     private final ObjectActionContributee contributeeAction;
 
     public ObjectActionParameterContributeeAbstract(
-            final ObjectAdapter serviceAdapter,
+            final FeatureType featureType, final ObjectAdapter serviceAdapter,
             final ObjectActionParameterAbstract serviceActionParameter,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
-        super(contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
+        super(featureType, contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
         this.serviceAdapter = serviceAdapter;
         this.serviceActionParameter = serviceActionParameter;
         this.contributeeAction = contributeeAction;

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
index f8516cd..658b61f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
@@ -29,9 +30,9 @@ public abstract class ObjectActionParameterMixedInAbstract
     private final ObjectActionMixedIn mixedInAction;
 
     public ObjectActionParameterMixedInAbstract(
-            final ObjectActionParameterAbstract mixinParameter,
+            final FeatureType featureType, final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
-        super(mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
+        super(featureType, mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
         this.mixinParameter = mixinParameter;
         this.mixedInAction = mixedInAction;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/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 4db147e..afaa1a0 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
@@ -17,6 +17,7 @@
 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.spec.feature.OneToManyActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
@@ -29,7 +30,7 @@ public class OneToManyActionParameterContributee
             final ObjectActionParameterAbstract serviceActionParameter,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
-        super(serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
+        super(FeatureType.ACTION_PARAMETER_COLLECTION, serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/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 a542f15..72ba757 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
@@ -19,6 +19,7 @@
 
 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.spec.feature.OneToManyActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
@@ -29,7 +30,7 @@ public class OneToManyActionParameterDefault extends ObjectActionParameterAbstra
             final int index,
             final ObjectActionDefault actionImpl,
             final TypedHolder peer) {
-        super(index, actionImpl, peer);
+        super(FeatureType.ACTION_PARAMETER_COLLECTION, index, actionImpl, peer);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/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 6ca04c0..f51a2a0 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
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyFeature;
 
@@ -26,7 +27,7 @@ public class OneToManyActionParameterMixedIn
     public OneToManyActionParameterMixedIn(
             final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
-        super(mixinParameter, mixedInAction);
+        super(FeatureType.ACTION_PARAMETER_COLLECTION, mixinParameter, mixedInAction);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index 6250086..654beba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -17,6 +17,7 @@
 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.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterContributee
@@ -28,7 +29,7 @@ public class OneToOneActionParameterContributee
             final ObjectActionParameterAbstract serviceActionParameter,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
-        super(serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
+        super(FeatureType.ACTION_PARAMETER_SCALAR, serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
index 65cf664..7a99d2a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
@@ -19,6 +19,7 @@
 
 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.spec.feature.OneToOneActionParameter;
 
@@ -28,7 +29,7 @@ public class OneToOneActionParameterDefault extends ObjectActionParameterAbstrac
             final int index,
             final ObjectActionDefault actionImpl,
             final TypedHolder peer) {
-        super(index, actionImpl, peer);
+        super(FeatureType.ACTION_PARAMETER_SCALAR, index, actionImpl, peer);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index 5842361..05aa227 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterMixedIn
@@ -25,7 +26,7 @@ public class OneToOneActionParameterMixedIn
     public OneToOneActionParameterMixedIn(
             final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
-        super(mixinParameter, mixedInAction);
+        super(FeatureType.ACTION_PARAMETER_SCALAR, mixinParameter, mixedInAction);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index ee195e2..5a80218 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -145,7 +145,8 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
 
         facetHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(Identifier.propertyOrCollectionIdentifier(Customer.class, "firstName"));
         facetedMethod = FacetedMethod.createForProperty(AbstractFacetFactoryTest.Customer.class, "firstName");
-        facetedMethodParameter = new FacetedMethodParameter(facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class);
+        facetedMethodParameter = new FacetedMethodParameter(FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class
+        );
     }
     
     @After

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 4721012..12fd5be 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -104,7 +104,8 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
                 Identifier.propertyOrCollectionIdentifier(Customer.class, "firstName"));
         facetedMethod = FacetedMethod.createForProperty(Customer.class, "firstName");
         facetedMethodParameter = new FacetedMethodParameter(
-                facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class);
+                FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class
+        );
 
         methodRemover = new ProgrammableMethodRemover();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index 52bc0e6..3985ca0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -19,9 +19,6 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
 import com.google.common.collect.Lists;
 
 import org.jmock.Expectations;
@@ -41,6 +38,9 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
 public class ObjectActionParameterAbstractTest_getId_and_getName {
 
     @Rule
@@ -63,7 +63,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
     private final static class ObjectActionParameterAbstractToTest extends ObjectActionParameterAbstract {
         private ObjectActionParameterAbstractToTest(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
-            super(number, objectAction, peer);
+            super(FeatureType.ACTION_PARAMETER_SCALAR, number, objectAction, peer);
         }
 
         private ObjectSpecification objectSpec;

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
index ea06673..243a606 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
@@ -60,7 +60,7 @@ public class GivenAuditableAnnotationFacetFactoryTest extends
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         Assert.assertFalse(contains(featureTypes, FeatureType.ACTION));
         assertFalse(contains(featureTypes,
-                FeatureType.ACTION_PARAMETER));
+                FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testAuditableAnnotationPickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableFacetMarkerInterfaceFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableFacetMarkerInterfaceFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableFacetMarkerInterfaceFactoryTest.java
index 970d029..de11405 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableFacetMarkerInterfaceFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableFacetMarkerInterfaceFactoryTest.java
@@ -57,7 +57,7 @@ public class GivenAuditableFacetMarkerInterfaceFactoryTest extends
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         Assert.assertFalse(contains(featureTypes, FeatureType.ACTION));
         assertFalse(contains(featureTypes,
-                FeatureType.ACTION_PARAMETER));
+                FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testAuditableMarkerInterfacePickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
index 949a3b9..980855d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/datastoreidentity/GivenJdoDatastoreIdentityAnnotationFacetFactoryTest.java
@@ -58,7 +58,7 @@ public class GivenJdoDatastoreIdentityAnnotationFacetFactoryTest extends
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         Assert.assertFalse(contains(featureTypes, FeatureType.ACTION));
         assertFalse(contains(featureTypes,
-                FeatureType.ACTION_PARAMETER));
+                FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testDatastoreIdentityAnnotationPickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
index 661e50c..f0d9af3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
@@ -53,7 +53,7 @@ public class GivenJdoDiscriminatorAnnotationFacetFactoryTest extends AbstractFac
         assertFalse(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testDiscriminatorValueAnnotationPickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
index f80da90..e59a286 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/persistencecapable/GivenJdoPersistenceCapableAnnotationFacetFactoryTest.java
@@ -63,7 +63,7 @@ public class GivenJdoPersistenceCapableAnnotationFacetFactoryTest extends
                 .assertFalse(contains(featureTypes,
                 FeatureType.ACTION));
         assertFalse(contains(featureTypes,
-                FeatureType.ACTION_PARAMETER));
+                FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testPersistenceCapableAnnotationPickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
index ecb3462..b1db8f8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest.java
@@ -51,7 +51,7 @@ public class JdoVersionAnnotationFacetFactoryTest extends AbstractFacetFactoryTe
         assertFalse(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testVersionAnnotationPickedUpOnClass() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
index 79ff9eb..ba36638 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -53,7 +53,7 @@ public class BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest extends Ab
         assertTrue(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testAnnotationPickedUpOnProperty() throws Exception {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
index 88d8c6c..dc4b385 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/column/MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -54,7 +54,7 @@ public class MandatoryDerivedFromJdoColumnAnnotationFacetFactoryTest extends Abs
         assertTrue(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testPrimitiveWithNoAnnotation_isMandatory() throws Exception {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
index b27a0a4..8c18680 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/notpersistent/GivenJdoNotPersistentAnnotationFacetFactoryTest.java
@@ -52,7 +52,7 @@ public class GivenJdoNotPersistentAnnotationFacetFactoryTest extends AbstractFac
         assertTrue(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testNotPersistentAnnotationPickedUpOnProperty() throws Exception {

http://git-wip-us.apache.org/repos/asf/isis/blob/d51d4aa6/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
index 2324e40..aaeb530 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/prop/primarykey/GivenJdoPrimaryKeyAnnotationFacetFactoryTest.java
@@ -53,7 +53,7 @@ public class GivenJdoPrimaryKeyAnnotationFacetFactoryTest extends AbstractFacetF
         assertTrue(contains(featureTypes, FeatureType.PROPERTY));
         assertFalse(contains(featureTypes, FeatureType.COLLECTION));
         assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER));
+        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
     }
 
     public void testIdAnnotationPickedUpOnProperty() throws Exception {


[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.

Posted by da...@apache.org.
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}


[13/24] isis git commit: ISIS-785: moves logic for inferring generic return types from ActionAnnotationFacetFactory into SpecificationLoader, since will want to do something similar for the FacetedMethodParameter which represents a Collection.

Posted by da...@apache.org.
ISIS-785: moves logic for inferring generic return types from ActionAnnotationFacetFactory into SpecificationLoader, since will want to do something similar for the FacetedMethodParameter which represents a Collection<T>.

Currently the FacetedMethodPeer does not hold a TypeOfFacet (unlike the FacetedMethod underpinning a OneToManyAssociation, which does); this means that we don't know what the <T> is for an action "foo(Collection<T> xxx)", we simply see "foo(Collection xxx)"


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

Branch: refs/heads/maint-1.13.3
Commit: 449f56983bf21c1ffa7c0b434164c6448b3ba368
Parents: 5b18209
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 12:01:09 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 12:01:09 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetedMethod.java    | 10 ++++
 .../action/ActionAnnotationFacetFactory.java    | 53 ++---------------
 .../specloader/SpecificationLoader.java         | 62 ++++++++++++++++++++
 3 files changed, 77 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/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 ebaa21d..cae44d3 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
@@ -93,6 +93,16 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
         final List<FacetedMethodParameter> actionParams = Lists.newArrayList();
         for (final Class<?> parameterType : parameterTypes) {
             actionParams.add(new FacetedMethodParameter(declaringType, actionMethod, parameterType));
+
+            // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
+            if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isCollectionType(parameterType)) {
+
+            } else if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
+
+            } else {
+                continue;
+            }
+
         }
         return Collections.unmodifiableList(actionParams);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 1bb357e..7b58bac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -19,11 +19,7 @@
 
 package org.apache.isis.core.metamodel.facets.actions.action;
 
-import java.lang.reflect.GenericDeclaration;
 import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionInteraction;
@@ -51,7 +47,6 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetObjectOnly;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
@@ -90,6 +85,7 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.CollectionUtils;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
 import org.apache.isis.core.metamodel.util.EventUtil;
@@ -462,52 +458,13 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
     private TypeOfFacet inferFromGenericReturnType(
             final ProcessMethodContext processMethodContext) {
 
+        final Class<?> cls = processMethodContext.getCls();
         final Method method = processMethodContext.getMethod();
-        final FacetedMethod holder = processMethodContext.getFacetHolder();
-
-        final Type type = method.getGenericReturnType();
-        if (!(type instanceof ParameterizedType)) {
-            return null;
-        }
-
-        final ParameterizedType methodParameterizedType = (ParameterizedType) type;
-        final Type[] methodActualTypeArguments = methodParameterizedType.getActualTypeArguments();
-
-        if (methodActualTypeArguments.length == 0) {
-            return null;
-        }
+        final FacetHolder holder = processMethodContext.getFacetHolder();
 
-        final Object methodActualTypeArgument = methodActualTypeArguments[0];
-        if (methodActualTypeArgument instanceof Class) {
-            final Class<?> actualType = (Class<?>) methodActualTypeArgument;
-            return new TypeOfFacetInferredFromGenerics(actualType, holder, getSpecificationLoader());
-        }
+        final SpecificationLoader specificationLoader = getSpecificationLoader();
 
-        if (methodActualTypeArgument instanceof TypeVariable) {
-
-            final TypeVariable<?> methodTypeVariable = (TypeVariable<?>) methodActualTypeArgument;
-            final GenericDeclaration methodGenericClassDeclaration = methodTypeVariable.getGenericDeclaration();
-
-            // try to match up with the actual type argument of the generic superclass.
-            final Type genericSuperclass = processMethodContext.getCls().getGenericSuperclass();
-            if(genericSuperclass instanceof ParameterizedType) {
-                final ParameterizedType parameterizedTypeOfSuperclass = (ParameterizedType)genericSuperclass;
-                if(parameterizedTypeOfSuperclass.getRawType() == methodGenericClassDeclaration) {
-                    final Type[] genericSuperClassActualTypeArguments = parameterizedTypeOfSuperclass.getActualTypeArguments();
-                    // simplification: if there's just one, then use it.
-                    if(methodActualTypeArguments.length == 1) {
-                        final Type actualType = genericSuperClassActualTypeArguments[0];
-                        if(actualType instanceof Class) {
-                            // just being safe
-                            final Class<?> actualCls = (Class<?>) actualType;
-                            return new TypeOfFacetInferredFromGenerics(actualCls, holder, getSpecificationLoader());
-                        }
-                    }
-                }
-            }
-            // otherwise, what to do?
-        }
-        return null;
+        return specificationLoader.inferFromGenericReturnType(cls, method, holder);
     }
 
     // ///////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/449f5698/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index d5791d1..64e3251 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -16,6 +16,11 @@
  */
 package org.apache.isis.core.metamodel.specloader;
 
+import java.lang.reflect.GenericDeclaration;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -38,7 +43,10 @@ import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
@@ -517,6 +525,60 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         return objectSpecification;
     }
 
+
+    //endregion
+
+    //region > inferFromGenericReturnType
+
+    @Programmatic
+    public TypeOfFacet inferFromGenericReturnType(
+            final Class<?> cls,
+            final Method method,
+            final FacetHolder holder) {
+        final Type type = method.getGenericReturnType();
+        if (!(type instanceof ParameterizedType)) {
+            return null;
+        }
+
+        final ParameterizedType methodParameterizedType = (ParameterizedType) type;
+        final Type[] methodActualTypeArguments = methodParameterizedType.getActualTypeArguments();
+
+        if (methodActualTypeArguments.length == 0) {
+            return null;
+        }
+
+        final Object methodActualTypeArgument = methodActualTypeArguments[0];
+        if (methodActualTypeArgument instanceof Class) {
+            final Class<?> actualType = (Class<?>) methodActualTypeArgument;
+            return new TypeOfFacetInferredFromGenerics(actualType, holder, this);
+        }
+
+        if (methodActualTypeArgument instanceof TypeVariable) {
+
+            final TypeVariable<?> methodTypeVariable = (TypeVariable<?>) methodActualTypeArgument;
+            final GenericDeclaration methodGenericClassDeclaration = methodTypeVariable.getGenericDeclaration();
+
+            // try to match up with the actual type argument of the generic superclass.
+            final Type genericSuperclass = cls.getGenericSuperclass();
+            if(genericSuperclass instanceof ParameterizedType) {
+                final ParameterizedType parameterizedTypeOfSuperclass = (ParameterizedType)genericSuperclass;
+                if(parameterizedTypeOfSuperclass.getRawType() == methodGenericClassDeclaration) {
+                    final Type[] genericSuperClassActualTypeArguments = parameterizedTypeOfSuperclass.getActualTypeArguments();
+                    // simplification: if there's just one, then use it.
+                    if(methodActualTypeArguments.length == 1) {
+                        final Type actualType = genericSuperClassActualTypeArguments[0];
+                        if(actualType instanceof Class) {
+                            // just being safe
+                            final Class<?> actualCls = (Class<?>) actualType;
+                            return new TypeOfFacetInferredFromGenerics(actualCls, holder, this);
+                        }
+                    }
+                }
+            }
+            // otherwise, what to do?
+        }
+        return null;
+    }
     //endregion
 
 


[05/24] isis git commit: ISIS-1540: updates simpleapp to compile under Java 1.7

Posted by da...@apache.org.
ISIS-1540: updates simpleapp to compile under Java 1.7


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

Branch: refs/heads/maint-1.13.3
Commit: fbb0475a6db5931221ee0e39fcf0dbccf997239a
Parents: 781526d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 12 15:07:43 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 09:51:17 2017 +0000

----------------------------------------------------------------------
 .../application/manifest/DomainAppAppManifestWithFixtures.java | 2 +-
 .../simple/integtests/SimpleModuleIntegTestAbstract.java       | 2 +-
 example/application/simpleapp/pom.xml                          | 6 +++++-
 3 files changed, 7 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/fbb0475a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
index 756ff0e..0998455 100644
--- a/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
+++ b/example/application/simpleapp/application/src/main/java/domainapp/application/manifest/DomainAppAppManifestWithFixtures.java
@@ -39,7 +39,7 @@ public class DomainAppAppManifestWithFixtures extends DomainAppAppManifest {
      */
     @Override
     public List<Class<? extends FixtureScript>> getFixtures() {
-        return Lists.newArrayList(CreateSimpleObjects.class);
+        return (List)Lists.newArrayList(CreateSimpleObjects.class);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/fbb0475a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
index b56a6e8..c13db47 100644
--- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
+++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/SimpleModuleIntegTestAbstract.java
@@ -57,7 +57,7 @@ public abstract class SimpleModuleIntegTestAbstract extends IntegrationTestAbstr
                         }
 
                         @Override public List<Class<?>> getAdditionalServices() {
-                            return Lists.newArrayList(ModuleFixtureScriptsSpecificationProvider.class);
+                            return (List)Lists.newArrayList(ModuleFixtureScriptsSpecificationProvider.class);
                         }
                     })
 

http://git-wip-us.apache.org/repos/asf/isis/blob/fbb0475a/example/application/simpleapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/pom.xml b/example/application/simpleapp/pom.xml
index a61f369..d9f5b76 100644
--- a/example/application/simpleapp/pom.xml
+++ b/example/application/simpleapp/pom.xml
@@ -68,7 +68,7 @@
         <maven-jxr-plugin.version>2.4</maven-jxr-plugin.version>
         <maven-source-plugin.version>2.2.1</maven-source-plugin.version>
 
-        <mavenmixin-standard.version>0.0.2</mavenmixin-standard.version>
+        <mavenmixin-standard.version>0.0.3</mavenmixin-standard.version>
         <maven-clean-plugin.version>2.5</maven-clean-plugin.version>
         <maven-project-info-reports-plugin.version>2.9</maven-project-info-reports-plugin.version>
         <maven-resources-plugin.version>2.6</maven-resources-plugin.version>
@@ -98,6 +98,10 @@
         <mavendeps-isisintellij.version>0.0.1</mavendeps-isisintellij.version>
         <mavendeps-isiswebapp.version>0.0.1</mavendeps-isiswebapp.version>
 
+        <compiler-plugin.source>1.7</compiler-plugin.source>
+        <compiler-plugin.target>1.7</compiler-plugin.target>
+        <compiler-plugin.compilerArgument></compiler-plugin.compilerArgument>
+
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     </properties>


[11/24] isis git commit: ISIS-785: ObjectAction{Contributee/MixedIn} now create either OneToOneAction{ContributeeMixedIn} or OneToManyAction{Contributee/MixedIn} as appropriate...

Posted by da...@apache.org.
ISIS-785: ObjectAction{Contributee/MixedIn} now create either OneToOneAction{ContributeeMixedIn} or OneToManyAction{Contributee/MixedIn} as appropriate...

.. using similar logic to that in ObjectActionDefault.


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

Branch: refs/heads/maint-1.13.3
Commit: 4639eab23db11cc858f0722694a88bc84eee20e7
Parents: 30d23e0
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 11:28:33 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 11:28:33 2017 +0000

----------------------------------------------------------------------
 .../specimpl/ObjectActionContributee.java       | 20 +++++++++++++++-----
 .../specimpl/ObjectActionDefault.java           | 16 ++++++----------
 .../specimpl/ObjectActionMixedIn.java           | 19 +++++++++++++++----
 3 files changed, 36 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4639eab2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
index 1e74b24..0d3fc46 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -32,6 +32,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
@@ -111,8 +113,9 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
         }
 
         final List<ObjectActionParameter> serviceParameters = serviceAction.getParameters();
-        final List<ObjectActionParameter> contributeeParameters = Lists.newArrayList();
+        final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
 
+        final List<ObjectActionParameter> contributeeParameters = Lists.newArrayList();
         int contributeeParamNum = 0;
 
         for (int serviceParamNum = 0; serviceParamNum < serviceParameters.size(); serviceParamNum++ ) {
@@ -121,13 +124,20 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
                 continue;
             }
 
+            final TypedHolder paramPeer = paramPeers.get(serviceParamNum);
+            final ObjectSpecification specification = ObjectMemberAbstract
+                    .getSpecification(getSpecificationLoader(), paramPeer.getType());
+
             final ObjectActionParameterAbstract serviceParameter =
                     (ObjectActionParameterAbstract) serviceParameters.get(serviceParamNum);
 
-            final ObjectActionParameterContributee contributedParam;
-            contributedParam = new OneToOneActionParameterContributee(
-                    getServiceAdapter(), serviceParameter,
-                    contributeeParamNum, this);
+            final ObjectActionParameterContributee contributedParam =
+                    specification.isNotCollection()
+                            ? new OneToOneActionParameterContributee(
+                                    getServiceAdapter(), serviceParameter, contributeeParamNum, this)
+                            : new OneToManyActionParameterContributee(
+                                    getServiceAdapter(), serviceParameter, contributeeParamNum, this);
+
             contributeeParameters.add(contributedParam);
 
             contributeeParamNum++;

http://git-wip-us.apache.org/repos/asf/isis/blob/4639eab2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index edae87e..79258f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -191,23 +191,19 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
             return parameters;
         }
         final int parameterCount = getParameterCount();
-        final List<ObjectActionParameter> parameters = Lists.newArrayList();
         final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
 
-        for (int i = 0; i < parameterCount; i++) {
-            final TypedHolder paramPeer = paramPeers.get(i);
+        final List<ObjectActionParameter> parameters = Lists.newArrayList();
+        for (int paramNum = 0; paramNum < parameterCount; paramNum++) {
+            final TypedHolder paramPeer = paramPeers.get(paramNum);
 
-            @SuppressWarnings("unused")
             final ObjectSpecification specification = ObjectMemberAbstract
                     .getSpecification(getSpecificationLoader(), paramPeer.getType());
 
             // previously we threw an exception here if the specification represented a collection.  No longer!
-            final ObjectActionParameter parameter;
-            if(specification.isNotCollection()) {
-                parameter = new OneToOneActionParameterDefault(i, this, paramPeer);
-            } else {
-                parameter = new OneToManyActionParameterDefault(i, this, paramPeer);
-            }
+            final ObjectActionParameter parameter = specification.isNotCollection() ?
+                    new OneToOneActionParameterDefault(paramNum, this, paramPeer) :
+                    new OneToManyActionParameterDefault(paramNum, this, paramPeer);
 
             parameters.add(parameter);
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/4639eab2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 752ffaa..8b9e963 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -30,6 +30,8 @@ import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
@@ -128,13 +130,22 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
             return parameters;
         }
         final List<ObjectActionParameter> mixinActionParameters = mixinAction.getParameters();
+        final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
+
         final List<ObjectActionParameter> mixedInParameters = Lists.newArrayList();
 
-        for (ObjectActionParameter mixinActionParameter : mixinActionParameters) {
+        for(int paramNum = 0; paramNum < mixinActionParameters.size(); paramNum++) {
+
             final ObjectActionParameterAbstract mixinParameter =
-                    (ObjectActionParameterAbstract) mixinActionParameter;
-            final ObjectActionParameterMixedIn mixedInParameter;
-            mixedInParameter = new OneToOneActionParameterMixedIn(mixinParameter, this);
+                    (ObjectActionParameterAbstract) mixinActionParameters.get(paramNum);
+
+            final TypedHolder paramPeer = paramPeers.get(paramNum);
+            final ObjectSpecification specification = ObjectMemberAbstract
+                    .getSpecification(getSpecificationLoader(), paramPeer.getType());
+
+            final ObjectActionParameterMixedIn mixedInParameter = specification.isNotCollection()
+                    ? new OneToOneActionParameterMixedIn(mixinParameter, this)
+                    : new OneToManyActionParameterMixedIn(mixinParameter, this);
             mixedInParameters.add(mixedInParameter);
         }
         return mixedInParameters;


[08/24] isis git commit: ISIS-785: introduces OneToManyActionParameter interface and OneToManyActionParameterDefault (WIP), and refactors the OTOActionParameter{MixedIn/Contributee} so that they no longer inherit from OTOActionParameterDefault.

Posted by da...@apache.org.
ISIS-785: introduces OneToManyActionParameter interface and OneToManyActionParameterDefault (WIP), and refactors the OTOActionParameter{MixedIn/Contributee} so that they no longer inherit from OTOActionParameterDefault.


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

Branch: refs/heads/maint-1.13.3
Commit: 74750c63cb28002526faf6284b7fc3bc8cf68a67
Parents: 12c4726
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 11:09:44 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 11:09:44 2017 +0000

----------------------------------------------------------------------
 .../metamodel/spec/ObjectSpecification.java     |  2 +-
 .../spec/feature/OneToManyActionParameter.java  | 28 +++++++++++++++
 .../specimpl/ObjectActionDefault.java           | 12 +++++--
 .../specimpl/ObjectActionParameterAbstract.java | 10 ++++++
 .../OneToManyActionParameterDefault.java        | 38 ++++++++++++++++++++
 .../OneToOneActionParameterContributee.java     |  5 ++-
 .../OneToOneActionParameterMixedIn.java         |  6 +++-
 7 files changed, 95 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 2869f0e..8491662 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -265,7 +265,7 @@ public interface ObjectSpecification extends Specification, ObjectActionContaine
      * In effect, means that it doesn't have the {@link CollectionFacet}, and
      * therefore will return NOT {@link #isParentedOrFreeCollection()}
      * 
-     * @see #isCollection().
+     * @see #isParentedOrFreeCollection().
      */
     boolean isNotCollection();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyActionParameter.java
new file mode 100644
index 0000000..c3a3d99
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/OneToManyActionParameter.java
@@ -0,0 +1,28 @@
+/*
+ *  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.spec.feature;
+
+/**
+ * Modelled after {@link OneToOneAssociation} as a subinterface of
+ * {@link ObjectAssociation}.
+ */
+public interface OneToManyActionParameter extends ObjectActionParameter, OneToManyFeature {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index 6e23f71..edae87e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -196,13 +196,19 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
 
         for (int i = 0; i < parameterCount; i++) {
             final TypedHolder paramPeer = paramPeers.get(i);
+
+            @SuppressWarnings("unused")
             final ObjectSpecification specification = ObjectMemberAbstract
                     .getSpecification(getSpecificationLoader(), paramPeer.getType());
 
-            if (!specification.isNotCollection()) {
-                throw new UnknownTypeException("collections not supported as parameters: " + getIdentifier());
+            // previously we threw an exception here if the specification represented a collection.  No longer!
+            final ObjectActionParameter parameter;
+            if(specification.isNotCollection()) {
+                parameter = new OneToOneActionParameterDefault(i, this, paramPeer);
+            } else {
+                parameter = new OneToManyActionParameterDefault(i, this, paramPeer);
             }
-            final ObjectActionParameter parameter = new OneToOneActionParameterDefault(i, this, paramPeer);
+
             parameters.add(parameter);
         }
         return parameters;

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 2f4d704..1aaebff 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -42,8 +42,10 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.choices.ChoicesFacetFromBoundedAbstract;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
@@ -422,6 +424,14 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             
             final ObjectSpecification choiceWrappedSpec = specificationLookup.loadSpecification(choiceWrappedClass);
             final ObjectSpecification paramWrappedSpec = specificationLookup.loadSpecification(paramWrappedClass);
+
+            // TODO: remove this eventually... need to introduce OneToManyParameter
+            if(paramWrappedSpec.isParentedOrFreeCollection()) {
+                final CollectionFacet collectionFacet = paramWrappedSpec.getFacet(CollectionFacet.class);
+                final TypeOfFacet typeOfFacet = collectionFacet.getTypeOfFacet();
+                final ObjectSpecification collectionOfParamSpec = typeOfFacet.valueSpec();
+                System.out.println(collectionOfParamSpec.getFullIdentifier());
+            }
             
             if (!choiceWrappedSpec.isOfType(paramWrappedSpec)) {
                 throw new DomainModelException("Type incompatible with parameter type; expected " + paramSpec.getFullIdentifier() + ", but was " + choiceClass.getName());

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/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
new file mode 100644
index 0000000..890ed2a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterDefault.java
@@ -0,0 +1,38 @@
+/*
+ *  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.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
+
+public class OneToManyActionParameterDefault extends ObjectActionParameterAbstract implements OneToManyActionParameter {
+
+    public OneToManyActionParameterDefault(
+            final int index,
+            final ObjectActionDefault actionImpl,
+            final TypedHolder peer) {
+        super(index, actionImpl, peer);
+    }
+
+    @Override
+    public CollectionSemantics getCollectionSemantics() {
+        throw new RuntimeException("TODO: not yet implemented");
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index 980147b..415abef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -22,8 +22,11 @@ import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
-public class OneToOneActionParameterContributee extends OneToOneActionParameterDefault implements ObjectActionParameterContributee{
+public class OneToOneActionParameterContributee
+        extends ObjectActionParameterAbstract
+        implements ObjectActionParameterContributee, OneToOneActionParameter {
 
     private final ObjectAdapter serviceAdapter;
     private final ObjectActionParameter serviceActionParameter;

http://git-wip-us.apache.org/repos/asf/isis/blob/74750c63/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index 7a16b20..b17e89d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -20,8 +20,12 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
-public class OneToOneActionParameterMixedIn extends OneToOneActionParameterDefault implements ObjectActionParameterMixedIn {
+public class OneToOneActionParameterMixedIn
+        extends ObjectActionParameterAbstract
+        implements ObjectActionParameterMixedIn,
+                   OneToOneActionParameter {
 
     private final ObjectActionParameter mixinParameter;
     private final ObjectActionMixedIn mixedInAction;


[15/24] isis git commit: ISIS-785: extends FacetedMethod#getParameters to also add the TypeOfFacet to the FacetedMethodParameter if it represents a parameter of type Collection. Calls new SpecificationLoader#inferFromGenericParamType

Posted by da...@apache.org.
ISIS-785: extends FacetedMethod#getParameters to also add the TypeOfFacet to the FacetedMethodParameter if it represents a parameter of type Collection<T>.  Calls new SpecificationLoader#inferFromGenericParamType

Along the way, added SpecificationLoader to FacetedMethod#createForAction (so can delegate across to SpecificationLoader#infer... methods).


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

Branch: refs/heads/maint-1.13.3
Commit: b993efe4628552d7f974d5dbf34eaff1e263db4b
Parents: 31d0a72
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 12:44:43 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 12:44:43 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetedMethod.java    | 50 +++++++++++++++-----
 .../action/ActionAnnotationFacetFactory.java    | 18 +++----
 .../specloader/SpecificationLoader.java         | 42 ++++++++++++++--
 .../specimpl/FacetedMethodsBuilder.java         |  2 +-
 .../actions/ActionMethodsFacetFactoryTest.java  | 15 ++++--
 ...tationFacetFactoryTest_actionInvocation.java |  8 ++--
 ...nLayoutAnnotationFacetFactoryJunit4Test.java | 18 +++----
 ...erivedFromDomainServiceFacetFactoryTest.java | 10 ++--
 ...erivedFromDomainServiceFacetFactoryTest.java | 10 ++--
 9 files changed, 120 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/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 cae44d3..e4b165d 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
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.List;
 
@@ -27,8 +28,11 @@ import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.commons.lang.StringExtensions;
+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.specloader.SpecificationLoader;
 
 /**
  * non-final only so it can be mocked if need be.
@@ -66,10 +70,14 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
     /**
      * Principally for testing purposes.
      */
-    public static FacetedMethod createForAction(final Class<?> declaringType, final String actionName, final Class<?>... parameterTypes) {
+    public static FacetedMethod createForAction(
+            final Class<?> declaringType,
+            final String actionName,
+            final SpecificationLoader specificationLoader,
+            final Class<?>... parameterTypes) {
         try {
             final Method method = declaringType.getMethod(actionName, parameterTypes);
-            return FacetedMethod.createForAction(declaringType, method);
+            return FacetedMethod.createForAction(declaringType, method, specificationLoader);
         } catch (final SecurityException | NoSuchMethodException e) {
             throw new RuntimeException(e);
         }
@@ -84,25 +92,43 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
         return new FacetedMethod(FeatureType.COLLECTION, declaringType, method, null, emptyParameterList());
     }
 
-    public static FacetedMethod createForAction(final Class<?> declaringType, final Method method) {
-        return new FacetedMethod(FeatureType.ACTION, declaringType, method, method.getReturnType(), getParameters(declaringType, method));
+    public static FacetedMethod createForAction(
+            final Class<?> declaringType,
+            final Method method,
+            final SpecificationLoader specificationLoader) {
+        return new FacetedMethod(FeatureType.ACTION, declaringType, method, method.getReturnType(), getParameters(declaringType, method,
+                specificationLoader));
     }
 
-    private static List<FacetedMethodParameter> getParameters(final Class<?> declaringType, final Method actionMethod) {
+    private static List<FacetedMethodParameter> getParameters(
+            final Class<?> declaringType,
+            final Method actionMethod,
+            final SpecificationLoader specificationLoader) {
+
         final Class<?>[] parameterTypes = actionMethod.getParameterTypes();
+        final Type[] genericParameterTypes = actionMethod.getGenericParameterTypes();
         final List<FacetedMethodParameter> actionParams = Lists.newArrayList();
-        for (final Class<?> parameterType : parameterTypes) {
-            actionParams.add(new FacetedMethodParameter(declaringType, actionMethod, parameterType));
 
-            // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
-            if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isCollectionType(parameterType)) {
+        for (int paramNum = 0; paramNum < parameterTypes.length; paramNum++) {
+
+            final Class<?> parameterType = parameterTypes[paramNum];
+            final Type genericParameterType = genericParameterTypes[paramNum];
 
-            } else if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
+            final FacetedMethodParameter fmp = new FacetedMethodParameter(declaringType, actionMethod, parameterType);
+            actionParams.add(fmp);
 
-            } else {
-                continue;
+            // this is based on similar logic to ActionAnnotationFacetFactory#processTypeOf
+            TypeOfFacet typeOfFacet = specificationLoader.inferFromGenericParamType(fmp, parameterType, genericParameterType);
+
+            if(typeOfFacet == null ) {
+                if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
+                    typeOfFacet = specificationLoader.inferFromArrayType(fmp, parameterType);
+                }
             }
 
+            FacetUtil.addFacet(typeOfFacet);
+            continue;
+
         }
         return Collections.unmodifiableList(actionParams);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 4912ba6..fdb6fb3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -418,37 +418,37 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
             return;
         }
 
-        TypeOfFacet facet;
+        TypeOfFacet typeOfFacet = null;
 
         // check for deprecated @TypeOf
         final TypeOf annotation = Annotations.getAnnotation(method, TypeOf.class);
-        facet = typeOfValidator.flagIfPresent(
+        typeOfFacet = typeOfValidator.flagIfPresent(
                 TypeOfFacetOnActionForTypeOfAnnotation.create(annotation, getSpecificationLoader(), holder), processMethodContext);
 
         // check for @Action(typeOf=...)
-        if(facet == null) {
+        if(typeOfFacet == null) {
             final Action action = Annotations.getAnnotation(method, Action.class);
             if (action != null) {
                 final Class<?> typeOf = action.typeOf();
                 if(typeOf != null && typeOf != Object.class) {
-                    facet = new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder);
+                    typeOfFacet = new TypeOfFacetForActionAnnotation(typeOf, getSpecificationLoader(), holder);
                 }
             }
         }
 
         // infer from return type
-        if(facet == null) {
+        if(typeOfFacet == null) {
             final Class<?> returnType = method.getReturnType();
-            facet = getSpecificationLoader().inferForArray(holder, returnType);
+            typeOfFacet = getSpecificationLoader().inferFromArrayType(holder, returnType);
         }
 
         // infer from generic return type
-        if(facet == null) {
+        if(typeOfFacet == null) {
             final Class<?> cls = processMethodContext.getCls();
-            facet = getSpecificationLoader().inferFromGenericReturnType(cls, method, holder);
+            typeOfFacet = getSpecificationLoader().inferFromGenericReturnType(cls, method, holder);
         }
 
-        FacetUtil.addFacet(facet);
+        FacetUtil.addFacet(typeOfFacet);
     }
 
     // ///////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index caf059b..757ad2d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -45,7 +45,6 @@ import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
@@ -530,13 +529,44 @@ public class SpecificationLoader implements ApplicationScopedComponent {
 
     //endregion
 
-    //region > inferFromGenericReturnType
+    //region > inferFromGenericParamType, inferFromGenericReturnType, inferFromArrayType
+
+    @Programmatic
+    public TypeOfFacet inferFromGenericParamType(
+            final FacetHolder holder,
+            final Class<?> parameterType,
+            final Type genericParameterType) {
+
+        if(!CollectionUtils.isCollectionType(parameterType)) {
+            return null;
+        }
+
+        if(genericParameterType instanceof ParameterizedType) {
+            System.out.println(genericParameterType);
+            final ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;
+            final Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
+            if(actualTypeArguments.length == 1) {
+                final Type actualTypeArgument = actualTypeArguments[0];
+                if(actualTypeArgument instanceof Class) {
+                    final Class<?> actualType = (Class<?>) actualTypeArgument;
+                    return new TypeOfFacetInferredFromGenerics(actualType, holder, this);
+                }
+            }
+        }
+        return null;
+    }
 
     @Programmatic
     public TypeOfFacet inferFromGenericReturnType(
             final Class<?> cls,
             final Method method,
             final FacetHolder holder) {
+
+        final Class<?> methodReturnType = method.getReturnType();
+        if (!CollectionUtils.isCollectionType(methodReturnType)) {
+            return null;
+        }
+
         final Type type = method.getGenericReturnType();
         if (!(type instanceof ParameterizedType)) {
             return null;
@@ -583,15 +613,19 @@ public class SpecificationLoader implements ApplicationScopedComponent {
     }
 
     @Programmatic
-    public TypeOfFacet inferForArray(
-            final FacetedMethod holder,
+    public TypeOfFacet inferFromArrayType(
+            final FacetHolder holder,
             final Class<?> type) {
+        if(!org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(type)) {
+            return null;
+        }
         if (type.isArray()) {
             final Class<?> componentType = type.getComponentType();
             return new TypeOfFacetInferredFromArray(componentType, holder, this);
         }
         return null;
     }
+
     //endregion
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 805ee62..4c513d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -483,7 +483,7 @@ public class FacetedMethodsBuilder {
             return null;
         }
 
-        final FacetedMethod action = FacetedMethod.createForAction(introspectedClass, actionMethod);
+        final FacetedMethod action = FacetedMethod.createForAction(introspectedClass, actionMethod, getSpecificationLoader());
 
         // process facets on the action & parameters
         getFacetProcessor().process(introspectedClass, actionMethod, methodRemover, action, FeatureType.ACTION, metadataProperties);

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index a4df50a..61b9a3a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -606,7 +606,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         final Method default0Method = findMethod(Customer.class, "default0SomeAction", new Class[] {});
         final Method default1Method = findMethod(Customer.class, "default1SomeAction", new Class[]{});
 
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod,
+                mockSpecificationLoader);
 
         facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetHolderWithParms));
 
@@ -662,7 +663,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         final Method choices1Method = findMethod(Customer.class, "choices1SomeAction", new Class[] {});
         final Method choices2Method = findMethod(Customer.class, "choices2SomeAction", new Class[] {});
         
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod,
+                mockSpecificationLoader);
 
         facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetHolderWithParms));
 
@@ -715,7 +717,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class });
         final Method autoComplete0Method = findMethod(Customer.class, "autoComplete0SomeAction", new Class[] {String.class});
 
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod,
+                mockSpecificationLoader);
 
         facetFactory.process(new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetHolderWithParms));
 
@@ -764,7 +767,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         }
 
         final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class });
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod,
+                mockSpecificationLoader);
 
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetHolderWithParms);
         facetFactory.process(processMethodContext);
@@ -813,7 +817,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
         }
 
         final Method actionMethod = findMethod(Customer.class, "someAction", new Class[] { int.class, long.class });
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(Customer.class, actionMethod,
+                mockSpecificationLoader);
 
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(Customer.class, null, null, actionMethod, methodRemover, facetHolderWithParms);
         facetFactory.process(processMethodContext);

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
index 7965f99..9b17f0f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_actionInvocation.java
@@ -45,7 +45,7 @@ public class ActionAnnotationFacetFactoryTest_actionInvocation extends AbstractF
 
     public void setUp() throws Exception {
         super.setUp();
-        this.facetFactory =  new ActionAnnotationFacetFactory();;
+        this.facetFactory =  new ActionAnnotationFacetFactory();
 
         facetFactory.setServicesInjector(stubServicesInjector);
 
@@ -144,7 +144,8 @@ public class ActionAnnotationFacetFactoryTest_actionInvocation extends AbstractF
 
         final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
 
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod,
+                mockSpecificationLoader);
 
         facetFactory.processInvocation(new ProcessMethodContext(CustomerEx.class, null, null, actionMethod, methodRemover, facetHolderWithParms));
 
@@ -200,7 +201,8 @@ public class ActionAnnotationFacetFactoryTest_actionInvocation extends AbstractF
         final Method choices1Method = findMethod(CustomerEx.class, "choices1SomeAction", new Class[] {});
         final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] { int.class, long.class });
 
-        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
+        final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod,
+                mockSpecificationLoader);
 
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(CustomerEx.class, null, null, actionMethod, methodRemover, facetHolderWithParms);
         facetFactory.processInvocation(processMethodContext);

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
index d7860a2..07e3ba4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
@@ -78,7 +78,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -112,7 +112,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -147,7 +147,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -185,7 +185,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -221,7 +221,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -258,7 +258,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -299,7 +299,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -337,7 +337,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+            facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -374,7 +374,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
 
             expectNoMethodsRemoved();
 
-            facetedMethod = FacetedMethod.createForAction(Customer.class, "name");
+            facetedMethod = FacetedMethod.createForAction(Customer.class, "name", mockSpecificationLoader);
 
             // when
             facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
index 8a7bd45..0ab88ba 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
@@ -70,7 +70,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -106,7 +106,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -142,7 +142,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -175,7 +175,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -206,7 +206,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));

http://git-wip-us.apache.org/repos/asf/isis/blob/b993efe4/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
index 0036429..cc504a9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
@@ -70,7 +70,7 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest exten
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -106,7 +106,7 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest exten
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -142,7 +142,7 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest exten
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -175,7 +175,7 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest exten
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
@@ -206,7 +206,7 @@ public class NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest exten
 
         expectNoMethodsRemoved();
 
-        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name", mockSpecificationLoader);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));


[09/24] isis git commit: ISIS-785: introduces ObjectActionParameter{Contributee/Mixin}Abstract, thus moving contributee/mixin above the OneToOne stuff in the inheritance hierarchy.

Posted by da...@apache.org.
ISIS-785: introduces ObjectActionParameter{Contributee/Mixin}Abstract, thus moving contributee/mixin above the OneToOne stuff in the inheritance hierarchy.

This will let these abstract classes be reused for the OneToManyActionParameter implementations.


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

Branch: refs/heads/maint-1.13.3
Commit: d2847d59c5bab09458f89d189f7048802f74104f
Parents: 74750c6
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 11:13:48 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 11:13:48 2017 +0000

----------------------------------------------------------------------
 ...bjectActionParameterContributeeAbstract.java | 70 +++++++++++++++++++
 .../ObjectActionParameterMixedInAbstract.java   | 72 ++++++++++++++++++++
 .../OneToOneActionParameterContributee.java     | 42 +-----------
 .../OneToOneActionParameterMixedIn.java         | 48 +------------
 4 files changed, 148 insertions(+), 84 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d2847d59/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
new file mode 100644
index 0000000..448c8aa
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
@@ -0,0 +1,70 @@
+/**
+ *  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.specloader.specimpl;
+
+import java.util.List;
+
+import org.apache.isis.core.commons.lang.ListExtensions;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+
+public abstract class ObjectActionParameterContributeeAbstract
+        extends ObjectActionParameterAbstract
+        implements ObjectActionParameterContributee {
+
+    private final ObjectAdapter serviceAdapter;
+    private final ObjectActionParameter serviceActionParameter;
+    private final ObjectActionContributee contributeeAction;
+
+    public ObjectActionParameterContributeeAbstract(
+            final ObjectAdapter serviceAdapter,
+            final ObjectActionParameterAbstract serviceActionParameter,
+            final int contributeeParamNumber,
+            final ObjectActionContributee contributeeAction) {
+        super(contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
+        this.serviceAdapter = serviceAdapter;
+        this.serviceActionParameter = serviceActionParameter;
+        this.contributeeAction = contributeeAction;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter adapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg,
+                interactionInitiatedBy);
+    }
+
+    protected ObjectAdapter targetForDefaultOrChoices(final ObjectAdapter adapter) {
+        return serviceAdapter;
+    }
+
+    protected List<ObjectAdapter> argsForDefaultOrChoices(
+            final ObjectAdapter contributee,
+            final List<ObjectAdapter> argumentsIfAvailable) {
+
+        final List<ObjectAdapter> suppliedArgs = ListExtensions.mutableCopy(argumentsIfAvailable);
+        
+        final int contributeeParam = contributeeAction.getContributeeParam();
+        ListExtensions.insert(suppliedArgs, contributeeParam, contributee);
+        
+        return suppliedArgs;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d2847d59/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
new file mode 100644
index 0000000..f8516cd
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
@@ -0,0 +1,72 @@
+/**
+ *  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.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+
+public abstract class ObjectActionParameterMixedInAbstract
+        extends ObjectActionParameterAbstract
+        implements ObjectActionParameterMixedIn {
+
+    private final ObjectActionParameter mixinParameter;
+    private final ObjectActionMixedIn mixedInAction;
+
+    public ObjectActionParameterMixedInAbstract(
+            final ObjectActionParameterAbstract mixinParameter,
+            final ObjectActionMixedIn mixedInAction) {
+        super(mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
+        this.mixinParameter = mixinParameter;
+        this.mixedInAction = mixedInAction;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter mixedInAdapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return mixinParameter.getAutoComplete(
+                mixinAdapterFor(mixedInAdapter), searchArg,
+                interactionInitiatedBy);
+    }
+
+    protected ObjectAdapter targetForDefaultOrChoices(final ObjectAdapter mixedInAdapter) {
+        return mixinAdapterFor(mixedInAdapter);
+    }
+
+    private ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
+        return mixedInAction.mixinAdapterFor(mixedInAdapter);
+    }
+
+    @Override
+    public ActionArgValidityContext createProposedArgumentInteractionContext(
+            final ObjectAdapter mixedInAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final int position,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final ObjectAdapter targetObject = mixinAdapterFor(mixedInAdapter);
+
+        final ActionArgValidityContext actionArgValidityContext = new ActionArgValidityContext(
+                targetObject, mixedInAction.mixinAction, getIdentifier(), proposedArguments, position, interactionInitiatedBy);
+        actionArgValidityContext.setMixedIn(mixedInAdapter);
+        return actionArgValidityContext;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d2847d59/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index 415abef..6250086 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -16,56 +16,20 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import java.util.List;
-
-import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterContributee
-        extends ObjectActionParameterAbstract
-        implements ObjectActionParameterContributee, OneToOneActionParameter {
-
-    private final ObjectAdapter serviceAdapter;
-    private final ObjectActionParameter serviceActionParameter;
-    private final ObjectActionContributee contributeeAction;
+        extends ObjectActionParameterContributeeAbstract
+        implements OneToOneActionParameter {
 
     public OneToOneActionParameterContributee(
             final ObjectAdapter serviceAdapter,
             final ObjectActionParameterAbstract serviceActionParameter,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
-        super(contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
-        this.serviceAdapter = serviceAdapter;
-        this.serviceActionParameter = serviceActionParameter;
-        this.contributeeAction = contributeeAction;
+        super(serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
     }
 
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter adapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg,
-                interactionInitiatedBy);
-    }
 
-    protected ObjectAdapter targetForDefaultOrChoices(final ObjectAdapter adapter) {
-        return serviceAdapter;
-    }
-
-    protected List<ObjectAdapter> argsForDefaultOrChoices(
-            final ObjectAdapter contributee,
-            final List<ObjectAdapter> argumentsIfAvailable) {
-
-        final List<ObjectAdapter> suppliedArgs = ListExtensions.mutableCopy(argumentsIfAvailable);
-        
-        final int contributeeParam = contributeeAction.getContributeeParam();
-        ListExtensions.insert(suppliedArgs, contributeeParam, contributee);
-        
-        return suppliedArgs;
-    }
-    
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d2847d59/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index b17e89d..5842361 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -16,59 +16,17 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterMixedIn
-        extends ObjectActionParameterAbstract
-        implements ObjectActionParameterMixedIn,
-                   OneToOneActionParameter {
-
-    private final ObjectActionParameter mixinParameter;
-    private final ObjectActionMixedIn mixedInAction;
+        extends ObjectActionParameterMixedInAbstract
+        implements OneToOneActionParameter {
 
     public OneToOneActionParameterMixedIn(
             final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
-        super(mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
-        this.mixinParameter = mixinParameter;
-        this.mixedInAction = mixedInAction;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter mixedInAdapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinParameter.getAutoComplete(
-                mixinAdapterFor(mixedInAdapter), searchArg,
-                interactionInitiatedBy);
-    }
-
-    protected ObjectAdapter targetForDefaultOrChoices(final ObjectAdapter mixedInAdapter) {
-        return mixinAdapterFor(mixedInAdapter);
+        super(mixinParameter, mixedInAction);
     }
 
-    private ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
-        return mixedInAction.mixinAdapterFor(mixedInAdapter);
-    }
-
-    @Override
-    public ActionArgValidityContext createProposedArgumentInteractionContext(
-            final ObjectAdapter mixedInAdapter,
-            final ObjectAdapter[] proposedArguments,
-            final int position,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final ObjectAdapter targetObject = mixinAdapterFor(mixedInAdapter);
-
-        final ActionArgValidityContext actionArgValidityContext = new ActionArgValidityContext(
-                targetObject, mixedInAction.mixinAction, getIdentifier(), proposedArguments, position, interactionInitiatedBy);
-        actionArgValidityContext.setMixedIn(mixedInAdapter);
-        return actionArgValidityContext;
-    }
 
 }


[19/24] isis git commit: ISIS-785: cleans up some redundant imports is all

Posted by da...@apache.org.
ISIS-785: cleans up some redundant imports is all


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

Branch: refs/heads/maint-1.13.3
Commit: bc9320e9fb45bcfeebb06fb01b507dd696f8013f
Parents: d6d0c19
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 14:42:21 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 14:42:21 2017 +0000

----------------------------------------------------------------------
 .../scalars/ScalarPanelTextFieldParseableAbstract.java           | 3 ---
 .../viewer/wicket/ui/components/scalars/TextFieldAbstract.java   | 4 ----
 .../ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java    | 1 -
 3 files changed, 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bc9320e9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
index 103dcc8..703a3f8 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
@@ -22,9 +22,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.Model;
-import org.apache.wicket.validation.IValidatable;
-import org.apache.wicket.validation.IValidator;
-import org.apache.wicket.validation.ValidationError;
 import org.apache.wicket.validation.validator.StringValidator;
 
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;

http://git-wip-us.apache.org/repos/asf/isis/blob/bc9320e9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldAbstract.java
index e122037..fefe769 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/TextFieldAbstract.java
@@ -16,13 +16,9 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
-import java.math.BigDecimal;
-
 import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.validation.IValidatable;
-import org.apache.wicket.validation.IValidator;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/bc9320e9/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
index 1827cf4..8e3c379 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
@@ -25,7 +25,6 @@ import java.sql.Timestamp;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldDatePickerAbstract;
 


[03/24] isis git commit: ISIS-1565: fixes wicket UI so that DROPDOWN position for mixin actions (as per @MemberOrder) continues to be honoured if it is not overridden in layout.xml

Posted by da...@apache.org.
ISIS-1565: fixes wicket UI so that DROPDOWN position for mixin actions (as per @MemberOrder) continues to be honoured if it is not overridden in layout.xml


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

Branch: refs/heads/maint-1.13.3
Commit: 4027a0b6e1fd6883224aeab4ec36d18247760638
Parents: ec12417
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Jan 9 23:53:04 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 09:51:00 2017 +0000

----------------------------------------------------------------------
 .../metamodel/facets/actions/layout/ActionLayoutFacetFactory.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4027a0b6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index 5803825..6b2251e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -188,7 +188,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
         // position
         ActionPositionFacet actionPositionFacet = ActionPositionFacetOnActionFromLayoutProperties.create(properties, holder);
-        if(actionPositionFacet == null) {
+        if(actionPositionFacet == null && ! holder.containsDoOpFacet(ActionPositionFacet.class)) {
             actionPositionFacet = new ActionPositionFacetFallback(holder);
         }
         FacetUtil.addFacet(actionPositionFacet);


[16/24] isis git commit: ISIS-785: now sets the type on the FactedMethodParameter peer object when represents collection, meaning that ...

Posted by da...@apache.org.
ISIS-785: now sets the type on the FactedMethodParameter peer object when represents collection, meaning that ...

... an action "foo(Collection<Customer> cust)" is compatible with supporting method "List<Customer> choices0Foo()"

Still WIP ... at this point, fails when attempt to invoke the action, passing an object rather than a collection of objects.


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

Branch: refs/heads/maint-1.13.3
Commit: 8d807129115c82fc172252fd1cf8776c44dbdc59
Parents: b993efe
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 13:22:49 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 13:22:49 2017 +0000

----------------------------------------------------------------------
 .../isis/core/metamodel/facets/FacetedMethod.java |  7 +++++--
 .../isis/core/metamodel/facets/TypedHolder.java   |  4 ++--
 .../core/metamodel/facets/TypedHolderDefault.java |  2 +-
 .../specimpl/ObjectActionParameterAbstract.java   | 18 ++++++------------
 .../GivenAuditableAnnotationFacetFactoryTest.java |  7 +++++--
 5 files changed, 19 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8d807129/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 e4b165d..e59a3e4 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
@@ -126,8 +126,11 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
                 }
             }
 
-            FacetUtil.addFacet(typeOfFacet);
-            continue;
+            // copy over (corresponds to similar code for OneToManyAssociation in FacetMethodsBuilder).
+            if(typeOfFacet != null ) {
+                FacetUtil.addFacet(typeOfFacet);
+                fmp.setType(typeOfFacet.value());
+            }
 
         }
         return Collections.unmodifiableList(actionParams);

http://git-wip-us.apache.org/repos/asf/isis/blob/8d807129/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
index a26963c..d1a9868 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
@@ -36,8 +36,8 @@ public interface TypedHolder extends FacetHolder {
     /**
      * The type of a {@link FeatureType#PROPERTY property}, the referenced type
      * of a {@link FeatureType#COLLECTION collection}, the return type of an
-     * {@link FeatureType#ACTION action} and the type of a
-     * {@link FeatureType#ACTION_PARAMETER action parameter}.
+     * {@link FeatureType#ACTION action} and for {@link FeatureType#ACTION_PARAMETER action parameter}s
+     * either the scalar type or the inferred generic type if a collection.
      */
     public Class<?> getType();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8d807129/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
index 8b04f05..a27f4b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderDefault.java
@@ -40,7 +40,7 @@ public class TypedHolderDefault extends FacetHolderImpl implements TypedHolder {
     }
 
     /**
-     * For {@link FeatureType#COLLECTION collection}s, represents the element
+     * For {@link FeatureType#COLLECTION collection}s, and for some {@link FeatureType#ACTION_PARAMETER}s, represents the element
      * type.
      */
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/8d807129/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 1aaebff..9c1e2fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -42,10 +42,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.choices.ChoicesFacetFromBoundedAbstract;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
@@ -59,9 +57,9 @@ import org.apache.isis.core.metamodel.services.persistsession.PersistenceSession
 import org.apache.isis.core.metamodel.spec.DomainModelException;
 import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public abstract class ObjectActionParameterAbstract implements ObjectActionParameter {
 
@@ -425,16 +423,12 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             final ObjectSpecification choiceWrappedSpec = specificationLookup.loadSpecification(choiceWrappedClass);
             final ObjectSpecification paramWrappedSpec = specificationLookup.loadSpecification(paramWrappedClass);
 
-            // TODO: remove this eventually... need to introduce OneToManyParameter
-            if(paramWrappedSpec.isParentedOrFreeCollection()) {
-                final CollectionFacet collectionFacet = paramWrappedSpec.getFacet(CollectionFacet.class);
-                final TypeOfFacet typeOfFacet = collectionFacet.getTypeOfFacet();
-                final ObjectSpecification collectionOfParamSpec = typeOfFacet.valueSpec();
-                System.out.println(collectionOfParamSpec.getFullIdentifier());
-            }
-            
+
+            // TODO: should implement this instead as a MetaModelValidator
             if (!choiceWrappedSpec.isOfType(paramWrappedSpec)) {
-                throw new DomainModelException("Type incompatible with parameter type; expected " + paramSpec.getFullIdentifier() + ", but was " + choiceClass.getName());
+                throw new DomainModelException(String.format(
+                        "Type incompatible with parameter type; expected %s, but was %s",
+                                paramSpec.getFullIdentifier(), choiceClass.getName()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8d807129/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
index 18b1ade..ea06673 100644
--- a/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/objectstore/jdo/metamodel/facets/object/auditable/GivenAuditableAnnotationFacetFactoryTest.java
@@ -18,10 +18,12 @@
  */
 package org.apache.isis.objectstore.jdo.metamodel.facets.object.auditable;
 
-import junit.framework.Assert;
-
 import java.util.List;
+
 import javax.jdo.annotations.PersistenceCapable;
+
+import org.junit.Assert;
+
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
@@ -31,6 +33,7 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.auditing.Audita
 import org.apache.isis.core.objectstore.jdo.applib.annotations.Auditable;
 
 
+
 public class GivenAuditableAnnotationFacetFactoryTest extends
         AbstractFacetFactoryTest {
 


[10/24] isis git commit: ISIS-785: introduces OneToManyActionParameter{Contributee/MixedIn}

Posted by da...@apache.org.
ISIS-785: introduces OneToManyActionParameter{Contributee/MixedIn}


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

Branch: refs/heads/maint-1.13.3
Commit: 30d23e057e97a78285585b582b64b08622e1bc1d
Parents: d2847d5
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 11:15:30 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 11:15:30 2017 +0000

----------------------------------------------------------------------
 .../OneToManyActionParameterContributee.java    | 38 ++++++++++++++++++++
 .../OneToManyActionParameterMixedIn.java        | 35 ++++++++++++++++++
 2 files changed, 73 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/30d23e05/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
new file mode 100644
index 0000000..54eae3c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
@@ -0,0 +1,38 @@
+/**
+ *  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.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
+
+public class OneToManyActionParameterContributee
+        extends ObjectActionParameterContributeeAbstract
+        implements OneToManyActionParameter {
+
+    public OneToManyActionParameterContributee(
+            final ObjectAdapter serviceAdapter,
+            final ObjectActionParameterAbstract serviceActionParameter,
+            final int contributeeParamNumber,
+            final ObjectActionContributee contributeeAction) {
+        super(serviceAdapter, serviceActionParameter, contributeeParamNumber, contributeeAction);
+    }
+
+    @Override
+    public CollectionSemantics getCollectionSemantics() {
+        throw new RuntimeException("TODO: not yet implemented");
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/30d23e05/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
new file mode 100644
index 0000000..b95106c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterMixedIn.java
@@ -0,0 +1,35 @@
+/**
+ *  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.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
+
+public class OneToManyActionParameterMixedIn
+        extends ObjectActionParameterMixedInAbstract
+        implements OneToManyActionParameter {
+
+    public OneToManyActionParameterMixedIn(
+            final ObjectActionParameterAbstract mixinParameter,
+            final ObjectActionMixedIn mixedInAction) {
+        super(mixinParameter, mixedInAction);
+    }
+
+    @Override
+    public CollectionSemantics getCollectionSemantics() {
+        throw new RuntimeException("TODO: not yet implemented");
+    }
+}


[20/24] isis git commit: ISIS-785: removes implementation of ActionArgumentCollectionModel, gonna use ScalarModel after all.

Posted by da...@apache.org.
ISIS-785: removes implementation of ActionArgumentCollectionModel, gonna use ScalarModel after all.


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

Branch: refs/heads/maint-1.13.3
Commit: a6a79e48f8efad7e08a1480ad49bb1e3ceb674d1
Parents: bc9320e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 14:48:56 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 14:48:56 2017 +0000

----------------------------------------------------------------------
 .../models/ActionArgumentCollectionModel.java   | 82 --------------------
 .../viewer/wicket/model/models/ActionModel.java |  6 +-
 2 files changed, 1 insertion(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a6a79e48/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
deleted file mode 100644
index 646631e..0000000
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
+++ /dev/null
@@ -1,82 +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.viewer.wicket.model.models;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-class ActionArgumentCollectionModel extends ModelAbstract<ObjectAdapter> implements
-        ActionArgumentModel {
-
-    private final ActionParameterMemento parameterMemento;
-    private ObjectAdapterMemento adapterMemento;
-
-    public ActionArgumentCollectionModel(
-            final ObjectAdapterMemento adapterMemento,
-            final ActionParameterMemento parameterMemento) {
-        this.adapterMemento = adapterMemento;
-        this.parameterMemento = parameterMemento;
-    }
-
-    @Override
-    public ActionParameterMemento getParameterMemento() {
-        return parameterMemento;
-    }
-
-    @Override
-    protected ObjectAdapter load() {
-        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(getSpecificationLoader());
-        final ObjectSpecification specification = parameterMemento.getSpecification(getSpecificationLoader());
-
-        return adapterMemento
-                .getObjectAdapter(AdapterManager.ConcurrencyChecking.CHECK, getPersistenceSession(), getSpecificationLoader());
-    }
-
-    @Override
-    public void setObject(final ObjectAdapter adapter) {
-        super.setObject(adapter);
-        adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
-    }
-
-    @Override
-    public void reset() {
-        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(
-                getSpecificationLoader());
-        final ObjectAdapter parentAdapter =
-                adapterMemento.getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK,
-                        getPersistenceSession(), getSpecificationLoader());
-        final ObjectAdapter defaultAdapter = actionParameter.getDefault(parentAdapter);
-        setObject(defaultAdapter);
-    }
-
-    /**
-     * transient because only temporary hint.
-     */
-    private transient ObjectAdapter[] actionArgsHint;
-
-    @Override
-    public void setActionArgsHint(ObjectAdapter[] actionArgsHint) {
-        this.actionArgsHint = actionArgsHint;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a6a79e48/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 40c9188..0219729 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -59,7 +59,6 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -434,10 +433,7 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         final int i = apm.getNumber();
 		ActionArgumentModel actionArgumentModel = arguments.get(i);
         if (actionArgumentModel == null) {
-            final ObjectActionParameter actionParameter = apm.getActionParameter(getSpecificationLoader());
-            actionArgumentModel = actionParameter.getFeatureType() == FeatureType.ACTION_PARAMETER_SCALAR
-                    ? new ScalarModel(targetAdapterMemento, apm)
-                    : new ActionArgumentCollectionModel(targetAdapterMemento, apm);
+            actionArgumentModel = new ScalarModel(targetAdapterMemento, apm);
             final int number = actionArgumentModel.getParameterMemento().getNumber();
             arguments.put(number, actionArgumentModel);
         }


[04/24] isis git commit: ISIS-1540: updates simpleapp to use 0.0.3 of docker mavenmixin

Posted by da...@apache.org.
ISIS-1540: updates simpleapp to use 0.0.3 of docker mavenmixin


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

Branch: refs/heads/maint-1.13.3
Commit: 781526d33a1f17a9bc115f844854e0a1cc9cca74
Parents: 4027a0b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 12 14:07:44 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 09:51:11 2017 +0000

----------------------------------------------------------------------
 example/application/simpleapp/pom.xml        | 8 +++++++-
 example/application/simpleapp/webapp/pom.xml | 7 +++++--
 2 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/781526d3/example/application/simpleapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/pom.xml b/example/application/simpleapp/pom.xml
index e20afcc..a61f369 100644
--- a/example/application/simpleapp/pom.xml
+++ b/example/application/simpleapp/pom.xml
@@ -89,9 +89,10 @@
         <jdepend-maven-plugin.version>2.0-beta-2</jdepend-maven-plugin.version>
         <findbugs-maven-plugin.version>2.5</findbugs-maven-plugin.version>
 
-        <mavenmixin-docker.version>0.0.2</mavenmixin-docker.version>
+        <mavenmixin-docker.version>0.0.3</mavenmixin-docker.version>
         <maven-deploy-plugin.version>2.8.1</maven-deploy-plugin.version>
         <docker-maven-plugin.version>0.4.13</docker-maven-plugin.version>
+        <gmavenplus-plugin.version>1.5</gmavenplus-plugin.version>
 
         <mavendeps-isistesting.version>0.0.2</mavendeps-isistesting.version>
         <mavendeps-isisintellij.version>0.0.1</mavendeps-isisintellij.version>
@@ -244,6 +245,11 @@
                     <artifactId>docker-maven-plugin</artifactId>
                     <version>${docker-maven-plugin.version}</version>
                 </plugin>
+                <plugin>
+                    <groupId>org.codehaus.gmavenplus</groupId>
+                    <artifactId>gmavenplus-plugin</artifactId>
+                    <version>${gmavenplus-plugin.version}</version>
+                </plugin>
 
             </plugins>
         </pluginManagement>

http://git-wip-us.apache.org/repos/asf/isis/blob/781526d3/example/application/simpleapp/webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/pom.xml b/example/application/simpleapp/webapp/pom.xml
index d0a2e40..baa74a6 100644
--- a/example/application/simpleapp/webapp/pom.xml
+++ b/example/application/simpleapp/webapp/pom.xml
@@ -45,8 +45,11 @@
 
         <docker-plugin.imageName>DOCKER_REGISTRY_ACCOUNT/${project.parent.artifactId}</docker-plugin.imageName>
         <docker-plugin.resource.include>${maven-war-plugin.warName}.war</docker-plugin.resource.include>
-        <docker-plugin.serverId>docker-hub</docker-plugin.serverId>
-        <docker-plugin.registryUrl>https://index.docker.io/v1/</docker-plugin.registryUrl>
+
+        <docker-plugin.releaseServerId>docker-hub</docker-plugin.releaseServerId>
+        <docker-plugin.releaseRegistryUrl>https://index.docker.io/v1/</docker-plugin.releaseRegistryUrl>
+        <docker-plugin.snapshotServerId>docker-hub</docker-plugin.snapshotServerId>
+        <docker-plugin.snapshotRegistryUrl>https://index.docker.io/v1/</docker-plugin.snapshotRegistryUrl>
 
     </properties>
 


[18/24] isis git commit: ISIS-785: introduces ActionArgumentModel as the API between ActionParametersFormPanel and ScalarModel; introduces ActionArgumentCollectionModel as an implementation to represent collection arguments.

Posted by da...@apache.org.
ISIS-785: introduces ActionArgumentModel as the API between ActionParametersFormPanel and ScalarModel; introduces ActionArgumentCollectionModel as an implementation to represent collection arguments.


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

Branch: refs/heads/maint-1.13.3
Commit: d6d0c195c2f10f67a39dee3f81eb90f035c6f112
Parents: d51d4aa
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 14:42:01 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 14:42:01 2017 +0000

----------------------------------------------------------------------
 .../models/ActionArgumentCollectionModel.java   | 82 ++++++++++++++++++++
 .../model/models/ActionArgumentModel.java       | 33 ++++++++
 .../viewer/wicket/model/models/ActionModel.java | 39 +++++-----
 .../viewer/wicket/model/models/ScalarModel.java |  2 +-
 .../actions/ActionParametersFormPanel.java      |  9 ++-
 5 files changed, 141 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
new file mode 100644
index 0000000..646631e
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCollectionModel.java
@@ -0,0 +1,82 @@
+/*
+ *  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.viewer.wicket.model.models;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+class ActionArgumentCollectionModel extends ModelAbstract<ObjectAdapter> implements
+        ActionArgumentModel {
+
+    private final ActionParameterMemento parameterMemento;
+    private ObjectAdapterMemento adapterMemento;
+
+    public ActionArgumentCollectionModel(
+            final ObjectAdapterMemento adapterMemento,
+            final ActionParameterMemento parameterMemento) {
+        this.adapterMemento = adapterMemento;
+        this.parameterMemento = parameterMemento;
+    }
+
+    @Override
+    public ActionParameterMemento getParameterMemento() {
+        return parameterMemento;
+    }
+
+    @Override
+    protected ObjectAdapter load() {
+        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(getSpecificationLoader());
+        final ObjectSpecification specification = parameterMemento.getSpecification(getSpecificationLoader());
+
+        return adapterMemento
+                .getObjectAdapter(AdapterManager.ConcurrencyChecking.CHECK, getPersistenceSession(), getSpecificationLoader());
+    }
+
+    @Override
+    public void setObject(final ObjectAdapter adapter) {
+        super.setObject(adapter);
+        adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
+    }
+
+    @Override
+    public void reset() {
+        final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(
+                getSpecificationLoader());
+        final ObjectAdapter parentAdapter =
+                adapterMemento.getObjectAdapter(AdapterManager.ConcurrencyChecking.NO_CHECK,
+                        getPersistenceSession(), getSpecificationLoader());
+        final ObjectAdapter defaultAdapter = actionParameter.getDefault(parentAdapter);
+        setObject(defaultAdapter);
+    }
+
+    /**
+     * transient because only temporary hint.
+     */
+    private transient ObjectAdapter[] actionArgsHint;
+
+    @Override
+    public void setActionArgsHint(ObjectAdapter[] actionArgsHint) {
+        this.actionArgsHint = actionArgsHint;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
new file mode 100644
index 0000000..465ad72
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
@@ -0,0 +1,33 @@
+/*
+ *  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.viewer.wicket.model.models;
+
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
+
+public interface ActionArgumentModel extends IModel<ObjectAdapter> {
+
+    ActionParameterMemento getParameterMemento();
+
+    void reset();
+
+    void setActionArgsHint(ObjectAdapter[] argumentsAsArray);
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 420cfc9..40c9188 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -59,6 +59,7 @@ import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -269,11 +270,10 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
     private final ActionMemento actionMemento;
     private Mode actionMode;
 
-
     /**
      * Lazily populated in {@link #getArgumentModel(ActionParameterMemento)}
      */
-    private final Map<Integer, ScalarModel> arguments = Maps.newHashMap();
+    private final Map<Integer, ActionArgumentModel> arguments = Maps.newHashMap();
 
 
     private ActionModel(final PageParameters pageParameters, final SpecificationLoader specificationLoader) {
@@ -336,8 +336,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         //this.actionPrompt = actionModel.actionPrompt;
         
         primeArgumentModels();
-        final Map<Integer, ScalarModel> argumentModelByIdx = actionModel.arguments;
-        for (final Map.Entry<Integer,ScalarModel> argumentModel : argumentModelByIdx.entrySet()) {
+        final Map<Integer, ActionArgumentModel> argumentModelByIdx = actionModel.arguments;
+        for (final Map.Entry<Integer,ActionArgumentModel> argumentModel : argumentModelByIdx.entrySet()) {
             setArgument(argumentModel.getKey(), argumentModel.getValue().getObject());
         }
 
@@ -425,20 +425,23 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         final ObjectAction action = actionMemento.getAction(getSpecificationLoader());
         final ObjectActionParameter actionParam = action.getParameters().get(paramNum);
         final ActionParameterMemento apm = new ActionParameterMemento(actionParam);
-        final ScalarModel argumentModel = getArgumentModel(apm);
-        argumentModel.setObject(argumentAdapter);
+        final ActionArgumentModel actionArgumentModel = getArgumentModel(apm);
+        actionArgumentModel.setObject(argumentAdapter);
     }
 
 
-    public ScalarModel getArgumentModel(final ActionParameterMemento apm) {
+    public ActionArgumentModel getArgumentModel(final ActionParameterMemento apm) {
         final int i = apm.getNumber();
-		ScalarModel scalarModel = arguments.get(i);
-        if (scalarModel == null) {
-            scalarModel = new ScalarModel(targetAdapterMemento, apm);
-            final int number = scalarModel.getParameterMemento().getNumber();
-            arguments.put(number, scalarModel);
+		ActionArgumentModel actionArgumentModel = arguments.get(i);
+        if (actionArgumentModel == null) {
+            final ObjectActionParameter actionParameter = apm.getActionParameter(getSpecificationLoader());
+            actionArgumentModel = actionParameter.getFeatureType() == FeatureType.ACTION_PARAMETER_SCALAR
+                    ? new ScalarModel(targetAdapterMemento, apm)
+                    : new ActionArgumentCollectionModel(targetAdapterMemento, apm);
+            final int number = actionArgumentModel.getParameterMemento().getNumber();
+            arguments.put(number, actionArgumentModel);
         }
-        return scalarModel;
+        return actionArgumentModel;
     }
 
     public ObjectAdapter getTargetAdapter() {
@@ -523,8 +526,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         final ObjectAction objectAction = getActionMemento().getAction(getSpecificationLoader());
         final ObjectAdapter[] arguments = new ObjectAdapter[objectAction.getParameterCount()];
         for (int i = 0; i < arguments.length; i++) {
-            final ScalarModel scalarModel = this.arguments.get(i);
-            arguments[i] = scalarModel.getObject();
+            final ActionArgumentModel actionArgumentModel = this.arguments.get(i);
+            arguments[i] = actionArgumentModel.getObject();
         }
         return arguments;
     }
@@ -534,8 +537,8 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
     }
 
     public void clearArguments() {
-        for (final ScalarModel argumentModel : arguments.values()) {
-            argumentModel.reset();
+        for (final ActionArgumentModel actionArgumentModel : arguments.values()) {
+            actionArgumentModel.reset();
         }
         this.actionMode = determineMode(actionMemento.getAction(getSpecificationLoader()));
     }
@@ -703,6 +706,4 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements Has
         return getIsisSessionFactory().getServicesInjector();
     }
 
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/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 755da1b..1f60e44 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
@@ -63,7 +63,7 @@ import org.apache.isis.viewer.wicket.model.mementos.SpecUtils;
  * Is the backing model to each of the fields that appear in forms (for entities
  * or action dialogs).
  */
-public class ScalarModel extends EntityModel implements LinksProvider,HasExecutingPanel {
+public class ScalarModel extends EntityModel implements LinksProvider,HasExecutingPanel, ActionArgumentModel {
 
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d6d0c195/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index f05caa6..b9f6a4f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.hints.IsisActionCompletedEvent;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.panels.PromptFormPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
@@ -97,9 +97,10 @@ public class ActionParametersFormPanel extends PromptFormPanelAbstract<ActionMod
                 final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
                 rv.add(container);
 
-                final ScalarModel argumentModel = actionModel.getArgumentModel(apm);
-                argumentModel.setActionArgsHint(actionModel.getArgumentsAsArray());
-                final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
+                final ActionArgumentModel actionArgumentModel = actionModel.getArgumentModel(apm);
+                actionArgumentModel.setActionArgsHint(actionModel.getArgumentsAsArray());
+                final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE,
+                        actionArgumentModel);
                 final ScalarPanelAbstract paramPanel = component instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) component : null;
                 paramPanels.add(paramPanel);
                 if(paramPanel != null) {


[02/24] isis git commit: ISIS-1565: fixes @MemberOrder for default mixin actions

Posted by da...@apache.org.
ISIS-1565: fixes @MemberOrder for default mixin actions


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

Branch: refs/heads/maint-1.13.3
Commit: ec124178a285e4ac87734370d7df3a8ad1152438
Parents: 2da7534
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Jan 9 22:12:12 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 09:50:39 2017 +0000

----------------------------------------------------------------------
 .../isis/applib/services/layout/Object_downloadLayoutXml.java    | 4 +---
 .../isis/applib/services/layout/Object_rebuildMetamodel.java     | 2 +-
 .../services/jdosupport/Persistable_downloadJdoMetadata.java     | 3 +--
 .../isis/viewer/wicket/viewer/services/Object_clearHints.java    | 2 +-
 4 files changed, 4 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ec124178/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 22261f9..f1bcaf8 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -16,8 +16,6 @@
  */
 package org.apache.isis.applib.services.layout;
 
-import javax.inject.Inject;
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -48,7 +46,7 @@ public class Object_downloadLayoutXml {
             cssClassFa = "fa-download",
             position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(name = "Metadata", sequence = "700.1")
+    @MemberOrder(name = "datanucleusIdLong", sequence = "700.1")
     public Object $$(
             @ParameterLayout(named = "File name")
             final String fileName,

http://git-wip-us.apache.org/repos/asf/isis/blob/ec124178/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
index 69d0cb7..05a9618 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_rebuildMetamodel.java
@@ -44,7 +44,7 @@ public class Object_rebuildMetamodel {
             cssClassFa = "fa-refresh",
             position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(name = "Metadata", sequence = "800.1")
+    @MemberOrder(name = "datanucleusIdLong", sequence = "800.1")
     public void $$() {
         metaModelService.rebuild(object.getClass());
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/ec124178/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
index 38a0f2f..3155247 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.services.jdosupport;
 
 import java.io.IOException;
 
-import javax.inject.Inject;
 import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.metadata.TypeMetadata;
 import javax.xml.bind.JAXBException;
@@ -57,7 +56,7 @@ public class Persistable_downloadJdoMetadata {
             cssClassFa = "fa-download",
             position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(name = "Metadata", sequence = "710.1")
+    @MemberOrder(name = "datanucleusIdLong", sequence = "710.1")
     public Clob $$(
             @ParameterLayout(named = ".jdo file name")
             final String fileName) throws JAXBException, IOException {

http://git-wip-us.apache.org/repos/asf/isis/blob/ec124178/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/Object_clearHints.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/Object_clearHints.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/Object_clearHints.java
index c97f8a6..00d419d 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/Object_clearHints.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/services/Object_clearHints.java
@@ -52,7 +52,7 @@ public class Object_clearHints {
             cssClassFa = "fa-trash",
             position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(name = "Metadata", sequence = "400.1")
+    @MemberOrder(name = "datanucleusIdLong", sequence = "400.1")
     public Object $$() {
         if (getHintStoreUsingWicketSession() != null) {
             final Bookmark bookmark = bookmarkService.bookmarkFor(object);


[14/24] isis git commit: ISIS-785: moves logic for inferring element type for arrays "ie X[] foo()" from ActionAnnotationFacetFactory to SpecificationLoader, in order that it might be reused for similar processing of FacetedMethodParameters for actions s

Posted by da...@apache.org.
ISIS-785: moves logic for inferring element type for arrays "ie X[] foo()" from ActionAnnotationFacetFactory to SpecificationLoader, in order that it might be reused for similar processing of FacetedMethodParameters for actions such as "void foo(X[] xxx)"


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

Branch: refs/heads/maint-1.13.3
Commit: 31d0a72a6430203b2c53a22c4249728b7137081d
Parents: 449f569
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 12:07:56 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 12:07:56 2017 +0000

----------------------------------------------------------------------
 .../action/ActionAnnotationFacetFactory.java    | 24 ++++----------------
 .../specloader/SpecificationLoader.java         | 13 +++++++++++
 2 files changed, 17 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/31d0a72a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index 7b58bac..4912ba6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -46,10 +46,9 @@ import org.apache.isis.core.metamodel.facets.Annotations;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
-import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetObjectOnly;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetForBulkAnnotation;
+import org.apache.isis.core.metamodel.facets.actions.action.bulk.BulkFacetObjectOnly;
 import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForActionAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.command.CommandFacetForCommandAnnotation;
 import org.apache.isis.core.metamodel.facets.actions.action.disabled.DisabledFacetForDisabledAnnotationOnAction;
@@ -85,7 +84,6 @@ import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.CollectionUtils;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorForDeprecatedAnnotation;
 import org.apache.isis.core.metamodel.util.EventUtil;
@@ -441,32 +439,18 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
         // infer from return type
         if(facet == null) {
             final Class<?> returnType = method.getReturnType();
-            if (returnType.isArray()) {
-                final Class<?> componentType = returnType.getComponentType();
-                facet = new TypeOfFacetInferredFromArray(componentType, holder, getSpecificationLoader());
-            }
+            facet = getSpecificationLoader().inferForArray(holder, returnType);
         }
 
         // infer from generic return type
         if(facet == null) {
-            facet = inferFromGenericReturnType(processMethodContext);
+            final Class<?> cls = processMethodContext.getCls();
+            facet = getSpecificationLoader().inferFromGenericReturnType(cls, method, holder);
         }
 
         FacetUtil.addFacet(facet);
     }
 
-    private TypeOfFacet inferFromGenericReturnType(
-            final ProcessMethodContext processMethodContext) {
-
-        final Class<?> cls = processMethodContext.getCls();
-        final Method method = processMethodContext.getMethod();
-        final FacetHolder holder = processMethodContext.getFacetHolder();
-
-        final SpecificationLoader specificationLoader = getSpecificationLoader();
-
-        return specificationLoader.inferFromGenericReturnType(cls, method, holder);
-    }
-
     // ///////////////////////////////////////////////////////////////
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/31d0a72a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 64e3251..caf059b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -45,7 +45,9 @@ import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromArray;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetInferredFromGenerics;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
@@ -579,6 +581,17 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         }
         return null;
     }
+
+    @Programmatic
+    public TypeOfFacet inferForArray(
+            final FacetedMethod holder,
+            final Class<?> type) {
+        if (type.isArray()) {
+            final Class<?> componentType = type.getComponentType();
+            return new TypeOfFacetInferredFromArray(componentType, holder, this);
+        }
+        return null;
+    }
     //endregion
 
 


[23/24] isis git commit: ISIS-785: wrapped Select2Choice with a Select2 wrapper class, idea being to encapsulate whether use Select2Choice or Select2MultiChoice.

Posted by da...@apache.org.
ISIS-785: wrapped Select2Choice with a Select2 wrapper class, idea being to encapsulate whether use Select2Choice or Select2MultiChoice.

Added ScalarModel#isCollection() - true if for an action parameter with featureType of ACTION_PARAMETER_COLL , and treat its ObjectAdapterMemento as a memento for a adapter of a transient java.util.ArrayList that contains (persistent) pojos.


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

Branch: refs/heads/maint-1.13.3
Commit: e114e6ccf60dcc2494de099e491192f4c3d2f19a
Parents: fbc259f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 19:13:29 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 19:22:14 2017 +0000

----------------------------------------------------------------------
 .../model/mementos/ObjectAdapterMemento.java    |  22 ++-
 .../viewer/wicket/model/models/ScalarModel.java |  50 ++++++
 .../models/ScalarModelWithMultiPending.java     | 151 +++++++++++++++++++
 .../reference/EntityLinkSelect2Panel.java       |   4 +-
 .../scalars/reference/ReferencePanel.java       | 112 ++++++++------
 .../components/scalars/reference/Select2.java   | 145 ++++++++++++++++++
 .../widgets/select2/Select2ChoiceUtil.java      |  17 +++
 7 files changed, 453 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index 609a047..a6ad7c5 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -22,6 +22,8 @@ package org.apache.isis.viewer.wicket.model.mementos;
 import java.io.Serializable;
 import java.util.List;
 
+import javax.annotation.Nullable;
+
 import com.google.common.base.Function;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -323,7 +325,8 @@ public class ObjectAdapterMemento implements Serializable {
      */
     public ObjectAdapter getObjectAdapter(
             final ConcurrencyChecking concurrencyChecking,
-            final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
         return type.getAdapter(this, concurrencyChecking, persistenceSession, specificationLoader);
     }
 
@@ -495,6 +498,23 @@ public class ObjectAdapterMemento implements Serializable {
             };
         }
 
+        public static Function<? super ObjectAdapterMemento, Object> toPojo(
+                final PersistenceSession persistenceSession,
+                final SpecificationLoader specificationLoader) {
+            return new Function<ObjectAdapterMemento, Object>() {
+                @Nullable @Override public Object apply(@Nullable final ObjectAdapterMemento input) {
+                    if(input == null) {
+                        return null;
+                    }
+                    final ObjectAdapter objectAdapter = input
+                            .getObjectAdapter(ConcurrencyChecking.NO_CHECK, persistenceSession, specificationLoader);
+                    if(objectAdapter == null) {
+                        return null;
+                    }
+                    return objectAdapter.getObject();
+                }
+            };
+        }
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/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 fbfd78e..6d9cba9 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
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.model.models;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -289,6 +290,11 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
             public ObjectAdapter load(final ScalarModel scalarModel) {
                 return scalarModel.loadFromSuper();
             }
+
+            @Override
+            public boolean isCollection(final ScalarModel scalarModel) {
+                return false;
+            }
         },
         PARAMETER {
             @Override
@@ -506,6 +512,7 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
                 }
 
                 // return an empty collection
+                // TODO: this should probably move down into OneToManyActionParameter impl
                 final OneToManyActionParameter otmap = (OneToManyActionParameter) actionParameter;
                 final CollectionSemantics collectionSemantics = otmap.getCollectionSemantics();
                 final TypeOfFacet typeOfFacet = actionParameter.getFacet(TypeOfFacet.class);
@@ -513,6 +520,13 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
                 final Object emptyCollection = collectionSemantics.emptyCollectionOf(elementType);
                 return scalarModel.getCurrentSession().getPersistenceSession().adapterFor(emptyCollection);
             }
+
+            @Override
+            public boolean isCollection(final ScalarModel scalarModel) {
+                final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
+                final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
+                return actionParameter.getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION;
+            }
         };
 
         private static List<ObjectAdapter> choicesAsList(final ObjectAdapter[] choices) {
@@ -576,6 +590,8 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
         public abstract void reset(ScalarModel scalarModel);
 
         public abstract ObjectAdapter load(final ScalarModel scalarModel);
+
+        public abstract boolean isCollection(final ScalarModel scalarModel);
     }
 
     private final Kind kind;
@@ -651,6 +667,10 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
         setObject(associatedAdapter);
     }
 
+    public boolean isCollection() {
+        return kind.isCollection(this);
+    }
+
     /**
      * Whether the scalar represents a {@link Kind#PROPERTY property} or a
      * {@link Kind#PARAMETER}.
@@ -842,6 +862,36 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
         };
     }
 
+    /**
+     * @return
+     */
+    public ScalarModelWithMultiPending asScalarModelWithMultiPending() {
+        return new ScalarModelWithMultiPending(){
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public ArrayList<ObjectAdapterMemento> getPending() {
+                final ObjectAdapterMemento pending = ScalarModel.this.getPending();
+                return Util.asMementoList(pending, getPersistenceSession(), getSpecificationLoader());
+            }
+
+            @Override
+            public void setPending(final ArrayList<ObjectAdapterMemento> pending) {
+                final ObjectAdapter list = Util.toAdapter(pending, getPersistenceSession(), getSpecificationLoader());
+                final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createOrNull(list);
+                ScalarModel.this.setPending(adapterMemento);
+            }
+
+            @Override
+            public ScalarModel getScalarModel() {
+                return ScalarModel.this;
+            }
+        };
+    }
+
+
+
 
     public String getReasonInvalidIfAny() {
         final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
new file mode 100644
index 0000000..e57494b
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
@@ -0,0 +1,151 @@
+/**
+ *  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.viewer.wicket.model.models;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.model.Model;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+/**
+ * For widgets that use a <tt>org.wicketstuff.select2.Select2MultiChoice</tt>;
+ * synchronizes the {@link Model} of the <tt>Select2MultiChoice</tt>
+ * with the parent {@link ScalarModel}, allowing also for pending values.
+ */
+public interface ScalarModelWithMultiPending extends Serializable {
+
+    public ArrayList<ObjectAdapterMemento> getPending();
+    public void setPending(ArrayList<ObjectAdapterMemento> pending);
+
+    public ScalarModel getScalarModel();
+
+    static class Util {
+
+        private static final Logger LOG = LoggerFactory.getLogger(ScalarModelWithMultiPending.Util.class);
+        
+        public static Model<ArrayList<ObjectAdapterMemento>> createModel(final ScalarModelWithMultiPending owner) {
+            return new Model<ArrayList<ObjectAdapterMemento>>() {
+
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                public ArrayList<ObjectAdapterMemento> getObject() {
+                    if (owner.getPending() != null) {
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("pending not null: " + owner.getPending().toString());
+                        }
+                        return owner.getPending();
+                    }
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("pending is null");
+                    }
+
+                    final ScalarModel scalarModel = owner.getScalarModel();
+                    final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
+                    ArrayList<ObjectAdapterMemento> mementos = asMementoList(objectAdapterMemento,
+                            scalarModel.getPersistenceSession(), scalarModel.getSpecificationLoader());
+
+                    owner.setPending(mementos);
+                    return mementos;
+                }
+
+                @Override
+                public void setObject(final ArrayList<ObjectAdapterMemento> adapterMemento) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug(String.format("setting to: %s", adapterMemento != null ? adapterMemento.toString() : null));
+                    }
+                    owner.setPending(adapterMemento);
+
+                    final ScalarModel ownerScalarModel = owner.getScalarModel();
+                    final PersistenceSession persistenceSession = ownerScalarModel.getPersistenceSession();
+                    final SpecificationLoader specificationLoader = ownerScalarModel.getSpecificationLoader();
+
+                    if(adapterMemento == null) {
+                        ownerScalarModel.setObject(null);
+                    } else {
+                        final ArrayList<ObjectAdapterMemento> ownerPending = owner.getPending();
+                        if (ownerPending != null) {
+                            if (LOG.isDebugEnabled()) {
+                                LOG.debug(String.format("setting to pending: %s", ownerPending.toString()));
+                            }
+                            final ObjectAdapter objectAdapterOfListOfPojos =
+                                    toAdapter(ownerPending, persistenceSession, specificationLoader);
+                            ownerScalarModel.setObject(objectAdapterOfListOfPojos);
+                        }
+                    }
+                }
+            };
+        }
+
+        public static ObjectAdapter toAdapter(
+                final ArrayList<ObjectAdapterMemento> ownerPending,
+                final PersistenceSession persistenceSession,
+                final SpecificationLoader specificationLoader) {
+            final ArrayList<Object> listOfPojos = Lists
+                    .newArrayList(FluentIterable.from(ownerPending).transform(
+                            ObjectAdapterMemento.Functions
+                                    .toPojo(persistenceSession, specificationLoader))
+                            .toList());
+            return persistenceSession.adapterFor(listOfPojos);
+        }
+
+        public static ArrayList<ObjectAdapterMemento> asMementoList(
+                final ObjectAdapterMemento objectAdapterMemento,
+                final PersistenceSession persistenceSession,
+                final SpecificationLoader specificationLoader) {
+
+            if(objectAdapterMemento == null) {
+                return Lists.newArrayList();
+            }
+
+            final ObjectAdapter objectAdapter = objectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                    persistenceSession, specificationLoader);
+            if(objectAdapter == null) {
+                return Lists.newArrayList();
+            }
+
+            final List<ObjectAdapter> objectAdapters = CollectionFacet.Utils.convertToAdapterList(objectAdapter);
+
+            return Lists.newArrayList(
+                FluentIterable.from(objectAdapters)
+                              .transform(ObjectAdapterMemento.Functions.fromAdapter())
+                              .toList());
+        }
+
+        public static ObjectAdapterMemento toAdapterMemento(
+                final Collection<ObjectAdapterMemento> modelObject,
+                final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+            final ObjectAdapter objectAdapter = ScalarModelWithMultiPending.Util
+                    .toAdapter(Lists.newArrayList(modelObject), persistenceSession, specificationLoader);
+            return ObjectAdapterMemento.createOrNull(objectAdapter);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
index 8ac459d..a4035ac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
@@ -44,8 +44,8 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
      */
     @Override
     public boolean checkRequired() {
-        if(owningPanel.select2Field != null) {
-            return owningPanel.select2Field.checkRequired();
+        if(owningPanel.select2 != null) {
+            return owningPanel.select2.checkRequired();
         }
         return super.checkRequired();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 0039bf6..1d4c814 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -35,7 +36,6 @@ import org.apache.wicket.validation.IValidatable;
 import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
 import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -50,7 +50,8 @@ import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithMultiPending;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.EntityActionUtil;
@@ -79,7 +80,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private static final String KEY_DISABLE_DEPENDENT_CHOICE_AUTO_SELECTION = "isis.viewer.wicket.disableDependentChoiceAutoSelection";
 
     private EntityLinkSelect2Panel entityLink;
-    Select2Choice<ObjectAdapterMemento> select2Field;
+
+    Select2 select2;
 
     private EntityLinkSimplePanel entitySimpleLink;
 
@@ -182,8 +184,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
     // called from buildGui
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
-        if(select2Field != null) {
-            select2Field.add(behavior);
+        if(select2 != null) {
+            select2.add(behavior);
         }
     }
 
@@ -259,14 +261,24 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
         // syncLinkWithInputIfAutoCompleteOrChoices
         if(isEditableWithEitherAutoCompleteOrChoices()) {
-            final IModel<ObjectAdapterMemento> model = Util.createModel(getModel().asScalarModelWithPending());       
-            
-            if(select2Field == null) {
+
+            if(select2 == null) {
                 entityLink.setRequired(getModel().isRequired());
-                select2Field = Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, model, getModel());
-                setProviderAndCurrAndPending(select2Field, getModel().getActionArgsHint());
 
-                final Settings settings = select2Field.getSettings();
+                if(getModel().isCollection()) {
+                    final IModel<ArrayList<ObjectAdapterMemento>> modelWithMultiPending =
+                            ScalarModelWithMultiPending.Util.createModel(getModel().asScalarModelWithMultiPending());
+                    select2 = Select2.with(Select2ChoiceUtil.newSelect2MultiChoice(ID_AUTO_COMPLETE, modelWithMultiPending,
+                            getModel()));
+                } else {
+                    final IModel<ObjectAdapterMemento> modelWithPending =
+                            ScalarModelWithPending.Util.createModel(getModel().asScalarModelWithPending());
+                    select2 = Select2.with(Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, modelWithPending,
+                            getModel()));
+                }
+                setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
+
+                final Settings settings = select2.getSettings();
 
                 // one of these three case should be true
                 // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
@@ -287,26 +299,26 @@ public class ReferencePanel extends ScalarPanelAbstract {
                     settings.setMinimumInputLength(minLength);
                 }
 
-                entityLink.addOrReplace(select2Field);
+                entityLink.addOrReplace(select2.component());
 
             } else {
                 //
-                // the select2Field already exists, so the widget has been rendered before.  If it is
+                // the select2Choice already exists, so the widget has been rendered before.  If it is
                 // being re-rendered now, it may be because some other property/parameter was invalid.
                 // when the form was submitted, the selected object (its oid as a string) would have
                 // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
-                // would be correctly converted and processed by the select2Field's choiceProvider.  However,
+                // would be correctly converted and processed by the select2Choice's choiceProvider.  However,
                 // an invalid property/parameter means that the webpage is re-rendered in another request,
                 // and the rawInput can no longer be interpreted.  The net result is that the field appears
                 // with no input.
                 //
-                // The fix is therefore (I think) simply to clear any rawInput, so that the select2Field
+                // The fix is therefore (I think) simply to clear any rawInput, so that the select2Choice
                 // renders its state from its model.
                 //
                 // see: FormComponent#getInputAsArray()
                 // see: Select2Choice#renderInitializationScript()
                 //
-                select2Field.clearInput();
+                select2.clearInput();
             }
 
             if(getComponentForRegular() != null) {
@@ -317,9 +329,9 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
 
             // syncUsability
-            if(select2Field != null) {
+            if(select2 != null) {
                 final boolean mutability = entityLink.isEnableAllowed() && !getModel().isViewMode();
-                select2Field.setEnabled(mutability);
+                select2.setEnabled(mutability);
             }
 
             Components.permanentlyHide(entityLink, "entityLinkIfNull");
@@ -327,7 +339,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
             // this is horrid; adds a label to the id
             // should instead be a 'temporary hide'
             Components.permanentlyHide(entityLink, ID_AUTO_COMPLETE);
-            select2Field = null; // this forces recreation next time around
+            select2 = null; // this forces recreation next time around
         }
         
     }
@@ -338,23 +350,23 @@ public class ReferencePanel extends ScalarPanelAbstract {
     
     // called by syncWithInput, updateChoices
     private void setProviderAndCurrAndPending(
-            final Select2Choice<ObjectAdapterMemento> select2Field, 
+            final Select2 select2,
             final ObjectAdapter[] argsIfAvailable) {
         if (getModel().hasChoices()) {
             
             final List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
             ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
 
-            select2Field.setProvider(providerForChoices);
+            select2.setProvider(providerForChoices);
             getModel().clearPending();
             
-            resetIfCurrentNotInChoices(select2Field, choiceMementos);
+            resetIfCurrentNotInChoices(select2, choiceMementos);
             
         } else if(getModel().hasAutoComplete()) {
-            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
+            select2.setProvider(providerForParamOrPropertyAutoComplete());
             getModel().clearPending();
         } else {
-            select2Field.setProvider(providerForObjectAutoComplete());
+            select2.setProvider(providerForObjectAutoComplete());
             getModel().clearPending();
         }
     }
@@ -370,24 +382,33 @@ public class ReferencePanel extends ScalarPanelAbstract {
     }
 
     // called by setProviderAndCurrAndPending
-    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
-        final ObjectAdapterMemento curr = select2Field.getModelObject();
-        if(curr == null) {
-            select2Field.getModel().setObject(null);
-            getModel().setObject(null);
-            return;
-        }
-        
-        if(!curr.containedIn(choiceMementos, getPersistenceSession(), getSpecificationLoader())) {
-            if(!choiceMementos.isEmpty() && autoSelect()) {
-                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
-                select2Field.getModel().setObject(newAdapterMemento);
-                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
-                        getPersistenceSession(), getSpecificationLoader()));
-            } else {
-                select2Field.getModel().setObject(null);
+    private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choiceMementos) {
+        final ObjectAdapterMemento curr = select2.getModelObject(getPersistenceSession(), getSpecificationLoader());
+
+        if(!getModel().isCollection()) {
+
+            if(curr == null) {
+                select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(null);
                 getModel().setObject(null);
+                return;
+            }
+
+            if(!curr.containedIn(choiceMementos, getPersistenceSession(), getSpecificationLoader())) {
+                if(!choiceMementos.isEmpty() && autoSelect()) {
+                    final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
+                    select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(newAdapterMemento);
+                    getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                            getPersistenceSession(), getSpecificationLoader()));
+                } else {
+                    select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(null);
+                    getModel().setObject(null);
+                }
             }
+
+        } else {
+
+            // TODO
+
         }
     }
 
@@ -468,11 +489,12 @@ public class ReferencePanel extends ScalarPanelAbstract {
         if(isEditableWithEitherAutoCompleteOrChoices()) {
 
             // flush changes to pending
-            ObjectAdapterMemento convertedInput = select2Field.getConvertedInput();
+            ObjectAdapterMemento convertedInput =
+                    select2.getConvertedInput(getPersistenceSession(), getSpecificationLoader());
             
             getModel().setPending(convertedInput);
-            if(select2Field != null) {
-                select2Field.getModel().setObject(convertedInput);
+            if(select2 != null) {
+                select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(convertedInput);
             }
             
             final ObjectAdapter adapter = convertedInput!=null?convertedInput.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
@@ -496,8 +518,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
      */
     @Override
     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        if(select2Field != null) {
-            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
+        if(select2 != null) {
+            setProviderAndCurrAndPending(select2, argsIfAvailable);
             return true;
         } else {
             return false;

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
new file mode 100644
index 0000000..e650d3b
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
@@ -0,0 +1,145 @@
+/*
+ *  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.viewer.wicket.ui.components.scalars.reference;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.IModel;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+import org.wicketstuff.select2.Settings;
+
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithMultiPending;
+
+public class Select2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    final Select2Choice<ObjectAdapterMemento> select2Choice;
+    final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice;
+
+    public static Select2 with(final Select2Choice<ObjectAdapterMemento> select2Choice) {
+        return new Select2(select2Choice, null);
+    }
+
+    public static Select2 with(final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice) {
+        return new Select2(null, select2MultiChoice);
+    }
+
+    private Select2(
+            final Select2Choice<ObjectAdapterMemento> select2Choice,
+            final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice) {
+        this.select2Choice = select2Choice;
+        this.select2MultiChoice = select2MultiChoice;
+    }
+
+    public void add(final Behavior behavior) {
+        component().add(behavior);
+    }
+
+    HiddenField<?> component() {
+        return select2Choice != null
+                ? (HiddenField<ObjectAdapterMemento>) select2Choice
+                : (HiddenField<Collection<ObjectAdapterMemento>>) select2MultiChoice;
+    }
+
+    public Settings getSettings() {
+        return select2Choice != null ? select2Choice.getSettings() : select2MultiChoice.getSettings();
+    }
+
+    public void clearInput() {
+        component().clearInput();
+    }
+
+    public void setEnabled(final boolean mutability) {
+        component().setEnabled(mutability);
+    }
+
+    public boolean checkRequired() {
+        return component().checkRequired();
+    }
+
+    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+        if (select2Choice != null)
+            select2Choice.setProvider(providerForChoices);
+        else
+            select2MultiChoice.setProvider(providerForChoices);
+    }
+
+    public ObjectAdapterMemento getModelObject(
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        if (select2Choice != null) {
+            return select2Choice.getModelObject();
+        } else {
+            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+            return ScalarModelWithMultiPending.Util
+                    .toAdapterMemento(modelObject, persistenceSession, specificationLoader);
+        }
+    }
+
+    public IModel<ObjectAdapterMemento> getModel(
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        if (select2Choice != null) {
+            return select2Choice.getModel();
+        } else {
+            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+            final ObjectAdapterMemento memento = ScalarModelWithMultiPending.Util
+                    .toAdapterMemento(modelObject, persistenceSession, specificationLoader);
+            return new IModel<ObjectAdapterMemento>() {
+                @Override
+                public ObjectAdapterMemento getObject() {
+                    return memento;
+                }
+
+                @Override
+                public void setObject(final ObjectAdapterMemento memento) {
+                    final ArrayList<ObjectAdapterMemento> mementos = ScalarModelWithMultiPending.Util
+                            .asMementoList(memento, persistenceSession, specificationLoader);
+                    model.setObject(mementos);
+                }
+
+                @Override public void detach() {
+
+                }
+            };
+        }
+    }
+
+    public ObjectAdapterMemento getConvertedInput(
+            final PersistenceSession persistenceSession,
+            final SpecificationLoader specificationLoader) {
+        if (select2Choice != null) {
+            return select2Choice.getConvertedInput();
+        } else {
+            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+            return ScalarModelWithMultiPending.Util.toAdapterMemento(convertedInput, persistenceSession, specificationLoader);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/e114e6cc/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java
index 476286b..08a00c6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.widgets.select2;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.apache.wicket.ajax.json.JSONException;
@@ -24,6 +25,7 @@ import org.apache.wicket.model.IModel;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Response;
 import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
 
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -38,6 +40,19 @@ public final class Select2ChoiceUtil  {
         return select2Choice;
     }
 
+    public static Select2MultiChoice<ObjectAdapterMemento> newSelect2MultiChoice(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> modelObject,
+            final ScalarModel scalarModel) {
+
+        // TODO: naughty..
+        final IModel<Collection<ObjectAdapterMemento>> modelObjectColl = (IModel)modelObject;
+
+        Select2MultiChoice<ObjectAdapterMemento> select2Choice = new Select2MultiChoice<>(id, modelObjectColl, EmptyChoiceProvider.INSTANCE);
+        select2Choice.setRequired(scalarModel.isRequired());
+        return select2Choice;
+    }
+
     private static class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
 
         private static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
@@ -57,4 +72,6 @@ public final class Select2ChoiceUtil  {
             return null;
         }
     }
+
+
 }


[22/24] isis git commit: ISIS-785: adds some missing 'final' modifiers, is all.

Posted by da...@apache.org.
ISIS-785: adds some missing 'final' modifiers, is all.


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

Branch: refs/heads/maint-1.13.3
Commit: fbc259fb01c88a9016e66380e5c2744ef5499a3d
Parents: 69753e2
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Jan 18 17:09:51 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 17:09:51 2017 +0000

----------------------------------------------------------------------
 .../wicket/model/mementos/ObjectAdapterMemento.java       | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/fbc259fb/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index 4333cf4..609a047 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -175,7 +175,7 @@ public class ObjectAdapterMemento implements Serializable {
             @Override
             ObjectAdapter recreateAdapter(
                     final ObjectAdapterMemento oam,
-                    ConcurrencyChecking concurrencyChecking,
+                    final ConcurrencyChecking concurrencyChecking,
                     final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
                 return oam.transientMemento.recreateObject();
             }
@@ -197,22 +197,22 @@ public class ObjectAdapterMemento implements Serializable {
 
             @Override
             public void resetVersion(
-                    ObjectAdapterMemento objectAdapterMemento,
+                    final ObjectAdapterMemento objectAdapterMemento,
                     final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
             }
         };
 
         public ObjectAdapter getAdapter(
                 final ObjectAdapterMemento nom,
-                ConcurrencyChecking concurrencyChecking,
+                final ConcurrencyChecking concurrencyChecking,
                 final PersistenceSession persistenceSession,
                 final SpecificationLoader specificationLoader) {
             return recreateAdapter(nom, concurrencyChecking, persistenceSession, specificationLoader);
         }
 
         abstract ObjectAdapter recreateAdapter(
-                ObjectAdapterMemento nom,
-                ConcurrencyChecking concurrencyChecking,
+                final ObjectAdapterMemento nom,
+                final ConcurrencyChecking concurrencyChecking,
                 final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
 
         public abstract boolean equals(ObjectAdapterMemento oam, ObjectAdapterMemento other);


[07/24] isis git commit: ISIS-1529: changes TableColumnOrderService to use List rather than Set, as less confusing. Also added additional user guide docs on usage.

Posted by da...@apache.org.
ISIS-1529: changes TableColumnOrderService to use List<String> rather than Set<String>, as less confusing.  Also added additional user guide docs on usage.


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

Branch: refs/heads/maint-1.13.3
Commit: 12c472685e0cbc72f84658c5da1fa0df8f43116b
Parents: a3d9d9b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Nov 2 11:16:56 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 10:17:37 2017 +0000

----------------------------------------------------------------------
 .gitignore                                      |   1 +
 .../_rgsvc_spi_TableColumnOrderService.adoc     |  14 ++---
 .../src/main/asciidoc/guides/_ugvw_layout.adoc  |  54 ++++++++++++++++++-
 .../wicket-viewer/layouts/customer-order.png    | Bin 0 -> 6640 bytes
 .../tablecol/TableColumnOrderService.java       |  18 ++++---
 .../CollectionContentsAsAjaxTablePanel.java     |  41 +++++++-------
 6 files changed, 94 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index bb099fc..4ff8c82 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 *.class
 bin/
 target/
+.asciidoctor/
 target-ide/
 logs/
 .settings/

http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
index 197c114..c7091b3 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
@@ -16,20 +16,22 @@ The SPI defined by this service is:
 [source,java]
 ----
 public interface TableColumnOrderService {
-    Set<String> orderParented(                  // <1>
+    List<String> orderParented(                  // <1>
             Object parent,
             String collectionId,
             Class<?> collectionType,
-            Set<String> propertyIds);
-    Set<String> orderStandalone(                // <3>
+            List<String> propertyIds);
+    List<String> orderStandalone(                // <2>
             Class<?> collectionType,
-            Set<String> propertyIds);
+            List<String> propertyIds);
 }
 ----
-<1> for the parent collection owned by the specified parent and collection Id, return the set of property ids in the same or other order, else return `null` if provides no reordering.
+<1> for the parent collection owned by the specified parent and collection Id, return the set of property ids in the same or other order.
 <2> for the standalone collection of the specified type, return the set of property ids in the same or other order, else return `null` if provides no reordering.
 
-There can be multiple implementations of `TableColumnOrderService` registered; the first such service that returns a non-`null` value will be used.  If all provided implementations return `null`, then the framework will fallback to a default implementation.
+There can be multiple implementations of `TableColumnOrderService` registered, ordered as per xref:rgant.adoc#_rgant_DomainServiceLayout_menuOrder[`@DomainServiceLayout#menuOrder()`].
+The ordering provided by the first such service that returns a non-`null` value will be used.
+If all provided implementations return `null`, then the framework will fallback to a default implementation.
 
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/adocs/documentation/src/main/asciidoc/guides/_ugvw_layout.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_ugvw_layout.adoc b/adocs/documentation/src/main/asciidoc/guides/_ugvw_layout.adoc
index 07ee5ad..aae0eb5 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_ugvw_layout.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_ugvw_layout.adoc
@@ -6,7 +6,12 @@
 
 
 
-The wicket viewer has full support for the various methods of specifying the xref:ugfun.adoc#_ugfun_object-layout[layout of objects], either statically or dynamically.
+The layout of domain objects can be controlled either through annotations, or through the supplementary `layout.xml` file.
+Of these, the `layout.xml` file is superior; it offers more flexibility, and can be reloaded at runtime, thereby reducing the feedback loop.
+
+In addition, the layout can be fine-tuned using the xref:rgsvc.adoc#_rgsvc_spi_TableColumnOrderService[`TableColumnOrderService`] optional SPI service (`1.14.0-SNAPSHOT`).
+
+== `layout.xml`
 
 For more information, see:
 
@@ -20,3 +25,50 @@ For more information, see:
 
 
 
+== Reordering columns (`1.14.0-SNAPSHOT`)
+
+The optional xref:rgsvc.adoc#_rgsvc_spi_TableColumnOrderService[`TableColumnOrderService`] SPI service can be used to reorder columns in a table, either for a parented collection (owned by parent domain object) or a standalone collection (returned from an action invocation).
+
+For example, suppose there is a `Customer` and an `Order`:
+
+[plantuml, {_imagesdir}/wicket-viewer/layouts/customer-order, png]
+....
+Customer "1" *--> "many" Order : orders
+
+class Order {
+    int num
+    Date placedOn
+    Date shippedOn
+    State state
+}
+....
+
+The order of these properties of `Order`, when rendered in the context of its owning `Customer`, can be controlled using this implementation of `TableColumnOrderService`:
+
+[source,java]
+----
+@DomainService(
+    nature = NatureOfService.DOMAIN,
+    menuOrder = "100"                               // <1>
+)
+public class TableColumnOrderServiceForCustomerOrders
+                 implements TableColumnOrderService {
+    public List<String> orderParented(
+            final Object parent,
+            final String collectionId,
+            final Class<?> collectionType,
+            final List<String> propertyIds) {
+        return parent instanceof Customer && "orders".equals(collectionId)
+             ? Arrays.asList("num", "placedOn", "state", "shippedOn")
+             : null;
+    }
+    public List<String> orderStandalone(
+            final Class<?> collectionType,
+            final List<String> propertyIds) {
+        return null;
+    }
+}
+----
+<1> specifies the order in which the `TableColumnOrderService` implementations are called.
+
+

http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/adocs/documentation/src/main/asciidoc/guides/images/wicket-viewer/layouts/customer-order.png
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/images/wicket-viewer/layouts/customer-order.png b/adocs/documentation/src/main/asciidoc/guides/images/wicket-viewer/layouts/customer-order.png
new file mode 100644
index 0000000..025dfe0
Binary files /dev/null and b/adocs/documentation/src/main/asciidoc/guides/images/wicket-viewer/layouts/customer-order.png differ

http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
index 61ed5db..8aa2b25 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.applib.services.tablecol;
 
-import java.util.Set;
+import java.util.List;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
@@ -25,16 +25,16 @@ import org.apache.isis.applib.annotation.Programmatic;
 public interface TableColumnOrderService {
 
     @Programmatic
-    Set<String> orderParented(
+    List<String> orderParented(
             final Object parent,
             final String collectionId,
             final Class<?> collectionType,
-            final Set<String> propertyIds);
+            final List<String> propertyIds);
 
     @Programmatic
-    Set<String> orderStandalone(
+    List<String> orderStandalone(
             final Class<?> collectionType,
-            final Set<String> propertyIds);
+            final List<String> propertyIds);
 
     /**
      * Used as a fallback.
@@ -43,16 +43,18 @@ public interface TableColumnOrderService {
     public static class Default implements TableColumnOrderService {
 
         @Override
-        public Set<String> orderParented(
+        public List<String> orderParented(
                 final Object parent,
                 final String collectionId,
                 final Class<?> collectionType,
-                final Set<String> propertyIds) {
+                final List<String> propertyIds) {
             return propertyIds;
         }
 
         @Override
-        public Set<String> orderStandalone(final Class<?> collectionType, final Set<String> propertyIds) {
+        public List<String> orderStandalone(
+                final Class<?> collectionType,
+                final List<String> propertyIds) {
             return propertyIds;
         }
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/12c47268/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 650d931..c90e9e0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -21,7 +21,6 @@ package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable
 
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -192,29 +191,14 @@ public class CollectionContentsAsAjaxTablePanel
         for (final ObjectAssociation property : propertyList) {
             propertyById.put(property.getId(), property);
         }
-        Set<String> propertyIds = propertyById.keySet();
+        List<String> propertyIds = Lists.newArrayList(propertyById.keySet());
 
         // optional SPI to reorder
         final List<TableColumnOrderService> tableColumnOrderServices =
                 getServicesInjector().lookupServices(TableColumnOrderService.class);
 
-        Set<String> propertyReorderedIds = null;
-        for (TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
-            final ObjectAdapterMemento parentObjectAdapterMemento = getModel().getParentObjectAdapterMemento();
-
-            final Class<?> collectionType = getModel().getTypeOfSpecification().getCorrespondingClass();
-
-            if(parentObjectAdapterMemento != null) {
-                final ObjectAdapter parentObjectAdapter = parentObjectAdapterMemento
-                        .getObjectAdapter(ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
-                final Object parent = parentObjectAdapter.getObject();
-                final String collectionId = getModel().getCollectionMemento().getId();
-                propertyReorderedIds =
-                        tableColumnOrderService.orderParented(parent, collectionId, collectionType, propertyIds);
-            } else {
-                propertyReorderedIds =
-                        tableColumnOrderService.orderStandalone(collectionType, propertyIds);
-            }
+        for (final TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
+            final List<String> propertyReorderedIds = reordered(tableColumnOrderService, propertyIds);
             if(propertyReorderedIds != null) {
                 propertyIds = propertyReorderedIds;
                 break;
@@ -228,6 +212,25 @@ public class CollectionContentsAsAjaxTablePanel
         }
     }
 
+    private List<String> reordered(
+            final TableColumnOrderService tableColumnOrderService,
+            final List<String> propertyIds) {
+
+        final Class<?> collectionType = getModel().getTypeOfSpecification().getCorrespondingClass();
+
+        final ObjectAdapterMemento parentObjectAdapterMemento = getModel().getParentObjectAdapterMemento();
+        if(parentObjectAdapterMemento != null) {
+            final ObjectAdapter parentObjectAdapter = parentObjectAdapterMemento
+                    .getObjectAdapter(ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+            final Object parent = parentObjectAdapter.getObject();
+            final String collectionId = getModel().getCollectionMemento().getId();
+
+            return tableColumnOrderService.orderParented(parent, collectionId, collectionType, propertyIds);
+        } else {
+            return tableColumnOrderService.orderStandalone(collectionType, propertyIds);
+        }
+    }
+
     static Filter<ObjectAssociation> associationDoesNotReferenceParent(final ObjectSpecification parentSpec) {
         if(parentSpec == null) {
             return Filters.any();


[06/24] isis git commit: ISIS-1529: adds TableColumnOrderService

Posted by da...@apache.org.
ISIS-1529: adds TableColumnOrderService


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

Branch: refs/heads/maint-1.13.3
Commit: a3d9d9beb8284b462be9c9e36bd7696637209cd2
Parents: fbb0475
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Nov 2 00:03:40 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Jan 18 10:17:29 2017 +0000

----------------------------------------------------------------------
 .../guides/_rgsvc_presentation-layer-spi.adoc   | 13 +++++
 .../_rgsvc_spi_TableColumnOrderService.adoc     | 47 ++++++++++++++++
 .../tablecol/TableColumnOrderService.java       | 59 ++++++++++++++++++++
 .../CollectionContentsAsAjaxTablePanel.java     | 45 +++++++++++++++
 4 files changed, 164 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a3d9d9be/adocs/documentation/src/main/asciidoc/guides/_rgsvc_presentation-layer-spi.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_presentation-layer-spi.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_presentation-layer-spi.adoc
index 4c0ac73..c71a074 100644
--- a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_presentation-layer-spi.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_presentation-layer-spi.adoc
@@ -130,6 +130,18 @@ Used by the xref:ugvw.adoc#[Wicket viewer] only.
 
 
 
+|xref:rgsvc.adoc#_rgsvc_spi_TableColumnOrderService[`o.a.i.applib.` +
+`services.tablecol` +
+`TableColumn-` +
+`OrderService`]
+|Allows the columns of a parented or standalone table to be reordered, based upon the parent object, collection id and type of object in the collection..
+|`TableColumn-` +
+`OrderService.Default` +
+``o.a.i.core`` +
+``isis-core-applib``
+|
+
+
 |xref:rgsvc.adoc#_rgsvc_spi_TranslationService[`o.a.i.applib.` +
 `services.i18n` +
 `TranslationService`]
@@ -195,6 +207,7 @@ include::_rgsvc_spi_GridService.adoc[leveloffset=+1]
 include::_rgsvc_spi_HintStore.adoc[leveloffset=+1]
 include::_rgsvc_spi_LocaleProvider.adoc[leveloffset=+1]
 include::_rgsvc_spi_RoutingService.adoc[leveloffset=+1]
+include::_rgsvc_spi_TableColumnOrderService.adoc[leveloffset=+1]
 include::_rgsvc_spi_TranslationService.adoc[leveloffset=+1]
 include::_rgsvc_spi_TranslationsResolver.adoc[leveloffset=+1]
 include::_rgsvc_spi_UrlEncodingService.adoc[leveloffset=+1]

http://git-wip-us.apache.org/repos/asf/isis/blob/a3d9d9be/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
new file mode 100644
index 0000000..197c114
--- /dev/null
+++ b/adocs/documentation/src/main/asciidoc/guides/_rgsvc_spi_TableColumnOrderService.adoc
@@ -0,0 +1,47 @@
+[[_rgsvc_spi_TableColumnOrderService]]
+= `TableColumnOrderService`
+:Notice: 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.
+:_basedir: ../
+:_imagesdir: images/
+
+
+
+The `TableColumnOrderService` (`1.14.0-SNAPSHOT`) provides the ability to reorder (or suppress) columns in both parented- and standalone tables.
+
+
+== SPI
+
+The SPI defined by this service is:
+
+[source,java]
+----
+public interface TableColumnOrderService {
+    Set<String> orderParented(                  // <1>
+            Object parent,
+            String collectionId,
+            Class<?> collectionType,
+            Set<String> propertyIds);
+    Set<String> orderStandalone(                // <3>
+            Class<?> collectionType,
+            Set<String> propertyIds);
+}
+----
+<1> for the parent collection owned by the specified parent and collection Id, return the set of property ids in the same or other order, else return `null` if provides no reordering.
+<2> for the standalone collection of the specified type, return the set of property ids in the same or other order, else return `null` if provides no reordering.
+
+There can be multiple implementations of `TableColumnOrderService` registered; the first such service that returns a non-`null` value will be used.  If all provided implementations return `null`, then the framework will fallback to a default implementation.
+
+
+
+== Implementation
+
+The framework provides a fallback implementation of this service, namely `TableColumnOrderService.Default`.
+
+
+== Registering the Services
+
+Assuming that the `configuration-and-annotation` services installer is configured (implicit if using the
+`AppManifest` to xref:rgcms.adoc#_rgcms_classes_AppManifest-bootstrapping[bootstrap the app]), then the
+ default implementation of `TableColumnOrderService` is automatically registered and injected, and no further
+ configuration is required.
+

http://git-wip-us.apache.org/repos/asf/isis/blob/a3d9d9be/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
new file mode 100644
index 0000000..61ed5db
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/tablecol/TableColumnOrderService.java
@@ -0,0 +1,59 @@
+/**
+ *  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.applib.services.tablecol;
+
+import java.util.Set;
+
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
+
+public interface TableColumnOrderService {
+
+    @Programmatic
+    Set<String> orderParented(
+            final Object parent,
+            final String collectionId,
+            final Class<?> collectionType,
+            final Set<String> propertyIds);
+
+    @Programmatic
+    Set<String> orderStandalone(
+            final Class<?> collectionType,
+            final Set<String> propertyIds);
+
+    /**
+     * Used as a fallback.
+     */
+    @DomainService(nature = NatureOfService.DOMAIN)
+    public static class Default implements TableColumnOrderService {
+
+        @Override
+        public Set<String> orderParented(
+                final Object parent,
+                final String collectionId,
+                final Class<?> collectionType,
+                final Set<String> propertyIds) {
+            return propertyIds;
+        }
+
+        @Override
+        public Set<String> orderStandalone(final Class<?> collectionType, final Set<String> propertyIds) {
+            return propertyIds;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/a3d9d9be/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index d37b8e5..650d931 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -20,8 +20,11 @@
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -33,12 +36,14 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.applib.layout.component.Grid;
+import org.apache.isis.applib.services.tablecol.TableColumnOrderService;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -183,7 +188,41 @@ public class CollectionContentsAsAjaxTablePanel
                 associationDoesNotReferenceParent(parentSpecIfAny));
         
         final List<? extends ObjectAssociation> propertyList = typeOfSpec.getAssociations(Contributed.INCLUDED, filter);
+        final Map<String, ObjectAssociation> propertyById = Maps.newLinkedHashMap();
         for (final ObjectAssociation property : propertyList) {
+            propertyById.put(property.getId(), property);
+        }
+        Set<String> propertyIds = propertyById.keySet();
+
+        // optional SPI to reorder
+        final List<TableColumnOrderService> tableColumnOrderServices =
+                getServicesInjector().lookupServices(TableColumnOrderService.class);
+
+        Set<String> propertyReorderedIds = null;
+        for (TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
+            final ObjectAdapterMemento parentObjectAdapterMemento = getModel().getParentObjectAdapterMemento();
+
+            final Class<?> collectionType = getModel().getTypeOfSpecification().getCorrespondingClass();
+
+            if(parentObjectAdapterMemento != null) {
+                final ObjectAdapter parentObjectAdapter = parentObjectAdapterMemento
+                        .getObjectAdapter(ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+                final Object parent = parentObjectAdapter.getObject();
+                final String collectionId = getModel().getCollectionMemento().getId();
+                propertyReorderedIds =
+                        tableColumnOrderService.orderParented(parent, collectionId, collectionType, propertyIds);
+            } else {
+                propertyReorderedIds =
+                        tableColumnOrderService.orderStandalone(collectionType, propertyIds);
+            }
+            if(propertyReorderedIds != null) {
+                propertyIds = propertyReorderedIds;
+                break;
+            }
+        }
+
+        for (final String propertyId : propertyIds) {
+            final ObjectAssociation property = propertyById.get(propertyId);
             final ColumnAbstract<ObjectAdapter> nopc = createObjectAdapterPropertyColumn(property);
             columns.add(nopc);
         }
@@ -241,6 +280,12 @@ public class CollectionContentsAsAjaxTablePanel
         return settings;
     }
 
+
+    protected ServicesInjector getServicesInjector() {
+        return getIsisSessionFactory().getServicesInjector();
+    }
+
+
     //endregion
 
 }