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/20 16:18:08 UTC

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

Repository: isis
Updated Branches:
  refs/heads/master f8b2faa87 -> bf9b97a46


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/master
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


[27/36] isis git commit: ISIS-785: removes println debug stmt from SpecificationLoader

Posted by da...@apache.org.
ISIS-785: removes println debug stmt from SpecificationLoader


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

Branch: refs/heads/master
Commit: 885b49419e00567aec33096a66a751c6122bd8d7
Parents: 03b8f4a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 14:20:56 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 14:20:56 2017 +0000

----------------------------------------------------------------------
 .../apache/isis/core/metamodel/specloader/SpecificationLoader.java  | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/885b4941/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 eb34dc0..5172394 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
@@ -562,7 +562,6 @@ public class SpecificationLoader implements ApplicationScopedComponent {
         }
 
         if(genericParameterType instanceof ParameterizedType) {
-            System.out.println(genericParameterType);
             final ParameterizedType parameterizedType = (ParameterizedType) genericParameterType;
             final Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
             if(actualTypeArguments.length == 1) {


[24/36] 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/master
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)"));


[23/36] 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/master
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;
         }
     }
+
+
 }


[35/36] isis git commit: ISIS-785: fixes conflicts for merging maint-1.13.3 (Wicket 6.x) into master (Wicket 7.x)

Posted by da...@apache.org.
ISIS-785: fixes conflicts for merging maint-1.13.3 (Wicket 6.x) into master (Wicket 7.x)


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

Branch: refs/heads/master
Commit: a3b7770d1c6672d116f3a27b3d3f5743ef893bb7
Parents: f8b2faa 482286e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 15:18:06 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 15:18:06 2017 +0000

----------------------------------------------------------------------
 .../isis/schema/utils/CommonDtoUtils.java       |  30 +-
 .../core/metamodel/facetapi/FeatureType.java    |  21 +-
 .../core/metamodel/facets/FacetedMethod.java    |  70 ++++-
 .../facets/FacetedMethodParameter.java          |   8 +-
 .../isis/core/metamodel/facets/TypedHolder.java |   7 +-
 .../metamodel/facets/TypedHolderDefault.java    |   4 +-
 .../facets/actcoll/typeof/TypeOfFacet.java      |  94 ++++++
 .../action/ActionAnnotationFacetFactory.java    |  82 +----
 ...llectionAccessorFacetViaAccessorFactory.java |   3 +
 .../semantics/CollectionSemantics.java          | 104 +++++++
 .../semantics/CollectionSemanticsFacet.java     |  29 ++
 .../CollectionSemanticsFacetDefault.java        |  47 +++
 .../metamodel/spec/ObjectSpecification.java     |   2 +-
 .../spec/feature/OneToManyActionParameter.java  |  28 ++
 .../spec/feature/OneToManyFeature.java          |  35 +--
 .../metamodel/specloader/CollectionUtils.java   |  47 +++
 .../specloader/SpecificationLoader.java         |   1 +
 .../facetprocessor/FacetProcessor.java          |  23 +-
 .../specimpl/FacetedMethodsBuilder.java         |   2 +-
 .../specimpl/ObjectActionContributee.java       |  20 +-
 .../specimpl/ObjectActionDefault.java           |  18 +-
 .../specimpl/ObjectActionMixedIn.java           |  19 +-
 .../specimpl/ObjectActionParameterAbstract.java |  20 +-
 ...bjectActionParameterContributeeAbstract.java |  71 +++++
 .../ObjectActionParameterMixedInAbstract.java   |  73 +++++
 .../OneToManyActionParameterContributee.java    |  41 +++
 .../OneToManyActionParameterDefault.java        |  43 +++
 .../OneToManyActionParameterMixedIn.java        |  38 +++
 .../specimpl/OneToManyAssociationDefault.java   |  22 +-
 .../OneToOneActionParameterContributee.java     |  44 +--
 .../OneToOneActionParameterDefault.java         |   3 +-
 .../OneToOneActionParameterMixedIn.java         |  49 +--
 .../AbstractFacetFactoryJUnit4TestCase.java     |   3 +-
 .../facets/AbstractFacetFactoryTest.java        |   3 +-
 .../actions/ActionMethodsFacetFactoryTest.java  |  16 +-
 ...tationFacetFactoryTest_actionInvocation.java |   8 +-
 ...nLayoutAnnotationFacetFactoryJunit4Test.java |  18 +-
 ...erivedFromDomainServiceFacetFactoryTest.java |  10 +-
 ...erivedFromDomainServiceFacetFactoryTest.java |  10 +-
 ...ParameterAbstractTest_getId_and_getName.java |   8 +-
 ...ivenAuditableAnnotationFacetFactoryTest.java |   9 +-
 ...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 +-
 core/schema/pom.xml                             |   8 +-
 .../org/apache/isis/schema/bindings.xml         |  12 +-
 .../org/apache/isis/schema/chg/chg-1.0.xsd      | 115 -------
 .../org/apache/isis/schema/chg/chg-1.1.xsd      | 115 +++++++
 .../org/apache/isis/schema/cmd/cmd-1.0.xsd      | 151 ---------
 .../org/apache/isis/schema/cmd/cmd-1.2.xsd      | 151 +++++++++
 .../apache/isis/schema/common/common-1.0.xsd    | 191 ------------
 .../apache/isis/schema/common/common-1.1.xsd    | 204 ++++++++++++
 .../org/apache/isis/schema/ixn/ixn-1.0.xsd      | 215 -------------
 .../org/apache/isis/schema/ixn/ixn-1.1.xsd      | 215 +++++++++++++
 .../ComponentFactoryRegistrarDefault.java       |   2 +-
 .../model/mementos/ObjectAdapterMemento.java    | 244 +++++++++++++--
 .../model/models/ActionArgumentModel.java       |  33 ++
 .../viewer/wicket/model/models/ActionModel.java |  35 +--
 .../viewer/wicket/model/models/EntityModel.java |  13 +
 .../viewer/wicket/model/models/ScalarModel.java | 123 +++++++-
 .../models/ScalarModelWithMultiPending.java     | 107 +++++++
 .../model/models/ScalarModelWithPending.java    |   8 +-
 .../actions/ActionParametersFormPanel.java      |   9 +-
 .../scalars/ComponentFactoryScalarAbstract.java |   6 +-
 .../ScalarPanelTextFieldParseableAbstract.java  |   3 -
 .../components/scalars/TextFieldAbstract.java   |   4 -
 .../scalars/jdkdates/JavaSqlTimestampPanel.java |   1 -
 .../reference/EntityLinkSelect2Panel.java       |   9 +-
 .../scalars/reference/ReferencePanel.java       | 268 ++++++++--------
 .../scalars/value/ValuePanelFactory.java        |   5 +-
 .../valuechoices/ValueChoicesSelect2Panel.html  |  50 +++
 .../valuechoices/ValueChoicesSelect2Panel.java  | 302 ++++++++++++++++++
 .../ValueChoicesSelect2PanelFactory.java        |  65 ++++
 .../ObjectAdapterMementoProviderAbstract.java   | 163 ----------
 .../entitysimplelink/EntityLinkSimplePanel.java |   8 +-
 .../components/widgets/select2/ChoiceExt.java   |  38 +++
 .../ui/components/widgets/select2/Select2.java  | 178 +++++++++++
 .../widgets/select2/Select2ChoiceExt.java       |  51 +++
 .../widgets/select2/Select2ChoiceUtil.java      |  76 -----
 .../widgets/select2/Select2MultiChoiceExt.java  |  61 ++++
 .../select2/providers/EmptyChoiceProvider.java  |  54 ++++
 .../ObjectAdapterMementoProviderAbstract.java   | 156 ++++++++++
 ...apterMementoProviderForReferenceChoices.java |  54 ++++
 ...oProviderForReferenceObjectAutoComplete.java |  60 ++++
 ...ForReferenceParamOrPropertyAutoComplete.java |  56 ++++
 ...ctAdapterMementoProviderForValueChoices.java |  52 ++++
 .../valuechoices/ValueChoicesSelect2Panel.html  |  50 ---
 .../valuechoices/ValueChoicesSelect2Panel.java  | 311 -------------------
 .../ValueChoicesSelect2PanelFactory.java        |  58 ----
 .../FixedObjectAdapterMementoProviderTest.java  |  84 -----
 ...apterMementoProviderForValueChoicesTest.java |  81 +++++
 example/application/simpleapp/pom.xml           |   4 +
 98 files changed, 3514 insertions(+), 1946 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/EntityLinkSelect2Panel.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 95b0fac,4e5bc79..a0f6f75
--- 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
@@@ -540,13 -520,4 +524,13 @@@ public class ReferencePanel extends Sca
          return getIsisSessionFactory().getConfiguration();
      }
  
 +    /**
 +     * Repaints just the Select2 component
 +     *
 +     * @param target The Ajax request handler
 +     */
 +    @Override
 +    public void repaint(AjaxRequestTarget target) {
-         target.add(select2Field);
++        target.add(select2.component());
 +    }
  }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
index 0000000,0874436..26b41c7
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
@@@ -1,0 -1,49 +1,50 @@@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!--
+   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.
+ -->
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml"  
 -      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
++      xmlns:wicket="http://wicket.apache.org"
+       xml:lang="en"  
+       lang="en">
+     <body>
+         <wicket:panel>
+             <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
+                 <div class="form-group" wicket:id="scalarIfRegular">
+                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
++
+                     <span class="scalarValueWrapper">
+                         <div class="scalarPlaceholder">
+                             <span class="scalarValueInput">
+                                 <span class="editing">
 -                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
 -                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
++                                    <select wicket:id="scalarValue" class="choices input-sm select2-remote" style="width: 99.8%;"></select>
++                                    <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                 </span>
+                             </span>
+                             <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                         </div>
+                         <span wicket:id="feedback" class="help-block"></span>
+                         <span wicket:id="associatedActionLinksBelow"></span>
+                     </span>
 -                    <div class="clearfix"/>
++                    <div class="clearfix"></div>
+                 </div>
+                 <span wicket:id="scalarIfCompact"></span>
+             </div>
+         </wicket:panel>
+     </body>
+ </html>

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 0000000,28a315e..27972d2
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@@ -1,0 -1,291 +1,302 @@@
+ /**
+  *  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.valuechoices;
+ 
+ import java.util.ArrayList;
+ import java.util.List;
+ 
+ import com.google.common.base.Strings;
+ import com.google.common.collect.Lists;
+ 
+ import org.apache.wicket.AttributeModifier;
+ import org.apache.wicket.Component;
+ import org.apache.wicket.MarkupContainer;
++import org.apache.wicket.ajax.AjaxRequestTarget;
+ import org.apache.wicket.behavior.Behavior;
+ import org.apache.wicket.markup.html.basic.Label;
+ import org.apache.wicket.model.IModel;
+ import org.apache.wicket.model.Model;
+ import org.wicketstuff.select2.ChoiceProvider;
+ 
+ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+ 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.ScalarModel;
+ 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.components.actionmenu.entityactions.EntityActionUtil;
+ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+ import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
+ import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+ import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+ 
+ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
+ 
+     private static final long serialVersionUID = 1L;
+ 
+     private Select2 select2;
+     private ObjectAdapterMemento pending;
+ 
+     public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
+         super(id, scalarModel);
+         pending = scalarModel.getObjectAdapterMemento();
+     }
+ 
+     @Override
+     protected MarkupContainer addComponentForRegular() {
+ 
+         // same pattern as in ReferencePanel
+         if(select2 == null) {
+             if(getModel().isCollection()) {
+                 final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
+                 select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
+             } else {
+                 final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+                 select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
+             }
+ 
+             final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
+             setProviderAndCurrAndPending(select2, actionArgsHint);
+             addStandardSemantics();
+         } else {
+             select2.clearInput();
+         }
+ 
+ 
+         final MarkupContainer labelIfRegular = createFormComponentLabel();
+         if(getModel().isRequired()) {
+             labelIfRegular.add(new CssClassAppender("mandatory"));
+         }
+         
+         addOrReplace(labelIfRegular);
+ 
+         final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
+         if(getModel().isRequired()) {
+             final String label = scalarName.getDefaultModelObjectAsString();
+             if(!Strings.isNullOrEmpty(label)) {
+                 scalarName.add(new CssClassAppender("mandatory"));
+             }
+         }
+         labelIfRegular.addOrReplace(scalarName);
+         NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+         if (namedFacet != null) {
+             scalarName.setEscapeModelStrings(namedFacet.escaped());
+         }
+ 
+         // find the links...
+         final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+ 
+         addPositioningCssTo(labelIfRegular, entityActions);
+ 
+         addFeedbackOnlyTo(labelIfRegular, select2.component());
+         addEditPropertyTo(labelIfRegular);
+ 
+         // ... add entity links to panel (below and to right)
+         addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
+ 
+         return labelIfRegular;
+     }
+ 
+     private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
+         final List<ObjectAdapter> choices =
+                 scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
+         
+         // take a copy otherwise is only lazily evaluated
+         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
+     }
+ 
+     protected void addStandardSemantics() {
+         setRequiredIfSpecified();
+     }
+ 
+     private void setRequiredIfSpecified() {
+         final ScalarModel scalarModel = getModel();
+         final boolean required = scalarModel.isRequired();
+         select2.setRequired(required);
+     }
+ 
+     protected MarkupContainer createFormComponentLabel() {
+         final String name = getModel().getName();
+         select2.setLabel(Model.of(name));
+ 
+         final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
+ 
+         final String describedAs = getModel().getDescribedAs();
+         if(describedAs != null) {
+             labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
+         }
+ 
+         labelIfRegular.add(select2.component());
+ 
+         return labelIfRegular;
+     }
+ 
+     @Override
+     protected Component addComponentForCompact() {
+         final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
+         addOrReplace(labelIfCompact);
+         return labelIfCompact;
+     }
+ 
+     
+     protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
+         return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
+     }
+ 
+     @Override
+     protected boolean alwaysRebuildGui() {
+         return true;
+     }
+ 
+     @Override
+     protected void onBeforeRenderWhenViewMode() { 
+         // View: Read only
+         select2.setEnabled(false);
+     }
+ 
+     @Override
+     protected void onBeforeRenderWhenEnabled() { 
+         // Edit: read/write
+         select2.setEnabled(true);
+ 
+         // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
+     }
+ 
+     @Override
+     protected void onBeforeRenderWhenDisabled(final String disableReason) {
+         super.onBeforeRenderWhenDisabled(disableReason);
+         setTitleAttribute(disableReason);
+         select2.setEnabled(false);
+     }
+ 
+     private void setTitleAttribute(final String titleAttribute) {
+         getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
+     }
+ 
+     
+     @Override
+     protected void addFormComponentBehavior(Behavior behavior) {
+         for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
+             select2.remove(b);
+         }
+         select2.add(behavior);
+     }
+ 
+     // //////////////////////////////////////
+ 
+     @Override
+     public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+         if(select2 != null) {
+             setProviderAndCurrAndPending(select2, argsIfAvailable);
+             return true;
+         } else {
+             return false;
+         }
+     }
+ 
+     /**
++     * Repaints just the Select2 component
++     *
++     * @param target The Ajax request handler
++     */
++    @Override
++    public void repaint(AjaxRequestTarget target) {
++        target.add(select2.component());
++    }
++
++    /**
+      * sets up the choices, also ensuring that any currently held value is compatible.
+      */
+     private void setProviderAndCurrAndPending(final Select2 select2, ObjectAdapter[] argsIfAvailable) {
+ 
+         final ChoiceProvider<ObjectAdapterMemento> provider;
+ 
+         // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers
+         // (choice vs autoComplete).  Here though - because values don't currently support autoComplete - no branch is required
+         final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
+         provider = newChoiceProvider(choicesMementos);
+ 
+         select2.setProvider(provider);
+         getModel().clearPending();
+ 
+         if(provider instanceof ObjectAdapterMementoProviderForValueChoices) {
+             final ObjectAdapterMementoProviderForValueChoices providerFixed = (ObjectAdapterMementoProviderForValueChoices) provider;
+             final List<ObjectAdapterMemento> choicesMementos1 = providerFixed.getChoicesMementos();
+             resetIfCurrentNotInChoices(select2, choicesMementos1);
+         }
+     }
+ 
+     private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
+         final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
+         if(objectAdapterMemento == null) {
+             select2.getModel().setObject(null);
+         } else {
+ 
+             if(!getModel().isCollection()) {
+ 
+                 // if currently held value is not compatible with choices, then replace with the first choice
+                 if(!choicesMementos.contains(objectAdapterMemento)) {
+ 
+                     final ObjectAdapterMemento newAdapterMemento =
+                             choicesMementos.isEmpty()
+                                     ? null
+                                     : choicesMementos.get(0);
+ 
+                     select2.getModel().setObject(newAdapterMemento);
+                     getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
+                 }
+ 
+             } else {
+ 
+                 // nothing to do
+             }
+         }
+     }
+ 
+     // //////////////////////////////////////
+ 
+     @Override
+     public ObjectAdapterMemento getPending() {
+         return pending;
+     }
+ 
+     public void setPending(ObjectAdapterMemento pending) {
+         this.pending = pending;
+     }
+ 
+     @Override
+     public ArrayList<ObjectAdapterMemento> getMultiPending() {
+         return pending != null ? pending.getList() : null;
+     }
+ 
+     @Override
+     public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+         this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
+     }
+ 
+     public ScalarModel getScalarModel() {
+         return scalarModel;
+     }
+ 
+     // //////////////////////////////////////
+ 
+     @com.google.inject.Inject
+     private WicketViewerSettings wicketViewerSettings;
+ }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
index 0000000,041af1e..916e624
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@@ -1,0 -1,178 +1,178 @@@
+ /*
+  *  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.widgets.select2;
+ 
+ import java.io.Serializable;
+ import java.util.ArrayList;
+ import java.util.Collection;
+ import java.util.List;
+ 
+ import org.apache.wicket.behavior.Behavior;
 -import org.apache.wicket.markup.html.form.HiddenField;
+ import org.apache.wicket.model.IModel;
+ import org.apache.wicket.model.Model;
++import org.wicketstuff.select2.AbstractSelect2Choice;
+ import org.wicketstuff.select2.ChoiceProvider;
+ import org.wicketstuff.select2.Select2Choice;
+ import org.wicketstuff.select2.Select2MultiChoice;
+ import org.wicketstuff.select2.Settings;
+ 
+ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+ 
+ /**
+  * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+  */
+ public class Select2 implements Serializable {
+ 
+     private static final long serialVersionUID = 1L;
+ 
+     final Select2ChoiceExt select2Choice;
+     final Select2MultiChoiceExt select2MultiChoice;
+ 
+     public static Select2 newSelect2Choice(
+             final String id,
+             final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+         return new Select2(
+                 Select2ChoiceExt.create(id, singleModel, parentModel),
+                 null
+         );
+     }
+ 
+     public static Select2 newSelect2MultiChoice(
+             final String id,
+             final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+             final ScalarModel parentModel) {
+         return new Select2(
+                 null,
+                 Select2MultiChoiceExt.create(id, multiModel, parentModel)
+         );
+     }
+ 
+     private Select2(
+             final Select2ChoiceExt select2Choice,
+             final Select2MultiChoiceExt select2MultiChoice) {
+         this.select2Choice = select2Choice;
+         this.select2MultiChoice = select2MultiChoice;
+     }
+ 
 -    public HiddenField<?> component() {
++    public AbstractSelect2Choice component() {
+         return select2Choice != null
+                 ? select2Choice
+                 : select2MultiChoice;
+     }
+ 
+     public ChoiceExt choiceExt() {
+         return select2Choice != null
+                 ? select2Choice
+                 : select2MultiChoice;
+     }
+ 
+     public void clearInput() {
+         component().clearInput();
+     }
+ 
+     public void setEnabled(final boolean mutability) {
+         component().setEnabled(mutability);
+     }
+ 
+     public void setRequired(final boolean required) {
+         component().setRequired(required);
+     }
+     public boolean checkRequired() {
+         return component().checkRequired();
+     }
+ 
+     public Settings getSettings() {
+         return choiceExt().getSettings();
+     }
+ 
+     public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+         choiceExt().setProvider(providerForChoices);
+     }
+ 
+     public ObjectAdapterMemento getModelObject() {
+         if (select2Choice != null) {
+             return select2Choice.getModelObject();
+         } else {
+             final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+ 
+             return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+         }
+     }
+ 
+     public IModel<ObjectAdapterMemento> getModel() {
+         if (select2Choice != null) {
+             return select2Choice.getModel();
+         } else {
+             final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+             final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+ 
+             final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+             return new IModel<ObjectAdapterMemento>() {
+                 @Override
+                 public ObjectAdapterMemento getObject() {
+                     return memento;
+                 }
+ 
+                 @Override
+                 public void setObject(final ObjectAdapterMemento memento) {
+ 
+                     if(memento == null) {
+                         model.setObject(null);
+                         return;
+                     }
+ 
+                     final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
+                     model.setObject(mementos);
+                 }
+ 
+                 @Override
+                 public void detach() {
+                 }
+             };
+         }
+     }
+ 
+     public ObjectAdapterMemento getConvertedInput() {
+         if (select2Choice != null) {
+             return select2Choice.getConvertedInput();
+         } else {
+             final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+             return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
+         }
+     }
+ 
+     public void setLabel(final Model<String> model) {
+         component().setLabel(model);
+     }
+ 
+     public void add(final Behavior behavior) {
+         component().add(behavior);
+     }
+ 
+     public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+         return component().getBehaviors(behaviorClass);
+     }
+ 
+     public void remove(final Behavior behavior) {
+         component().remove(behavior);
+     }
+ 
+ 
+ }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
index 0000000,dbc0e85..aa4387b
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
@@@ -1,0 -1,44 +1,54 @@@
+ /**
+  *  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.widgets.select2.providers;
+ 
+ import java.util.Collection;
+ 
+ import org.apache.wicket.ajax.json.JSONException;
+ import org.apache.wicket.ajax.json.JSONWriter;
+ import org.wicketstuff.select2.ChoiceProvider;
+ import org.wicketstuff.select2.Response;
+ 
+ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+ 
+ public class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+ 
+     public static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+ 
+     @Override
++    public String getDisplayValue(ObjectAdapterMemento object) {
++        return null;
++    }
++
++    @Override
++    public String getIdValue(ObjectAdapterMemento object) {
++        return null;
++    }
++
++    @Override
+     public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+     }
+ 
+     @Override
+     public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+     }
+ 
+     @Override
+     public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+         return null;
+     }
+ }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index 0000000,0143749..b4347ab
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@@ -1,0 -1,157 +1,156 @@@
+ /**
+  *  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.widgets.select2.providers;
+ 
+ import java.util.Collection;
+ import java.util.List;
+ import java.util.Locale;
+ 
+ import com.google.common.collect.Lists;
 -
++import org.wicketstuff.select2.ChoiceProvider;
+ import org.apache.wicket.Session;
+ import org.apache.wicket.util.convert.IConverter;
+ import org.apache.wicket.util.string.Strings;
 -import org.wicketstuff.select2.TextChoiceProvider;
+ 
+ import org.apache.isis.core.commons.authentication.AuthenticationSession;
+ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+ import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+ import org.apache.isis.core.runtime.system.context.IsisContext;
+ import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+ import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
+ 
 -public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
++public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvider<ObjectAdapterMemento> {
+ 
+     private static final long serialVersionUID = 1L;
+     
+     protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
+     private static final String NULL_DISPLAY_TEXT = "";
+ 
+     private final ScalarModel scalarModel;
+     private final WicketViewerSettings wicketViewerSettings;
+ 
+     public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
+         this.scalarModel = scalarModel;
+         this.wicketViewerSettings = wicketViewerSettings;
+     }
+     
+     @Override
 -    protected String getDisplayText(final ObjectAdapterMemento choice) {
++    public String getDisplayValue(final ObjectAdapterMemento choice) {
+         if (choice == null) {
+             return NULL_DISPLAY_TEXT;
+         }
+ 
+         final ObjectAdapter objectAdapter =
+                 choice.getObjectAdapter(
+                         ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+         final IConverter<Object> converter = findConverter(objectAdapter);
+         return converter != null
+                 ? converter.convertToString(objectAdapter.getObject(), getLocale())
+                 : objectAdapter.titleString(null);
+     }
+ 
+     protected Locale getLocale() {
+         return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
+     }
+ 
+     protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
+         return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
+     }
+ 
+     @Override
 -    protected Object getId(final ObjectAdapterMemento choice) {
++    public String getIdValue(final ObjectAdapterMemento choice) {
+         return choice != null? choice.asString(): NULL_PLACEHOLDER;
+     }
+ 
+     @Override
+     public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
+         
+         final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
+         // if not mandatory, and the list doesn't contain null already, then add it in.
+         if(!scalarModel.isRequired() && !mementos.contains(null)) {
+             mementos.add(0, null);
+         }
+         response.addAll(mementos);
+     }
+ 
+     protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
+ 
+     /**
+      * Filters all choices against a term by using their
+      * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
+      *
+      * @param term The term entered by the user
+      * @param choicesMementos The collections of choices to filter
+      * @return A list of all matching choices
+      */
+     protected final List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
+         List<ObjectAdapterMemento> matches = Lists.newArrayList();
+         if (Strings.isEmpty(term)) {
+             matches.addAll(choicesMementos);
+         } else {
+             for (ObjectAdapterMemento candidate : choicesMementos) {
+                 ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                         getPersistenceSession(), getSpecificationLoader());
+                 String title = objectAdapter.titleString(objectAdapter);
+                 if (title.toLowerCase().contains(term.toLowerCase())) {
+                     matches.add(candidate);
+                 }
+             }
+         }
+ 
+         return matches;
+     }
+ 
+ 
+     protected ScalarModel getScalarModel() {
+         return scalarModel;
+     }
+ 
+ 
+     ///////////////////////////////////////////////////////
+     // Dependencies (from context)
+     ///////////////////////////////////////////////////////
+ 
+ 
+     protected SpecificationLoader getSpecificationLoader() {
+         return getIsisSessionFactory().getSpecificationLoader();
+     }
+ 
+     PersistenceSession getPersistenceSession() {
+         return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+     }
+ 
+     protected IsisSessionFactory getIsisSessionFactory() {
+         return IsisContext.getSessionFactory();
+     }
+ 
+     public AuthenticationSession getAuthenticationSession() {
+         return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+     }
+ 
+     public DeploymentCategory getDeploymentCategory() {
+         return getIsisSessionFactory().getDeploymentCategory();
+     }
+ 
+ 
+ }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
----------------------------------------------------------------------
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
index 0000000,cf52db6..a846822
mode 000000,100644..100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
@@@ -1,0 -1,52 +1,52 @@@
+ package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+ 
+ import java.util.Collection;
+ import java.util.List;
+ 
+ import com.google.common.base.Predicate;
+ import com.google.common.collect.FluentIterable;
+ import com.google.common.collect.Lists;
+ 
+ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+ 
+ public class ObjectAdapterMementoProviderForValueChoices
+         extends ObjectAdapterMementoProviderAbstract {
+ 
+     private static final long serialVersionUID = 1L;
+     private final List<ObjectAdapterMemento> choicesMementos;
+ 
+     public ObjectAdapterMementoProviderForValueChoices(
+             final ScalarModel scalarModel,
+             final List<ObjectAdapterMemento> choicesMementos,
+             final WicketViewerSettings wicketViewerSettings) {
+         super(scalarModel, wicketViewerSettings);
+         this.choicesMementos = choicesMementos;
+     }
+ 
+     @Override
+     protected List<ObjectAdapterMemento> obtainMementos(String term) {
+         return obtainMementos(term, choicesMementos);
+     }
+ 
+     public List<ObjectAdapterMemento> getChoicesMementos() {
+         return choicesMementos;
+     }
+ 
+     @Override
+     public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+         final List<ObjectAdapterMemento> mementos = obtainMementos(null);
+ 
+         final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
+             @Override
+             public boolean apply(ObjectAdapterMemento input) {
 -                final String id = (String) getId(input);
++                final String id = getIdValue(input);
+                 return ids.contains(id);
+             }
+         };
+         return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
+     }
+ 
+ 
+ }

http://git-wip-us.apache.org/repos/asf/isis/blob/a3b7770d/example/application/simpleapp/pom.xml
----------------------------------------------------------------------
diff --cc example/application/simpleapp/pom.xml
index ff1b33d,d9f5b76..0e018ec
--- a/example/application/simpleapp/pom.xml
+++ b/example/application/simpleapp/pom.xml
@@@ -96,12 -96,12 +96,16 @@@
  
          <mavendeps-isistesting.version>0.0.2</mavendeps-isistesting.version>
          <mavendeps-isisintellij.version>0.0.1</mavendeps-isisintellij.version>
 -        <mavendeps-isiswebapp.version>0.0.1</mavendeps-isiswebapp.version>
 +        <mavendeps-isiswebapp.version>0.0.2</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>
  
+         <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/36] 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/master
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;


[06/36] 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/master
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
 
 }


[36/36] isis git commit: ISIS-785: removes the setRequired for reference and value select2

Posted by da...@apache.org.
ISIS-785: removes the setRequired for reference and value select2

... because when triggered causes the floating drop-down issue to re-appear


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

Branch: refs/heads/master
Commit: bf9b97a46507178243e66eed8b28d7ca36bd5d08
Parents: a3b7770
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 16:16:39 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 16:16:39 2017 +0000

----------------------------------------------------------------------
 .../scalars/valuechoices/ValueChoicesSelect2Panel.java         | 3 ++-
 .../viewer/wicket/ui/components/widgets/select2/Select2.java   | 3 ++-
 .../wicket/ui/components/widgets/select2/Select2ChoiceExt.java | 6 +++++-
 .../ui/components/widgets/select2/Select2MultiChoiceExt.java   | 5 ++++-
 4 files changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bf9b97a4/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 27972d2..c642413 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -283,7 +283,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
 
     @Override
     public ArrayList<ObjectAdapterMemento> getMultiPending() {
-        return pending != null ? pending.getList() : null;
+        final ArrayList<ObjectAdapterMemento> mementos = pending != null ? pending.getList() : null;
+        return mementos == null || mementos.isEmpty() ? null : mementos;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/bf9b97a4/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
index 916e624..c49e4d4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -92,7 +92,8 @@ public class Select2 implements Serializable {
     }
 
     public void setRequired(final boolean required) {
-        component().setRequired(required);
+        // causing a more severe orphaned drop-down when triggered...
+        // component().setRequired(required);
     }
     public boolean checkRequired() {
         return component().checkRequired();

http://git-wip-us.apache.org/repos/asf/isis/blob/bf9b97a4/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
index e01c7b1..3dcb7a7 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
@@ -41,7 +41,11 @@ public class Select2ChoiceExt extends Select2Choice<ObjectAdapterMemento> implem
             final ScalarModel scalarModel) {
         super(id, model, EmptyChoiceProvider.INSTANCE);
         specId = scalarModel.getTypeOfSpecification().getSpecId();
-        setRequired(scalarModel.isRequired());
+
+        //causing a more severe orphaned drop-down when triggered...
+        //setRequired(scalarModel.isRequired());
+
+        setOutputMarkupPlaceholderTag(true);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/bf9b97a4/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index 5f11e58..1d2d0de 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -51,7 +51,10 @@ public class Select2MultiChoiceExt
         super(id, model, EmptyChoiceProvider.INSTANCE);
         specId = scalarModel.getTypeOfSpecification().getSpecId();
 
-        setRequired(scalarModel.isRequired());
+        //causing a more severe orphaned drop-down when triggered...
+        //setRequired(scalarModel.isRequired());
+
+        setOutputMarkupPlaceholderTag(true);
     }
 
     @Override


[29/36] isis git commit: ISIS-785: fixes value select2 also (was only saving the first selected object, due to the ChoiceProvider implementation assuming there is only ever one choice selected (no longer true now, of course).

Posted by da...@apache.org.
ISIS-785: fixes value select2 also (was only saving the first selected object, due to the ChoiceProvider implementation assuming there is only ever one choice selected (no longer true now, of course).


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

Branch: refs/heads/master
Commit: bbb9d33539e0cbc9b753809e2c86f7036c911eb4
Parents: 0419e4d
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 10:01:54 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 10:01:54 2017 +0000

----------------------------------------------------------------------
 .../viewer/wicket/model/models/EntityModel.java |  5 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  | 49 ++++++--------------
 2 files changed, 18 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/bbb9d335/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 d9692df..a51bed6 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
@@ -361,7 +361,10 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
             final ObjectAdapterMemento memento,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
-        super.setObject(memento.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader));
+        super.setObject(
+                memento != null
+                        ? memento.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader)
+                        : null);
         adapterMemento = memento;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/bbb9d335/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 66b682f..c438bdf 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -20,10 +20,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
-import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.AttributeModifier;
@@ -36,7 +35,6 @@ import org.apache.wicket.model.Model;
 import org.wicketstuff.select2.ChoiceProvider;
 
 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.all.named.NamedFacet;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -189,23 +187,11 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
                     return ids.contains(id);
                 }
             };
-
-            final Function<String, ObjectAdapterMemento> toOam = new Function<String, ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento apply(String input) {
-                    if (NULL_PLACEHOLDER.equals(input)) {
-                        return null;
-                    }
-                    final Collection<ObjectAdapterMemento> filteredCollection = Collections2.filter(mementos, lookupOam);
-                    return filteredCollection.iterator().next();
-                }
-            };
-            return Collections2.transform(ids, toOam);
+            return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
         }
 
         @Override
         protected List<ObjectAdapterMemento> obtainMementos(String term) {
-            // return choicesMementos;  // ISIS-1020: as of Jan 2015
             return obtainMementos(term, choicesMementos);
         }
 
@@ -259,15 +245,16 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     }
 
     /**
-     * sets up the choices, also ensuring that any currently held value
-     * is compatible.
+     * sets up the choices, also ensuring that any currently held value is compatible.
      */
     private void setChoices(ObjectAdapter[] argsIfAvailable) {
         final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
         
         final ChoiceProvider<ObjectAdapterMemento> provider = newChoiceProvider(choicesMementos);
         select2.setProvider(provider);
+
         getModel().clearPending();
+
         final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
         if(objectAdapterMemento == null) {
             select2.getModel().setObject(null);
@@ -275,28 +262,20 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
 
             if(!getModel().isCollection()) {
 
+                // if currently held value is not compatible with choices, then replace with the first choice
                 if(!choicesMementos.contains(objectAdapterMemento)) {
 
-                    final ObjectAdapterMemento newAdapterMemento;
-                    if (!choicesMementos.isEmpty()) {
-                        newAdapterMemento = choicesMementos.get(0);
-                    } else {
-                        newAdapterMemento = null;
-                    }
-
-                    final IModel<ObjectAdapterMemento> model = select2.getModel();
-                    model.setObject(newAdapterMemento);
-                    if (newAdapterMemento != null) {
-                        getModel().setObject(
-                                newAdapterMemento.getObjectAdapter(
-                                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader()));
-                    } else {
-                        getModel().setObject(null);
-                    }
+                    final ObjectAdapterMemento newAdapterMemento =
+                            choicesMementos.isEmpty()
+                                    ? null
+                                    : choicesMementos.get(0);
+
+                    select2.getModel().setObject(newAdapterMemento);
+                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
                 }
 
             } else {
-                // TODO
+
             }
         }
     }


[21/36] 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/master
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}


[07/36] 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/master
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();


[28/36] isis git commit: ISIS-785: extends common XSD (and therefore the other XSDs) to support action parameters that are collections.

Posted by da...@apache.org.
ISIS-785: extends common XSD (and therefore the other XSDs) to support action parameters that are collections.


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

Branch: refs/heads/master
Commit: 0419e4d7cd2be05eaeb0a83b1df287524e84e023
Parents: 885b494
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 23:56:07 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 23:56:07 2017 +0000

----------------------------------------------------------------------
 .../isis/schema/utils/CommonDtoUtils.java       |  30 ++-
 core/schema/pom.xml                             |   8 +-
 .../org/apache/isis/schema/bindings.xml         |  12 +-
 .../org/apache/isis/schema/chg/chg-1.0.xsd      | 115 ----------
 .../org/apache/isis/schema/chg/chg-1.1.xsd      | 115 ++++++++++
 .../org/apache/isis/schema/cmd/cmd-1.0.xsd      | 151 -------------
 .../org/apache/isis/schema/cmd/cmd-1.2.xsd      | 151 +++++++++++++
 .../apache/isis/schema/common/common-1.0.xsd    | 191 ----------------
 .../apache/isis/schema/common/common-1.1.xsd    | 204 ++++++++++++++++++
 .../org/apache/isis/schema/ixn/ixn-1.0.xsd      | 215 -------------------
 .../org/apache/isis/schema/ixn/ixn-1.1.xsd      | 215 +++++++++++++++++++
 .../model/mementos/ObjectAdapterMemento.java    |   4 +
 .../models/ScalarModelWithMultiPending.java     |   4 +-
 .../entitysimplelink/EntityLinkSimplePanel.java |  20 +-
 .../widgets/select2/Select2MultiChoiceExt.java  |   1 +
 15 files changed, 735 insertions(+), 701 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
index 83a920f..4ca819d 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
@@ -20,6 +20,7 @@ package org.apache.isis.schema.utils;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.util.Collection;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;
@@ -33,6 +34,7 @@ import org.joda.time.LocalTime;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.schema.cmd.v1.ParamDto;
+import org.apache.isis.schema.common.v1.CollectionDto;
 import org.apache.isis.schema.common.v1.EnumDto;
 import org.apache.isis.schema.common.v1.OidDto;
 import org.apache.isis.schema.common.v1.ValueDto;
@@ -124,6 +126,9 @@ public final class CommonDtoUtils {
             final BookmarkService bookmarkService) {
         setValueOn((ValueDto)valueWithTypeDto, valueType, val, bookmarkService);
         valueWithTypeDto.setNull(val == null);
+        if(val instanceof Collection) {
+            valueWithTypeDto.setType(ValueType.COLLECTION);
+        }
         return valueWithTypeDto;
     }
 
@@ -132,6 +137,12 @@ public final class CommonDtoUtils {
             final ValueType valueType,
             final Object val,
             final BookmarkService bookmarkService) {
+        if(val instanceof Collection) {
+            final Collection collection = (Collection) val;
+            final CollectionDto collectionDto = asCollectionDto(collection, valueType, bookmarkService);
+            valueDto.setCollection(collectionDto);
+            return valueDto;
+        }
         switch (valueType) {
         case STRING: {
             final String argValue = (String) val;
@@ -230,13 +241,14 @@ public final class CommonDtoUtils {
                     : bookmarkService.bookmarkFor(val);
 
             if (bookmark != null) {
-                OidDto argValue = bookmark != null ? bookmark.toOidDto() : null;
+                OidDto argValue = bookmark.toOidDto();
                 valueDto.setReference(argValue);
             }
             return valueDto;
         }
-        case VOID:
+        case VOID: {
             return null;
+        }
         default:
             // should never happen; all cases are listed above
             throw new IllegalArgumentException(String.format(
@@ -244,6 +256,20 @@ public final class CommonDtoUtils {
                     valueType));
         }
     }
+
+    private static CollectionDto asCollectionDto(
+            final Iterable iterable,
+            final ValueType valueType,
+            final BookmarkService bookmarkService) {
+        final CollectionDto collectionDto = new CollectionDto();
+        collectionDto.setType(valueType);
+        for (Object o : iterable) {
+            final ValueDto valueDto = new ValueDto();
+            setValueOn(valueDto, valueType, o, bookmarkService);
+            collectionDto.getValue().add(valueDto);
+        }
+        return collectionDto;
+    }
     //endregion
 
     //region > getValue (from valueDto)

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/pom.xml
----------------------------------------------------------------------
diff --git a/core/schema/pom.xml b/core/schema/pom.xml
index d6e40ef..25e58a2 100644
--- a/core/schema/pom.xml
+++ b/core/schema/pom.xml
@@ -78,10 +78,10 @@
                                 <configuration>
                                     <schemaDirectory>src/main/resources/org/apache/isis/schema</schemaDirectory>
                                     <schemaIncludes>
-                                        <schemaInclude>common/common-1.0.xsd</schemaInclude>
-                                        <schemaInclude>cmd/cmd-1.0.xsd</schemaInclude>
-                                        <schemaInclude>ixn/ixn-1.0.xsd</schemaInclude>
-                                        <schemaInclude>chg/chg-1.0.xsd</schemaInclude>
+                                        <schemaInclude>common/common-1.1.xsd</schemaInclude>
+                                        <schemaInclude>cmd/cmd-1.2.xsd</schemaInclude>
+                                        <schemaInclude>ixn/ixn-1.1.xsd</schemaInclude>
+                                        <schemaInclude>chg/chg-1.1.xsd</schemaInclude>
                                     </schemaIncludes>
                                     <bindingDirectory>src/main/resources/org/apache/isis/schema</bindingDirectory>
                                     <bindingIncludes>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/bindings.xml
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/bindings.xml b/core/schema/src/main/resources/org/apache/isis/schema/bindings.xml
index 92ffed9..660fa51 100644
--- a/core/schema/src/main/resources/org/apache/isis/schema/bindings.xml
+++ b/core/schema/src/main/resources/org/apache/isis/schema/bindings.xml
@@ -25,7 +25,7 @@
                xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
 			  http://jaxb2-commons.dev.java.net/namespace-prefix http://java.net/projects/jaxb2-commons/sources/svn/content/namespace-prefix/trunk/src/main/resources/prefix-namespace-schema.xsd"
 >
-    <jaxb:bindings schemaLocation="chg/chg-1.0.xsd">
+    <jaxb:bindings schemaLocation="chg/chg-1.1.xsd">
         <jaxb:schemaBindings>
             <!--
             we don't include the minor version, because the
@@ -38,7 +38,7 @@
         </jaxb:bindings>
     </jaxb:bindings>
 
-    <jaxb:bindings schemaLocation="ixn/ixn-1.0.xsd">
+    <jaxb:bindings schemaLocation="ixn/ixn-1.1.xsd">
         <jaxb:schemaBindings>
             <!--
             we don't include the minor version, because the
@@ -50,8 +50,8 @@
             <namespace:prefix name="ixn" />
         </jaxb:bindings>
     </jaxb:bindings>
-    <!-- since ixn-1.0.xsd does an xs:import of common-1.0.xsd, we need to specify common's package bindings -->
-    <jaxb:bindings schemaLocation="common/common-1.0.xsd">
+    <!-- since ixn-1.1.xsd does an xs:import of common-1.1.xsd, we need to specify common's package bindings -->
+    <jaxb:bindings schemaLocation="common/common-1.1.xsd">
         <jaxb:schemaBindings>
             <!--
             we don't include the minor version, because the
@@ -63,8 +63,8 @@
             <namespace:prefix name="com" />
         </jaxb:bindings>
     </jaxb:bindings>
-    <!-- since ixn-1.0.xsd does an xs:import of cmd-1.0.xsd, we need to specify common's package bindings -->
-    <jaxb:bindings schemaLocation="cmd/cmd-1.0.xsd">
+    <!-- since ixn-1.1.xsd does an xs:import of cmd-1.2.xsd, we need to specify common's package bindings -->
+    <jaxb:bindings schemaLocation="cmd/cmd-1.2.xsd">
         <jaxb:schemaBindings>
             <!--
             we don't include the minor version, because the

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.0.xsd
deleted file mode 100644
index 41501de..0000000
--- a/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.0.xsd
+++ /dev/null
@@ -1,115 +0,0 @@
-\ufeff<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<xs:schema targetNamespace="http://isis.apache.org/schema/chg"
-           elementFormDefault="qualified"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns="http://isis.apache.org/schema/chg"
-           xmlns:com="http://isis.apache.org/schema/common"
->
-
-    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
-
-    <xs:element name="changesDto">
-        <xs:annotation>
-            <xs:documentation>The changes (create/update/delete) to one or more domain objects within a transaction.  (nb: only published objects are included in these lists).
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element name="majorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
-                    <xs:annotation>
-                        <xs:documentation>The major version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="minorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="0">
-                    <xs:annotation>
-                        <xs:documentation>The minor version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="transactionId" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation>Unique identifier of the interaction id within which this change occurred.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="sequence" type="xs:int">
-                    <xs:annotation>
-                        <xs:documentation>Unique sequence number of the set of change within the interaction.  There could be many such events within a single interaction, one for each completed transaction.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="completedAt" type="xs:dateTime" minOccurs="0" maxOccurs="1">
-                    <xs:annotation>
-                        <xs:documentation>The point in time that these changes were completed.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="user" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation>The name of the user that performed this transaction.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="objects" type="objectsDto"/>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:complexType name="objectsDto">
-        <xs:annotation>
-            <xs:documentation>A set of changes to domain objects.</xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="loaded" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation>The number of objects loaded within the transaction.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="created" type="com:oidsDto">
-                <xs:annotation>
-                    <xs:documentation>The list of objects created within the transaction.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="updated" type="com:oidsDto">
-                <xs:annotation>
-                    <xs:documentation>The list of objects updated within the transaction.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="deleted" type="com:oidsDto">
-                <xs:annotation>
-                    <xs:documentation>The list of objects deleted within the transaction.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="propertiesModified" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation>The number of object properties modified within the transaction.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.1.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.1.xsd b/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.1.xsd
new file mode 100644
index 0000000..4a9bceb
--- /dev/null
+++ b/core/schema/src/main/resources/org/apache/isis/schema/chg/chg-1.1.xsd
@@ -0,0 +1,115 @@
+\ufeff<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xs:schema targetNamespace="http://isis.apache.org/schema/chg"
+           elementFormDefault="qualified"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://isis.apache.org/schema/chg"
+           xmlns:com="http://isis.apache.org/schema/common"
+>
+
+    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.1.xsd"/>
+
+    <xs:element name="changesDto">
+        <xs:annotation>
+            <xs:documentation>Represents v1.1 of this schema.  The changes (create/update/delete) to one or more domain objects within a transaction.  (nb: only published objects are included in these lists).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="majorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
+                    <xs:annotation>
+                        <xs:documentation>The major version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="minorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
+                    <xs:annotation>
+                        <xs:documentation>The minor version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="transactionId" type="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>Unique identifier of the interaction id within which this change occurred.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="sequence" type="xs:int">
+                    <xs:annotation>
+                        <xs:documentation>Unique sequence number of the set of change within the interaction.  There could be many such events within a single interaction, one for each completed transaction.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="completedAt" type="xs:dateTime" minOccurs="0" maxOccurs="1">
+                    <xs:annotation>
+                        <xs:documentation>The point in time that these changes were completed.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="user" type="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>The name of the user that performed this transaction.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="objects" type="objectsDto"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:complexType name="objectsDto">
+        <xs:annotation>
+            <xs:documentation>A set of changes to domain objects.</xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="loaded" type="xs:int">
+                <xs:annotation>
+                    <xs:documentation>The number of objects loaded within the transaction.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="created" type="com:oidsDto">
+                <xs:annotation>
+                    <xs:documentation>The list of objects created within the transaction.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="updated" type="com:oidsDto">
+                <xs:annotation>
+                    <xs:documentation>The list of objects updated within the transaction.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="deleted" type="com:oidsDto">
+                <xs:annotation>
+                    <xs:documentation>The list of objects deleted within the transaction.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="propertiesModified" type="xs:int">
+                <xs:annotation>
+                    <xs:documentation>The number of object properties modified within the transaction.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
deleted file mode 100644
index e3aa0b9..0000000
--- a/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.0.xsd
+++ /dev/null
@@ -1,151 +0,0 @@
-\ufeff<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<xs:schema targetNamespace="http://isis.apache.org/schema/cmd"
-           elementFormDefault="qualified"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns="http://isis.apache.org/schema/cmd"
-           xmlns:com="http://isis.apache.org/schema/common">
-
-    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
-
-    <xs:element name="commandDto">
-        <xs:annotation>
-            <xs:documentation>Represents v1.0 of this schema.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element name="majorVersion" type="xs:string" minOccurs="1" maxOccurs="1" default="1">
-                    <xs:annotation>
-                        <xs:documentation>The major version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="minorVersion" type="xs:string" minOccurs="1" maxOccurs="1" default="1">
-                    <xs:annotation>
-                        <xs:documentation>Introduced in v1.1. The minor version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="transactionId" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation>Transaction id for this command, a unique identifier.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="user" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation>The name of the user that initiated/created this command.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="targets" type="com:oidsDto">
-                    <xs:annotation>
-                        <xs:documentation>For regular actions, represents the entity/entities or view model(s) upon which the action is to be invoked.  For mixin actions, is the object(s) being mixed-into (the constructor arg to the mixin).  For contributed actions, is the domain service (the contributee object will be one of the action arguments within the payload).  Note that this means that bulk contributed actions cannot be reified as a memento (for this use case, implement as a mixin action instead).
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="member" type="memberDto">
-                    <xs:annotation>
-                        <xs:documentation>The action or property (identifier and parameter arguments) to be invoked on the target object(s).</xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-            </xs:sequence>
-        </xs:complexType>
-    </xs:element>
-
-    <xs:complexType name="memberDto" abstract="true">
-        <xs:annotation>
-            <xs:documentation>Represents the information required to be able to invoke an action or modify a property on the target(s).  Specifically, is the identifier of the action/property, along with the parameter arguments.  Is subclassed by 'actionDto' and 'propertyDto'.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="memberIdentifier" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>Formal identifier of the member being interacted with (action or property).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-        <xs:attribute  name="interactionType" type="com:interactionType">
-            <xs:annotation>
-                <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:complexType>
-
-    <xs:complexType name="actionDto">
-        <xs:annotation>
-            <xs:documentation>Captures the information required to be able to invoke an action on the target(s).
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="memberDto">
-                <xs:sequence>
-                    <xs:element name="parameters" type="paramsDto">
-                        <xs:annotation>
-                            <xs:documentation>The list of parameter/argument values for this action invocation.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="propertyDto">
-        <xs:annotation>
-            <xs:documentation>Captures the information required to be able to modify a property on the target(s).
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="memberDto">
-                <xs:sequence>
-                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="paramsDto">
-        <xs:annotation>
-            <xs:documentation>A list of of parameter/argument values.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence minOccurs="0" maxOccurs="unbounded">
-            <xs:element name="parameter" type="paramDto"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="paramDto">
-        <xs:annotation>
-            <xs:documentation>Defines an action parameter: its name, type and value (ie provided argument).
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="com:valueWithTypeDto">
-                <xs:attribute name="name" use="required" type="xs:string"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-
-</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.2.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.2.xsd b/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.2.xsd
new file mode 100644
index 0000000..98cb53a
--- /dev/null
+++ b/core/schema/src/main/resources/org/apache/isis/schema/cmd/cmd-1.2.xsd
@@ -0,0 +1,151 @@
+\ufeff<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xs:schema targetNamespace="http://isis.apache.org/schema/cmd"
+           elementFormDefault="qualified"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://isis.apache.org/schema/cmd"
+           xmlns:com="http://isis.apache.org/schema/common">
+
+    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.1.xsd"/>
+
+    <xs:element name="commandDto">
+        <xs:annotation>
+            <xs:documentation>Represents v1.2 of this schema.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="majorVersion" type="xs:string" minOccurs="1" maxOccurs="1" default="1">
+                    <xs:annotation>
+                        <xs:documentation>The major version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="minorVersion" type="xs:string" minOccurs="1" maxOccurs="1" default="2">
+                    <xs:annotation>
+                        <xs:documentation>The minor version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="transactionId" type="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>Transaction id for this command, a unique identifier.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="user" type="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>The name of the user that initiated/created this command.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="targets" type="com:oidsDto">
+                    <xs:annotation>
+                        <xs:documentation>For regular actions, represents the entity/entities or view model(s) upon which the action is to be invoked.  For mixin actions, is the object(s) being mixed-into (the constructor arg to the mixin).  For contributed actions, is the domain service (the contributee object will be one of the action arguments within the payload).  Note that this means that bulk contributed actions cannot be reified as a memento (for this use case, implement as a mixin action instead).
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="member" type="memberDto">
+                    <xs:annotation>
+                        <xs:documentation>The action or property (identifier and parameter arguments) to be invoked on the target object(s).</xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+    <xs:complexType name="memberDto" abstract="true">
+        <xs:annotation>
+            <xs:documentation>Represents the information required to be able to invoke an action or modify a property on the target(s).  Specifically, is the identifier of the action/property, along with the parameter arguments.  Is subclassed by 'actionDto' and 'propertyDto'.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="memberIdentifier" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Formal identifier of the member being interacted with (action or property).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+        <xs:attribute  name="interactionType" type="com:interactionType">
+            <xs:annotation>
+                <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:complexType>
+
+    <xs:complexType name="actionDto">
+        <xs:annotation>
+            <xs:documentation>Captures the information required to be able to invoke an action on the target(s).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexContent>
+            <xs:extension base="memberDto">
+                <xs:sequence>
+                    <xs:element name="parameters" type="paramsDto">
+                        <xs:annotation>
+                            <xs:documentation>The list of parameter/argument values for this action invocation.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:element>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="propertyDto">
+        <xs:annotation>
+            <xs:documentation>Captures the information required to be able to modify a property on the target(s).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexContent>
+            <xs:extension base="memberDto">
+                <xs:sequence>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="paramsDto">
+        <xs:annotation>
+            <xs:documentation>A list of of parameter/argument values.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="parameter" type="paramDto"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="paramDto">
+        <xs:annotation>
+            <xs:documentation>Defines an action parameter: its name, type and value (ie provided argument).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexContent>
+            <xs:extension base="com:valueWithTypeDto">
+                <xs:attribute name="name" use="required" type="xs:string"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+
+</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.0.xsd
deleted file mode 100644
index 041208c..0000000
--- a/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.0.xsd
+++ /dev/null
@@ -1,191 +0,0 @@
-\ufeff<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<xs:schema targetNamespace="http://isis.apache.org/schema/common"
-           elementFormDefault="qualified"
-           xmlns="http://isis.apache.org/schema/common"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
-    <xs:complexType name="valueDto">
-        <xs:choice minOccurs="0" maxOccurs="1">
-            <xs:element name="string" type="xs:string"/>
-            <xs:element name="byte" type="xs:byte"/>
-            <xs:element name="short" type="xs:short"/>
-            <xs:element name="int" type="xs:int"/>
-            <xs:element name="long" type="xs:long"/>
-            <xs:element name="float" type="xs:float"/>
-            <xs:element name="double" type="xs:double"/>
-            <xs:element name="boolean" type="xs:boolean"/>
-            <xs:element name="char" type="xs:string"/>
-            <xs:element name="bigInteger" type="xs:integer"/>
-            <xs:element name="bigDecimal" type="xs:decimal"/>
-            <xs:element name="dateTime" type="xs:dateTime"/>
-            <xs:element name="localDate" type="xs:date"/>
-            <xs:element name="localDateTime" type="xs:dateTime"/>
-            <xs:element name="localTime" type="xs:time"/>
-            <xs:element name="timestamp" type="xs:dateTime"/>
-            <xs:element name="enum" type="enumDto"/>
-            <xs:element name="reference" type="oidDto"/>
-        </xs:choice>
-    </xs:complexType>
-
-    <xs:complexType name="oidDto">
-        <xs:sequence>
-            <xs:element name="objectType" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>Deprecated, use the 'objectType' attribute instead.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="objectIdentifier" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>Deprecated, use the 'id' attribute instead.</xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-        <xs:attribute name="objectState" type="bookmarkObjectState">
-            <xs:annotation>
-                <xs:documentation>In previous versions of this schema the 'objectState' attribute was defaulted, but is now assumed to be 'persistent'</xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="type" type="xs:string"/>
-        <xs:attribute name="id" type="xs:string"/>
-    </xs:complexType>
-
-    <xs:complexType name="oidsDto">
-        <xs:annotation>
-            <xs:documentation>A list of OIDs
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="oid" type="oidDto" minOccurs="1" maxOccurs="unbounded"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="enumDto">
-        <xs:sequence>
-            <xs:element name="enumType" type="xs:string"/>
-            <xs:element name="enumName" type="xs:string"/>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:simpleType name="bookmarkObjectState">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="persistent"/>
-            <xs:enumeration value="transient"/>
-            <xs:enumeration value="viewModel"/>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:simpleType name="valueType">
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="string"/>
-            <xs:enumeration value="byte"/>
-            <xs:enumeration value="short"/>
-            <xs:enumeration value="int"/>
-            <xs:enumeration value="long"/>
-            <xs:enumeration value="float"/>
-            <xs:enumeration value="double"/>
-            <xs:enumeration value="boolean"/>
-            <xs:enumeration value="char"/>
-            <xs:enumeration value="bigInteger"/>
-            <xs:enumeration value="bigDecimal"/>
-            <xs:enumeration value="javaSqlTimestamp"/>
-            <xs:enumeration value="jodaDateTime"/>
-            <xs:enumeration value="jodaLocalDate"/>
-            <xs:enumeration value="jodaLocalTime"/>
-            <xs:enumeration value="jodaLocalDateTime"/>
-            <xs:enumeration value="enum"/>
-            <xs:enumeration value="reference"/>
-            <xs:enumeration value="void">
-                <xs:annotation>
-                    <xs:documentation>
-                        Not valid to be used as the parameter type of an action; can be used as its return type.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:enumeration>
-        </xs:restriction>
-    </xs:simpleType>
-
-    <xs:complexType name="periodDto">
-        <xs:annotation>
-            <xs:documentation>Captures a period of time, eg for capturing metrics/timings.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="startedAt" type="xs:dateTime">
-                <xs:annotation>
-                    <xs:documentation>The point in time that this period of time started.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="completedAt" type="xs:dateTime" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>The point in time that this period of time completed.  The duration is the difference between 'start' and 'complete'.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="differenceDto">
-        <xs:annotation>
-            <xs:documentation>Captures a pair of numbers representing a difference.  Used for example to capture metrics (number objects modified before and after).
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-        </xs:sequence>
-        <xs:attribute name="before" type="xs:int">
-            <xs:annotation>
-                <xs:documentation>The initial quantity.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="after" type="xs:int">
-            <xs:annotation>
-                <xs:documentation>The final quantity, once known.  The difference is therefore the computation of (after - before).
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:complexType>
-
-    <xs:complexType name="valueWithTypeDto">
-        <xs:annotation>
-            <xs:documentation>Captures both a value and its corresponding type.  Used for the return value of action invocations, and for the new value in property edits.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexContent>
-            <xs:extension base="valueDto">
-                <xs:attribute name="type" use="required" type="valueType"/>
-                <xs:attribute name="null" use="optional" type="xs:boolean"/>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-
-    <xs:simpleType name="interactionType" >
-        <xs:annotation>
-            <xs:documentation>Whether this interaction with a member is invoking an action, or editing a property.</xs:documentation>
-        </xs:annotation>
-        <xs:restriction base="xs:string">
-            <xs:enumeration value="action_invocation" />
-            <xs:enumeration value="property_edit" />
-        </xs:restriction>
-    </xs:simpleType>
-
-</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.1.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.1.xsd b/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.1.xsd
new file mode 100644
index 0000000..1121962
--- /dev/null
+++ b/core/schema/src/main/resources/org/apache/isis/schema/common/common-1.1.xsd
@@ -0,0 +1,204 @@
+\ufeff<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xs:schema targetNamespace="http://isis.apache.org/schema/common"
+           elementFormDefault="qualified"
+           xmlns="http://isis.apache.org/schema/common"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:complexType name="valueDto">
+        <xs:choice minOccurs="0" maxOccurs="1">
+            <xs:element name="string" type="xs:string"/>
+            <xs:element name="byte" type="xs:byte"/>
+            <xs:element name="short" type="xs:short"/>
+            <xs:element name="int" type="xs:int"/>
+            <xs:element name="long" type="xs:long"/>
+            <xs:element name="float" type="xs:float"/>
+            <xs:element name="double" type="xs:double"/>
+            <xs:element name="boolean" type="xs:boolean"/>
+            <xs:element name="char" type="xs:string"/>
+            <xs:element name="bigInteger" type="xs:integer"/>
+            <xs:element name="bigDecimal" type="xs:decimal"/>
+            <xs:element name="dateTime" type="xs:dateTime"/>
+            <xs:element name="localDate" type="xs:date"/>
+            <xs:element name="localDateTime" type="xs:dateTime"/>
+            <xs:element name="localTime" type="xs:time"/>
+            <xs:element name="timestamp" type="xs:dateTime"/>
+            <xs:element name="enum" type="enumDto"/>
+            <xs:element name="reference" type="oidDto"/>
+            <xs:element name="collection" type="collectionDto"/>
+        </xs:choice>
+    </xs:complexType>
+
+    <xs:complexType name="oidDto">
+        <xs:sequence>
+            <xs:element name="objectType" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Deprecated, use the 'objectType' attribute instead.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="objectIdentifier" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Deprecated, use the 'id' attribute instead.</xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+        <xs:attribute name="objectState" type="bookmarkObjectState">
+            <xs:annotation>
+                <xs:documentation>In previous versions of this schema the 'objectState' attribute was defaulted, but is now assumed to be 'persistent'</xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="type" type="xs:string"/>
+        <xs:attribute name="id" type="xs:string"/>
+    </xs:complexType>
+
+    <xs:complexType name="collectionDto">
+        <xs:annotation>
+            <xs:documentation>A collection of (argument) values
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="value" type="valueDto" minOccurs="1" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="type" use="required" type="valueType"/>
+        <xs:attribute name="null" use="optional" type="xs:boolean"/>
+    </xs:complexType>
+
+    <xs:complexType name="oidsDto">
+        <xs:annotation>
+            <xs:documentation>A list of OIDs
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="oid" type="oidDto" minOccurs="1" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="enumDto">
+        <xs:sequence>
+            <xs:element name="enumType" type="xs:string"/>
+            <xs:element name="enumName" type="xs:string"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:simpleType name="bookmarkObjectState">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="persistent"/>
+            <xs:enumeration value="transient"/>
+            <xs:enumeration value="viewModel"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:simpleType name="valueType">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="string"/>
+            <xs:enumeration value="byte"/>
+            <xs:enumeration value="short"/>
+            <xs:enumeration value="int"/>
+            <xs:enumeration value="long"/>
+            <xs:enumeration value="float"/>
+            <xs:enumeration value="double"/>
+            <xs:enumeration value="boolean"/>
+            <xs:enumeration value="char"/>
+            <xs:enumeration value="bigInteger"/>
+            <xs:enumeration value="bigDecimal"/>
+            <xs:enumeration value="javaSqlTimestamp"/>
+            <xs:enumeration value="jodaDateTime"/>
+            <xs:enumeration value="jodaLocalDate"/>
+            <xs:enumeration value="jodaLocalTime"/>
+            <xs:enumeration value="jodaLocalDateTime"/>
+            <xs:enumeration value="enum"/>
+            <xs:enumeration value="reference"/>
+            <xs:enumeration value="collection"/>
+            <xs:enumeration value="void">
+                <xs:annotation>
+                    <xs:documentation>Not valid to be used as the parameter type of an action; can be used as its return type.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:enumeration>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:complexType name="periodDto">
+        <xs:annotation>
+            <xs:documentation>Captures a period of time, eg for capturing metrics/timings.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="startedAt" type="xs:dateTime">
+                <xs:annotation>
+                    <xs:documentation>The point in time that this period of time started.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="completedAt" type="xs:dateTime" minOccurs="0" maxOccurs="1">
+                <xs:annotation>
+                    <xs:documentation>The point in time that this period of time completed.  The duration is the difference between 'start' and 'complete'.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="differenceDto">
+        <xs:annotation>
+            <xs:documentation>Captures a pair of numbers representing a difference.  Used for example to capture metrics (number objects modified before and after).
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+        </xs:sequence>
+        <xs:attribute name="before" type="xs:int">
+            <xs:annotation>
+                <xs:documentation>The initial quantity.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="after" type="xs:int">
+            <xs:annotation>
+                <xs:documentation>The final quantity, once known.  The difference is therefore the computation of (after - before).
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:complexType>
+
+    <xs:complexType name="valueWithTypeDto">
+        <xs:annotation>
+            <xs:documentation>Captures both a value and its corresponding type.  Used for the return value of action invocations, and for the new value in property edits.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexContent>
+            <xs:extension base="valueDto">
+                <xs:attribute name="type" use="required" type="valueType"/>
+                <xs:attribute name="null" use="optional" type="xs:boolean"/>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+
+    <xs:simpleType name="interactionType" >
+        <xs:annotation>
+            <xs:documentation>Whether this interaction with a member is invoking an action, or editing a property.</xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="action_invocation" />
+            <xs:enumeration value="property_edit" />
+        </xs:restriction>
+    </xs:simpleType>
+
+</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd b/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
deleted file mode 100644
index dc7908f..0000000
--- a/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.0.xsd
+++ /dev/null
@@ -1,215 +0,0 @@
-\ufeff<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<xs:schema targetNamespace="http://isis.apache.org/schema/ixn"
-           elementFormDefault="qualified"
-           xmlns:xs="http://www.w3.org/2001/XMLSchema"
-           xmlns="http://isis.apache.org/schema/ixn"
-           xmlns:cmd="http://isis.apache.org/schema/cmd"
-           xmlns:com="http://isis.apache.org/schema/common"
->
-
-    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.0.xsd"/>
-    <xs:import namespace="http://isis.apache.org/schema/cmd" schemaLocation="../cmd/cmd-1.0.xsd"/>
-
-    <xs:element name="interactionDto">
-        <xs:annotation>
-            <xs:documentation>Represents v1.0 of this schema, replacing and generalizing the earlier 'actionInvocationMemento'.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:complexType>
-            <xs:sequence>
-                <xs:element name="majorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
-                    <xs:annotation>
-                        <xs:documentation>The major version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="minorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="0">
-                    <xs:annotation>
-                        <xs:documentation>The minor version of the schema that an XML instance was created using.
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="transactionId" type="xs:string">
-                    <xs:annotation>
-                        <xs:documentation>Unique identifier of the interaction which this member was interacted with (action invoked/property edited); can be used to locate the corresponding Command object (which may have been persisted).
-                        </xs:documentation>
-                    </xs:annotation>
-                </xs:element>
-                <xs:element name="execution" type="memberExecutionDto"/>
-            </xs:sequence>
-        </xs:complexType>
-
-    </xs:element>
-
-    <xs:complexType name="memberExecutionDto" abstract="true">
-        <xs:annotation>
-            <xs:documentation>Represents either an action invocation or a property edit.  Is subclassed by both.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="sequence" type="xs:int">
-                <xs:annotation>
-                    <xs:documentation>Unique sequence number of an individual member interaction within the overall interaction.  There could be many such member interactions (within a single transaction) for two reasons: either a single top-level interaction could call sub-interactions (by virtue of WrapperFactory), or there may be a bulk action interaction against many targets.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="target" type="com:oidDto">
-                <xs:annotation>
-                    <xs:documentation>For target domain object being interacted with.  For regular actions/properties, represents the entity or view model upon which the action is to be invoked/property edited.  For mixin actions/properties, is the object being mixed-into (the constructor arg to the mixin).  For contributed actions/properties, is the domain service (the contributee object will be one of the action arguments within the payload).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="memberIdentifier" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>Formal identifier (class name and member name) of the member being interacted with (action or property).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="user" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>The name of the user that invoked this action.  Note that this isn't necessarily the user that initiated the original command; the SudoService may be being used to temporarily switch the effective user.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="title" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>User-friendly title of the 'target' object.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="metrics" type="metricsDto">
-                <xs:annotation>
-                    <xs:documentation>Profiling metrics capturng the this time/number of objects affected as a result of performing this member interaction (invoke the action, or edit the property).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="threw" type="exceptionDto" minOccurs="0" maxOccurs="1">
-                <xs:annotation>
-                    <xs:documentation>Captures any exception thrown by an action.  Either the 'returned' or the 'threw' element will be populated.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="childExecutions" minOccurs="0" maxOccurs="1">
-                <xs:complexType>
-                    <xs:sequence>
-                        <xs:element name="execution" type="memberExecutionDto" minOccurs="0" maxOccurs="unbounded">
-                            <xs:annotation>
-                                <xs:documentation>Capture interactions with other members from this interaction, using the WrapperFactory service.  Typically this will be actions invoking other actions, but it is also possible for an action to perform a property edit, and - much rarer - for a property edit to invoke an action.  Whatever; these interactions nest together into a call/stack, more generally into a graph.
-                                </xs:documentation>
-                            </xs:annotation>
-                        </xs:element>
-                    </xs:sequence>
-                </xs:complexType>
-            </xs:element>
-        </xs:sequence>
-        <xs:attribute  name="interactionType" type="com:interactionType">
-            <xs:annotation>
-                <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
-                </xs:documentation>
-            </xs:annotation>
-        </xs:attribute>
-    </xs:complexType>
-
-    <xs:complexType name="actionInvocationDto">
-        <xs:complexContent>
-            <xs:extension base="memberExecutionDto">
-                <xs:sequence>
-                    <xs:element name="parameters" type="cmd:paramsDto">
-                        <xs:annotation>
-                            <xs:documentation>The list of parameter/argument values for this action invocation.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                    <xs:element name="returned" type="com:valueWithTypeDto" minOccurs="0" maxOccurs="1">
-                        <xs:annotation>
-                            <xs:documentation>The value returned by this action (including the type of that returned value).  Either the 'returned' or the 'threw' element (from 'memberExecutionDto') will be populated.
-                            </xs:documentation>
-                        </xs:annotation>
-                    </xs:element>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="propertyEditDto">
-        <xs:complexContent>
-            <xs:extension base="memberExecutionDto">
-                <xs:sequence>
-                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
-                </xs:sequence>
-            </xs:extension>
-        </xs:complexContent>
-    </xs:complexType>
-
-    <xs:complexType name="metricsDto">
-        <xs:sequence>
-            <xs:element name="timings" type="com:periodDto">
-                <xs:annotation>
-                    <xs:documentation>The time taken to perform the member interaction (invoke the action, or edit the property).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="objectCounts" type="objectCountsDto">
-                <xs:annotation>
-                    <xs:documentation>How many objets were affected by the member interaction.
-                    </xs:documentation>
-                </xs:annotation>
-
-            </xs:element>
-        </xs:sequence>
-    </xs:complexType>
-
-    <xs:complexType name="objectCountsDto">
-        <xs:sequence>
-            <xs:element name="loaded" type="com:differenceDto">
-                <xs:annotation>
-                    <xs:documentation>The number of objects loaded.
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="dirtied" type="com:differenceDto">
-                <xs:annotation>
-                    <xs:documentation>The number of objects dirtied (ie updated).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-        </xs:sequence>
-
-    </xs:complexType>
-
-    <xs:complexType name="exceptionDto">
-        <xs:annotation>
-            <xs:documentation>Captures any exception thrown by an action invocation.  Use as the xsd:type of the 'threw' element.
-            </xs:documentation>
-        </xs:annotation>
-        <xs:sequence>
-            <xs:element name="message" type="xs:string"/>
-            <xs:element name="stackTrace" type="xs:string">
-                <xs:annotation>
-                    <xs:documentation>A formatted stack trace.  (A future version of the 'exceptionDto' element might refine this to more easily parseable stack trace elements).
-                    </xs:documentation>
-                </xs:annotation>
-            </xs:element>
-            <xs:element name="causedBy" type="exceptionDto" minOccurs="0" maxOccurs="1"/>
-        </xs:sequence>
-    </xs:complexType>
-
-</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.1.xsd
----------------------------------------------------------------------
diff --git a/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.1.xsd b/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.1.xsd
new file mode 100644
index 0000000..b840390
--- /dev/null
+++ b/core/schema/src/main/resources/org/apache/isis/schema/ixn/ixn-1.1.xsd
@@ -0,0 +1,215 @@
+\ufeff<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<xs:schema targetNamespace="http://isis.apache.org/schema/ixn"
+           elementFormDefault="qualified"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns="http://isis.apache.org/schema/ixn"
+           xmlns:cmd="http://isis.apache.org/schema/cmd"
+           xmlns:com="http://isis.apache.org/schema/common"
+>
+
+    <xs:import namespace="http://isis.apache.org/schema/common" schemaLocation="../common/common-1.1.xsd"/>
+    <xs:import namespace="http://isis.apache.org/schema/cmd" schemaLocation="../cmd/cmd-1.2.xsd"/>
+
+    <xs:element name="interactionDto">
+        <xs:annotation>
+            <xs:documentation>Represents v1.1 of this schema.  This schema replaces and generalizes the earlier 'actionInvocationMemento'.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element name="majorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
+                    <xs:annotation>
+                        <xs:documentation>The major version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="minorVersion" type="xs:string" minOccurs="0" maxOccurs="1" default="1">
+                    <xs:annotation>
+                        <xs:documentation>The minor version of the schema that an XML instance was created using.
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="transactionId" type="xs:string">
+                    <xs:annotation>
+                        <xs:documentation>Unique identifier of the interaction which this member was interacted with (action invoked/property edited); can be used to locate the corresponding Command object (which may have been persisted).
+                        </xs:documentation>
+                    </xs:annotation>
+                </xs:element>
+                <xs:element name="execution" type="memberExecutionDto"/>
+            </xs:sequence>
+        </xs:complexType>
+
+    </xs:element>
+
+    <xs:complexType name="memberExecutionDto" abstract="true">
+        <xs:annotation>
+            <xs:documentation>Represents either an action invocation or a property edit.  Is subclassed by both.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="sequence" type="xs:int">
+                <xs:annotation>
+                    <xs:documentation>Unique sequence number of an individual member interaction within the overall interaction.  There could be many such member interactions (within a single transaction) for two reasons: either a single top-level interaction could call sub-interactions (by virtue of WrapperFactory), or there may be a bulk action interaction against many targets.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="target" type="com:oidDto">
+                <xs:annotation>
+                    <xs:documentation>For target domain object being interacted with.  For regular actions/properties, represents the entity or view model upon which the action is to be invoked/property edited.  For mixin actions/properties, is the object being mixed-into (the constructor arg to the mixin).  For contributed actions/properties, is the domain service (the contributee object will be one of the action arguments within the payload).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="memberIdentifier" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>Formal identifier (class name and member name) of the member being interacted with (action or property).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="user" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>The name of the user that invoked this action.  Note that this isn't necessarily the user that initiated the original command; the SudoService may be being used to temporarily switch the effective user.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="title" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>User-friendly title of the 'target' object.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="metrics" type="metricsDto">
+                <xs:annotation>
+                    <xs:documentation>Profiling metrics capturng the this time/number of objects affected as a result of performing this member interaction (invoke the action, or edit the property).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="threw" type="exceptionDto" minOccurs="0" maxOccurs="1">
+                <xs:annotation>
+                    <xs:documentation>Captures any exception thrown by an action.  Either the 'returned' or the 'threw' element will be populated.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="childExecutions" minOccurs="0" maxOccurs="1">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="execution" type="memberExecutionDto" minOccurs="0" maxOccurs="unbounded">
+                            <xs:annotation>
+                                <xs:documentation>Capture interactions with other members from this interaction, using the WrapperFactory service.  Typically this will be actions invoking other actions, but it is also possible for an action to perform a property edit, and - much rarer - for a property edit to invoke an action.  Whatever; these interactions nest together into a call/stack, more generally into a graph.
+                                </xs:documentation>
+                            </xs:annotation>
+                        </xs:element>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+        <xs:attribute  name="interactionType" type="com:interactionType">
+            <xs:annotation>
+                <xs:documentation>Indicates whether this is an intention to invoke an action, or edit a property.
+                </xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+    </xs:complexType>
+
+    <xs:complexType name="actionInvocationDto">
+        <xs:complexContent>
+            <xs:extension base="memberExecutionDto">
+                <xs:sequence>
+                    <xs:element name="parameters" type="cmd:paramsDto">
+                        <xs:annotation>
+                            <xs:documentation>The list of parameter/argument values for this action invocation.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:element>
+                    <xs:element name="returned" type="com:valueWithTypeDto" minOccurs="0" maxOccurs="1">
+                        <xs:annotation>
+                            <xs:documentation>The value returned by this action (including the type of that returned value).  Either the 'returned' or the 'threw' element (from 'memberExecutionDto') will be populated.
+                            </xs:documentation>
+                        </xs:annotation>
+                    </xs:element>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="propertyEditDto">
+        <xs:complexContent>
+            <xs:extension base="memberExecutionDto">
+                <xs:sequence>
+                    <xs:element name="newValue" type="com:valueWithTypeDto"/>
+                </xs:sequence>
+            </xs:extension>
+        </xs:complexContent>
+    </xs:complexType>
+
+    <xs:complexType name="metricsDto">
+        <xs:sequence>
+            <xs:element name="timings" type="com:periodDto">
+                <xs:annotation>
+                    <xs:documentation>The time taken to perform the member interaction (invoke the action, or edit the property).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="objectCounts" type="objectCountsDto">
+                <xs:annotation>
+                    <xs:documentation>How many objets were affected by the member interaction.
+                    </xs:documentation>
+                </xs:annotation>
+
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="objectCountsDto">
+        <xs:sequence>
+            <xs:element name="loaded" type="com:differenceDto">
+                <xs:annotation>
+                    <xs:documentation>The number of objects loaded.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="dirtied" type="com:differenceDto">
+                <xs:annotation>
+                    <xs:documentation>The number of objects dirtied (ie updated).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:sequence>
+
+    </xs:complexType>
+
+    <xs:complexType name="exceptionDto">
+        <xs:annotation>
+            <xs:documentation>Captures any exception thrown by an action invocation.  Use as the xsd:type of the 'threw' element.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element name="message" type="xs:string"/>
+            <xs:element name="stackTrace" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>A formatted stack trace.  (A future version of the 'exceptionDto' element might refine this to more easily parseable stack trace elements).
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="causedBy" type="exceptionDto" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/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 71bd7a6..8a68331 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
@@ -62,6 +62,10 @@ public class ObjectAdapterMemento implements Serializable {
         if (adapter == null) {
             return null;
         }
+        final Object object = adapter.getObject();
+        if(object == null) {
+            return null;
+        }
         return new ObjectAdapterMemento(adapter);
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/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 e2b9786..ffb303a 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
@@ -69,7 +69,9 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
                     final ScalarModel scalarModel = owner.getScalarModel();
                     final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
-                    return objectAdapterMemento != null? objectAdapterMemento.getList(): null;
+                    final ArrayList<ObjectAdapterMemento> mementos =
+                            objectAdapterMemento != null ? objectAdapterMemento.getList() : null;
+                    return mementos;
                 }
 
                 @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/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 619a9f9..de016cb 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
@@ -72,7 +72,7 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
     }
 
     private void syncWithInput() {
-        final ObjectAdapter adapter = getPendingElseCurrentAdapter();
+        final ObjectAdapter adapter = getEntityModel().getObject(); // getPendingElseCurrentAdapter();
 
         if (adapter != null) {
             final EntityModel entityModelForLink = new EntityModel(adapter);
@@ -81,21 +81,9 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
             
             final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
 
-            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);
-
-            }
+            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)'

http://git-wip-us.apache.org/repos/asf/isis/blob/0419e4d7/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index 059ed24..7796061 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -49,6 +49,7 @@ public class Select2MultiChoiceExt
             final ScalarModel scalarModel) {
         super(id, model, EmptyChoiceProvider.INSTANCE);
         specId = scalarModel.getTypeOfSpecification().getSpecId();
+
         setRequired(scalarModel.isRequired());
     }
 


[14/36] 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/master
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
 
 


[04/36] 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/master
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>
 


[05/36] 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/master
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>


[03/36] 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/master
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);


[33/36] isis git commit: ISIS-785: extracts method in ReferencePanel to create select2 object

Posted by da...@apache.org.
ISIS-785: extracts method in ReferencePanel to create select2 object


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

Branch: refs/heads/master
Commit: d1453c12b67019fb400802c70dad1aadc36d2062
Parents: 50a38e9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 15:05:09 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 15:05:09 2017 +0000

----------------------------------------------------------------------
 .../scalars/reference/ReferencePanel.java       | 81 ++++++++++----------
 1 file changed, 42 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d1453c12/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 abf32e4..4e5bc79 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
@@ -124,47 +124,10 @@ public class ReferencePanel extends ScalarPanelAbstract {
         
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
 
-        // create select2
         entityLink.setRequired(getModel().isRequired());
-
-        if(getModel().isCollection()) {
-            final IModel<ArrayList<ObjectAdapterMemento>> model =
-                    ScalarModelWithMultiPending.Util.createModel(getModel());
-            this.select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
-        } else {
-            final IModel<ObjectAdapterMemento> modelObject =
-                    ScalarModelWithPending.Util.createModel(getModel());
-            this.select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
-        }
-
-        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
-
-        final Settings settings = select2.getSettings();
-
-        // one of these three case should be true
-        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
-        if(getModel().hasChoices()) {
-
-            settings.setPlaceholder(getModel().getName());
-
-        } else if(getModel().hasAutoComplete()) {
-
-            final int minLength = getModel().getAutoCompleteMinLength();
-            settings.setMinimumInputLength(minLength);
-            settings.setPlaceholder(getModel().getName());
-
-        } else if(hasObjectAutoComplete()) {
-            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
-            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-            final int minLength = autoCompleteFacet.getMinLength();
-            settings.setMinimumInputLength(minLength);
-        }
-
+        this.select2 = createSelect2();
         entityLink.addOrReplace(select2.component());
 
-        // end create select2
-
-
         syncWithInput();
 
         setOutputMarkupId(true);
@@ -189,7 +152,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
 
         // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+        final List<LinkAndLabel> entityActions =
+                EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
         addPositioningCssTo(labelIfRegular, entityActions);
 
@@ -224,6 +188,45 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return labelIfRegular;
     }
 
+    private Select2 createSelect2() {
+
+        final Select2 select2;
+        if(getModel().isCollection()) {
+            final IModel<ArrayList<ObjectAdapterMemento>> model =
+                    ScalarModelWithMultiPending.Util.createModel(getModel());
+            select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
+        } else {
+            final IModel<ObjectAdapterMemento> modelObject =
+                    ScalarModelWithPending.Util.createModel(getModel());
+            select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
+        }
+
+        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
+
+        final Settings settings = select2.getSettings();
+
+        // one of these three case should be true
+        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
+        if(getModel().hasChoices()) {
+
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(getModel().hasAutoComplete()) {
+
+            final int minLength = getModel().getAutoCompleteMinLength();
+            settings.setMinimumInputLength(minLength);
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(hasObjectAutoComplete()) {
+            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+            final int minLength = autoCompleteFacet.getMinLength();
+            settings.setMinimumInputLength(minLength);
+        }
+
+        return select2;
+    }
+
     // //////////////////////////////////////
 
     // called from buildGui


[32/36] isis git commit: ISIS-785: feedback panel (indicating mandatory parameter etc) now shows for ReferencePanel.

Posted by da...@apache.org.
ISIS-785: feedback panel (indicating mandatory parameter etc) now shows for ReferencePanel.

Along the way, the ReferencePanel#select2 field is not created eagerly (similar to ValueSelect2ChoicePanel) and never removed.  There's a chance, at least, this might fix the floating drop-down problem.


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

Branch: refs/heads/master
Commit: 50a38e9f9d43cc86a766341e96de781fd49cadf0
Parents: d987650
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 13:18:07 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 13:18:07 2017 +0000

----------------------------------------------------------------------
 .../reference/EntityLinkSelect2Panel.java       |  9 +-
 .../scalars/reference/ReferencePanel.java       | 97 +++++++++++---------
 .../valuechoices/ValueChoicesSelect2Panel.java  |  1 -
 3 files changed, 57 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/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 a4035ac..34f50a3 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
@@ -20,6 +20,7 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
 import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.wicketstuff.select2.Select2MultiChoice;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
@@ -40,14 +41,12 @@ class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAdapter> i
 
     /**
      * Necessary because {@link FormComponentPanel} overrides this as <tt>true</tt>, whereas we want to
-     * report on the state of the underlying {@link org.wicketstuff.select2.Select2Choice}.
+     * report on the state of the underlying {@link org.wicketstuff.select2.Select2Choice} or
+     * {@link Select2MultiChoice}.
      */
     @Override
     public boolean checkRequired() {
-        if(owningPanel.select2 != null) {
-            return owningPanel.select2.checkRequired();
-        }
-        return super.checkRequired();
+        return owningPanel.select2.checkRequired();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/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 4331225..abf32e4 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
@@ -57,10 +57,10 @@ import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.Enti
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceChoices;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceObjectAutoComplete;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -84,6 +84,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     Select2 select2;
 
+
     private EntityLinkSimplePanel entitySimpleLink;
 
     public ReferencePanel(final String id, final ScalarModel scalarModel) {
@@ -115,7 +116,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return labelIfCompact;
     }
 
-
     // First called as a side-effect of {@link #beforeRender()}
     @Override
     protected FormGroup addComponentForRegular() {
@@ -123,34 +123,78 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final String name = scalarModel.getName();
         
         entityLink = new EntityLinkSelect2Panel(ComponentType.ENTITY_LINK.getWicketId(), this);
+
+        // create select2
+        entityLink.setRequired(getModel().isRequired());
+
+        if(getModel().isCollection()) {
+            final IModel<ArrayList<ObjectAdapterMemento>> model =
+                    ScalarModelWithMultiPending.Util.createModel(getModel());
+            this.select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
+        } else {
+            final IModel<ObjectAdapterMemento> modelObject =
+                    ScalarModelWithPending.Util.createModel(getModel());
+            this.select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
+        }
+
+        setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
+
+        final Settings settings = select2.getSettings();
+
+        // one of these three case should be true
+        // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
+        if(getModel().hasChoices()) {
+
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(getModel().hasAutoComplete()) {
+
+            final int minLength = getModel().getAutoCompleteMinLength();
+            settings.setMinimumInputLength(minLength);
+            settings.setPlaceholder(getModel().getName());
+
+        } else if(hasObjectAutoComplete()) {
+            final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
+            final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+            final int minLength = autoCompleteFacet.getMinLength();
+            settings.setMinimumInputLength(minLength);
+        }
+
+        entityLink.addOrReplace(select2.component());
+
+        // end create select2
+
+
         syncWithInput();
 
         setOutputMarkupId(true);
         entityLink.setOutputMarkupId(true);
-        entityLink.setLabel(Model.of(name));
+        select2.component().setOutputMarkupId(true);
+        select2.component().setLabel(Model.of(name));
 
         final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, entityLink);
         labelIfRegular.add(entityLink);
-        
+
         final String describedAs = getModel().getDescribedAs();
         if(describedAs != null) {
             labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
         }
-        
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(entityLink));
+
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
         labelIfRegular.add(scalarName);
         NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
         if (namedFacet != null) {
             scalarName.setEscapeModelStrings(namedFacet.escaped());
         }
 
+
         // find the links...
         final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
 
         addPositioningCssTo(labelIfRegular, entityActions);
 
         addOrReplace(labelIfRegular);
-        addFeedbackOnlyTo(labelIfRegular, entityLink);
+        addFeedbackOnlyTo(labelIfRegular, select2.component()); // this is a placeholder; when select2.component() is available, we use that instead
         addEditPropertyTo(labelIfRegular);
 
         // ... add entity links to panel (below and to right)
@@ -264,42 +308,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         if(isEditableWithEitherAutoCompleteOrChoices()) {
 
             if(select2 == null) {
-                entityLink.setRequired(getModel().isRequired());
-
-                if(getModel().isCollection()) {
-                    final IModel<ArrayList<ObjectAdapterMemento>> model =
-                            ScalarModelWithMultiPending.Util.createModel(getModel());
-                    select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
-                } else {
-                    final IModel<ObjectAdapterMemento> modelObject =
-                            ScalarModelWithPending.Util.createModel(getModel());
-                    select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
-                }
-                setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
-
-                final Settings settings = select2.getSettings();
-
-                // one of these three case should be true
-                // (as per the isEditableWithEitherAutoCompleteOrChoices() guard above)
-                if(getModel().hasChoices()) {
-
-                    settings.setPlaceholder(getModel().getName());
-
-                } else if(getModel().hasAutoComplete()) {
-
-                    final int minLength = getModel().getAutoCompleteMinLength();
-                    settings.setMinimumInputLength(minLength);
-                    settings.setPlaceholder(getModel().getName());
-
-                } else if(hasObjectAutoComplete()) {
-                    final ObjectSpecification typeOfSpecification = getModel().getTypeOfSpecification();
-                    final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                    final int minLength = autoCompleteFacet.getMinLength();
-                    settings.setMinimumInputLength(minLength);
-                }
-
-                entityLink.addOrReplace(select2.component());
-
+                throw new IllegalStateException("select2 should be created already");
             } else {
                 //
                 // the select2Choice already exists, so the widget has been rendered before.  If it is
@@ -338,7 +347,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);
-            select2 = null; // this forces recreation next time around
+            // setSelect2(null); // this forces recreation next time around
         }
         
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/50a38e9f/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index fcbca2f..28a315e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -61,7 +61,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     @Override
     protected MarkupContainer addComponentForRegular() {
 
-
         // same pattern as in ReferencePanel
         if(select2 == null) {
             if(getModel().isCollection()) {


[08/36] 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/master
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;


[13/36] 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/master
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
 
 


[15/36] 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/master
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));


[12/36] 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/master
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


[02/36] 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/master
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);


[25/36] isis git commit: ISIS-785: huzzah... can now invoke actions also with a collection of objects.

Posted by da...@apache.org.
ISIS-785: huzzah... can now invoke actions also with 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/d62089eb
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/d62089eb
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/d62089eb

Branch: refs/heads/master
Commit: d62089eb7cd875192665ac76a1c8c23e4e618d80
Parents: fadb7ec
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 11:25:18 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 11:25:18 2017 +0000

----------------------------------------------------------------------
 .../model/mementos/ObjectAdapterMemento.java    | 16 ++-----
 .../viewer/wicket/model/models/EntityModel.java |  2 +-
 .../models/ScalarModelWithMultiPending.java     | 50 --------------------
 .../scalars/reference/ReferencePanel.java       | 12 ++---
 .../components/scalars/reference/Select2.java   | 34 +++++--------
 5 files changed, 25 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d62089eb/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 d6d820e..3b7505e 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
@@ -89,9 +89,10 @@ public class ObjectAdapterMemento implements Serializable {
             @Override
             public ObjectAdapter asAdapter(
                     final ObjectAdapterMemento oam,
+                    final ConcurrencyChecking concurrencyChecking,
                     final PersistenceSession persistenceSession,
                     final SpecificationLoader specificationLoader) {
-                return oam.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader);
+                return oam.type.getAdapter(oam, concurrencyChecking, persistenceSession, specificationLoader);
             }
 
             @Override
@@ -124,7 +125,7 @@ public class ObjectAdapterMemento implements Serializable {
             @Override
             public ObjectAdapter asAdapter(
                     final ObjectAdapterMemento oam,
-                    final PersistenceSession persistenceSession,
+                    final ConcurrencyChecking concurrencyChecking, final PersistenceSession persistenceSession,
                     final SpecificationLoader specificationLoader) {
                 final List<Object> listOfPojos =
                         Lists.newArrayList(
@@ -167,7 +168,7 @@ public class ObjectAdapterMemento implements Serializable {
 
         public abstract ObjectAdapter asAdapter(
                 final ObjectAdapterMemento oam,
-                final PersistenceSession persistenceSession,
+                final ConcurrencyChecking concurrencyChecking, final PersistenceSession persistenceSession,
                 final SpecificationLoader specificationLoader);
 
         public abstract int hashCode(final ObjectAdapterMemento oam);
@@ -446,12 +447,6 @@ public class ObjectAdapterMemento implements Serializable {
         return list;
     }
 
-    public ObjectAdapter asAdapter(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
-        return sort.asAdapter(this, persistenceSession, specificationLoader);
-    }
-
 
     public void resetVersion(
             final PersistenceSession persistenceSession,
@@ -480,8 +475,7 @@ public class ObjectAdapterMemento implements Serializable {
             final ConcurrencyChecking concurrencyChecking,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
-        ensureScalar();
-        return type.getAdapter(this, concurrencyChecking, persistenceSession, specificationLoader);
+        return sort.asAdapter(this, concurrencyChecking, persistenceSession, specificationLoader);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/d62089eb/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 74c1c3a..d9692df 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
@@ -361,7 +361,7 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
             final ObjectAdapterMemento memento,
             final PersistenceSession persistenceSession,
             final SpecificationLoader specificationLoader) {
-        super.setObject(memento.asAdapter(persistenceSession, specificationLoader));
+        super.setObject(memento.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader));
         adapterMemento = memento;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d62089eb/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 1a824cc..9ada5fd 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
@@ -18,19 +18,11 @@ 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;
@@ -101,47 +93,5 @@ public interface ScalarModelWithMultiPending extends Serializable {
             };
         }
 
-        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) {
-
-            return ObjectAdapterMemento.createForList(modelObject);
-        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/d62089eb/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 d23e63f..b0d009f 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
@@ -383,12 +383,12 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
     // called by setProviderAndCurrAndPending
     private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choiceMementos) {
-        final ObjectAdapterMemento curr = select2.getModelObject(getPersistenceSession(), getSpecificationLoader());
+        final ObjectAdapterMemento curr = select2.getModelObject();
 
         if(!getModel().isCollection()) {
 
             if(curr == null) {
-                select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(null);
+                select2.getModel().setObject(null);
                 getModel().setObject(null);
                 return;
             }
@@ -396,11 +396,11 @@ public class ReferencePanel extends ScalarPanelAbstract {
             if(!curr.containedIn(choiceMementos, getPersistenceSession(), getSpecificationLoader())) {
                 if(!choiceMementos.isEmpty() && autoSelect()) {
                     final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
-                    select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(newAdapterMemento);
+                    select2.getModel().setObject(newAdapterMemento);
                     getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
                             getPersistenceSession(), getSpecificationLoader()));
                 } else {
-                    select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(null);
+                    select2.getModel().setObject(null);
                     getModel().setObject(null);
                 }
             }
@@ -490,11 +490,11 @@ public class ReferencePanel extends ScalarPanelAbstract {
 
             // flush changes to pending
             ObjectAdapterMemento convertedInput =
-                    select2.getConvertedInput(getPersistenceSession(), getSpecificationLoader());
+                    select2.getConvertedInput();
             
             getModel().setPending(convertedInput);
             if(select2 != null) {
-                select2.getModel(getPersistenceSession(), getSpecificationLoader()).setObject(convertedInput);
+                select2.getModel().setObject(convertedInput);
             }
             
             final ObjectAdapter adapter = convertedInput!=null?convertedInput.getObjectAdapter(ConcurrencyChecking.NO_CHECK,

http://git-wip-us.apache.org/repos/asf/isis/blob/d62089eb/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
index e650d3b..d82773c 100644
--- 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
@@ -30,10 +30,7 @@ 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 {
 
@@ -90,28 +87,24 @@ public class Select2 implements Serializable {
             select2MultiChoice.setProvider(providerForChoices);
     }
 
-    public ObjectAdapterMemento getModelObject(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+    public ObjectAdapterMemento getModelObject() {
         if (select2Choice != null) {
             return select2Choice.getModelObject();
         } else {
             final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
-            return ScalarModelWithMultiPending.Util
-                    .toAdapterMemento(modelObject, persistenceSession, specificationLoader);
+
+            return ObjectAdapterMemento.createForList(modelObject);
         }
     }
 
-    public IModel<ObjectAdapterMemento> getModel(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+    public IModel<ObjectAdapterMemento> getModel() {
         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);
+
+            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject);
             return new IModel<ObjectAdapterMemento>() {
                 @Override
                 public ObjectAdapterMemento getObject() {
@@ -120,26 +113,25 @@ public class Select2 implements Serializable {
 
                 @Override
                 public void setObject(final ObjectAdapterMemento memento) {
-                    final ArrayList<ObjectAdapterMemento> mementos = ScalarModelWithMultiPending.Util
-                            .asMementoList(memento, persistenceSession, specificationLoader);
+
+                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
                     model.setObject(mementos);
                 }
 
-                @Override public void detach() {
-
+                @Override
+                public void detach() {
                 }
             };
         }
     }
 
-    public ObjectAdapterMemento getConvertedInput(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+    public ObjectAdapterMemento getConvertedInput() {
         if (select2Choice != null) {
             return select2Choice.getConvertedInput();
         } else {
             final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
-            return ScalarModelWithMultiPending.Util.toAdapterMemento(convertedInput, persistenceSession, specificationLoader);
+
+            return ObjectAdapterMemento.createForList(convertedInput);
         }
     }
 }


[19/36] 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/master
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;
 


[18/36] 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/master
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) {


[10/36] 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/master
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");
+    }
+}


[26/36] isis git commit: ISIS-785: working towards supporting values types, also defaults. Not there yet.

Posted by da...@apache.org.
ISIS-785: working towards supporting values types, also defaults.  Not there yet.

In particular:
- extends ObjectAdapterMemento so that getObjectSpecId() is supported for both scalar and vector "sorts"
- custom subclasses of Select2Choice and Select2MultiChoice to support this (holds the specId... also refactors/simplifies some code); simplify Select2 and remove Select2ChoiceUtil
- extends ScalarModel#setObject(ObjectAdapter) so that can transparently handle an ObjectAdapter that's a list of pojos (eg as occurs when invoke the defaultXxx supporting method)
- renamed ScalarModelWithMultiPending methods so ValuesChoicesSelect2Panel can implement it and also ScalarModelWithPending without there being a clash in the return type;
- refactored ValuesChoicesSelect2Panel to use Select2 rather than Select2Choice


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

Branch: refs/heads/master
Commit: 03b8f4ab4730703eddc170b2f220a1dbeb0e5256
Parents: d62089e
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 14:20:27 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 14:20:27 2017 +0000

----------------------------------------------------------------------
 .../model/mementos/ObjectAdapterMemento.java    |  24 ++---
 .../viewer/wicket/model/models/ScalarModel.java |  31 +++++-
 .../models/ScalarModelWithMultiPending.java     |  22 ++--
 .../model/models/ScalarModelWithPending.java    |   8 +-
 .../scalars/reference/ReferencePanel.java       |  15 ++-
 .../components/scalars/reference/Select2.java   |  94 +++++++++++-----
 .../components/widgets/select2/ChoiceExt.java   |  38 +++++++
 .../widgets/select2/EmptyChoiceProvider.java    |  44 ++++++++
 .../widgets/select2/Select2ChoiceExt.java       |  50 +++++++++
 .../widgets/select2/Select2ChoiceUtil.java      |  77 -------------
 .../widgets/select2/Select2MultiChoiceExt.java  |  59 ++++++++++
 .../valuechoices/ValueChoicesSelect2Panel.java  | 108 ++++++++++++-------
 12 files changed, 397 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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 3b7505e..71bd7a6 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
@@ -72,12 +72,16 @@ public class ObjectAdapterMemento implements Serializable {
         return new ObjectAdapterMemento(rootOid);
     }
 
-    public static ObjectAdapterMemento createForList(final ArrayList<ObjectAdapterMemento> list) {
-        return new ObjectAdapterMemento(list);
+    public static ObjectAdapterMemento createForList(
+            final ArrayList<ObjectAdapterMemento> list,
+            final ObjectSpecId objectSpecId) {
+        return new ObjectAdapterMemento(list, objectSpecId);
     }
 
-    public static ObjectAdapterMemento createForList(final Collection<ObjectAdapterMemento> list) {
-        return list != null ? createForList(Lists.newArrayList(list)) :  null;
+    public static ObjectAdapterMemento createForList(
+            final Collection<ObjectAdapterMemento> list,
+            final ObjectSpecId objectSpecId) {
+        return list != null ? createForList(Lists.newArrayList(list), objectSpecId) :  null;
     }
 
     enum Sort {
@@ -335,6 +339,7 @@ public class ObjectAdapterMemento implements Serializable {
 
 
     private final Sort sort;
+    private final ObjectSpecId objectSpecId;
 
     /**
      * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
@@ -344,10 +349,6 @@ public class ObjectAdapterMemento implements Serializable {
     /**
      * 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;
 
     /**
@@ -387,9 +388,10 @@ public class ObjectAdapterMemento implements Serializable {
      */
     private ArrayList<ObjectAdapterMemento> list;
 
-    public ObjectAdapterMemento(final ArrayList<ObjectAdapterMemento> list) {
+    public ObjectAdapterMemento(final ArrayList<ObjectAdapterMemento> list, final ObjectSpecId objectSpecId) {
         this.sort = Sort.VECTOR;
         this.list = list;
+        this.objectSpecId = objectSpecId;
     }
 
     private ObjectAdapterMemento(final RootOid rootOid) {
@@ -481,9 +483,6 @@ public class ObjectAdapterMemento implements Serializable {
     /**
      * Updates the memento if the adapter's state has changed.
      * 
-     * <p>
-     * This is a no-op for
-     * 
      * @param adapter
      */
     public void setAdapter(final ObjectAdapter adapter) {
@@ -492,7 +491,6 @@ public class ObjectAdapterMemento implements Serializable {
     }
 
     public ObjectSpecId getObjectSpecId() {
-        ensureScalar();
         return objectSpecId;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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 d0a6c07..b0aae4f 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
@@ -25,6 +25,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Where;
@@ -731,7 +732,29 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
 
     @Override
     public void setObject(final ObjectAdapter adapter) {
-        super.setObject(adapter); // associated value
+        if(adapter == null) {
+            super.setObject(null);
+            return;
+        }
+
+        final Object pojo = adapter.getObject();
+        if(pojo == null) {
+            super.setObject(null);
+            return;
+        }
+
+        if(isCollection()) {
+            final Iterable iterable = (Iterable) pojo;
+            final ArrayList<ObjectAdapterMemento> listOfMementos =
+                    Lists.newArrayList(FluentIterable.from(iterable)
+                          .transform(ObjectAdapterMemento.Functions.fromPojo(getPersistenceSession()))
+                    .toList());
+            final ObjectAdapterMemento memento =
+                    ObjectAdapterMemento.createForList(listOfMementos, getTypeOfSpecification().getSpecId());
+            super.setObjectMemento(memento, getPersistenceSession(), getSpecificationLoader()); // associated value
+        } else {
+            super.setObject(adapter); // associated value
+        }
     }
 
     public void setObjectAsString(final String enteredText) {
@@ -874,14 +897,14 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
             private static final long serialVersionUID = 1L;
 
             @Override
-            public ArrayList<ObjectAdapterMemento> getPending() {
+            public ArrayList<ObjectAdapterMemento> getMultiPending() {
                 final ObjectAdapterMemento pending = ScalarModel.this.getPending();
                 return pending != null ? pending.getList() : null;
             }
 
             @Override
-            public void setPending(final ArrayList<ObjectAdapterMemento> pending) {
-                final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createForList(pending);
+            public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+                final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createForList(pending, getScalarModel().getTypeOfSpecification().getSpecId());
                 ScalarModel.this.setPending(adapterMemento);
             }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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 9ada5fd..e2b9786 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
@@ -19,10 +19,12 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.io.Serializable;
 import java.util.ArrayList;
 
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 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;
@@ -34,15 +36,19 @@ import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
  */
 public interface ScalarModelWithMultiPending extends Serializable {
 
-    public ArrayList<ObjectAdapterMemento> getPending();
-    public void setPending(ArrayList<ObjectAdapterMemento> pending);
+    public ArrayList<ObjectAdapterMemento> getMultiPending();
+    public void setMultiPending(ArrayList<ObjectAdapterMemento> pending);
 
     public ScalarModel getScalarModel();
 
     static class Util {
 
         private static final Logger LOG = LoggerFactory.getLogger(ScalarModelWithMultiPending.Util.class);
-        
+
+        public static IModel<ArrayList<ObjectAdapterMemento>> createModel(final ScalarModel model) {
+            return createModel(model.asScalarModelWithMultiPending());
+        }
+
         public static Model<ArrayList<ObjectAdapterMemento>> createModel(final ScalarModelWithMultiPending owner) {
             return new Model<ArrayList<ObjectAdapterMemento>>() {
 
@@ -50,7 +56,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
 
                 @Override
                 public ArrayList<ObjectAdapterMemento> getObject() {
-                    final ArrayList<ObjectAdapterMemento> pending = owner.getPending();
+                    final ArrayList<ObjectAdapterMemento> pending = owner.getMultiPending();
                     if (pending != null) {
                         if (LOG.isDebugEnabled()) {
                             LOG.debug("pending not null: " + pending.toString());
@@ -71,7 +77,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
                     if (LOG.isDebugEnabled()) {
                         LOG.debug(String.format("setting to: %s", adapterMemento != null ? adapterMemento.toString() : null));
                     }
-                    owner.setPending(adapterMemento);
+                    owner.setMultiPending(adapterMemento);
 
                     final ScalarModel ownerScalarModel = owner.getScalarModel();
                     final PersistenceSession persistenceSession = ownerScalarModel.getPersistenceSession();
@@ -80,13 +86,15 @@ public interface ScalarModelWithMultiPending extends Serializable {
                     if(adapterMemento == null) {
                         ownerScalarModel.setObject(null);
                     } else {
-                        final ArrayList<ObjectAdapterMemento> ownerPending = owner.getPending();
+                        final ArrayList<ObjectAdapterMemento> ownerPending = owner.getMultiPending();
                         if (ownerPending != null) {
                             if (LOG.isDebugEnabled()) {
                                 LOG.debug(String.format("setting to pending: %s", ownerPending.toString()));
                             }
+                            final ObjectSpecId objectSpecId = ownerScalarModel.getTypeOfSpecification().getSpecId();
                             ownerScalarModel.setObjectMemento(
-                                    ObjectAdapterMemento.createForList(adapterMemento), persistenceSession, specificationLoader);
+                                    ObjectAdapterMemento.createForList(adapterMemento, objectSpecId),
+                                    persistenceSession, specificationLoader);
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index bed0300..31c026e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -18,6 +18,7 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
 
+import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,7 +41,11 @@ public interface ScalarModelWithPending extends Serializable {
     static class Util {
         
         private static final Logger LOG = LoggerFactory.getLogger(ScalarModelWithPending.Util.class);
-        
+
+        public static IModel<ObjectAdapterMemento> createModel(final ScalarModel model) {
+            return createModel(model.asScalarModelWithPending());
+        }
+
         public static Model<ObjectAdapterMemento> createModel(final ScalarModelWithPending owner) {
             return new Model<ObjectAdapterMemento>() {
 
@@ -90,5 +95,6 @@ public interface ScalarModelWithPending extends Serializable {
                 }
             };
         }
+
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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 b0d009f..abcc7ef 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
@@ -59,7 +59,6 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -266,15 +265,13 @@ public class ReferencePanel extends ScalarPanelAbstract {
                 entityLink.setRequired(getModel().isRequired());
 
                 if(getModel().isCollection()) {
-                    final IModel<ArrayList<ObjectAdapterMemento>> modelWithMultiPending =
-                            ScalarModelWithMultiPending.Util.createModel(getModel().asScalarModelWithMultiPending());
-                    select2 = Select2.with(Select2ChoiceUtil.newSelect2MultiChoice(ID_AUTO_COMPLETE, modelWithMultiPending,
-                            getModel()));
+                    final IModel<ArrayList<ObjectAdapterMemento>> model =
+                            ScalarModelWithMultiPending.Util.createModel(getModel());
+                    select2 = Select2.newSelect2MultiChoice(ID_AUTO_COMPLETE, model, getModel());
                 } else {
-                    final IModel<ObjectAdapterMemento> modelWithPending =
-                            ScalarModelWithPending.Util.createModel(getModel().asScalarModelWithPending());
-                    select2 = Select2.with(Select2ChoiceUtil.newSelect2Choice(ID_AUTO_COMPLETE, modelWithPending,
-                            getModel()));
+                    final IModel<ObjectAdapterMemento> modelObject =
+                            ScalarModelWithPending.Util.createModel(getModel());
+                    select2 = Select2.newSelect2Choice(ID_AUTO_COMPLETE, modelObject, getModel());
                 }
                 setProviderAndCurrAndPending(select2, getModel().getActionArgsHint());
 

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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
index d82773c..7d47b74 100644
--- 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
@@ -21,51 +21,69 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.form.HiddenField;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Select2Choice;
 import org.wicketstuff.select2.Select2MultiChoice;
 import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.ChoiceExt;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceExt;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2MultiChoiceExt;
 
+/**
+ * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+ */
 public class Select2 implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    final Select2Choice<ObjectAdapterMemento> select2Choice;
-    final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice;
+    final Select2ChoiceExt select2Choice;
+    final Select2MultiChoiceExt select2MultiChoice;
 
-    public static Select2 with(final Select2Choice<ObjectAdapterMemento> select2Choice) {
-        return new Select2(select2Choice, null);
+    public static Select2 newSelect2Choice(
+            final String id,
+            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+        return new Select2(
+                Select2ChoiceExt.create(id, singleModel, parentModel),
+                null
+        );
     }
 
-    public static Select2 with(final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice) {
-        return new Select2(null, select2MultiChoice);
+    public static Select2 newSelect2MultiChoice(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+            final ScalarModel parentModel) {
+        return new Select2(
+                null,
+                Select2MultiChoiceExt.create(id, multiModel, parentModel)
+        );
     }
 
     private Select2(
-            final Select2Choice<ObjectAdapterMemento> select2Choice,
-            final Select2MultiChoice<ObjectAdapterMemento> select2MultiChoice) {
+            final Select2ChoiceExt select2Choice,
+            final Select2MultiChoiceExt select2MultiChoice) {
         this.select2Choice = select2Choice;
         this.select2MultiChoice = select2MultiChoice;
     }
 
-    public void add(final Behavior behavior) {
-        component().add(behavior);
-    }
-
-    HiddenField<?> component() {
+    public HiddenField<?> component() {
         return select2Choice != null
-                ? (HiddenField<ObjectAdapterMemento>) select2Choice
-                : (HiddenField<Collection<ObjectAdapterMemento>>) select2MultiChoice;
+                ? select2Choice
+                : select2MultiChoice;
     }
 
-    public Settings getSettings() {
-        return select2Choice != null ? select2Choice.getSettings() : select2MultiChoice.getSettings();
+    public ChoiceExt choiceExt() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
     }
 
     public void clearInput() {
@@ -76,15 +94,19 @@ public class Select2 implements Serializable {
         component().setEnabled(mutability);
     }
 
+    public void setRequired(final boolean required) {
+        component().setRequired(required);
+    }
     public boolean checkRequired() {
         return component().checkRequired();
     }
 
+    public Settings getSettings() {
+        return choiceExt().getSettings();
+    }
+
     public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
-        if (select2Choice != null)
-            select2Choice.setProvider(providerForChoices);
-        else
-            select2MultiChoice.setProvider(providerForChoices);
+        choiceExt().setProvider(providerForChoices);
     }
 
     public ObjectAdapterMemento getModelObject() {
@@ -93,7 +115,7 @@ public class Select2 implements Serializable {
         } else {
             final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
 
-            return ObjectAdapterMemento.createForList(modelObject);
+            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
         }
     }
 
@@ -104,7 +126,7 @@ public class Select2 implements Serializable {
             final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
             final Collection<ObjectAdapterMemento> modelObject = model.getObject();
 
-            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject);
+            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
             return new IModel<ObjectAdapterMemento>() {
                 @Override
                 public ObjectAdapterMemento getObject() {
@@ -114,6 +136,11 @@ public class Select2 implements Serializable {
                 @Override
                 public void setObject(final ObjectAdapterMemento memento) {
 
+                    if(memento == null) {
+                        model.setObject(null);
+                        return;
+                    }
+
                     final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
                     model.setObject(mementos);
                 }
@@ -130,8 +157,25 @@ public class Select2 implements Serializable {
             return select2Choice.getConvertedInput();
         } else {
             final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
-
-            return ObjectAdapterMemento.createForList(convertedInput);
+            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
         }
     }
+
+    public void setLabel(final Model<String> model) {
+        component().setLabel(model);
+    }
+
+    public void add(final Behavior behavior) {
+        component().add(behavior);
+    }
+
+    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+        return component().getBehaviors(behaviorClass);
+    }
+
+    public void remove(final Behavior behavior) {
+        component().remove(behavior);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/ChoiceExt.java
new file mode 100644
index 0000000..b65bc2b
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/ChoiceExt.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.viewer.wicket.ui.components.widgets.select2;
+
+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.spec.ObjectSpecId;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+/**
+ * Represents functionality that is common to both {@link Select2Choice} and {@link Select2MultiChoice}, but for
+ * which there is no suitable common supertype.
+ *
+ * Also holds extensions, notable {@link #getSpecId()}.
+ */
+public interface ChoiceExt {
+    void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices);
+    Settings getSettings();
+
+    ObjectSpecId getSpecId();
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
new file mode 100644
index 0000000..0cb647b
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
@@ -0,0 +1,44 @@
+/**
+ *  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.widgets.select2;
+
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONWriter;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+
+    static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+
+    @Override
+    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+    }
+
+    @Override
+    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
new file mode 100644
index 0000000..3e0f25b
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
@@ -0,0 +1,50 @@
+/**
+ *  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.widgets.select2;
+
+import org.apache.wicket.model.IModel;
+import org.wicketstuff.select2.Select2Choice;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class Select2ChoiceExt extends Select2Choice<ObjectAdapterMemento> implements ChoiceExt {
+
+    public static Select2ChoiceExt create(
+            final String id,
+            final IModel<ObjectAdapterMemento> modelObject,
+            final ScalarModel scalarModel) {
+        return new Select2ChoiceExt(id, modelObject, scalarModel);
+    }
+
+    private final ObjectSpecId specId;
+
+    private Select2ChoiceExt(
+            final String id,
+            final IModel<ObjectAdapterMemento> model,
+            final ScalarModel scalarModel) {
+        super(id, model, EmptyChoiceProvider.INSTANCE);
+        specId = scalarModel.getTypeOfSpecification().getSpecId();
+        setRequired(scalarModel.isRequired());
+    }
+
+    @Override
+    public ObjectSpecId getSpecId() {
+        return specId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/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
deleted file mode 100644
index 08a00c6..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceUtil.java
+++ /dev/null
@@ -1,77 +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.ui.components.widgets.select2;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONWriter;
-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;
-
-public final class Select2ChoiceUtil  {
-
-    private Select2ChoiceUtil(){}
-
-    public static Select2Choice<ObjectAdapterMemento> newSelect2Choice(String id, final IModel<ObjectAdapterMemento> modelObject, ScalarModel scalarModel) {
-        Select2Choice<ObjectAdapterMemento> select2Choice = new Select2Choice<>(id, modelObject, EmptyChoiceProvider.INSTANCE);
-        select2Choice.setRequired(scalarModel.isRequired());
-        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();
-
-        @Override
-        public void query(String term, int page, Response<ObjectAdapterMemento> response) {
-
-        }
-
-        @Override
-        public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
-
-        }
-
-        @Override
-        public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
-            return null;
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
new file mode 100644
index 0000000..059ed24
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.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.viewer.wicket.ui.components.widgets.select2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.wicket.model.IModel;
+import org.wicketstuff.select2.Select2MultiChoice;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class Select2MultiChoiceExt
+        extends Select2MultiChoice<ObjectAdapterMemento>
+        implements ChoiceExt {
+
+    public static Select2MultiChoiceExt create(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> modelObject,
+            final ScalarModel scalarModel) {
+
+        // TODO: naughty..
+        final IModel<Collection<ObjectAdapterMemento>> modelObjectColl = (IModel) modelObject;
+
+        return new Select2MultiChoiceExt(id, modelObjectColl, scalarModel);
+    }
+
+    private final ObjectSpecId specId;
+
+    Select2MultiChoiceExt(
+            final String id,
+            final IModel<Collection<ObjectAdapterMemento>> model,
+            final ScalarModel scalarModel) {
+        super(id, model, EmptyChoiceProvider.INSTANCE);
+        specId = scalarModel.getTypeOfSpecification().getSpecId();
+        setRequired(scalarModel.isRequired());
+    }
+
+    @Override
+    public ObjectSpecId getSpecId() {
+        return specId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/03b8f4ab/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 172069e..66b682f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices;
 
-
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
@@ -34,7 +34,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -43,19 +42,20 @@ import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 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.ScalarModel;
+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.components.actionmenu.entityactions.EntityActionUtil;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.reference.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceUtil;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending {
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
 
     private static final long serialVersionUID = 1L;
 
-    private Select2Choice<ObjectAdapterMemento> select2Field;
+    private Select2 select2;
     private ObjectAdapterMemento pending;
 
     public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
@@ -66,16 +66,22 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     @Override
     protected MarkupContainer addComponentForRegular() {
 
-        final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
-        final ObjectAdapter[] actionArgsHint = getScalarModel().getActionArgsHint();
-        
-        // same pattern as in EntityLinkSelect2Panel
-        if(select2Field == null) {
-            select2Field = Select2ChoiceUtil.newSelect2Choice(ID_SCALAR_VALUE, modelObject, getScalarModel());
+
+        // same pattern as in ReferencePanel
+        if(select2 == null) {
+            if(getModel().isCollection()) {
+                final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
+                select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            } else {
+                final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+                select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            }
+
+            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
             setChoices(actionArgsHint);
             addStandardSemantics();
         } else {
-            select2Field.clearInput();
+            select2.clearInput();
         }
 
 
@@ -86,7 +92,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         
         addOrReplace(labelIfRegular);
 
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2Field));
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
         if(getModel().isRequired()) {
             final String label = scalarName.getDefaultModelObjectAsString();
             if(!Strings.isNullOrEmpty(label)) {
@@ -104,7 +110,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
 
         addPositioningCssTo(labelIfRegular, entityActions);
 
-        addFeedbackOnlyTo(labelIfRegular, select2Field);
+        addFeedbackOnlyTo(labelIfRegular, select2.component());
         addEditPropertyTo(labelIfRegular);
 
         // ... add entity links to panel (below and to right)
@@ -128,21 +134,21 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     private void setRequiredIfSpecified() {
         final ScalarModel scalarModel = getModel();
         final boolean required = scalarModel.isRequired();
-        select2Field.setRequired(required);
+        select2.setRequired(required);
     }
 
     protected MarkupContainer createFormComponentLabel() {
         final String name = getModel().getName();
-        select2Field.setLabel(Model.of(name));
+        select2.setLabel(Model.of(name));
 
-        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2Field);
+        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
 
         final String describedAs = getModel().getDescribedAs();
         if(describedAs != null) {
             labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
         }
 
-        labelIfRegular.add(select2Field);
+        labelIfRegular.add(select2.component());
 
         return labelIfRegular;
     }
@@ -156,7 +162,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
 
     
     protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
-        return new FixedObjectAdapterMementoProvider(getScalarModel(), choicesMementos, wicketViewerSettings);
+        return new FixedObjectAdapterMementoProvider(scalarModel, choicesMementos, wicketViewerSettings);
     }
 
     static class FixedObjectAdapterMementoProvider extends ObjectAdapterMementoProviderAbstract {
@@ -213,13 +219,13 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     @Override
     protected void onBeforeRenderWhenViewMode() { 
         // View: Read only
-        select2Field.setEnabled(false);
+        select2.setEnabled(false);
     }
 
     @Override
     protected void onBeforeRenderWhenEnabled() { 
         // Edit: read/write
-        select2Field.setEnabled(true);
+        select2.setEnabled(true);
 
         // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
     }
@@ -228,7 +234,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     protected void onBeforeRenderWhenDisabled(final String disableReason) {
         super.onBeforeRenderWhenDisabled(disableReason);
         setTitleAttribute(disableReason);
-        select2Field.setEnabled(false);
+        select2.setEnabled(false);
     }
 
     private void setTitleAttribute(final String titleAttribute) {
@@ -238,10 +244,10 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     
     @Override
     protected void addFormComponentBehavior(Behavior behavior) {
-        for (Behavior b : select2Field.getBehaviors(ScalarUpdatingBehavior.class)) {
-            select2Field.remove(b);
+        for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
+            select2.remove(b);
         }
-        select2Field.add(behavior);
+        select2.add(behavior);
     }
 
     // //////////////////////////////////////
@@ -260,23 +266,37 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
         final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
         
         final ChoiceProvider<ObjectAdapterMemento> provider = newChoiceProvider(choicesMementos);
-        select2Field.setProvider(provider);
+        select2.setProvider(provider);
         getModel().clearPending();
         final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
         if(objectAdapterMemento == null) {
-            select2Field.getModel().setObject(null);
+            select2.getModel().setObject(null);
         } else {
-            if(!choicesMementos.contains(objectAdapterMemento)) {
-                final ObjectAdapterMemento newAdapterMemento = 
-                        !choicesMementos.isEmpty() 
-                        ? choicesMementos.get(0) 
-                                : null;
-                        select2Field.getModel().setObject(newAdapterMemento);
+
+            if(!getModel().isCollection()) {
+
+                if(!choicesMementos.contains(objectAdapterMemento)) {
+
+                    final ObjectAdapterMemento newAdapterMemento;
+                    if (!choicesMementos.isEmpty()) {
+                        newAdapterMemento = choicesMementos.get(0);
+                    } else {
+                        newAdapterMemento = null;
+                    }
+
+                    final IModel<ObjectAdapterMemento> model = select2.getModel();
+                    model.setObject(newAdapterMemento);
+                    if (newAdapterMemento != null) {
                         getModel().setObject(
-                                newAdapterMemento != null
-                                    ? newAdapterMemento.getObjectAdapter(
-                                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader())
-                                    : null);
+                                newAdapterMemento.getObjectAdapter(
+                                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader()));
+                    } else {
+                        getModel().setObject(null);
+                    }
+                }
+
+            } else {
+                // TODO
             }
         }
     }
@@ -284,17 +304,31 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     
     // //////////////////////////////////////
 
+    @Override
     public ObjectAdapterMemento getPending() {
         return pending;
     }
+
     public void setPending(ObjectAdapterMemento pending) {
         this.pending = pending;
     }
 
+    @Override
+    public ArrayList<ObjectAdapterMemento> getMultiPending() {
+        return pending != null ? pending.getList() : null;
+    }
+
+    @Override
+    public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+        this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
+    }
+
     public ScalarModel getScalarModel() {
         return scalarModel;
     }
 
+    // //////////////////////////////////////
+
     @com.google.inject.Inject
     private WicketViewerSettings wicketViewerSettings;
 }


[34/36] isis git commit: ISIS-785: tidying up, moves methods from SpecificationLoader into either TypeOfFacet.Util or CollectionUtils (as static methods)

Posted by da...@apache.org.
ISIS-785: tidying up, moves methods from SpecificationLoader into either TypeOfFacet.Util or CollectionUtils (as static methods)


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

Branch: refs/heads/master
Commit: 482286e2b5bbced62a5e01c1618ae38aea3be5c6
Parents: d1453c1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 15:05:54 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 15:05:54 2017 +0000

----------------------------------------------------------------------
 .../core/metamodel/facets/FacetedMethod.java    |  11 +-
 .../facets/actcoll/typeof/TypeOfFacet.java      |  94 +++++++++++++
 .../action/ActionAnnotationFacetFactory.java    |   5 +-
 .../metamodel/specloader/CollectionUtils.java   |  47 +++++++
 .../specloader/SpecificationLoader.java         | 135 -------------------
 .../actions/ActionMethodsFacetFactoryTest.java  |   1 +
 ...apterMementoProviderForValueChoicesTest.java |   7 -
 7 files changed, 152 insertions(+), 148 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/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 c2d6410..7c4b64e 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
@@ -34,7 +34,7 @@ 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;
+import org.apache.isis.core.metamodel.specloader.*;
 
 /**
  * non-final only so it can be mocked if need be.
@@ -117,7 +117,8 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
             final Type genericParameterType = genericParameterTypes[paramNum];
 
             final FeatureType featureType =
-                    specificationLoader.isParamCollection(parameterType, genericParameterType)
+                    org.apache.isis.core.metamodel.specloader.CollectionUtils
+                            .isParamCollection(parameterType, genericParameterType)
                             ? FeatureType.ACTION_PARAMETER_COLLECTION
                             : FeatureType.ACTION_PARAMETER_SCALAR;
 
@@ -131,11 +132,13 @@ public class FacetedMethod extends TypedHolderDefault implements IdentifiedHolde
                         CollectionSemanticsFacetDefault.forParamType(parameterType, fmp);
                 FacetUtil.addFacet(semanticsFacet);
 
-                TypeOfFacet typeOfFacet = specificationLoader.inferFromGenericParamType(fmp, parameterType, genericParameterType);
+                TypeOfFacet typeOfFacet = TypeOfFacet.Util
+                        .inferFromGenericParamType(fmp, parameterType, genericParameterType,
+                        specificationLoader);
 
                 if(typeOfFacet == null ) {
                     if (org.apache.isis.core.metamodel.specloader.CollectionUtils.isArrayType(parameterType)) {
-                        typeOfFacet = specificationLoader.inferFromArrayType(fmp, parameterType);
+                        typeOfFacet = TypeOfFacet.Util.inferFromArrayType(fmp, parameterType, specificationLoader);
                     }
                 }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
index 67bd5b5..d3219c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacet.java
@@ -19,7 +19,17 @@
 
 package org.apache.isis.core.metamodel.facets.actcoll.typeof;
 
+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.Programmatic;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.SingleClassValueFacet;
+import org.apache.isis.core.metamodel.specloader.CollectionUtils;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 /**
  * The type of the collection or the action.
@@ -30,4 +40,88 @@ import org.apache.isis.core.metamodel.facets.SingleClassValueFacet;
  * <tt>@TypeOf</tt> annotation.
  */
 public interface TypeOfFacet extends SingleClassValueFacet {
+
+    public static class Util {
+        private Util(){}
+
+        @Programmatic
+        public static TypeOfFacet inferFromGenericReturnType(
+                final Class<?> cls,
+                final Method method,
+                final FacetHolder holder,
+                final SpecificationLoader specificationLoader) {
+
+            final Class<?> methodReturnType = method.getReturnType();
+            if (!CollectionUtils.isCollectionType(methodReturnType)) {
+                return null;
+            }
+
+            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, specificationLoader);
+            }
+
+            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, specificationLoader);
+                            }
+                        }
+                    }
+                }
+                // otherwise, what to do?
+            }
+            return null;
+        }
+
+        @Programmatic
+        public static TypeOfFacet inferFromArrayType(
+                final FacetHolder holder,
+                final Class<?> type,
+                final SpecificationLoader specificationLoader) {
+            final Class<?> componentType = CollectionUtils.inferFromArrayType(type);
+            return componentType != null
+                    ? new TypeOfFacetInferredFromArray(componentType, holder, specificationLoader)
+                    : null;
+        }
+
+        @Programmatic
+        public static TypeOfFacet inferFromGenericParamType(
+                final FacetHolder holder,
+                final Class<?> parameterType,
+                final Type genericParameterType,
+                final SpecificationLoader specificationLoader) {
+            final Class<?> actualType = CollectionUtils.inferFromGenericParamType(parameterType, genericParameterType);
+            return actualType != null
+                    ? new TypeOfFacetInferredFromGenerics(actualType, holder, specificationLoader)
+                    : null;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/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 fdb6fb3..b181bee 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
@@ -439,13 +439,14 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract
         // infer from return type
         if(typeOfFacet == null) {
             final Class<?> returnType = method.getReturnType();
-            typeOfFacet = getSpecificationLoader().inferFromArrayType(holder, returnType);
+            typeOfFacet = TypeOfFacet.Util.inferFromArrayType(holder, returnType, getSpecificationLoader());
         }
 
         // infer from generic return type
         if(typeOfFacet == null) {
             final Class<?> cls = processMethodContext.getCls();
-            typeOfFacet = getSpecificationLoader().inferFromGenericReturnType(cls, method, holder);
+            typeOfFacet = TypeOfFacet.Util.inferFromGenericReturnType(cls, method, holder,
+                    getSpecificationLoader());
         }
 
         FacetUtil.addFacet(typeOfFacet);

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
index 29098eb..1f6133a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/CollectionUtils.java
@@ -19,6 +19,13 @@
 
 package org.apache.isis.core.metamodel.specloader;
 
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+
 /**
  * Defines the types which are considered to be collections.
  * 
@@ -40,6 +47,46 @@ public final class CollectionUtils {
         return cls.isArray();
     }
 
+    public static Class<?> inferFromArrayType(final Class<?> type) {
+        if(!isArrayType(type)) {
+            return null;
+        }
+        if (type.isArray()) {
+            final Class<?> componentType = type.getComponentType();
+            return componentType;
+        }
+        return null;
+    }
+
+    @Programmatic
+    public static Class<?> inferFromGenericParamType(
+            final Class<?> parameterType,
+            final Type genericParameterType) {
 
+        if(!isCollectionType(parameterType)) {
+            return null;
+        }
 
+        if(genericParameterType instanceof ParameterizedType) {
+            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 actualType;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @return true means that either {@link CollectionUtils#inferFromGenericParamType(Class, Type)} or {@link TypeOfFacet.Util#inferFromArrayType(FacetHolder, Class, SpecificationLoader)} will return a non-null value.
+     */
+    public static boolean isParamCollection(
+            final Class<?> parameterType,
+            final Type genericParameterType) {
+        return inferFromGenericParamType(parameterType, genericParameterType) != null || inferFromArrayType(parameterType) != null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/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 5172394..cf3a009 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,11 +16,6 @@
  */
 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;
@@ -43,11 +38,7 @@ 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.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;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
@@ -529,131 +520,5 @@ public class SpecificationLoader implements ApplicationScopedComponent {
 
     //endregion
 
-    //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;
-        }
-
-        if(genericParameterType instanceof ParameterizedType) {
-            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 actualType;
-                }
-            }
-        }
-        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;
-        }
-
-        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;
-    }
-
-    @Programmatic
-    public TypeOfFacet inferFromArrayType(
-            final FacetHolder holder,
-            final Class<?> 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 componentType;
-        }
-        return null;
-    }
-
-    //endregion
-
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/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 61b9a3a..7ed3aff 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
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.facets.actions;
 
 import java.lang.reflect.Method;
+import java.lang.reflect.Type;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/isis/blob/482286e2/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
index 55e3025..f4d91b5 100644
--- a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
+++ b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
@@ -69,13 +69,6 @@ public class ObjectAdapterMementoProviderForValueChoicesTest {
         Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
     }
 
-    @Test
-    public void whenNullPlaceholder() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
-    }
-
     private ObjectAdapterMemento mock(final String id) {
         final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
         context.checking(new Expectations() {{


[16/36] 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/master
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 {
 


[20/36] 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/master
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);
         }


[17/36] 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/master
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 {


[22/36] 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/master
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);


[31/36] isis git commit: ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.

Posted by da...@apache.org.
ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.


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

Branch: refs/heads/master
Commit: d987650409fd33094ca6154a4e2cc86417bba556
Parents: bbb9d33
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jan 20 11:38:00 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jan 20 11:38:00 2017 +0000

----------------------------------------------------------------------
 .../ComponentFactoryRegistrarDefault.java       |   2 +-
 .../scalars/ComponentFactoryScalarAbstract.java |   6 +-
 .../scalars/reference/ReferencePanel.java       |  94 ++----
 .../components/scalars/reference/Select2.java   | 181 -----------
 .../scalars/value/ValuePanelFactory.java        |   5 +-
 .../valuechoices/ValueChoicesSelect2Panel.html  |  49 +++
 .../valuechoices/ValueChoicesSelect2Panel.java  | 292 +++++++++++++++++
 .../ValueChoicesSelect2PanelFactory.java        |  65 ++++
 .../ObjectAdapterMementoProviderAbstract.java   | 164 ----------
 .../widgets/select2/EmptyChoiceProvider.java    |  44 ---
 .../ui/components/widgets/select2/Select2.java  | 178 +++++++++++
 .../widgets/select2/Select2ChoiceExt.java       |   1 +
 .../widgets/select2/Select2MultiChoiceExt.java  |   1 +
 .../select2/providers/EmptyChoiceProvider.java  |  44 +++
 .../ObjectAdapterMementoProviderAbstract.java   | 157 ++++++++++
 ...apterMementoProviderForReferenceChoices.java |  54 ++++
 ...oProviderForReferenceObjectAutoComplete.java |  60 ++++
 ...ForReferenceParamOrPropertyAutoComplete.java |  56 ++++
 ...ctAdapterMementoProviderForValueChoices.java |  52 +++
 .../valuechoices/ValueChoicesSelect2Panel.html  |  49 ---
 .../valuechoices/ValueChoicesSelect2Panel.java  | 313 -------------------
 .../ValueChoicesSelect2PanelFactory.java        |  58 ----
 .../FixedObjectAdapterMementoProviderTest.java  |  84 -----
 ...apterMementoProviderForValueChoicesTest.java |  88 ++++++
 24 files changed, 1128 insertions(+), 969 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
index 469d275..38b63b3 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/registries/components/ComponentFactoryRegistrarDefault.java
@@ -64,7 +64,7 @@ import org.apache.isis.viewer.wicket.ui.components.value.StandaloneValuePanelFac
 import org.apache.isis.viewer.wicket.ui.components.voidreturn.VoidReturnPanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.welcome.WelcomePanelFactory;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanelFactory;
-import org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices.ValueChoicesSelect2PanelFactory;
+import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2PanelFactory;
 
 import java.util.ServiceLoader;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
index ed0d8a4..1b7fea4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ComponentFactoryScalarAbstract.java
@@ -48,8 +48,10 @@ public abstract class ComponentFactoryScalarAbstract extends ComponentFactoryAbs
         if(!scalarModel.isScalarTypeAnyOf(scalarTypes)) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        final boolean hasNoChoices = !scalarModel.hasChoices();
-        return appliesIf(hasNoChoices);
+        final boolean hasChoices = scalarModel.hasChoices();
+        // autoComplete not supported on values, only references
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/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 abcc7ef..4331225 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
@@ -41,7 +41,6 @@ import org.wicketstuff.select2.Settings;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -56,9 +55,12 @@ 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;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.entitysimplelink.EntityLinkSimplePanel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceChoices;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceObjectAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.util.Components;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -349,22 +351,27 @@ public class ReferencePanel extends ScalarPanelAbstract {
     private void setProviderAndCurrAndPending(
             final Select2 select2,
             final ObjectAdapter[] argsIfAvailable) {
+
+        ChoiceProvider<ObjectAdapterMemento> providerForChoices;
         if (getModel().hasChoices()) {
-            
-            final List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
-            ObjectAdapterMementoProviderAbstract providerForChoices = providerForChoices(choiceMementos);
+            List<ObjectAdapterMemento> choiceMementos = obtainChoiceMementos(argsIfAvailable);
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceChoices(getModel(), wicketViewerSettings, choiceMementos);
 
-            select2.setProvider(providerForChoices);
-            getModel().clearPending();
-            
-            resetIfCurrentNotInChoices(select2, choiceMementos);
-            
         } else if(getModel().hasAutoComplete()) {
-            select2.setProvider(providerForParamOrPropertyAutoComplete());
-            getModel().clearPending();
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(getModel(), wicketViewerSettings);
         } else {
-            select2.setProvider(providerForObjectAutoComplete());
-            getModel().clearPending();
+            providerForChoices =
+                    new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel(), wicketViewerSettings);
+        }
+
+        select2.setProvider(providerForChoices);
+        getModel().clearPending();
+
+        if(providerForChoices instanceof ObjectAdapterMementoProviderForReferenceChoices) {
+            final ObjectAdapterMementoProviderForReferenceChoices provider = (ObjectAdapterMementoProviderForReferenceChoices) providerForChoices;
+            resetIfCurrentNotInChoices(select2, provider.getChoiceMementos());
         }
     }
 
@@ -374,7 +381,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
         if(getModel().hasChoices()) {
             choices.addAll(getModel().getChoices(argsIfAvailable, getAuthenticationSession(), getDeploymentCategory()));
         }
-        // take a copy otherwise is only lazily evaluated
+        // take a copy (otherwise is only lazily evaluated)
         return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
     }
 
@@ -415,60 +422,6 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return autoSelect;
     }
 
-    // called by setProviderAndCurrAndPending
-    private ChoiceProvider<ObjectAdapterMemento> providerForObjectAutoComplete() {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
-                final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
-                final List<ObjectAdapter> autoCompleteAdapters =
-                        autoCompleteFacet.execute(term,
-                                InteractionInitiatedBy.USER);
-                // take a copy otherwise so is eagerly evaluated and memento objects correctly built
-                return Lists.newArrayList(
-                        Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-        };
-    }
-
-    // called by setProviderAndCurrAndPending
-    private ChoiceProvider<ObjectAdapterMemento> providerForParamOrPropertyAutoComplete() {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-            
-            private static final long serialVersionUID = 1L;
-            
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
-                if(getScalarModel().hasAutoComplete()) {
-                    final List<ObjectAdapter> autoCompleteAdapters =
-                            getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
-                    autoCompleteChoices.addAll(autoCompleteAdapters);
-                }
-                // take a copy otherwise so is eagerly evaluated and memento objects correctly built
-                return Lists.newArrayList(
-                        Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
-            }
-            
-        };
-    }
-
-    // called by setProviderAndCurrAndPending
-    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
-        return new ObjectAdapterMementoProviderAbstract(getModel(), wicketViewerSettings) {
-            private static final long serialVersionUID = 1L;
-            @Override
-            protected List<ObjectAdapterMemento> obtainMementos(String term) {
-                return obtainMementos(term, choiceMementos);
-            }
-        };
-    }
-
-    
     // //////////////////////////////////////
     // getInput, convertInput
     // //////////////////////////////////////
@@ -555,7 +508,4 @@ public class ReferencePanel extends ScalarPanelAbstract {
         return getIsisSessionFactory().getConfiguration();
     }
 
-
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/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
deleted file mode 100644
index 7d47b74..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
+++ /dev/null
@@ -1,181 +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.ui.components.scalars.reference;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.HiddenField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
-import org.wicketstuff.select2.Select2MultiChoice;
-import org.wicketstuff.select2.Settings;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2MultiChoiceExt;
-
-/**
- * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
- */
-public class Select2 implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    final Select2ChoiceExt select2Choice;
-    final Select2MultiChoiceExt select2MultiChoice;
-
-    public static Select2 newSelect2Choice(
-            final String id,
-            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
-        return new Select2(
-                Select2ChoiceExt.create(id, singleModel, parentModel),
-                null
-        );
-    }
-
-    public static Select2 newSelect2MultiChoice(
-            final String id,
-            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
-            final ScalarModel parentModel) {
-        return new Select2(
-                null,
-                Select2MultiChoiceExt.create(id, multiModel, parentModel)
-        );
-    }
-
-    private Select2(
-            final Select2ChoiceExt select2Choice,
-            final Select2MultiChoiceExt select2MultiChoice) {
-        this.select2Choice = select2Choice;
-        this.select2MultiChoice = select2MultiChoice;
-    }
-
-    public HiddenField<?> component() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public ChoiceExt choiceExt() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public void clearInput() {
-        component().clearInput();
-    }
-
-    public void setEnabled(final boolean mutability) {
-        component().setEnabled(mutability);
-    }
-
-    public void setRequired(final boolean required) {
-        component().setRequired(required);
-    }
-    public boolean checkRequired() {
-        return component().checkRequired();
-    }
-
-    public Settings getSettings() {
-        return choiceExt().getSettings();
-    }
-
-    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
-        choiceExt().setProvider(providerForChoices);
-    }
-
-    public ObjectAdapterMemento getModelObject() {
-        if (select2Choice != null) {
-            return select2Choice.getModelObject();
-        } else {
-            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
-
-            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public IModel<ObjectAdapterMemento> getModel() {
-        if (select2Choice != null) {
-            return select2Choice.getModel();
-        } else {
-            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
-            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
-
-            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-            return new IModel<ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento getObject() {
-                    return memento;
-                }
-
-                @Override
-                public void setObject(final ObjectAdapterMemento memento) {
-
-                    if(memento == null) {
-                        model.setObject(null);
-                        return;
-                    }
-
-                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
-                    model.setObject(mementos);
-                }
-
-                @Override
-                public void detach() {
-                }
-            };
-        }
-    }
-
-    public ObjectAdapterMemento getConvertedInput() {
-        if (select2Choice != null) {
-            return select2Choice.getConvertedInput();
-        } else {
-            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
-            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public void setLabel(final Model<String> model) {
-        component().setLabel(model);
-    }
-
-    public void add(final Behavior behavior) {
-        component().add(behavior);
-    }
-
-    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
-        return component().getBehaviors(behaviorClass);
-    }
-
-    public void remove(final Behavior behavior) {
-        component().remove(behavior);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
index 85ba70f..c1a3732 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/ValuePanelFactory.java
@@ -48,7 +48,10 @@ public class ValuePanelFactory extends ComponentFactoryScalarAbstract {
         if(valueFacet == null) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        return appliesIf(!scalarModel.hasChoices());
+        final boolean hasChoices = scalarModel.hasChoices();
+        // autoComplete not supported on values, only references
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
new file mode 100644
index 0000000..0874436
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
+      xml:lang="en"  
+      lang="en">
+    <body>
+        <wicket:panel>
+            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
+                <div class="form-group" wicket:id="scalarIfRegular">
+                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                        </div>
+                        <span wicket:id="feedback" class="help-block"></span>
+                        <span wicket:id="associatedActionLinksBelow"></span>
+                    </span>
+                    <div class="clearfix"/>
+                </div>
+                <span wicket:id="scalarIfCompact"></span>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
new file mode 100644
index 0000000..fcbca2f
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -0,0 +1,292 @@
+/**
+ *  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.valuechoices;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.AttributeModifier;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+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.ScalarModel;
+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.components.actionmenu.entityactions.EntityActionUtil;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
+import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
+
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
+
+    private static final long serialVersionUID = 1L;
+
+    private Select2 select2;
+    private ObjectAdapterMemento pending;
+
+    public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
+        super(id, scalarModel);
+        pending = scalarModel.getObjectAdapterMemento();
+    }
+
+    @Override
+    protected MarkupContainer addComponentForRegular() {
+
+
+        // same pattern as in ReferencePanel
+        if(select2 == null) {
+            if(getModel().isCollection()) {
+                final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
+                select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            } else {
+                final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+                select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
+            }
+
+            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
+            setProviderAndCurrAndPending(select2, actionArgsHint);
+            addStandardSemantics();
+        } else {
+            select2.clearInput();
+        }
+
+
+        final MarkupContainer labelIfRegular = createFormComponentLabel();
+        if(getModel().isRequired()) {
+            labelIfRegular.add(new CssClassAppender("mandatory"));
+        }
+        
+        addOrReplace(labelIfRegular);
+
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
+        if(getModel().isRequired()) {
+            final String label = scalarName.getDefaultModelObjectAsString();
+            if(!Strings.isNullOrEmpty(label)) {
+                scalarName.add(new CssClassAppender("mandatory"));
+            }
+        }
+        labelIfRegular.addOrReplace(scalarName);
+        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
+        if (namedFacet != null) {
+            scalarName.setEscapeModelStrings(namedFacet.escaped());
+        }
+
+        // find the links...
+        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+
+        addPositioningCssTo(labelIfRegular, entityActions);
+
+        addFeedbackOnlyTo(labelIfRegular, select2.component());
+        addEditPropertyTo(labelIfRegular);
+
+        // ... add entity links to panel (below and to right)
+        addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
+
+        return labelIfRegular;
+    }
+
+    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
+        final List<ObjectAdapter> choices =
+                scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
+        
+        // take a copy otherwise is only lazily evaluated
+        return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    protected void addStandardSemantics() {
+        setRequiredIfSpecified();
+    }
+
+    private void setRequiredIfSpecified() {
+        final ScalarModel scalarModel = getModel();
+        final boolean required = scalarModel.isRequired();
+        select2.setRequired(required);
+    }
+
+    protected MarkupContainer createFormComponentLabel() {
+        final String name = getModel().getName();
+        select2.setLabel(Model.of(name));
+
+        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
+
+        final String describedAs = getModel().getDescribedAs();
+        if(describedAs != null) {
+            labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
+        }
+
+        labelIfRegular.add(select2.component());
+
+        return labelIfRegular;
+    }
+
+    @Override
+    protected Component addComponentForCompact() {
+        final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
+        addOrReplace(labelIfCompact);
+        return labelIfCompact;
+    }
+
+    
+    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
+        return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos, wicketViewerSettings);
+    }
+
+    @Override
+    protected boolean alwaysRebuildGui() {
+        return true;
+    }
+
+    @Override
+    protected void onBeforeRenderWhenViewMode() { 
+        // View: Read only
+        select2.setEnabled(false);
+    }
+
+    @Override
+    protected void onBeforeRenderWhenEnabled() { 
+        // Edit: read/write
+        select2.setEnabled(true);
+
+        // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
+    }
+
+    @Override
+    protected void onBeforeRenderWhenDisabled(final String disableReason) {
+        super.onBeforeRenderWhenDisabled(disableReason);
+        setTitleAttribute(disableReason);
+        select2.setEnabled(false);
+    }
+
+    private void setTitleAttribute(final String titleAttribute) {
+        getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
+    }
+
+    
+    @Override
+    protected void addFormComponentBehavior(Behavior behavior) {
+        for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
+            select2.remove(b);
+        }
+        select2.add(behavior);
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
+        if(select2 != null) {
+            setProviderAndCurrAndPending(select2, argsIfAvailable);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * sets up the choices, also ensuring that any currently held value is compatible.
+     */
+    private void setProviderAndCurrAndPending(final Select2 select2, ObjectAdapter[] argsIfAvailable) {
+
+        final ChoiceProvider<ObjectAdapterMemento> provider;
+
+        // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers
+        // (choice vs autoComplete).  Here though - because values don't currently support autoComplete - no branch is required
+        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
+        provider = newChoiceProvider(choicesMementos);
+
+        select2.setProvider(provider);
+        getModel().clearPending();
+
+        if(provider instanceof ObjectAdapterMementoProviderForValueChoices) {
+            final ObjectAdapterMementoProviderForValueChoices providerFixed = (ObjectAdapterMementoProviderForValueChoices) provider;
+            final List<ObjectAdapterMemento> choicesMementos1 = providerFixed.getChoicesMementos();
+            resetIfCurrentNotInChoices(select2, choicesMementos1);
+        }
+    }
+
+    private void resetIfCurrentNotInChoices(final Select2 select2, final List<ObjectAdapterMemento> choicesMementos) {
+        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
+        if(objectAdapterMemento == null) {
+            select2.getModel().setObject(null);
+        } else {
+
+            if(!getModel().isCollection()) {
+
+                // if currently held value is not compatible with choices, then replace with the first choice
+                if(!choicesMementos.contains(objectAdapterMemento)) {
+
+                    final ObjectAdapterMemento newAdapterMemento =
+                            choicesMementos.isEmpty()
+                                    ? null
+                                    : choicesMementos.get(0);
+
+                    select2.getModel().setObject(newAdapterMemento);
+                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
+                }
+
+            } else {
+
+                // nothing to do
+            }
+        }
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public ObjectAdapterMemento getPending() {
+        return pending;
+    }
+
+    public void setPending(ObjectAdapterMemento pending) {
+        this.pending = pending;
+    }
+
+    @Override
+    public ArrayList<ObjectAdapterMemento> getMultiPending() {
+        return pending != null ? pending.getList() : null;
+    }
+
+    @Override
+    public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
+        this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
+    }
+
+    public ScalarModel getScalarModel() {
+        return scalarModel;
+    }
+
+    // //////////////////////////////////////
+
+    @com.google.inject.Inject
+    private WicketViewerSettings wicketViewerSettings;
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
new file mode 100644
index 0000000..78fe659
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
@@ -0,0 +1,65 @@
+/*
+ *  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.valuechoices;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.model.IModel;
+
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
+
+public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ValueChoicesSelect2PanelFactory() {
+        super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
+    }
+
+    @Override
+    public ApplicationAdvice appliesTo(final IModel<?> model) {
+        if (!(model instanceof ScalarModel)) {
+            return ApplicationAdvice.DOES_NOT_APPLY;
+        }
+        final ScalarModel scalarModel = (ScalarModel) model;
+        final boolean hasChoices = scalarModel.hasChoices();
+
+        // autoComplete not supported on values, only references
+        // this is because there is no easy way in the ChoiceProvider to convert the list of Ids (strings)
+        // into corresponding ObjectAdapterMemento's.
+        // see subclasses of ObjectAdapterMementoProviderAbstract
+
+        // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
+        return appliesIf(hasChoices /* || hasAutoComplete */);
+    }
+
+    @Override
+    public final Component createComponent(final String id, final IModel<?> model) {
+        final ScalarModel scalarModel = (ScalarModel) model;
+        if(scalarModel.isViewMode()) {
+            return new StringPanel(id, scalarModel);
+        } else {
+            return new ValueChoicesSelect2Panel(id, scalarModel);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
deleted file mode 100644
index cdc2250..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ /dev/null
@@ -1,164 +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.ui.components.widgets;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.Session;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.string.Strings;
-import org.wicketstuff.select2.TextChoiceProvider;
-
-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.oid.RootOid;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
-
-public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
-
-    private static final long serialVersionUID = 1L;
-    
-    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
-    private static final String NULL_DISPLAY_TEXT = "";
-
-    private final ScalarModel scalarModel;
-    private final WicketViewerSettings wicketViewerSettings;
-
-    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
-        this.scalarModel = scalarModel;
-        this.wicketViewerSettings = wicketViewerSettings;
-    }
-    
-    @Override
-    protected String getDisplayText(final ObjectAdapterMemento choice) {
-        if (choice == null) {
-            return NULL_DISPLAY_TEXT;
-        }
-
-        final ObjectAdapter objectAdapter =
-                choice.getObjectAdapter(
-                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
-        final IConverter<Object> converter = findConverter(objectAdapter);
-        return converter != null
-                ? converter.convertToString(objectAdapter.getObject(), getLocale())
-                : objectAdapter.titleString(null);
-    }
-
-    protected Locale getLocale() {
-        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
-    }
-
-    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
-        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
-    }
-
-    @Override
-    protected Object getId(final ObjectAdapterMemento choice) {
-        return choice != null? choice.asString(): NULL_PLACEHOLDER;
-    }
-
-    @Override
-    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
-        
-        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
-        // if not mandatory, and the list doesn't contain null already, then add it in.
-        if(!scalarModel.isRequired() && !mementos.contains(null)) {
-            mementos.add(0, null);
-        }
-        response.addAll(mementos);
-    }
-
-    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
-
-    /**
-     * Filters all choices against a term by using their
-     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
-     *
-     * @param term The term entered by the user
-     * @param choicesMementos The collections of choices to filter
-     * @return A list of all matching choices
-     */
-    protected List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
-        List<ObjectAdapterMemento> matches = Lists.newArrayList();
-        if (Strings.isEmpty(term)) {
-            matches.addAll(choicesMementos);
-        } else {
-            for (ObjectAdapterMemento candidate : choicesMementos) {
-                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
-                        getPersistenceSession(), getSpecificationLoader());
-                String title = objectAdapter.titleString(objectAdapter);
-                if (title.toLowerCase().contains(term.toLowerCase())) {
-                    matches.add(candidate);
-                }
-            }
-        }
-
-        return matches;
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
-        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
-
-            @Override
-            public ObjectAdapterMemento apply(final String input) {
-                if(NULL_PLACEHOLDER.equals(input)) {
-                    return null;
-                }
-                final RootOid oid = RootOid.deString(input);
-                return ObjectAdapterMemento.createPersistent(oid);
-            }
-        };
-        return Collections2.transform(ids, function);
-    }
-    
-    protected ScalarModel getScalarModel() {
-        return scalarModel;
-    }
-
-
-    ///////////////////////////////////////////////////////
-    // Dependencies (from context)
-    ///////////////////////////////////////////////////////
-
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return getIsisSessionFactory().getSpecificationLoader();
-    }
-
-    PersistenceSession getPersistenceSession() {
-        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
-    }
-
-    private IsisSessionFactory getIsisSessionFactory() {
-        return IsisContext.getSessionFactory();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
deleted file mode 100644
index 0cb647b..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
+++ /dev/null
@@ -1,44 +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.ui.components.widgets.select2;
-
-import java.util.Collection;
-
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONWriter;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
-
-    static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
-
-    @Override
-    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
-    }
-
-    @Override
-    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
new file mode 100644
index 0000000..041af1e
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -0,0 +1,178 @@
+/*
+ *  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.widgets.select2;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+import org.wicketstuff.select2.Settings;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+/**
+ * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+ */
+public class Select2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    final Select2ChoiceExt select2Choice;
+    final Select2MultiChoiceExt select2MultiChoice;
+
+    public static Select2 newSelect2Choice(
+            final String id,
+            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+        return new Select2(
+                Select2ChoiceExt.create(id, singleModel, parentModel),
+                null
+        );
+    }
+
+    public static Select2 newSelect2MultiChoice(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+            final ScalarModel parentModel) {
+        return new Select2(
+                null,
+                Select2MultiChoiceExt.create(id, multiModel, parentModel)
+        );
+    }
+
+    private Select2(
+            final Select2ChoiceExt select2Choice,
+            final Select2MultiChoiceExt select2MultiChoice) {
+        this.select2Choice = select2Choice;
+        this.select2MultiChoice = select2MultiChoice;
+    }
+
+    public HiddenField<?> component() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public ChoiceExt choiceExt() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public void clearInput() {
+        component().clearInput();
+    }
+
+    public void setEnabled(final boolean mutability) {
+        component().setEnabled(mutability);
+    }
+
+    public void setRequired(final boolean required) {
+        component().setRequired(required);
+    }
+    public boolean checkRequired() {
+        return component().checkRequired();
+    }
+
+    public Settings getSettings() {
+        return choiceExt().getSettings();
+    }
+
+    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+        choiceExt().setProvider(providerForChoices);
+    }
+
+    public ObjectAdapterMemento getModelObject() {
+        if (select2Choice != null) {
+            return select2Choice.getModelObject();
+        } else {
+            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+
+            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public IModel<ObjectAdapterMemento> getModel() {
+        if (select2Choice != null) {
+            return select2Choice.getModel();
+        } else {
+            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+
+            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+            return new IModel<ObjectAdapterMemento>() {
+                @Override
+                public ObjectAdapterMemento getObject() {
+                    return memento;
+                }
+
+                @Override
+                public void setObject(final ObjectAdapterMemento memento) {
+
+                    if(memento == null) {
+                        model.setObject(null);
+                        return;
+                    }
+
+                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
+                    model.setObject(mementos);
+                }
+
+                @Override
+                public void detach() {
+                }
+            };
+        }
+    }
+
+    public ObjectAdapterMemento getConvertedInput() {
+        if (select2Choice != null) {
+            return select2Choice.getConvertedInput();
+        } else {
+            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public void setLabel(final Model<String> model) {
+        component().setLabel(model);
+    }
+
+    public void add(final Behavior behavior) {
+        component().add(behavior);
+    }
+
+    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+        return component().getBehaviors(behaviorClass);
+    }
+
+    public void remove(final Behavior behavior) {
+        component().remove(behavior);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
index 3e0f25b..e01c7b1 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2ChoiceExt.java
@@ -22,6 +22,7 @@ import org.wicketstuff.select2.Select2Choice;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
 
 public class Select2ChoiceExt extends Select2Choice<ObjectAdapterMemento> implements ChoiceExt {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
index 7796061..5f11e58 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2MultiChoiceExt.java
@@ -25,6 +25,7 @@ import org.wicketstuff.select2.Select2MultiChoice;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.EmptyChoiceProvider;
 
 public class Select2MultiChoiceExt
         extends Select2MultiChoice<ObjectAdapterMemento>

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
new file mode 100644
index 0000000..dbc0e85
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
@@ -0,0 +1,44 @@
+/**
+ *  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.widgets.select2.providers;
+
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONWriter;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+
+    public static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+
+    @Override
+    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+    }
+
+    @Override
+    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
new file mode 100644
index 0000000..0143749
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -0,0 +1,157 @@
+/**
+ *  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.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.string.Strings;
+import org.wicketstuff.select2.TextChoiceProvider;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
+
+public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
+
+    private static final long serialVersionUID = 1L;
+    
+    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
+    private static final String NULL_DISPLAY_TEXT = "";
+
+    private final ScalarModel scalarModel;
+    private final WicketViewerSettings wicketViewerSettings;
+
+    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
+        this.scalarModel = scalarModel;
+        this.wicketViewerSettings = wicketViewerSettings;
+    }
+    
+    @Override
+    protected String getDisplayText(final ObjectAdapterMemento choice) {
+        if (choice == null) {
+            return NULL_DISPLAY_TEXT;
+        }
+
+        final ObjectAdapter objectAdapter =
+                choice.getObjectAdapter(
+                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+        final IConverter<Object> converter = findConverter(objectAdapter);
+        return converter != null
+                ? converter.convertToString(objectAdapter.getObject(), getLocale())
+                : objectAdapter.titleString(null);
+    }
+
+    protected Locale getLocale() {
+        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
+    }
+
+    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
+        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
+    }
+
+    @Override
+    protected Object getId(final ObjectAdapterMemento choice) {
+        return choice != null? choice.asString(): NULL_PLACEHOLDER;
+    }
+
+    @Override
+    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
+        
+        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
+        // if not mandatory, and the list doesn't contain null already, then add it in.
+        if(!scalarModel.isRequired() && !mementos.contains(null)) {
+            mementos.add(0, null);
+        }
+        response.addAll(mementos);
+    }
+
+    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
+
+    /**
+     * Filters all choices against a term by using their
+     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
+     *
+     * @param term The term entered by the user
+     * @param choicesMementos The collections of choices to filter
+     * @return A list of all matching choices
+     */
+    protected final List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
+        List<ObjectAdapterMemento> matches = Lists.newArrayList();
+        if (Strings.isEmpty(term)) {
+            matches.addAll(choicesMementos);
+        } else {
+            for (ObjectAdapterMemento candidate : choicesMementos) {
+                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                        getPersistenceSession(), getSpecificationLoader());
+                String title = objectAdapter.titleString(objectAdapter);
+                if (title.toLowerCase().contains(term.toLowerCase())) {
+                    matches.add(candidate);
+                }
+            }
+        }
+
+        return matches;
+    }
+
+
+    protected ScalarModel getScalarModel() {
+        return scalarModel;
+    }
+
+
+    ///////////////////////////////////////////////////////
+    // Dependencies (from context)
+    ///////////////////////////////////////////////////////
+
+
+    protected SpecificationLoader getSpecificationLoader() {
+        return getIsisSessionFactory().getSpecificationLoader();
+    }
+
+    PersistenceSession getPersistenceSession() {
+        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+    }
+
+    protected IsisSessionFactory getIsisSessionFactory() {
+        return IsisContext.getSessionFactory();
+    }
+
+    public AuthenticationSession getAuthenticationSession() {
+        return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+    }
+
+    public DeploymentCategory getDeploymentCategory() {
+        return getIsisSessionFactory().getDeploymentCategory();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
new file mode 100644
index 0000000..de3f7f4
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
@@ -0,0 +1,54 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceChoices
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+    private final List<ObjectAdapterMemento> choiceMementos;
+
+    public ObjectAdapterMementoProviderForReferenceChoices(
+            final ScalarModel model,
+            final WicketViewerSettings wicketViewerSettings,
+            final List<ObjectAdapterMemento> choiceMementos) {
+        super(model, wicketViewerSettings);
+        this.choiceMementos = choiceMementos;
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        return obtainMementos(term, choiceMementos);
+    }
+
+    public List<ObjectAdapterMemento> getChoiceMementos() {
+        return choiceMementos;
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                return ObjectAdapterMemento.createPersistent(oid);
+            }
+        };
+        return Collections2.transform(ids, function);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
new file mode 100644
index 0000000..d55fd58
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceObjectAutoComplete.java
@@ -0,0 +1,60 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceObjectAutoComplete
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ObjectAdapterMementoProviderForReferenceObjectAutoComplete(
+            final ScalarModel model,
+            final WicketViewerSettings wicketViewerSettings) {
+        super(model, wicketViewerSettings);
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        final ObjectSpecification typeOfSpecification = getScalarModel().getTypeOfSpecification();
+        final AutoCompleteFacet autoCompleteFacet = typeOfSpecification.getFacet(AutoCompleteFacet.class);
+        final List<ObjectAdapter> autoCompleteAdapters =
+                autoCompleteFacet.execute(term,
+                        InteractionInitiatedBy.USER);
+        // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+        return Lists.newArrayList(
+                Lists.transform(autoCompleteAdapters, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                final ObjectAdapterMemento oam = ObjectAdapterMemento.createPersistent(oid);
+                return oam;
+            }
+        };
+
+        return Collections2.transform(ids, function);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
new file mode 100644
index 0000000..6ce9783
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
@@ -0,0 +1,56 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(
+            final ScalarModel model, final WicketViewerSettings wicketViewerSettings) {
+        super(model, wicketViewerSettings);
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
+        if (getScalarModel().hasAutoComplete()) {
+            final List<ObjectAdapter> autoCompleteAdapters =
+                    getScalarModel().getAutoComplete(term, getAuthenticationSession(), getDeploymentCategory());
+            autoCompleteChoices.addAll(autoCompleteAdapters);
+        }
+        // take a copy otherwise so is eagerly evaluated and memento objects correctly built
+        return Lists.newArrayList(
+                Lists.transform(autoCompleteChoices, ObjectAdapterMemento.Functions.fromAdapter()));
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
+
+            @Override
+            public ObjectAdapterMemento apply(final String input) {
+                if(NULL_PLACEHOLDER.equals(input)) {
+                    return null;
+                }
+                final RootOid oid = RootOid.deString(input);
+                return ObjectAdapterMemento.createPersistent(oid);
+            }
+        };
+        return Collections2.transform(ids, function);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
new file mode 100644
index 0000000..cf52db6
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForValueChoices.java
@@ -0,0 +1,52 @@
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
+
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+public class ObjectAdapterMementoProviderForValueChoices
+        extends ObjectAdapterMementoProviderAbstract {
+
+    private static final long serialVersionUID = 1L;
+    private final List<ObjectAdapterMemento> choicesMementos;
+
+    public ObjectAdapterMementoProviderForValueChoices(
+            final ScalarModel scalarModel,
+            final List<ObjectAdapterMemento> choicesMementos,
+            final WicketViewerSettings wicketViewerSettings) {
+        super(scalarModel, wicketViewerSettings);
+        this.choicesMementos = choicesMementos;
+    }
+
+    @Override
+    protected List<ObjectAdapterMemento> obtainMementos(String term) {
+        return obtainMementos(term, choicesMementos);
+    }
+
+    public List<ObjectAdapterMemento> getChoicesMementos() {
+        return choicesMementos;
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
+        final List<ObjectAdapterMemento> mementos = obtainMementos(null);
+
+        final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
+            @Override
+            public boolean apply(ObjectAdapterMemento input) {
+                final String id = (String) getId(input);
+                return ids.contains(id);
+            }
+        };
+        return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
deleted file mode 100644
index 0874436..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  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.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
-      xml:lang="en"  
-      lang="en">
-    <body>
-        <wicket:panel>
-            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
-                <div class="form-group" wicket:id="scalarIfRegular">
-                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
-                    <span class="scalarValueWrapper">
-                        <div class="scalarPlaceholder">
-                            <span class="scalarValueInput">
-                                <span class="editing">
-                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
-                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
-                                </span>
-                            </span>
-                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
-                        </div>
-                        <span wicket:id="feedback" class="help-block"></span>
-                        <span wicket:id="associatedActionLinksBelow"></span>
-                    </span>
-                    <div class="clearfix"/>
-                </div>
-                <span wicket:id="scalarIfCompact"></span>
-            </div>
-        </wicket:panel>
-    </body>
-</html>


[30/36] isis git commit: ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
deleted file mode 100644
index c438bdf..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ /dev/null
@@ -1,313 +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.ui.components.widgets.valuechoices;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-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.ScalarModel;
-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.components.actionmenu.entityactions.EntityActionUtil;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.reference.Select2;
-import org.apache.isis.viewer.wicket.ui.components.widgets.ObjectAdapterMementoProviderAbstract;
-import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
-import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
-
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements ScalarModelWithPending, ScalarModelWithMultiPending {
-
-    private static final long serialVersionUID = 1L;
-
-    private Select2 select2;
-    private ObjectAdapterMemento pending;
-
-    public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
-        pending = scalarModel.getObjectAdapterMemento();
-    }
-
-    @Override
-    protected MarkupContainer addComponentForRegular() {
-
-
-        // same pattern as in ReferencePanel
-        if(select2 == null) {
-            if(getModel().isCollection()) {
-                final IModel<ArrayList<ObjectAdapterMemento>> modelObject = ScalarModelWithMultiPending.Util.createModel(this);
-                select2 = Select2.newSelect2MultiChoice(ID_SCALAR_VALUE, modelObject, scalarModel);
-            } else {
-                final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
-                select2 = Select2.newSelect2Choice(ID_SCALAR_VALUE, modelObject, scalarModel);
-            }
-
-            final ObjectAdapter[] actionArgsHint = scalarModel.getActionArgsHint();
-            setChoices(actionArgsHint);
-            addStandardSemantics();
-        } else {
-            select2.clearInput();
-        }
-
-
-        final MarkupContainer labelIfRegular = createFormComponentLabel();
-        if(getModel().isRequired()) {
-            labelIfRegular.add(new CssClassAppender("mandatory"));
-        }
-        
-        addOrReplace(labelIfRegular);
-
-        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2.component()));
-        if(getModel().isRequired()) {
-            final String label = scalarName.getDefaultModelObjectAsString();
-            if(!Strings.isNullOrEmpty(label)) {
-                scalarName.add(new CssClassAppender("mandatory"));
-            }
-        }
-        labelIfRegular.addOrReplace(scalarName);
-        NamedFacet namedFacet = getModel().getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
-        }
-
-        // find the links...
-        final List<LinkAndLabel> entityActions = EntityActionUtil.getEntityActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-
-        addPositioningCssTo(labelIfRegular, entityActions);
-
-        addFeedbackOnlyTo(labelIfRegular, select2.component());
-        addEditPropertyTo(labelIfRegular);
-
-        // ... add entity links to panel (below and to right)
-        addEntityActionLinksBelowAndRight(labelIfRegular, entityActions);
-
-        return labelIfRegular;
-    }
-
-    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
-        final List<ObjectAdapter> choices =
-                scalarModel.getChoices(argumentsIfAvailable, getAuthenticationSession(), getDeploymentCategory());
-        
-        // take a copy otherwise is only lazily evaluated
-        return Lists.newArrayList(Lists.transform(choices, ObjectAdapterMemento.Functions.fromAdapter()));
-    }
-
-    protected void addStandardSemantics() {
-        setRequiredIfSpecified();
-    }
-
-    private void setRequiredIfSpecified() {
-        final ScalarModel scalarModel = getModel();
-        final boolean required = scalarModel.isRequired();
-        select2.setRequired(required);
-    }
-
-    protected MarkupContainer createFormComponentLabel() {
-        final String name = getModel().getName();
-        select2.setLabel(Model.of(name));
-
-        final FormGroup labelIfRegular = new FormGroup(ID_SCALAR_IF_REGULAR, select2.component());
-
-        final String describedAs = getModel().getDescribedAs();
-        if(describedAs != null) {
-            labelIfRegular.add(new AttributeModifier("title", Model.of(describedAs)));
-        }
-
-        labelIfRegular.add(select2.component());
-
-        return labelIfRegular;
-    }
-
-    @Override
-    protected Component addComponentForCompact() {
-        final Label labelIfCompact = new Label(ID_SCALAR_IF_COMPACT, getModel().getObjectAsString());
-        addOrReplace(labelIfCompact);
-        return labelIfCompact;
-    }
-
-    
-    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
-        return new FixedObjectAdapterMementoProvider(scalarModel, choicesMementos, wicketViewerSettings);
-    }
-
-    static class FixedObjectAdapterMementoProvider extends ObjectAdapterMementoProviderAbstract {
-
-        private static final long serialVersionUID = 1L;
-        private final List<ObjectAdapterMemento> choicesMementos;
-
-        public FixedObjectAdapterMementoProvider(
-                final ScalarModel scalarModel,
-                final List<ObjectAdapterMemento> choicesMementos,
-                final WicketViewerSettings wicketViewerSettings) {
-            super(scalarModel, wicketViewerSettings);
-            this.choicesMementos = choicesMementos;
-        }
-
-        @Override
-        public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
-            final List<ObjectAdapterMemento> mementos = obtainMementos(null);
-
-            final Predicate<ObjectAdapterMemento> lookupOam = new Predicate<ObjectAdapterMemento>() {
-                @Override
-                public boolean apply(ObjectAdapterMemento input) {
-                    final String id = (String) getId(input);
-                    return ids.contains(id);
-                }
-            };
-            return Lists.newArrayList(FluentIterable.from(mementos).filter(lookupOam).toList());
-        }
-
-        @Override
-        protected List<ObjectAdapterMemento> obtainMementos(String term) {
-            return obtainMementos(term, choicesMementos);
-        }
-
-    }
-
-    @Override
-    protected boolean alwaysRebuildGui() {
-        return true;
-    }
-
-    @Override
-    protected void onBeforeRenderWhenViewMode() { 
-        // View: Read only
-        select2.setEnabled(false);
-    }
-
-    @Override
-    protected void onBeforeRenderWhenEnabled() { 
-        // Edit: read/write
-        select2.setEnabled(true);
-
-        // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
-    }
-
-    @Override
-    protected void onBeforeRenderWhenDisabled(final String disableReason) {
-        super.onBeforeRenderWhenDisabled(disableReason);
-        setTitleAttribute(disableReason);
-        select2.setEnabled(false);
-    }
-
-    private void setTitleAttribute(final String titleAttribute) {
-        getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
-    }
-
-    
-    @Override
-    protected void addFormComponentBehavior(Behavior behavior) {
-        for (Behavior b : select2.getBehaviors(ScalarUpdatingBehavior.class)) {
-            select2.remove(b);
-        }
-        select2.add(behavior);
-    }
-
-    // //////////////////////////////////////
-
-    @Override
-    public boolean updateChoices(ObjectAdapter[] argsIfAvailable) {
-        setChoices(argsIfAvailable);
-        return true;
-    }
-
-    /**
-     * sets up the choices, also ensuring that any currently held value is compatible.
-     */
-    private void setChoices(ObjectAdapter[] argsIfAvailable) {
-        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argsIfAvailable);
-        
-        final ChoiceProvider<ObjectAdapterMemento> provider = newChoiceProvider(choicesMementos);
-        select2.setProvider(provider);
-
-        getModel().clearPending();
-
-        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
-        if(objectAdapterMemento == null) {
-            select2.getModel().setObject(null);
-        } else {
-
-            if(!getModel().isCollection()) {
-
-                // if currently held value is not compatible with choices, then replace with the first choice
-                if(!choicesMementos.contains(objectAdapterMemento)) {
-
-                    final ObjectAdapterMemento newAdapterMemento =
-                            choicesMementos.isEmpty()
-                                    ? null
-                                    : choicesMementos.get(0);
-
-                    select2.getModel().setObject(newAdapterMemento);
-                    getModel().setObjectMemento(newAdapterMemento, getPersistenceSession(), getSpecificationLoader());
-                }
-
-            } else {
-
-            }
-        }
-    }
-
-    
-    // //////////////////////////////////////
-
-    @Override
-    public ObjectAdapterMemento getPending() {
-        return pending;
-    }
-
-    public void setPending(ObjectAdapterMemento pending) {
-        this.pending = pending;
-    }
-
-    @Override
-    public ArrayList<ObjectAdapterMemento> getMultiPending() {
-        return pending != null ? pending.getList() : null;
-    }
-
-    @Override
-    public void setMultiPending(final ArrayList<ObjectAdapterMemento> pending) {
-        this.pending = ObjectAdapterMemento.createForList(pending, scalarModel.getTypeOfSpecification().getSpecId());
-    }
-
-    public ScalarModel getScalarModel() {
-        return scalarModel;
-    }
-
-    // //////////////////////////////////////
-
-    @com.google.inject.Inject
-    private WicketViewerSettings wicketViewerSettings;
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
deleted file mode 100644
index 4615cfa..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
+++ /dev/null
@@ -1,58 +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.ui.components.widgets.valuechoices;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
-
-public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-
-    public ValueChoicesSelect2PanelFactory() {
-        super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-        if (!(model instanceof ScalarModel)) {
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        }
-        final ScalarModel scalarModel = (ScalarModel) model;
-        final boolean hasChoices = scalarModel.hasChoices();
-        return appliesIf(hasChoices);
-    }
-
-    @Override
-    public final Component createComponent(final String id, final IModel<?> model) {
-        final ScalarModel scalarModel = (ScalarModel) model;
-        if(scalarModel.isViewMode()) {
-            return new StringPanel(id, scalarModel);
-        } else {
-            return new ValueChoicesSelect2Panel(id, scalarModel);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
deleted file mode 100644
index c151c44..0000000
--- a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
+++ /dev/null
@@ -1,84 +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.ui.components.widgets.valuechoices;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import com.google.common.collect.Lists;
-import org.jmock.Expectations;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-
-public class FixedObjectAdapterMementoProviderTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private List<ObjectAdapterMemento> mementos;
-
-    private ObjectAdapterMemento mockMemento1;
-    private ObjectAdapterMemento mockMemento2;
-    private ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider provider;
-
-    @Before
-    public void setUp() throws Exception {
-        mockMemento1 = mock("mockMemento1");
-        mockMemento2 = mock("mockMemento2");
-
-        mementos = Lists.newArrayList(
-                mockMemento1, mockMemento2
-        );
-
-        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
-        provider = new ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider(null, mementos, wicketViewerSettings);
-    }
-
-    @Test
-    public void whenInList() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
-    }
-
-    @Test
-    public void whenNullPlaceholder() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
-    }
-
-    private ObjectAdapterMemento mock(final String id) {
-        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
-        context.checking(new Expectations() {{
-            allowing(mock).asString();
-            will(returnValue(id));
-        }});
-        return mock;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
new file mode 100644
index 0000000..55e3025
--- /dev/null
+++ b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
@@ -0,0 +1,88 @@
+/*
+ *  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.widgets.valuechoices;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.jmock.Expectations;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+public class ObjectAdapterMementoProviderForValueChoicesTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
+
+    private List<ObjectAdapterMemento> mementos;
+
+    private ObjectAdapterMemento mockMemento1;
+    private ObjectAdapterMemento mockMemento2;
+    private ObjectAdapterMementoProviderForValueChoices provider;
+
+    @Before
+    public void setUp() throws Exception {
+        mockMemento1 = mock("mockMemento1");
+        mockMemento2 = mock("mockMemento2");
+
+        mementos = Lists.newArrayList(
+                mockMemento1, mockMemento2
+        );
+
+        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
+        provider = new ObjectAdapterMementoProviderForValueChoices(null, mementos, wicketViewerSettings);
+    }
+
+    @Test
+    public void whenInList() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
+    }
+
+    @Test
+    public void whenNullPlaceholder() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
+    }
+
+    private ObjectAdapterMemento mock(final String id) {
+        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
+        context.checking(new Expectations() {{
+            allowing(mock).asString();
+            will(returnValue(id));
+        }});
+        return mock;
+    }
+
+}


[09/36] 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/master
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;
-    }
 
 }