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 2013/08/21 01:42:42 UTC

[1/5] git commit: ISIS-478: starting work on dependencies between action parameters.

Updated Branches:
  refs/heads/master a9ff5e66d -> 2ab9e6615


ISIS-478: starting work on dependencies between action parameters.

* ToDoItem now has category and subcategory properties
  - disabled
  - ToDoItem#updateCategory action now updates both
* introducing subscriber logic between ActionParametersFormPanel and the ScalarPanelAbstract (subclasses)

also:
- deleted ProcessObjectPanelAbstract, not formal API and not used
- deleted DropDownChoicesForXxx, superceded a while back by the Select2Choices


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

Branch: refs/heads/master
Commit: d114c453c68845396a0fc31ad5cba4bcf16ebd14
Parents: a9ff5e6
Author: Dan Haywood <da...@apache.org>
Authored: Tue Aug 20 14:54:46 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Aug 20 15:19:59 2013 +0100

----------------------------------------------------------------------
 STATUS                                          |   8 +-
 .../actions/ActionParametersFormPanel.java      |  56 ++++++-
 .../scalars/ScalarModelSubscriber.java          |  25 +++
 .../components/scalars/ScalarPanelAbstract.java |  34 +++-
 .../scalars/ScalarPanelTextFieldAbstract.java   |   7 +
 .../isisapplib/IsisBlobOrClobPanelAbstract.java |  11 +-
 .../scalars/isisapplib/IsisBlobPanel.java       |   2 +
 .../scalars/primitive/BooleanPanel.java         |  12 +-
 .../scalars/reference/ReferencePanel.java       |   7 +
 ...DropDownChoicesForObjectAdapterMementos.java |  78 ----------
 .../DropDownChoicesForValueMementos.java        |  63 --------
 .../valuechoices/ValueChoicesSelect2Panel.java  |  17 +-
 .../ui/panels/ProcessObjectPanelAbstract.java   | 156 -------------------
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  70 +++++++--
 .../src/main/java/dom/todo/ToDoItem.layout.json |   1 +
 .../java/dom/todo/ToDoItemContributions.java    |  32 ++--
 .../dom/src/main/java/dom/todo/ToDoItems.java   |  13 +-
 .../java/fixture/todo/ToDoItemsFixture.java     |  27 ++--
 .../tests/actions/ToDoItemTest_duplicate.java   |   1 +
 .../repo/ToDoItemsTest_newToDo_and_delete.java  |   3 +-
 20 files changed, 269 insertions(+), 354 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/STATUS
----------------------------------------------------------------------
diff --git a/STATUS b/STATUS
index 1fa73c8..639ffd0 100644
--- a/STATUS
+++ b/STATUS
@@ -19,11 +19,11 @@ Description
 TLP releases:
 
   * isis-1.2.0                                     : 31 May 2013
-  * isis-viewer-wicket-1.2.0                       : 31 May 2013
-  * isis-viewer-restfulobjects-2.0.0               : 31 May 2013
   * isis-objectstore-jdo-1.1.0                     : 31 May 2013
-  * isis-security-shiro-1.1.1                      : 31 May 2013
   * isis-security-file-1.0.1                       : 31 May 2013
+  * isis-security-shiro-1.1.1                      : 31 May 2013
+  * isis-viewer-restfulobjects-2.0.0               : 31 May 2013
+  * isis-viewer-wicket-1.2.0                       : 31 May 2013
   * quickstart-wicket-restful_jdo-archetype-1.0.3  : 31 May 2013
  
   * isis-1.1.0                                     : 31 Jan 2013
@@ -37,8 +37,8 @@ TLP releases:
   * isis-1.0.0                                     : 24 Dec 2012
   * isis-objectstore-jdo-1.0.0                     : 24 Dec 2012
   * isis-security-file-1.0.0                       : 24 Dec 2012
-  * isis-viewer-wicket-1.0.0                       : 24 Dec 2012
   * isis-viewer-restfulobjects-1.0.0               : 24 Dec 2012
+  * isis-viewer-wicket-1.0.0                       : 24 Dec 2012
   * quickstart-wicket-restful_jdo-archetype-1.0.0  : 24 Dec 2012
  
 Incubating releases:

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index 7e9d08c..0b692c8 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -25,23 +25,33 @@ import static org.hamcrest.CoreMatchers.nullValue;
 
 import java.util.List;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.commons.ensure.Ensure;
+import org.apache.isis.core.commons.lang.CastUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 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;
 import org.apache.isis.viewer.wicket.model.models.ActionExecutor;
 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.util.Mementos;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
 import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
@@ -71,12 +81,14 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
         add(new ActionParameterForm("inputForm", getModel()));
     }
 
-    class ActionParameterForm extends Form<ObjectAdapter>  {
+    class ActionParameterForm extends Form<ObjectAdapter> implements ScalarModelSubscriber  {
 
         private static final long serialVersionUID = 1L;
 
         private static final String ID_FEEDBACK = "feedback";
 
+        private final List<ScalarPanelAbstract> scalarPanels = Lists.newArrayList();
+
         public ActionParameterForm(final String id, final ActionModel actionModel) {
             super(id, actionModel);
 
@@ -107,12 +119,21 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
             
             final RepeatingView rv = new RepeatingView(ID_ACTION_PARAMETERS);
             add(rv);
+            
+            scalarPanels.clear();
             for (final ActionParameterMemento apm : mementos) {
                 final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
                 rv.add(container);
 
                 final ScalarModel argumentModel = actionModel.getArgumentModel(apm);
-                getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
+                final Component paramPanel = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
+                final ScalarPanelAbstract scalarPanel = paramPanel instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) paramPanel : null;
+                scalarPanels.add(scalarPanel);
+            }
+            
+            // subscribe to all param panels
+            for (ScalarPanelAbstract scalarPanel : scalarPanels) {
+                scalarPanel.addScalarModelSubscriber(this);
             }
         }
 
@@ -136,5 +157,36 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
             // reference to a non-serializable object
             return Lists.newArrayList(parameterMementoList);
         }
+
+        @Override
+        public void onUpdate(ScalarModelProvider provider) {
+            final ScalarModel scalarModel = provider.getModel();
+            String name = scalarModel.getName();
+            final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
+            final List<ObjectAdapter> pendingArgs = 
+                    Lists.newArrayList(
+                            Iterables.transform(scalarPanels, new Function<ScalarPanelAbstract, ObjectAdapter>() {
+                        @Override
+                        public ObjectAdapter apply(ScalarPanelAbstract input) {
+                            if(input == null) {
+                                return null;
+                            }
+                            final ScalarModel model = input.getModel();
+                            final ObjectAdapterMemento objectAdapterMemento = model.getObjectAdapterMemento();
+                            if(objectAdapterMemento == null) {
+                                return null;
+                            }
+                            return objectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
+                        }
+                    })
+            );
+            //System.out.println(name + " = '" + (objectAdapterMemento != null? objectAdapterMemento.getTitleHint(): null) + "'");
+            System.out.println(pendingArgs);
+            final ActionModel actionModel = getActionModel();
+            actionModel.getArgumentsAsArray();
+            for (ScalarPanelAbstract scalarPanel : scalarPanels) {
+                
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
new file mode 100644
index 0000000..a42c227
--- /dev/null
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
@@ -0,0 +1,25 @@
+/**
+ *  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;
+
+import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
+
+public interface ScalarModelSubscriber {
+
+    void onUpdate(ScalarModelProvider provider);
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index a16cdd6..0d841ae 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -25,7 +25,10 @@ import com.google.common.collect.Lists;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
 import org.apache.wicket.markup.html.form.LabeledWebMarkupContainer;
@@ -117,6 +120,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     private Component componentIfRegular;
     protected final ScalarModel scalarModel;
 
+
     public ScalarPanelAbstract(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
         this.scalarModel = scalarModel;
@@ -168,9 +172,28 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         componentIfCompact = addComponentForCompact();
         getRendering().buildGui(this);
         addCssForMetaModel();
+        
+        if(!subscribers.isEmpty()) {
+            addFormComponentBehaviour(new AjaxFormComponentUpdatingBehavior("onchange"){
+
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                protected void onUpdate(AjaxRequestTarget target) {
+                    for (ScalarModelSubscriber subscriber : subscribers) {
+                        subscriber.onUpdate(ScalarPanelAbstract.this);
+                    }
+                }
+            });
+        }
     }
 
 
+    /**
+     * Mandatory hook.
+     */
+    protected abstract void addFormComponentBehaviour(Behavior behavior);
+
     private void addCssForMetaModel() {
         final String cssForMetaModel = getModel().getLongName();
         if (cssForMetaModel != null) {
@@ -208,8 +231,6 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
         addAdditionalLinks(labelIfRegular, entityActions);
     }
 
-
-    
     private void addAdditionalLinks(MarkupContainer markupContainer, List<LinkAndLabel> links) {
         if(links == null || links.isEmpty()) {
             Components.permanentlyHide(markupContainer, ID_ADDITIONAL_LINKS);
@@ -239,4 +260,13 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
     protected void onBeforeRenderWhenEnabled() {
     }
 
+    // //////////////////////////////////////
+
+    private final List<ScalarModelSubscriber> subscribers = Lists.newArrayList();
+
+    public void addScalarModelSubscriber(final ScalarModelSubscriber subscriber) {
+        subscribers.add(subscriber);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index d3f19b6..e7bca55 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -23,6 +23,7 @@ import java.io.Serializable;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
@@ -206,4 +207,10 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         textField.add(new AttributeModifier("title", Model.of(titleAttribute)));
     }
 
+    @Override
+    protected void addFormComponentBehaviour(Behavior behavior) {
+        textField.add(behavior);
+    }
+
 }
+

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index aceaa6d..b594126 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -31,6 +31,7 @@ import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.extensions.markup.html.image.resource.ThumbnailImageResource;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.JavaScriptHeaderItem;
@@ -76,13 +77,15 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
 
     private Image wicketImage;
 
+    private FileUploadField fileUploadField;
+
     protected enum InputFieldVisibility {
             VISIBLE, NOT_VISIBLE;
         }
 
     @Override
     protected FormComponentLabel addComponentForRegular() {
-        final FileUploadField fileUploadField = createFileUploadField(ID_SCALAR_VALUE);
+        fileUploadField = createFileUploadField(ID_SCALAR_VALUE);
         fileUploadField.setLabel(Model.of(getModel().getName()));
         
         final FormComponentLabel labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, fileUploadField);
@@ -286,10 +289,16 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         return new ResourceLink<Object>(id, bar);
     }
 
+    @Override
+    protected void addFormComponentBehaviour(Behavior behavior) {
+        fileUploadField.add(behavior);
+    }
+
     
     /**
      * Mandatory hook method.
      */
     protected abstract IResource newResource(final T namedWithMimeType);
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
index a440d13..ee2420b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobPanel.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib;
 
 import java.util.List;
 
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.form.upload.FileUpload;
 import org.apache.wicket.request.resource.ByteArrayResource;
 
@@ -54,4 +55,5 @@ public class IsisBlobPanel extends IsisBlobOrClobPanelAbstract<Blob> {
     }
 
 
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index 226d7e4..f626707 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -19,8 +19,12 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
+import java.util.List;
+
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.CheckBox;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
@@ -28,6 +32,7 @@ import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
@@ -81,8 +86,6 @@ public class BooleanPanel extends ScalarPanelAbstract {
     }
 
 
-
-
     /**
      * Mandatory hook method to build the component to render the model when in
      * {@link Rendering#COMPACT compact} format.
@@ -135,4 +138,9 @@ public class BooleanPanel extends ScalarPanelAbstract {
         checkBox.setEnabled(false);
     }
 
+    @Override
+    protected void addFormComponentBehaviour(Behavior behavior) {
+        checkBox.add(behavior);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 8413c2a..5be6822 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
 import org.apache.wicket.model.Model;
@@ -171,4 +172,10 @@ public class ReferencePanel extends ScalarPanelAbstract {
         
         return labelIfCompact;
     }
+    
+    @Override
+    protected void addFormComponentBehaviour(Behavior behavior) {
+        entityLink.add(behavior);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForObjectAdapterMementos.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForObjectAdapterMementos.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForObjectAdapterMementos.java
deleted file mode 100644
index 0f08da1..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForObjectAdapterMementos.java
+++ /dev/null
@@ -1,78 +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.dropdownchoices;
-
-import java.util.List;
-
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-public class DropDownChoicesForObjectAdapterMementos extends DropDownChoice<ObjectAdapterMemento> {
-
-    private final static class ObjectAdapterMementoRenderer implements IChoiceRenderer<ObjectAdapterMemento> {
-
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public Object getDisplayValue(final ObjectAdapterMemento nom) {
-            return nom.getObjectAdapter(ConcurrencyChecking.NO_CHECK).titleString();
-        }
-
-        @Override
-        public String getIdValue(final ObjectAdapterMemento nom, final int index) {
-            final Oid oid = nom.getObjectAdapter(ConcurrencyChecking.NO_CHECK).getOid();
-            return oid.enString(getOidMarshaller());
-        }
-    }
-
-
-
-    private static final long serialVersionUID = 1L;
-
-    public DropDownChoicesForObjectAdapterMementos(final String id, final IModel<ObjectAdapterMemento> model, final IModel<? extends List<? extends ObjectAdapterMemento>> choices) {
-        this(id, model, choices, new ObjectAdapterMementoRenderer());
-    }
-
-    private DropDownChoicesForObjectAdapterMementos(final String id, final IModel<ObjectAdapterMemento> model, final IModel<? extends List<? extends ObjectAdapterMemento>> choices, final IChoiceRenderer<? super ObjectAdapterMemento> renderer) {
-        super(id, model, choices, renderer);
-    }
-
-    @Override
-    protected boolean wantOnSelectionChangedNotifications() {
-        return false;//true;
-    }
-    
-
-    
-    // //////////////////////////////////////////////////////////
-    // Dependencies (from context)
-    // //////////////////////////////////////////////////////////
-
-    protected static OidMarshaller getOidMarshaller() {
-        return IsisContext.getOidMarshaller();
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForValueMementos.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForValueMementos.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForValueMementos.java
deleted file mode 100755
index 4169fed..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/dropdownchoices/DropDownChoicesForValueMementos.java
+++ /dev/null
@@ -1,63 +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.dropdownchoices;
-
-import java.util.List;
-
-import org.apache.wicket.markup.html.form.DropDownChoice;
-import org.apache.wicket.markup.html.form.IChoiceRenderer;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-public class DropDownChoicesForValueMementos extends DropDownChoice<ObjectAdapterMemento> {
-
-    private final static class ValueMementoRenderer implements IChoiceRenderer<ObjectAdapterMemento> {
-
-        private static final long serialVersionUID = 1L;
-
-        @Override
-        public Object getDisplayValue(final ObjectAdapterMemento nom) {
-            return nom.getObjectAdapter(ConcurrencyChecking.NO_CHECK).titleString();
-        }
-
-        @Override
-        public String getIdValue(final ObjectAdapterMemento nom, final int index) {
-            return String.valueOf(index);
-        }
-
-    }
-
-    private static final long serialVersionUID = 1L;
-
-    public DropDownChoicesForValueMementos(final String id, final IModel<ObjectAdapterMemento> model, final IModel<? extends List<? extends ObjectAdapterMemento>> choices) {
-        this(id, model, choices, new ValueMementoRenderer());
-    }
-
-    private DropDownChoicesForValueMementos(final String id, final IModel<ObjectAdapterMemento> model, final IModel<? extends List<? extends ObjectAdapterMemento>> choices, final IChoiceRenderer<? super ObjectAdapterMemento> renderer) {
-        super(id, model, choices, renderer);
-    }
-
-    @Override
-    protected boolean wantOnSelectionChangedNotifications() {
-        return false;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index e711780..4ab0837 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -28,6 +28,9 @@ import com.vaynberg.wicket.select2.TextChoiceProvider;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
@@ -48,7 +51,7 @@ import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 /**
  * Initial skeleton - trying to add support for value choices.
  */
-public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPanelTextFieldAbstract
+public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
     private static final Logger LOG = LoggerFactory.getLogger(ValueChoicesSelect2Panel.class);
 
     private static final long serialVersionUID = 1L;
@@ -207,7 +210,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan
             }
 
         };
-        return new Select2Choice<ObjectAdapterMemento>(id, modelObject, provider);
+        final Select2Choice<ObjectAdapterMemento> select2Choice = new Select2Choice<ObjectAdapterMemento>(id, modelObject, provider);
+        return select2Choice;
     }
 
     @Override
@@ -222,9 +226,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan
 
     private IModel<List<ObjectAdapterMemento>> getChoicesModel() {
         final List<ObjectAdapter> choices = scalarModel.getChoices();
-        if (choices.size() == 0) {
-            return null;
-        }
         
         // take a copy otherwise is only lazily evaluated
         final List<ObjectAdapterMemento> choicesMementos = Lists.newArrayList(Lists.transform(choices, Mementos.fromAdapter()));
@@ -243,5 +244,11 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract { // ScalarPan
                 return getObject();
             }};
     }
+    
+    @Override
+    protected void addFormComponentBehaviour(Behavior behavior) {
+        valueField.add(behavior);
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/ProcessObjectPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/ProcessObjectPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/ProcessObjectPanelAbstract.java
deleted file mode 100644
index 4513eb7..0000000
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/ProcessObjectPanelAbstract.java
+++ /dev/null
@@ -1,156 +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.panels;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.repeater.RepeatingView;
-
-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.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.spec.ActionType;
-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.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.runtime.memento.Memento;
-import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.ActionModel.SingleResultsMode;
-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.util.Mementos;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.pages.action.ActionPage;
-
-/**
- * Convenience adapter for building bespoke panels for process objects.
- */
-public abstract class ProcessObjectPanelAbstract extends PanelAbstract<EntityModel> {
-
-    private static final long serialVersionUID = 1L;
-    
-    private final Where where;
-
-    public ProcessObjectPanelAbstract(final String id, final EntityModel model, Where where) {
-        super(id, model);
-        this.where = where;
-    }
-
-    protected EntityModel getEntityModel() {
-        return getModel();
-    }
-
-    protected void addProperties(final MarkupContainer mc, final String idProperties, final String idProperty) {
-        final EntityModel entityModel = getModel();
-        final ObjectAdapter adapter = entityModel.getObject();
-        final ObjectSpecification noSpec = adapter.getSpecification();
-
-        final List<OneToOneAssociation> properties = visibleProperties(adapter, noSpec);
-
-        final RepeatingView rv = new RepeatingView(idProperties);
-        mc.add(rv);
-        final List<PropertyMemento> mementos = buildPropertyMementos(properties);
-        for (final PropertyMemento pm : mementos) {
-            final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
-            rv.add(container);
-
-            final ScalarModel scalarModel = entityModel.getPropertyModel(pm);
-            getComponentFactoryRegistry().addOrReplaceComponent(container, idProperty, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private List<OneToOneAssociation> visibleProperties(final ObjectAdapter adapter, final ObjectSpecification noSpec) {
-        @SuppressWarnings("rawtypes")
-        final List list = noSpec.getAssociations(Contributed.EXCLUDED, visiblePropertyFilter(adapter));
-        return new ArrayList<OneToOneAssociation>(list);
-    }
-
-    private Filter<ObjectAssociation> visiblePropertyFilter(final ObjectAdapter adapter) {
-        return Filters.and(ObjectAssociationFilters.PROPERTIES, ObjectAssociationFilters.dynamicallyVisible(getAuthenticationSession(), adapter, where));
-    }
-
-    private List<PropertyMemento> buildPropertyMementos(final List<OneToOneAssociation> properties) {
-        final List<PropertyMemento> mementos = Lists.transform(properties, Mementos.fromProperty());
-        // we copy into a new array list otherwise we get lazy evaluation =
-        // reference to a non-serializable object
-        return Lists.newArrayList(mementos);
-    }
-
-    /**
-     * Validates the form properties and domain object (object-level
-     * validation).
-     */
-    protected boolean isValid(final Form<?> form) {
-
-        // check properties are all valid
-        if (form.hasError()) {
-            return false;
-        }
-
-        // check object is valid
-
-        // to perform object-level validation, we must apply the changes first
-        // Contrast this with ActionPanel (for validating action arguments)
-        // where
-        // we do the validation prior to the execution of the action.
-        final ObjectAdapter object = getEntityModel().getObject();
-        final Memento snapshotToRollbackToIfInvalid = new Memento(object);
-
-        getEntityModel().apply();
-        final String invalidReasonIfAny = getEntityModel().getReasonInvalidIfAny();
-        if (invalidReasonIfAny != null) {
-            form.error(invalidReasonIfAny);
-            snapshotToRollbackToIfInvalid.recreateObject();
-            return false;
-        }
-
-        // ok
-        return true;
-    }
-
-    /**
-     * Executes action; expected to take no arguments.
-     */
-    protected void executeNoArgAction(final String actionId) {
-        final ObjectSpecification typeOfSpec = getModel().getTypeOfSpecification();
-        final ObjectAction action = typeOfSpec.getObjectAction(ActionType.USER, actionId);
-        final ObjectAdapterMemento adapterMemento = getModel().getObjectAdapterMemento();
-        final ActionMemento actionMemento = new ActionMemento(action);
-        final ActionModel.Mode actionMode = ActionModel.determineMode(action);
-
-        final ActionModel actionModel = ActionModel.create(adapterMemento, actionMemento, actionMode, SingleResultsMode.INLINE);
-        setResponsePage(new ActionPage(actionModel));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index e89c638..36db01e 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -19,7 +19,9 @@
 package dom.todo;
 
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.SortedSet;
@@ -31,6 +33,7 @@ import javax.jdo.annotations.VersionStrategy;
 import javax.jdo.spi.PersistenceCapable;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 
 import org.joda.time.LocalDate;
@@ -153,35 +156,59 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     }
 
     // //////////////////////////////////////
-    // Category (property)
+    // Category and Subcategory (property)
     // //////////////////////////////////////
 
     public static enum Category {
         Professional {
             @Override
-            public int priority() {
-                return 1;
+            public List<Subcategory> subcategories() {
+                return Arrays.asList(Subcategory.OpenSource, Subcategory.Consulting, Subcategory.Education);
             }
         }, Domestic {
             @Override
-            public int priority() {
-                return 2;
+            public List<Subcategory> subcategories() {
+                return Arrays.asList(Subcategory.Shopping, Subcategory.Housework, Subcategory.Garden, Subcategory.Chores);
             }
         }, Other {
             @Override
-            public int priority() {
-                return 3;
+            public List<Subcategory> subcategories() {
+                return Arrays.asList(Subcategory.Other);
             }
         };
         
-        // this method is simply to demonstrate that anonymous 
-        // subtypes of enums are allowed
-        public abstract int priority();
+        public abstract List<Subcategory> subcategories();
     }
 
+    public static enum Subcategory {
+        // professional
+        OpenSource, Consulting, Education, Marketing,
+        // domestic
+        Shopping, Housework, Garden, Chores,
+        // other
+        Other;
+
+        public static List<Subcategory> listFor(Category category) {
+            return category != null? category.subcategories(): Collections.<Subcategory>emptyList();
+        }
+
+        static String validate(final Category category, final Subcategory subcategory) {
+            if(category == null) {
+                return "Enter category first";
+            }
+            return !category.subcategories().contains(subcategory) 
+                    ? "Invalid subcategory for category '" + category + "'" 
+                    : null;
+        }
+    }
+
+    // //////////////////////////////////////
+
+
     private Category category;
 
     @javax.jdo.annotations.Column(allowsNull="false")
+    @Disabled
     public Category getCategory() {
         return category;
     }
@@ -191,6 +218,20 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     }
 
     // //////////////////////////////////////
+
+    private Subcategory subcategory;
+
+    @javax.jdo.annotations.Column(allowsNull="false")
+    @Disabled
+    public Subcategory getSubcategory() {
+        return subcategory;
+    }
+    public void setSubcategory(final Subcategory subcategory) {
+        this.subcategory = subcategory;
+    }
+
+    
+    // //////////////////////////////////////
     // OwnedBy (property)
     // //////////////////////////////////////
     
@@ -446,13 +487,15 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
             String description,
             @Named("Category")
             ToDoItem.Category category, 
+            @Named("Subcategory")
+            ToDoItem.Subcategory subcategory, 
             @Named("Due by") 
             @Optional
             LocalDate dueBy,
             @Named("Cost") 
             @Optional
             BigDecimal cost) {
-        return toDoItems.newToDo(description, category, dueBy, cost);
+        return toDoItems.newToDo(description, category, subcategory, dueBy, cost);
     }
     public String default0Duplicate() {
         return getDescription() + " - Copy";
@@ -460,7 +503,10 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     public Category default1Duplicate() {
         return getCategory();
     }
-    public LocalDate default2Duplicate() {
+    public Subcategory default2Duplicate() {
+        return getSubcategory();
+    }
+    public LocalDate default3Duplicate() {
         return getDueBy();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
index 1284a93..576ae44 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.layout.json
@@ -23,6 +23,7 @@
                 members: {
                     description: {},
                     category: {},
+                    subcategory: {},
                     complete: {
                         actions: {
                             completed: {},

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index 4d91bd1..86c7c3a 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -29,6 +29,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 
 import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
 
 import org.joda.time.LocalDate;
 
@@ -140,27 +141,36 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     // UpdateCategory (contributed action)
     // //////////////////////////////////////
 
-    @DescribedAs("Demonstrates contributed actions; could also be implemented as a simple editable property")
+    @DescribedAs("Update category and subcategory")
     @NotInServiceMenu
     @ActionSemantics(Of.IDEMPOTENT)
     @MemberOrder(sequence="1")
-    public ToDoItem updateCategory(ToDoItem item, @Named("Category") Category category) {
+    public ToDoItem updateCategory(
+            final ToDoItem item, 
+            final @Named("Category") Category category,
+            final @Named("Subcategory") Subcategory subcategory) {
         item.setCategory(category);
+        item.setSubcategory(subcategory);
         return item;
     }
 
-    public List<Category> choices1UpdateCategory(ToDoItem item, Category category) {
-        // in principle we could fine-tune the choices.
-        // here, though, we just return all categories
-        return Arrays.asList(Category.values());
-    }
-    
-    public Category default1UpdateCategory(ToDoItem item, Category category) {
+    public Category default1UpdateCategory(
+            final ToDoItem item, final Category category, final Subcategory subcategory) {
         return item.getCategory();
     }
+    public Subcategory default2UpdateCategory(
+            final ToDoItem item, final Category category, final Subcategory subcategory) {
+        return item.getSubcategory();
+    }
+
+    public List<Subcategory> choices2UpdateCategory(
+            final ToDoItem item, final Category category, final Subcategory subcategory) {
+        return Subcategory.listFor(category);
+    }
     
-    public String validateUpdateCategory(final ToDoItem item, Category category) {
-        return category == item.getCategory() ? "Already set to that value!" : null;
+    public String validateUpdateCategory(
+            final ToDoItem item, final Category category, final Subcategory subcategory) {
+        return Subcategory.validate(category, subcategory);
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
index 47df583..0411239 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
@@ -34,6 +34,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 
 import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
 
 import org.joda.time.LocalDate;
 
@@ -139,14 +140,15 @@ public class ToDoItems extends AbstractFactoryAndRepository {
             @RegEx(validation = "\\w[@&:\\-\\,\\.\\+ \\w]*") // words, spaces and selected punctuation
             @Named("Description") String description, 
             @Named("Category") Category category,
+            @Named("Subcategory") Subcategory subcategory,
             @Optional
             @Named("Due by") LocalDate dueBy,
             @Optional
             @Named("Cost") BigDecimal cost) {
         final String ownedBy = currentUserName();
-        return newToDo(description, category, ownedBy, dueBy, cost);
+        return newToDo(description, category, subcategory, ownedBy, dueBy, cost);
     }
-    public LocalDate default2NewToDo() {
+    public LocalDate default3NewToDo() {
         return new LocalDate(Clock.getTime()).plusDays(14);
     }
 
@@ -207,12 +209,13 @@ public class ToDoItems extends AbstractFactoryAndRepository {
     public ToDoItem newToDo(
             final String description, 
             final Category category, 
-            final String userName,
-            final LocalDate dueBy, 
-            final BigDecimal cost) {
+            final Subcategory subcategory,
+            final String userName, 
+            final LocalDate dueBy, final BigDecimal cost) {
         final ToDoItem toDoItem = newTransientInstance(ToDoItem.class);
         toDoItem.setDescription(description);
         toDoItem.setCategory(category);
+        toDoItem.setSubcategory(subcategory);
         toDoItem.setOwnedBy(userName);
         toDoItem.setDueBy(dueBy);
         toDoItem.setCost(cost);

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
index 7a14f6d..b52d951 100644
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
+++ b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
@@ -23,6 +23,7 @@ import java.math.BigDecimal;
 
 import dom.todo.ToDoItem;
 import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
 import dom.todo.ToDoItems;
 
 import org.joda.time.LocalDate;
@@ -57,18 +58,20 @@ public class ToDoItemsFixture extends AbstractFixture {
 
     private void installFor(String user) {
 
-        createToDoItemForUser("Buy milk", Category.Domestic, user, daysFromToday(0), new BigDecimal("0.75"));
-        createToDoItemForUser("Buy bread", Category.Domestic, user, daysFromToday(0), new BigDecimal("1.75"));
-        createToDoItemForUser("Buy stamps", Category.Domestic, user, daysFromToday(0), new BigDecimal("10.00")).setComplete(true);
-        createToDoItemForUser("Pick up laundry", Category.Domestic, user, daysFromToday(6), new BigDecimal("7.50"));
-        createToDoItemForUser("Sharpen knives", Category.Domestic, user, daysFromToday(14), null);
+        createToDoItemForUser("Buy milk", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("0.75"));
+        createToDoItemForUser("Buy bread", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("1.75"));
+        createToDoItemForUser("Buy stamps", Category.Domestic, Subcategory.Shopping, user, daysFromToday(0), new BigDecimal("10.00")).setComplete(true);
+        createToDoItemForUser("Pick up laundry", Category.Domestic, Subcategory.Chores, user, daysFromToday(6), new BigDecimal("7.50"));
+        createToDoItemForUser("Mow lawn", Category.Domestic, Subcategory.Garden, user, daysFromToday(6), null);
+        createToDoItemForUser("Vacuum house", Category.Domestic, Subcategory.Housework, user, daysFromToday(3), null);
+        createToDoItemForUser("Sharpen knives", Category.Domestic, Subcategory.Chores, user, daysFromToday(14), null);
         
-        createToDoItemForUser("Write to penpal", Category.Other, user, null, null);
+        createToDoItemForUser("Write to penpal", Category.Other, Subcategory.Other, user, null, null);
         
-        createToDoItemForUser("Write blog post", Category.Professional, user, daysFromToday(7), null).setComplete(true);
-        createToDoItemForUser("Organize brown bag", Category.Professional, user, daysFromToday(14), null);
-        createToDoItemForUser("Submit conference session", Category.Professional, user, daysFromToday(21), null);
-        createToDoItemForUser("Stage Isis release", Category.Professional, user, null, null);
+        createToDoItemForUser("Write blog post", Category.Professional, Subcategory.Marketing, user, daysFromToday(7), null).setComplete(true);
+        createToDoItemForUser("Organize brown bag", Category.Professional, Subcategory.Consulting, user, daysFromToday(14), null);
+        createToDoItemForUser("Submit conference session", Category.Professional, Subcategory.Education, user, daysFromToday(21), null);
+        createToDoItemForUser("Stage Isis release", Category.Professional, Subcategory.OpenSource, user, null, null);
 
         getContainer().flush();
     }
@@ -76,8 +79,8 @@ public class ToDoItemsFixture extends AbstractFixture {
 
     // //////////////////////////////////////
 
-    private ToDoItem createToDoItemForUser(final String description, final Category category, String user, final LocalDate dueBy, final BigDecimal cost) {
-        return toDoItems.newToDo(description, category, user, dueBy, cost);
+    private ToDoItem createToDoItemForUser(final String description, final Category category, Subcategory subcategory, String user, final LocalDate dueBy, final BigDecimal cost) {
+        return toDoItems.newToDo(description, category, subcategory, user, dueBy, cost);
     }
 
     private static LocalDate daysFromToday(final int i) {

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemTest_duplicate.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemTest_duplicate.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemTest_duplicate.java
index 2d3645b..c280aaa 100644
--- a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemTest_duplicate.java
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemTest_duplicate.java
@@ -60,6 +60,7 @@ public class ToDoItemTest_duplicate extends ToDoIntegTest {
                 unwrap(toDoItem).default0Duplicate(), 
                 unwrap(toDoItem).default1Duplicate(),
                 unwrap(toDoItem).default2Duplicate(),
+                unwrap(toDoItem).default3Duplicate(),
                 new BigDecimal("987.65"));
         
         // then

http://git-wip-us.apache.org/repos/asf/isis/blob/d114c453/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/repo/ToDoItemsTest_newToDo_and_delete.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/repo/ToDoItemsTest_newToDo_and_delete.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/repo/ToDoItemsTest_newToDo_and_delete.java
index 3f51963..0fa2e35 100644
--- a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/repo/ToDoItemsTest_newToDo_and_delete.java
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/repo/ToDoItemsTest_newToDo_and_delete.java
@@ -24,6 +24,7 @@ import integration.tests.ToDoIntegTest;
 import dom.todo.ToDoItem;
 import dom.todo.ToDoItems;
 import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
 
 import org.junit.Test;
 
@@ -36,7 +37,7 @@ public class ToDoItemsTest_newToDo_and_delete extends ToDoIntegTest {
         int size = wrap(service(ToDoItems.class)).notYetComplete().size();
         
         // when
-        final ToDoItem newToDo = wrap(service(ToDoItems.class)).newToDo("new todo", Category.Professional, null, null);
+        final ToDoItem newToDo = wrap(service(ToDoItems.class)).newToDo("new todo", Category.Professional, Subcategory.OpenSource, null, null);
 
         // then
         assertThat(newToDo.getDescription(), is("new todo"));


[5/5] git commit: ISIS-478: choices and default methods can now take partial parameter lists

Posted by da...@apache.org.
ISIS-478: choices and default methods can now take partial parameter lists

See ToDoItemContributions#updateCost and its supporting methods for example.


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

Branch: refs/heads/master
Commit: 2ab9e661552dc14fc200656e548b3946ff325079
Parents: 6763bd4
Author: Dan Haywood <da...@apache.org>
Authored: Wed Aug 21 00:42:20 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Aug 21 00:42:20 2013 +0100

----------------------------------------------------------------------
 .../isis/core/commons/lang/ListUtils.java       | 36 ++++++++
 .../adapter/util/AdapterInvokeUtils.java        | 31 ++++++-
 .../choices/ActionParameterChoicesFacet.java    |  4 +-
 .../defaults/ActionParameterDefaultsFacet.java  |  4 +-
 .../specimpl/ObjectActionParameterAbstract.java | 19 ++--
 .../ObjectActionParameterContributee.java       | 87 ++++++++++++++++--
 ...jectActionParameterParseableContributee.java | 16 ++--
 .../OneToOneActionParameterContributee.java     | 17 ++--
 .../ActionParameterChoicesFacetNone.java        |  4 +-
 ...eterChoicesFacetDerivedFromChoicesFacet.java |  4 +-
 .../ActionParameterChoicesFacetFactory.java     | 57 ++++++++----
 .../ActionParameterChoicesFacetViaMethod.java   | 12 +--
 .../ActionParameterDefaultsFacetNone.java       |  4 +-
 .../ActionParameterDefaultsFacetFactory.java    | 39 +++++++--
 .../ActionParameterDefaultsFacetViaMethod.java  |  9 +-
 .../core/commons/lang/ListUtilsTest_adjust.java | 70 +++++++++++++++
 .../core/commons/lang/ListUtilsTest_insert.java | 82 +++++++++++++++++
 .../commons/lang/ListUtilsTest_mutableCopy.java | 92 ++++++++++++++++++++
 .../java/dom/todo/ToDoItemContributions.java    |  6 +-
 19 files changed, 524 insertions(+), 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListUtils.java
index 4c7f337..3da6bdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ListUtils.java
@@ -22,8 +22,13 @@ package org.apache.isis.core.commons.lang;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+
 public final class ListUtils {
     private static final String DEFAULT_DELIMITER = ",";
 
@@ -138,5 +143,36 @@ public final class ListUtils {
         list.addAll(Arrays.asList(optionValues));
         return list;
     }
+    
+    // //////////////////////////////////////
+    
+    public static <T> List<T> mutableCopy(final List<T> input) {
+        return Lists.newArrayList(input != null? input: Collections.<T>emptyList());
+    }
+
+    public static <T> List<T> mutableCopy(T[] arr) {
+        return mutableCopy(arr != null? Arrays.asList(arr): Collections.<T>emptyList()) ;
+    }
+
+    public static <T> void insert(final List<T> list, final int insertionPoint, final T elementToInsert) {
+        extend(list, insertionPoint);
+        list.add(insertionPoint, elementToInsert);
+    }
+
+    public static <T> void adjust(final List<T> list, final int requiredLength) {
+        extend(list, requiredLength);
+        if(list.size() > requiredLength) {
+            list.subList(requiredLength, list.size()).clear();;
+        }
+    }
+
+    private static <T> void extend(final List<T> list, final int requiredLength) {
+        for(int i=list.size(); i<requiredLength; i++) {
+            list.add(null);
+        }
+    }
+
+    
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterInvokeUtils.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterInvokeUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterInvokeUtils.java
index ff2c2a0..271a63f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterInvokeUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/util/AdapterInvokeUtils.java
@@ -22,7 +22,11 @@ package org.apache.isis.core.metamodel.adapter.util;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionParameterContributee.Util;
 
 public final class AdapterInvokeUtils {
 
@@ -50,6 +54,30 @@ public final class AdapterInvokeUtils {
     }
     
     /**
+     * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
+     * 
+     * <p>
+     * That is:
+     * <ul>
+     * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.
+     * <li>if the method does not declare all parameters for arguments, then truncates arguments.
+     * </ul>
+     */
+    public static Object invokeAutofit(final Method method, final ObjectAdapter target, List<ObjectAdapter> argumentsIfAvailable) {
+        final List<ObjectAdapter> args = Lists.newArrayList();
+        if(argumentsIfAvailable != null) {
+            args.addAll(argumentsIfAvailable);
+        }
+        
+        final int requiredLength = method.getParameterTypes().length;
+        ListUtils.adjust(args, requiredLength);
+
+        final ObjectAdapter[] argArray = args.toArray(new ObjectAdapter[]{});
+        
+        return AdapterInvokeUtils.invoke(method, target, argArray);
+    }
+    
+    /**
      * Invokes the method, adjusting arguments as required.
      * 
      * <p>
@@ -59,7 +87,8 @@ public final class AdapterInvokeUtils {
      * <li>if the method does not declare parameters but arguments were provided, then will ignore those argumens.
      * </ul>
      */
-    public static Object invokeWithDefaults(final Method method, final ObjectAdapter adapter, final ObjectAdapter[] argumentAdapters) {
+    @SuppressWarnings("unused")
+    private static Object invokeWithDefaults(final Method method, final ObjectAdapter adapter, final ObjectAdapter[] argumentAdapters) {
         final int numParams = method.getParameterTypes().length;
         ObjectAdapter[] adapters;
         

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
index 4e40114..b92e976 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.param.choices;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
@@ -32,5 +34,5 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface ActionParameterChoicesFacet extends Facet {
 
-    public Object[] getChoices(ObjectAdapter target, ObjectAdapter[] arguments);
+    public Object[] getChoices(ObjectAdapter target, List<ObjectAdapter> arguments);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
index 130bf41..dc50133 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.param.defaults;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
@@ -32,5 +34,5 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface ActionParameterDefaultsFacet extends Facet {
 
-    public abstract Object getDefault(ObjectAdapter target, ObjectAdapter[] parameters);
+    public abstract Object getDefault(ObjectAdapter target, List<ObjectAdapter> parameters);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/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 325bcb7..bcb157b 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
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.Arrays;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -30,6 +31,7 @@ import org.apache.isis.applib.query.Query;
 import org.apache.isis.applib.query.QueryFindAllInstances;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.commons.lang.StringUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.QuerySubmitter;
@@ -57,6 +59,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.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.specimpl.ObjectActionParameterContributee.Util;
 import org.apache.isis.core.progmodel.facets.param.autocomplete.MinLengthUtil;
 
 public abstract class ObjectActionParameterAbstract implements ObjectActionParameter {
@@ -292,13 +295,15 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     @Override
     public ObjectAdapter[] getChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
-        final ObjectAdapter target = targetForDefaultOrChoices(adapter, argumentsIfAvailable);
-        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter, argumentsIfAvailable);
+        final List<ObjectAdapter> argListIfAvailable = ListUtils.mutableCopy(argumentsIfAvailable);
+        
+        final ObjectAdapter target = targetForDefaultOrChoices(adapter, argListIfAvailable);
+        final List<ObjectAdapter> args = argsForDefaultOrChoices(adapter, argListIfAvailable);
         
         return findChoices(target, args);
     }
 
-    private ObjectAdapter[] findChoices(final ObjectAdapter target, final ObjectAdapter[] args) {
+    private ObjectAdapter[] findChoices(final ObjectAdapter target, final List<ObjectAdapter> args) {
         final List<ObjectAdapter> adapters = Lists.newArrayList();
         final ActionParameterChoicesFacet facet = getFacet(ActionParameterChoicesFacet.class);
 
@@ -323,14 +328,14 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     public ObjectAdapter getDefault(final ObjectAdapter adapter) {
         
         final ObjectAdapter target = targetForDefaultOrChoices(adapter, null);
-        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter, null);
+        final List<ObjectAdapter> args = argsForDefaultOrChoices(adapter, null);
         
         return findDefault(target, args);
     }
 
     private ObjectAdapter findDefault(
             final ObjectAdapter target, 
-            final ObjectAdapter[] args) {
+            final List<ObjectAdapter> args) {
         final ActionParameterDefaultsFacet defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
         if (defaultsFacet != null) {
             final Object dflt = defaultsFacet.getDefault(target, args);
@@ -347,14 +352,14 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
         return adapter;
     }
 
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+    protected List<ObjectAdapter> argsForDefaultOrChoices(final ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
index 53873c8..dbc375e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -27,13 +28,20 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 public interface ObjectActionParameterContributee extends ObjectActionParameter {
 
+    // TODO: can probably remove this now?
     public static class Util {
-        
-        static <T> List<T> toList(final T[] inputArray) {
+
+        @SuppressWarnings("unused")
+        private static <T> List<T> toList(final T[] inputArray) {
+            return Lists.newArrayList(asList(inputArray));
+        }
+
+        private static <T> List<T> asList(final T[] inputArray) {
             return inputArray != null? Arrays.asList(inputArray): Collections.<T>emptyList();
         }
 
-        static <T> List<T> update(List<T> input, final int requiredLength, final int index, final T elementAtIndex) {
+        @SuppressWarnings("unused")
+        private static <T> List<T> adjust(final List<T> input, final int requiredLength, final int index, final T elementAtIndex) {
             List<T> output;
             if(input.isEmpty()) {
                 // nothing provided, so just create an empty list of the required length
@@ -50,13 +58,13 @@ public interface ObjectActionParameterContributee extends ObjectActionParameter
             } else {
                 throw new IllegalArgumentException("Provided " + input.size() + " args for method taking " + requiredLength + " parameters");
             }
-
+            
             // finally, overwrite the element
             output.set(index, elementAtIndex);
             return output;
         }
 
-        static <T> List<T> newList(final int requiredLength) {
+        private static <T> List<T> newList(final int requiredLength) {
             List<T> output;
             output = Lists.newArrayList();
             for(int i=0; i<requiredLength; i++) {
@@ -64,5 +72,74 @@ public interface ObjectActionParameterContributee extends ObjectActionParameter
             }
             return output;
         }
+        
+//      @Test
+//      public void adjust_whenSameSize() throws Exception {
+//          final List<Integer> input = Arrays.asList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+//          final List<Integer> output = ObjectActionParameterContributee.Util.adjust(input, 3, 0, Integer.valueOf(10));
+//          
+//          assertThat(output.size(), is(3));
+//          assertThat(output.get(0), is(Integer.valueOf(10)));
+//          assertThat(output.get(1), is(Integer.MAX_VALUE));
+//          assertThat(output.get(2), is(Integer.MIN_VALUE));
+//      }
+  //    
+//      @Test
+//      public void adjust_whenEmpty() throws Exception {
+//          final List<Integer> input = Collections.emptyList();
+//          final List<Integer> output = ObjectActionParameterContributee.Util.adjust(input, 3, 0, Integer.valueOf(10));
+//          
+//          assertThat(output.size(), is(3));
+//          assertThat(output.get(0), is(Integer.valueOf(10)));
+//          assertThat(output.get(1), is(nullValue()));
+//          assertThat(output.get(2), is(nullValue()));
+//      }
+  //
+//      @Test
+//      public void adjust_whenOneLess_replaceStart() throws Exception {
+//          final List<Integer> input = Arrays.asList(Integer.MAX_VALUE, Integer.MIN_VALUE);
+//          final List<Integer> output = ObjectActionParameterContributee.Util.adjust(input, 3, 0, Integer.valueOf(10));
+//          
+//          assertThat(output.size(), is(3));
+//          assertThat(output.get(0), is(Integer.valueOf(10)));
+//          assertThat(output.get(1), is(Integer.MAX_VALUE));
+//          assertThat(output.get(2), is(Integer.MIN_VALUE));
+//      }
+  //    
+//      @Test
+//      public void adjust_whenOneLess_replaceMiddle() throws Exception {
+//          final List<Integer> input = Arrays.asList(Integer.MAX_VALUE, Integer.MIN_VALUE);
+//          final List<Integer> output = ObjectActionParameterContributee.Util.adjust(input, 3, 1, Integer.valueOf(10));
+//          
+//          assertThat(output.size(), is(3));
+//          assertThat(output.get(0), is(Integer.MAX_VALUE));
+//          assertThat(output.get(1), is(Integer.valueOf(10)));
+//          assertThat(output.get(2), is(Integer.MIN_VALUE));
+//      }
+  //    
+//      @Test
+//      public void adjust_whenOneLess_replaceEnd() throws Exception {
+//          final List<Integer> input = Arrays.asList(Integer.MAX_VALUE, Integer.MIN_VALUE);
+//          final List<Integer> output = ObjectActionParameterContributee.Util.adjust(input, 3, 2, Integer.valueOf(10));
+//          
+//          assertThat(output.size(), is(3));
+//          assertThat(output.get(0), is(Integer.MAX_VALUE));
+//          assertThat(output.get(1), is(Integer.MIN_VALUE));
+//          assertThat(output.get(2), is(Integer.valueOf(10)));
+//      }
+      
+      
+      
+
+  //  @Test
+  //  public void newList() throws Exception {
+//        final List<Object> list = ObjectActionParameterContributee.Util.newList(3);
+//        assertThat(list.size(), is(3));
+//        assertThat(list.get(0), is(nullValue()));
+//        assertThat(list.get(1), is(nullValue()));
+//        assertThat(list.get(2), is(nullValue()));
+  //  }
+
+        
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
index 0de6bea..7ee83a4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import com.google.common.collect.Lists;
 
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.object.bounded.BoundedFacetUtils;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
@@ -37,6 +38,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 public class ObjectActionParameterParseableContributee extends ObjectActionParameterParseable implements ObjectActionParameterContributee {
 
     private final ObjectAdapter serviceAdapter;
+    @SuppressWarnings("unused")
     private final ObjectActionImpl serviceAction;
     private final ObjectActionParameter serviceActionParameter;
     @SuppressWarnings("unused")
@@ -66,18 +68,18 @@ public class ObjectActionParameterParseableContributee extends ObjectActionParam
         return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg);
     }
 
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
         return serviceAdapter;
     }
 
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
-        final int required = serviceAction.getParameterCount();
-        final int existing = contributeeAction.getContributeeParam();
+    protected List<ObjectAdapter> argsForDefaultOrChoices(final ObjectAdapter contributee, final List<ObjectAdapter> argumentsIfAvailable) {
+
+        final List<ObjectAdapter> suppliedArgs = ListUtils.mutableCopy(argumentsIfAvailable);
         
-        List<ObjectAdapter> input = Util.toList(argumentsIfAvailable);
-        List<ObjectAdapter> output = Util.update(input, required, existing, adapter);
+        final int contributeeParam = contributeeAction.getContributeeParam();
+        ListUtils.insert(suppliedArgs, contributeeParam, contributee);
         
-        return output.toArray(new ObjectAdapter[]{});
+        return suppliedArgs;
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/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 6470df2..dbc4e5b 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
@@ -18,13 +18,14 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
 
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionParameterContributee.Util;
 
 public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
 
     private final ObjectAdapter serviceAdapter;
+    @SuppressWarnings("unused")
     private final ObjectActionImpl serviceAction;
     private final ObjectActionParameter serviceActionParameter;
     @SuppressWarnings("unused")
@@ -54,18 +55,18 @@ public class OneToOneActionParameterContributee extends OneToOneActionParameterI
         return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg);
     }
 
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
         return serviceAdapter;
     }
 
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
-        final int required = serviceAction.getParameterCount();
-        final int existing = contributeeAction.getContributeeParam();
+    protected List<ObjectAdapter> argsForDefaultOrChoices(final ObjectAdapter contributee, final List<ObjectAdapter> argumentsIfAvailable) {
+
+        final List<ObjectAdapter> suppliedArgs = ListUtils.mutableCopy(argumentsIfAvailable);
         
-        List<ObjectAdapter> input = Util.toList(argumentsIfAvailable);
-        List<ObjectAdapter> output = Util.update(input, required, existing, adapter);
+        final int contributeeParam = contributeeAction.getContributeeParam();
+        ListUtils.insert(suppliedArgs, contributeeParam, contributee);
         
-        return output.toArray(new ObjectAdapter[]{});
+        return suppliedArgs;
     }
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/ActionParameterChoicesFacetNone.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/ActionParameterChoicesFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/ActionParameterChoicesFacetNone.java
index ae1112e..4f39e7a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/ActionParameterChoicesFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/ActionParameterChoicesFacetNone.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.progmodel.facets.param.choices;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -31,7 +33,7 @@ public class ActionParameterChoicesFacetNone extends ActionParameterChoicesFacet
     }
 
     @Override
-    public Object[] getChoices(final ObjectAdapter adapter, final ObjectAdapter[] arguments) {
+    public Object[] getChoices(final ObjectAdapter adapter, final List<ObjectAdapter> arguments) {
         return new ObjectAdapter[0];
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
index 872d274..7701222 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.progmodel.facets.param.choices.enums;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -35,7 +37,7 @@ public class ActionParameterChoicesFacetDerivedFromChoicesFacet extends ActionPa
     }
 
     @Override
-    public Object[] getChoices(final ObjectAdapter adapter, final ObjectAdapter[] arguments) {
+    public Object[] getChoices(final ObjectAdapter adapter, final List<ObjectAdapter> arguments) {
         final FacetHolder facetHolder = getFacetHolder();
         final TypedHolder paramPeer = (TypedHolder) facetHolder;
         final ObjectSpecification noSpec = getSpecification(paramPeer.getType());

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java
index b7efc07..5a4e5b5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetFactory.java
@@ -24,6 +24,7 @@ import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.commons.lang.NameUtils;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
@@ -33,6 +34,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 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.FacetFactory.ProcessMethodContext;
 import org.apache.isis.core.metamodel.facets.actions.choices.ActionChoicesFacet;
 import org.apache.isis.core.metamodel.methodutils.MethodScope;
 import org.apache.isis.core.progmodel.facets.MethodFinderUtils;
@@ -80,19 +82,7 @@ public class ActionParameterChoicesFacetFactory extends MethodPrefixBasedFacetFa
 
             final Class<?> arrayOfParamType = (Array.newInstance(paramTypes[i], 0)).getClass();
             
-            // four attempts to find matching method
-            Method choicesMethod;
-            choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, paramTypes, arrayOfParamType);
-            if (choicesMethod == null) {
-                choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, paramTypes, Collection.class);
-            }
-            if (choicesMethod == null) {
-                // ... otherwise on method name + no params
-                choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, new Class[0], arrayOfParamType);
-            }
-            if (choicesMethod == null) {
-                choicesMethod = findChoicesNumMethodReturning(processMethodContext, i, new Class[0], Collection.class);
-            }
+            final Method choicesMethod = findChoicesNumMethodReturning(processMethodContext, i);
             if (choicesMethod == null) {
                 continue;
             }
@@ -111,12 +101,47 @@ public class ActionParameterChoicesFacetFactory extends MethodPrefixBasedFacetFa
         }
     }
 
-    private static Method findChoicesNumMethodReturning(final ProcessMethodContext processMethodContext, final int i, Class<?>[] paramTypes, final Class<?> arrayOfParamType) {
+    /**
+     * search successively for the default method, trimming number of param types each loop
+     */
+    private static Method findChoicesNumMethodReturning(final ProcessMethodContext processMethodContext, final int n) {
+        
+        final Method actionMethod = processMethodContext.getMethod();
+        final List<Class<?>> paramTypes = ListUtils.mutableCopy(actionMethod.getParameterTypes());
+        
+        final Class<?> arrayOfParamType = (Array.newInstance(paramTypes.get(n), 0)).getClass();
+        
+        final int numParamTypes = paramTypes.size();
+        
+        for(int i=0; i< numParamTypes+1; i++) {
+            Method method;
+            
+            method = findChoicesNumMethodReturning(processMethodContext, n, paramTypes.toArray(new Class<?>[]{}), arrayOfParamType);
+            if(method != null) {
+                return method;
+            }
+            method = findChoicesNumMethodReturning(processMethodContext, n, paramTypes.toArray(new Class<?>[]{}), Collection.class);
+            if(method != null) {
+                return method;
+            }
+            
+            // remove last, and search again
+            if(!paramTypes.isEmpty()) {
+                paramTypes.remove(paramTypes.size()-1);
+            }
+        }
+
+        return null;
+    }
+
+
+    
+    private static Method findChoicesNumMethodReturning(final ProcessMethodContext processMethodContext, final int n, Class<?>[] paramTypes, final Class<?> returnType) {
         final Class<?> cls = processMethodContext.getCls();
         final Method actionMethod = processMethodContext.getMethod();
         final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
-        final String name = MethodPrefixConstants.CHOICES_PREFIX + i + capitalizedName;
-        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, name, arrayOfParamType, paramTypes);
+        final String name = MethodPrefixConstants.CHOICES_PREFIX + n + capitalizedName;
+        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, name, returnType, paramTypes);
     }
 
     // ///////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index 37ca5d7..7f78b52 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -65,16 +65,16 @@ public class ActionParameterChoicesFacetViaMethod extends ActionParameterChoices
     }
 
     @Override
-    public Object[] getChoices(final ObjectAdapter adapter, final ObjectAdapter[] arguments) {
-        final Object options = AdapterInvokeUtils.invokeWithDefaults(method, adapter, arguments);
-        if (options == null) {
+    public Object[] getChoices(final ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
+        final Object choices = AdapterInvokeUtils.invokeAutofit(method, adapter, argumentsIfAvailable);
+        if (choices == null) {
             return new Object[0];
         }
-        if (options.getClass().isArray()) {
-            return ArrayUtil.getObjectAsObjectArray(options);
+        if (choices.getClass().isArray()) {
+            return ArrayUtil.getObjectAsObjectArray(choices);
         } else {
             final ObjectSpecification specification = getSpecification(choicesType);
-            return CollectionUtils.getCollectionAsObjectArray(options, specification, getAdapterManager());
+            return CollectionUtils.getCollectionAsObjectArray(choices, specification, getAdapterManager());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java
index e71128b..6800f48 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/ActionParameterDefaultsFacetNone.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.progmodel.facets.param.defaults;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
@@ -29,7 +31,7 @@ public class ActionParameterDefaultsFacetNone extends ActionParameterDefaultsFac
     }
 
     @Override
-    public Object getDefault(final ObjectAdapter inObject, ObjectAdapter[] parameters) {
+    public Object getDefault(final ObjectAdapter inObject, List<ObjectAdapter> parameters) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java
index beba8b0..c4fd3b5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetFactory.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.progmodel.facets.param.defaults.methodnum;
 import java.lang.reflect.Method;
 import java.util.List;
 
+import org.apache.isis.core.commons.lang.ListUtils;
 import org.apache.isis.core.commons.lang.NameUtils;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -74,12 +75,8 @@ public class ActionParameterDefaultsFacetFactory extends MethodPrefixBasedFacetF
 
         for (int i = 0; i < paramTypes.length; i++) {
 
-            // two attempts to match method...
-            Method defaultMethod;
-            defaultMethod = findDefaultNumMethod(processMethodContext, i, paramTypes);
-            if (defaultMethod == null) {
-                defaultMethod = findDefaultNumMethod(processMethodContext, i, new Class[0]);
-            }
+            // attempt to match method...
+            Method defaultMethod = findDefaultNumMethod(processMethodContext, i);
             if (defaultMethod == null) {
                 continue;
             }
@@ -98,12 +95,36 @@ public class ActionParameterDefaultsFacetFactory extends MethodPrefixBasedFacetF
         }
     }
 
-    private static Method findDefaultNumMethod(final ProcessMethodContext processMethodContext, int i, Class<?>[] paramTypes) {
+    /**
+     * search successively for the default method, trimming number of param types each loop
+     */
+    private static Method findDefaultNumMethod(ProcessMethodContext processMethodContext, int n) {
+        
+        final Method actionMethod = processMethodContext.getMethod();
+        final List<Class<?>> paramTypes = ListUtils.mutableCopy(actionMethod.getParameterTypes());
+        
+        final int numParamTypes = paramTypes.size();
+        
+        for(int i=0; i< numParamTypes+1; i++) {
+            final Method method = findDefaultNumMethod(processMethodContext, n, paramTypes.toArray(new Class<?>[]{}));
+            if(method != null) {
+                return method;
+            }
+            // remove last, and search again
+            if(!paramTypes.isEmpty()) {
+                paramTypes.remove(paramTypes.size()-1);
+            }
+        }
+
+        return null;
+    }
+
+    private static Method findDefaultNumMethod(final ProcessMethodContext processMethodContext, int n, Class<?>[] paramTypes) {
         final Class<?> cls = processMethodContext.getCls();
         final Method actionMethod = processMethodContext.getMethod();
-        final Class<?> returnType = actionMethod.getParameterTypes()[i];
+        final Class<?> returnType = actionMethod.getParameterTypes()[n];
         final String capitalizedName = NameUtils.capitalizeName(actionMethod.getName());
-        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.DEFAULT_PREFIX + i + capitalizedName, returnType, paramTypes);
+        return MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodPrefixConstants.DEFAULT_PREFIX + n + capitalizedName, returnType, paramTypes);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index d4134e2..94242bd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -23,10 +23,13 @@ import java.lang.reflect.Method;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionParameterContributee.Util;
 import org.apache.isis.core.progmodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 
 public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaultsFacetAbstract implements ImperativeFacet {
@@ -58,10 +61,12 @@ public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaul
     }
 
     @Override
-    public Object getDefault(final ObjectAdapter target, ObjectAdapter[] argumentsIfAvailable) {
-        return AdapterInvokeUtils.invokeWithDefaults(method, target, argumentsIfAvailable);
+    public Object getDefault(final ObjectAdapter target, List<ObjectAdapter> argumentsIfAvailable) {
+        return AdapterInvokeUtils.invokeAutofit(method, target, argumentsIfAvailable);
     }
 
+
+
     @Override
     protected String toStringValues() {
         return "method=" + method;

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_adjust.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_adjust.java b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_adjust.java
new file mode 100644
index 0000000..08fbe68
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_adjust.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.commons.lang;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Test;
+
+import org.apache.isis.core.commons.lang.ListUtils;
+
+public class ListUtilsTest_adjust {
+    
+    
+    @Test
+    public void sameLength() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.adjust(list, 3);
+        
+        assertThat(list.size(), is(3));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+    }
+    
+    @Test
+    public void ifLonger() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.adjust(list, 4);
+        
+        assertThat(list.size(), is(4));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+        assertThat(list.get(3), is(nullValue()));
+    }
+    
+    @Test
+    public void ifShorter() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.adjust(list, 2);
+        
+        assertThat(list.size(), is(2));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_insert.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_insert.java b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_insert.java
new file mode 100644
index 0000000..851f527
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_insert.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.core.commons.lang;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Test;
+
+public class ListUtilsTest_insert {
+    
+    @Test
+    public void insert_whenInsertionPointAtBeginning() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.insert(list, 0, Integer.valueOf(10));
+        
+        assertThat(list.size(), is(4));
+        assertThat(list.get(0), is(Integer.valueOf(10)));
+        assertThat(list.get(1), is(Integer.valueOf(0)));
+        assertThat(list.get(2), is(Integer.MAX_VALUE));
+        assertThat(list.get(3), is(Integer.MIN_VALUE));
+    }
+    
+    @Test
+    public void insert_whenInsertionPointInMiddle() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.insert(list, 1, Integer.valueOf(10));
+        
+        assertThat(list.size(), is(4));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.valueOf(10)));
+        assertThat(list.get(2), is(Integer.MAX_VALUE));
+        assertThat(list.get(3), is(Integer.MIN_VALUE));
+    }
+
+    @Test
+    public void insert_whenInsertionPointAtEnd() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.insert(list, 3, Integer.valueOf(10));
+        
+        assertThat(list.size(), is(4));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+        assertThat(list.get(3), is(Integer.valueOf(10)));
+    }
+    
+    @Test
+    public void insert_whenInsertionPointBeyondEnd() throws Exception {
+        final List<Integer> list = Lists.newArrayList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        ListUtils.insert(list, 4, Integer.valueOf(10));
+        
+        assertThat(list.size(), is(5));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+        assertThat(list.get(3), is(nullValue()));
+        assertThat(list.get(4), is(Integer.valueOf(10)));
+    }
+    
+    
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_mutableCopy.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_mutableCopy.java b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_mutableCopy.java
new file mode 100644
index 0000000..618b685
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/commons/lang/ListUtilsTest_mutableCopy.java
@@ -0,0 +1,92 @@
+/**
+ *  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.commons.lang;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Test;
+
+import org.apache.isis.core.commons.lang.ListUtils;
+
+public class ListUtilsTest_mutableCopy {
+    
+    @Test
+    public void mutableCopyOfList_whenNotNull() throws Exception {
+        List<Integer> input = Arrays.asList(Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE);
+        
+        final List<Integer> list = ListUtils.mutableCopy(input);
+        
+        assertThat(list.size(), is(3));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+        
+        // is mutable
+        list.add(Integer.valueOf(-1));
+    }
+    
+    @Test
+    public void mutableCopyOfList_whenNull() throws Exception {
+        List<Integer> input = null;
+        
+        final List<Integer> list = ListUtils.mutableCopy(input);
+        
+        assertThat(list, is(not(nullValue())));
+        assertThat(list.size(), is(0));
+        
+        // is mutable
+        list.add(Integer.valueOf(-1));
+    }
+
+    @Test
+    public void mutableCopyOfArray_whenNotNull() throws Exception {
+        Integer[] input = {Integer.valueOf(0), Integer.MAX_VALUE, Integer.MIN_VALUE};
+        
+        final List<Integer> list = ListUtils.mutableCopy(input);
+        
+        assertThat(list.size(), is(3));
+        assertThat(list.get(0), is(Integer.valueOf(0)));
+        assertThat(list.get(1), is(Integer.MAX_VALUE));
+        assertThat(list.get(2), is(Integer.MIN_VALUE));
+        
+        // is mutable
+        list.add(Integer.valueOf(-1));
+    }
+    
+    @Test
+    public void mutableCopyOfArray_whenNull() throws Exception {
+        Integer[] input = null;
+        
+        final List<Integer> list = ListUtils.mutableCopy(input);
+        
+        assertThat(list, is(not(nullValue())));
+        assertThat(list.size(), is(0));
+        
+        // is mutable
+        list.add(Integer.valueOf(-1));
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/2ab9e661/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index d7319b9..f0d45d0 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -155,16 +155,16 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     }
 
     public Category default1UpdateCategory(
-            final ToDoItem item, final Category category, final Subcategory subcategory) {
+            final ToDoItem item) {
         return item.getCategory();
     }
     public Subcategory default2UpdateCategory(
-            final ToDoItem item, final Category category, final Subcategory subcategory) {
+            final ToDoItem item) {
         return item.getSubcategory();
     }
 
     public List<Subcategory> choices2UpdateCategory(
-            final ToDoItem item, final Category category, final Subcategory subcategory) {
+            final ToDoItem item, final Category category) {
         return Subcategory.listFor(category);
     }
     


[4/5] git commit: ISIS-478: dependent choices now refreshed in UI ok.

Posted by da...@apache.org.
ISIS-478: dependent choices now refreshed in UI ok.


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

Branch: refs/heads/master
Commit: 6763bd4eb76ee9ab4d845af0201262ee113b2c1e
Parents: cbd4f35
Author: Dan Haywood <da...@apache.org>
Authored: Tue Aug 20 20:43:26 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Aug 20 20:43:26 2013 +0100

----------------------------------------------------------------------
 .../actions/ActionParametersFormPanel.java      |  2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  | 33 ++++++++++++++------
 .../java/dom/todo/ToDoItemContributions.java    |  2 +-
 3 files changed, 25 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6763bd4e/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index a9bcea4..c168ec5 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -131,8 +131,8 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
                 final ScalarPanelAbstract paramPanel = component instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) component : null;
                 paramPanels.add(paramPanel);
                 if(paramPanel != null) {
-                    paramPanel.notifyOnChange(this);
                     paramPanel.setOutputMarkupId(true);
+                    paramPanel.notifyOnChange(this);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/6763bd4e/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index d0d5110..7f04de4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -74,7 +74,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
         final IModel<ObjectAdapterMemento> modelObject = createModel();
         
         select2ChoiceField = new Select2Choice<ObjectAdapterMemento>(ID_VALUE_ID, modelObject);
-        select2ChoiceField.setProvider(newChoiceProviderForArgs(null));
+        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(null);
+        setChoices(choicesMementos);
 
         addStandardSemantics();
 
@@ -90,8 +91,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
         return labelIfRegular;
     }
 
-    private ChoiceProvider<ObjectAdapterMemento> newChoiceProviderForArgs(final ObjectAdapter[] argumentsIfAvailable) {
-        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argumentsIfAvailable);
+    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final List<ObjectAdapterMemento> choicesMementos) {
         final IModel<List<ObjectAdapterMemento>> choicesModel = newModel(choicesMementos);
         final ChoiceProvider<ObjectAdapterMemento> choiceProvider = newChoiceProvider(choicesModel);
         return choiceProvider;
@@ -112,11 +112,6 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
         
         // take a copy otherwise is only lazily evaluated
         final List<ObjectAdapterMemento> choicesMementos = Lists.newArrayList(Lists.transform(choices, Mementos.fromAdapter()));
-        
-        final ObjectAdapterMemento currentValue = getModel().getObjectAdapterMemento();
-        if(currentValue != null && !choicesMementos.contains(currentValue)) {
-            choicesMementos.add(currentValue);
-        }
         return choicesMementos;
     }
 
@@ -260,9 +255,27 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
 
     @Override
     public void updateChoices(ObjectAdapter[] arguments) {
-        select2ChoiceField.setProvider(newChoiceProviderForArgs(arguments));
+        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(arguments);
+        setChoices(choicesMementos);
+    }
+
+    /**
+     * sets up the choices, also ensuring that any currently held value
+     * is compatible.
+     */
+    private void setChoices(final List<ObjectAdapterMemento> choicesMementos) {
+        select2ChoiceField.setProvider(newChoiceProvider(choicesMementos));
         getModel().setPending(null);
-        select2ChoiceField.clearInput();
+        final ObjectAdapterMemento objectAdapterMemento = getModel().getObjectAdapterMemento();
+        if(!choicesMementos.contains(objectAdapterMemento)) {
+            final ObjectAdapterMemento newAdapterMemento = 
+                    !choicesMementos.isEmpty() 
+                    ? choicesMementos.get(0) 
+                    : null;
+            select2ChoiceField.getModel().setObject(newAdapterMemento);
+            getModel().setObject(
+                    newAdapterMemento != null? newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK): null);
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6763bd4e/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index 86c7c3a..d7319b9 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -144,7 +144,7 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     @DescribedAs("Update category and subcategory")
     @NotInServiceMenu
     @ActionSemantics(Of.IDEMPOTENT)
-    @MemberOrder(sequence="1")
+    @MemberOrder(name="Subcategory", sequence="1")
     public ToDoItem updateCategory(
             final ToDoItem item, 
             final @Named("Category") Category category,


[3/5] git commit: ISIS-478: fixing quickstart example app tests

Posted by da...@apache.org.
ISIS-478: fixing quickstart example app tests


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

Branch: refs/heads/master
Commit: cbd4f355cf61676016603cb77655d0354abd7628
Parents: db418f5
Author: Dan Haywood <da...@apache.org>
Authored: Tue Aug 20 19:42:42 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Aug 20 19:42:42 2013 +0100

----------------------------------------------------------------------
 ...oDoItemContributionsTest_updateCategory.java | 99 ++++++++++++++++++++
 .../ToDoItemContributionsTest_similarTo.java    | 66 +++++++++++++
 .../ToDoItemContributionsTest_priority.java     | 68 ++++++++++++++
 .../tests/props/ToDoItemTest_category.java      | 29 +-----
 .../tests/props/ToDoItemTest_ownedBy.java       |  3 +
 .../tests/props/ToDoItemTest_subcategory.java   | 55 +++++++++++
 6 files changed, 295 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemContributionsTest_updateCategory.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemContributionsTest_updateCategory.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemContributionsTest_updateCategory.java
new file mode 100644
index 0000000..dd5fba5
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/actions/ToDoItemContributionsTest_updateCategory.java
@@ -0,0 +1,99 @@
+/*
+ *  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 integration.tests.actions;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+import integration.tests.ToDoIntegTest;
+
+import java.util.List;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItemContributions;
+import dom.todo.ToDoItems;
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+import fixture.todo.ToDoItemsFixture;
+
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.clock.Clock;
+
+public class ToDoItemContributionsTest_updateCategory extends ToDoIntegTest {
+
+    private ToDoItem toDoItem;
+    private ToDoItemContributions toDoItemContributions;
+
+    @Before
+    public void setUp() throws Exception {
+        scenarioExecution().install(new ToDoItemsFixture());
+
+        final ToDoItems toDoItems = wrap(service(ToDoItems.class));
+        toDoItemContributions = wrap(service(ToDoItemContributions.class));
+        final List<ToDoItem> all = toDoItems.notYetComplete();
+        toDoItem = wrap(all.get(0));
+    }
+
+    @Test
+    public void happyCase() throws Exception {
+        
+        // when
+        toDoItemContributions.updateCategory(toDoItem, Category.Professional, Subcategory.Consulting);
+        
+        // then
+        assertThat(toDoItem.getCategory(), is(Category.Professional));
+        assertThat(toDoItem.getSubcategory(), is(Subcategory.Consulting));
+        
+        // when
+        toDoItemContributions.updateCategory(toDoItem, Category.Domestic, Subcategory.Chores);
+        
+        // then
+        assertThat(toDoItem.getCategory(), is(Category.Domestic));
+        assertThat(toDoItem.getSubcategory(), is(Subcategory.Chores));
+    }
+
+
+    @Test
+    public void categoryCannotBeNull() throws Exception {
+        
+        // when, then
+        expectedExceptions.expectMessage("Mandatory");
+        toDoItemContributions.updateCategory(toDoItem, null, Subcategory.Chores);
+    }
+
+    @Test
+    public void subcategoryCannotBeNull() throws Exception {
+        
+        // when, then
+        expectedExceptions.expectMessage("Mandatory");
+        toDoItemContributions.updateCategory(toDoItem, Category.Professional, null);
+    }
+    
+    @Test
+    public void subcategoryMustBelongToCategory() throws Exception {
+        
+        // when, then
+        expectedExceptions.expectMessage(containsString("Invalid subcategory"));
+        toDoItemContributions.updateCategory(toDoItem, Category.Professional, Subcategory.Chores);
+    }
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/colls/ToDoItemContributionsTest_similarTo.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/colls/ToDoItemContributionsTest_similarTo.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/colls/ToDoItemContributionsTest_similarTo.java
new file mode 100644
index 0000000..dd292cd
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/colls/ToDoItemContributionsTest_similarTo.java
@@ -0,0 +1,66 @@
+/*
+ *  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 integration.tests.colls;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+import integration.tests.ToDoIntegTest;
+
+import java.util.List;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItemContributions;
+import dom.todo.ToDoItems;
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+import fixture.todo.ToDoItemsFixture;
+
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.isis.applib.clock.Clock;
+
+public class ToDoItemContributionsTest_similarTo extends ToDoIntegTest {
+
+    private ToDoItem toDoItem;
+    private ToDoItemContributions toDoItemContributions;
+
+    @Before
+    public void setUp() throws Exception {
+        scenarioExecution().install(new ToDoItemsFixture());
+
+        final ToDoItems toDoItems = wrap(service(ToDoItems.class));
+        toDoItemContributions = wrap(service(ToDoItemContributions.class));
+        final List<ToDoItem> all = toDoItems.notYetComplete();
+        toDoItem = wrap(all.get(0));
+    }
+
+    @Test
+    public void happyCase() throws Exception {
+        
+        // when
+        List<ToDoItem> similarItems = toDoItemContributions.similarTo(toDoItem);
+        
+        // then
+        assertThat(similarItems.size(), is(6));
+    }
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemContributionsTest_priority.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemContributionsTest_priority.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemContributionsTest_priority.java
new file mode 100644
index 0000000..9df9784
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemContributionsTest_priority.java
@@ -0,0 +1,68 @@
+/*
+ *  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 integration.tests.props;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import integration.tests.ToDoIntegTest;
+
+import java.util.List;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItemContributions;
+import dom.todo.ToDoItems;
+import fixture.todo.ToDoItemsFixture;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ToDoItemContributionsTest_priority extends ToDoIntegTest {
+
+    private ToDoItemContributions toDoItemContributions;
+    
+    private List<ToDoItem> notYetComplete;
+
+    @Before
+    public void setUp() throws Exception {
+        scenarioExecution().install(new ToDoItemsFixture());
+
+        final ToDoItems toDoItems = wrap(service(ToDoItems.class));
+        toDoItemContributions = wrap(service(ToDoItemContributions.class));
+        notYetComplete = toDoItems.notYetComplete();
+    }
+
+    @Test
+    public void happyCase() throws Exception {
+        assertPriority(0, 1);
+        assertPriority(1, 2);
+        assertPriority(2, 4);
+        assertPriority(3, 6);
+        assertPriority(4, 5);
+        assertPriority(5, 7);
+        assertPriority(6, 9);
+        assertPriority(7, 8);
+        assertPriority(8, 3);
+        assertPriority(9, 10);
+    }
+
+    private void assertPriority(final int n, final int priority) {
+        assertThat(toDoItemContributions.priority(notYetComplete.get(n)), is(Integer.valueOf(priority)));
+    }
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_category.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_category.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_category.java
index 91214af..119b2e9 100644
--- a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_category.java
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_category.java
@@ -18,8 +18,7 @@
  */
 package integration.tests.props;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.containsString;
 import integration.tests.ToDoIntegTest;
 
 import java.util.List;
@@ -29,13 +28,9 @@ import dom.todo.ToDoItems;
 import dom.todo.ToDoItem.Category;
 import fixture.todo.ToDoItemsFixture;
 
-import org.joda.time.LocalDate;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.isis.applib.clock.Clock;
-
 public class ToDoItemTest_category extends ToDoIntegTest {
 
     private ToDoItem toDoItem;
@@ -49,28 +44,12 @@ public class ToDoItemTest_category extends ToDoIntegTest {
     }
 
     @Test
-    public void happyCase() throws Exception {
+    public void cannotModify() throws Exception {
         
-        // when
+        // when, then
+        expectedExceptions.expectMessage(containsString("Always disabled"));
         toDoItem.setCategory(Category.Professional);
-        
-        // then
-        assertThat(toDoItem.getCategory(), is(Category.Professional));
-        
-        // when
-        toDoItem.setCategory(Category.Domestic);
-        
-        // then
-        assertThat(toDoItem.getCategory(), is(Category.Domestic));
     }
 
 
-    @Test
-    public void cannotBeNull() throws Exception {
-        
-        // when, then
-        expectedExceptions.expectMessage("Mandatory");
-        toDoItem.setCategory(null);
-    }
-
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_ownedBy.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_ownedBy.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_ownedBy.java
index fface0b..034d7f7 100644
--- a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_ownedBy.java
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_ownedBy.java
@@ -18,12 +18,15 @@
  */
 package integration.tests.props;
 
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
 import integration.tests.ToDoIntegTest;
 
 import java.util.List;
 
 import dom.todo.ToDoItem;
 import dom.todo.ToDoItems;
+import dom.todo.ToDoItem.Category;
 import fixture.todo.ToDoItemsFixture;
 
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/isis/blob/cbd4f355/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_subcategory.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_subcategory.java b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_subcategory.java
new file mode 100644
index 0000000..2df8358
--- /dev/null
+++ b/example/application/quickstart_wicket_restful_jdo/integtests/src/test/java/integration/tests/props/ToDoItemTest_subcategory.java
@@ -0,0 +1,55 @@
+/*
+ *  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 integration.tests.props;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import integration.tests.ToDoIntegTest;
+
+import java.util.List;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItem.Subcategory;
+import dom.todo.ToDoItems;
+import fixture.todo.ToDoItemsFixture;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class ToDoItemTest_subcategory extends ToDoIntegTest {
+
+    private ToDoItem toDoItem;
+
+    @Before
+    public void setUp() throws Exception {
+        scenarioExecution().install(new ToDoItemsFixture());
+
+        final List<ToDoItem> all = wrap(service(ToDoItems.class)).notYetComplete();
+        toDoItem = wrap(all.get(0));
+    }
+
+    @Test
+    public void cannotModify() throws Exception {
+        
+        // when, then
+        expectedExceptions.expectMessage(containsString("Always disabled"));
+        toDoItem.setSubcategory(Subcategory.Chores);
+    }
+
+
+}
\ No newline at end of file


[2/5] git commit: ISIS-478: further work to getting choices to be updated between action parameters

Posted by da...@apache.org.
ISIS-478: further work to getting choices to be updated between action parameters

* completed subscriber logic between ActionParametersFormPanel and the ScalarPanelAbstracts
* ObjectActionParameterContributee subtype's getChoices() now takes argumentsIfAvailable
  * used when invoke facet


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

Branch: refs/heads/master
Commit: db418f5d5fef87b41c61d7298a5d472e1410cc3e
Parents: d114c45
Author: Dan Haywood <da...@apache.org>
Authored: Tue Aug 20 17:03:33 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Aug 20 17:03:33 2013 +0100

----------------------------------------------------------------------
 .../viewer/dnd/view/action/ActionHelper.java    |  2 +-
 .../domainobjects/ObjectActionReprRenderer.java |  2 +-
 .../viewer/wicket/model/models/ScalarModel.java | 12 +--
 .../actions/ActionParametersFormPanel.java      | 63 ++++++-------
 .../scalars/ScalarModelSubscriber.java          |  4 +-
 .../components/scalars/ScalarPanelAbstract.java | 15 +++-
 .../entitylink/EntityLinkSelect2Panel.java      |  2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  | 94 +++++++++++---------
 .../spec/feature/ObjectActionParameter.java     | 39 ++++----
 .../specimpl/ObjectActionParameterAbstract.java | 22 ++---
 .../ObjectActionParameterContributee.java       | 44 +++++++++
 ...jectActionParameterParseableContributee.java | 17 ++--
 .../OneToOneActionParameterContributee.java     | 20 +++--
 13 files changed, 206 insertions(+), 130 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/ActionHelper.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/ActionHelper.java b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/ActionHelper.java
index 6055598..e82c631 100644
--- a/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/ActionHelper.java
+++ b/component/viewer/dnd/impl/src/main/java/org/apache/isis/viewer/dnd/view/action/ActionHelper.java
@@ -45,7 +45,7 @@ public class ActionHelper {
 
         for (int i = 0; i < parameterSpecs.size(); i++) {
             defaultValues[i] = parameterSpecs.get(i).getDefault(target);
-            options[i] = parameterSpecs.get(i).getChoices(target);
+            options[i] = parameterSpecs.get(i).getChoices(target, null);
         }
 
         if (!hasValues(defaultValues) && !hasValues(options)) {

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
index c36645c..0408484 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
@@ -160,7 +160,7 @@ public class ObjectActionReprRenderer extends AbstractObjectMemberReprRenderer<O
     }
 
     private Object choicesFor(final ObjectActionParameter param) {
-        final ObjectAdapter[] choiceAdapters = param.getChoices(objectAdapter);
+        final ObjectAdapter[] choiceAdapters = param.getChoices(objectAdapter, null);
         if (choiceAdapters == null || choiceAdapters.length == 0) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index aad39bc..30667de 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -159,7 +159,7 @@ public class ScalarModel extends EntityModel implements LinksProvider {
             }
 
             @Override
-            public List<ObjectAdapter> getChoices(final ScalarModel scalarModel) {
+            public List<ObjectAdapter> getChoices(final ScalarModel scalarModel, final ObjectAdapter[] argumentsIfAvailable) {
                 final PropertyMemento propertyMemento = scalarModel.getPropertyMemento();
                 final OneToOneAssociation property = propertyMemento.getProperty();
                 final ObjectAdapter[] choices = property.getChoices(scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
@@ -300,10 +300,10 @@ public class ScalarModel extends EntityModel implements LinksProvider {
                 return actionParameter.hasChoices();
             }
             @Override
-            public List<ObjectAdapter> getChoices(final ScalarModel scalarModel) {
+            public List<ObjectAdapter> getChoices(final ScalarModel scalarModel, final ObjectAdapter[] argumentsIfAvailable) {
                 final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
                 final ObjectActionParameter actionParameter = parameterMemento.getActionParameter();
-                final ObjectAdapter[] choices = actionParameter.getChoices(scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+                final ObjectAdapter[] choices = actionParameter.getChoices(scalarModel.parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK), argumentsIfAvailable);
                 return choicesAsList(choices);
             }
 
@@ -392,7 +392,7 @@ public class ScalarModel extends EntityModel implements LinksProvider {
         }
 
         public abstract boolean hasChoices(ScalarModel scalarModel);
-        public abstract List<ObjectAdapter> getChoices(ScalarModel scalarModel);
+        public abstract List<ObjectAdapter> getChoices(ScalarModel scalarModel, final ObjectAdapter[] argumentsIfAvailable);
 
         public abstract boolean hasAutoComplete(ScalarModel scalarModel);
         public abstract List<ObjectAdapter> getAutoComplete(ScalarModel scalarModel, String searchArg);
@@ -586,8 +586,8 @@ public class ScalarModel extends EntityModel implements LinksProvider {
         return kind.hasChoices(this);
     }
 
-    public List<ObjectAdapter> getChoices() {
-        return kind.getChoices(this);
+    public List<ObjectAdapter> getChoices(final ObjectAdapter[] argumentsIfAvailable) {
+        return kind.getChoices(this, argumentsIfAvailable);
     }
 
     public boolean hasAutoComplete() {

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index 0b692c8..a9bcea4 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -30,6 +30,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Button;
 import org.apache.wicket.markup.html.form.Form;
@@ -86,8 +87,8 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
         private static final long serialVersionUID = 1L;
 
         private static final String ID_FEEDBACK = "feedback";
-
-        private final List<ScalarPanelAbstract> scalarPanels = Lists.newArrayList();
+        
+        private final List<ScalarPanelAbstract> paramPanels = Lists.newArrayList();
 
         public ActionParameterForm(final String id, final ActionModel actionModel) {
             super(id, actionModel);
@@ -120,20 +121,19 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
             final RepeatingView rv = new RepeatingView(ID_ACTION_PARAMETERS);
             add(rv);
             
-            scalarPanels.clear();
+            paramPanels.clear();
             for (final ActionParameterMemento apm : mementos) {
                 final WebMarkupContainer container = new WebMarkupContainer(rv.newChildId());
                 rv.add(container);
 
                 final ScalarModel argumentModel = actionModel.getArgumentModel(apm);
-                final Component paramPanel = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
-                final ScalarPanelAbstract scalarPanel = paramPanel instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) paramPanel : null;
-                scalarPanels.add(scalarPanel);
-            }
-            
-            // subscribe to all param panels
-            for (ScalarPanelAbstract scalarPanel : scalarPanels) {
-                scalarPanel.addScalarModelSubscriber(this);
+                final Component component = getComponentFactoryRegistry().addOrReplaceComponent(container, ComponentType.SCALAR_NAME_AND_VALUE, argumentModel);
+                final ScalarPanelAbstract paramPanel = component instanceof ScalarPanelAbstract ? (ScalarPanelAbstract) component : null;
+                paramPanels.add(paramPanel);
+                if(paramPanel != null) {
+                    paramPanel.notifyOnChange(this);
+                    paramPanel.setOutputMarkupId(true);
+                }
             }
         }
 
@@ -159,34 +159,23 @@ public class ActionParametersFormPanel extends PanelAbstract<ActionModel> {
         }
 
         @Override
-        public void onUpdate(ScalarModelProvider provider) {
-            final ScalarModel scalarModel = provider.getModel();
-            String name = scalarModel.getName();
-            final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
-            final List<ObjectAdapter> pendingArgs = 
-                    Lists.newArrayList(
-                            Iterables.transform(scalarPanels, new Function<ScalarPanelAbstract, ObjectAdapter>() {
-                        @Override
-                        public ObjectAdapter apply(ScalarPanelAbstract input) {
-                            if(input == null) {
-                                return null;
-                            }
-                            final ScalarModel model = input.getModel();
-                            final ObjectAdapterMemento objectAdapterMemento = model.getObjectAdapterMemento();
-                            if(objectAdapterMemento == null) {
-                                return null;
-                            }
-                            return objectAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
-                        }
-                    })
-            );
-            //System.out.println(name + " = '" + (objectAdapterMemento != null? objectAdapterMemento.getTitleHint(): null) + "'");
-            System.out.println(pendingArgs);
+        public void onUpdate(AjaxRequestTarget target, ScalarModelProvider provider) {
+
             final ActionModel actionModel = getActionModel();
-            actionModel.getArgumentsAsArray();
-            for (ScalarPanelAbstract scalarPanel : scalarPanels) {
-                
+            
+            final ObjectAdapter[] pendingArguments = actionModel.getArgumentsAsArray();
+            System.out.println(pendingArguments);
+
+            final ObjectAction action = actionModel.getActionMemento().getAction();
+            final int numParams = action.getParameterCount();
+            for (int i = 0; i < numParams; i++) {
+                final ScalarPanelAbstract paramPanel = paramPanels.get(i);
+                if(paramPanel != null) {
+                    paramPanel.updateChoices(pendingArguments);
+                    target.add(paramPanel);
+                }
             }
+            
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
index a42c227..88b9a7c 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarModelSubscriber.java
@@ -16,10 +16,12 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
+import org.apache.wicket.ajax.AjaxRequestTarget;
+
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
 
 public interface ScalarModelSubscriber {
 
-    void onUpdate(ScalarModelProvider provider);
+    void onUpdate(AjaxRequestTarget target, ScalarModelProvider provider);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 0d841ae..a5d0cfd 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -36,8 +36,11 @@ import org.apache.wicket.markup.html.panel.ComponentFeedbackPanel;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 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.EntityModel.RenderingHint;
@@ -181,7 +184,7 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
                 @Override
                 protected void onUpdate(AjaxRequestTarget target) {
                     for (ScalarModelSubscriber subscriber : subscribers) {
-                        subscriber.onUpdate(ScalarPanelAbstract.this);
+                        subscriber.onUpdate(target, ScalarPanelAbstract.this);
                     }
                 }
             });
@@ -264,9 +267,17 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
 
     private final List<ScalarModelSubscriber> subscribers = Lists.newArrayList();
 
-    public void addScalarModelSubscriber(final ScalarModelSubscriber subscriber) {
+    public void notifyOnChange(final ScalarModelSubscriber subscriber) {
         subscribers.add(subscriber);
     }
 
+    // //////////////////////////////////////
+
+    /**
+     * Optional hook method
+     */
+    public void updateChoices(ObjectAdapter[] pendingArguments) {
+    }
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index f5dbfe9..92270ff 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -318,7 +318,7 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
                 if(!hasChoices) {
                     return Collections.emptyList();
                 }
-                final List<ObjectAdapter> choices = scalarModel.getChoices();
+                final List<ObjectAdapter> choices = scalarModel.getChoices(null);
                 if(choices.isEmpty()) {
                     return Collections.emptyList();
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 4ab0837..d0d5110 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -28,11 +28,8 @@ import com.vaynberg.wicket.select2.TextChoiceProvider;
 
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.FormComponentLabel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
@@ -63,7 +60,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
 
     private static final String ID_VALUE_ID = "valueId";
 
-    private FormComponent<ObjectAdapterMemento> valueField;
+    private Select2Choice<ObjectAdapterMemento> select2ChoiceField;
     private ObjectAdapterMemento pending;
 
     public ValueChoicesSelect2Panel(final String id, final ScalarModel scalarModel) {
@@ -75,8 +72,9 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
     protected FormComponentLabel addComponentForRegular() {
 
         final IModel<ObjectAdapterMemento> modelObject = createModel();
-        final IModel<List<ObjectAdapterMemento>> choicesMementos = getChoicesModel();
-        valueField = createDropDownChoices(choicesMementos, modelObject);
+        
+        select2ChoiceField = new Select2Choice<ObjectAdapterMemento>(ID_VALUE_ID, modelObject);
+        select2ChoiceField.setProvider(newChoiceProviderForArgs(null));
 
         addStandardSemantics();
 
@@ -86,12 +84,42 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
         }
         
         addOrReplace(labelIfRegular);
-        addFeedbackTo(labelIfRegular, valueField);
+        addFeedbackTo(labelIfRegular, select2ChoiceField);
         addAdditionalLinksTo(labelIfRegular);
         
         return labelIfRegular;
     }
 
+    private ChoiceProvider<ObjectAdapterMemento> newChoiceProviderForArgs(final ObjectAdapter[] argumentsIfAvailable) {
+        final List<ObjectAdapterMemento> choicesMementos = getChoiceMementos(argumentsIfAvailable);
+        final IModel<List<ObjectAdapterMemento>> choicesModel = newModel(choicesMementos);
+        final ChoiceProvider<ObjectAdapterMemento> choiceProvider = newChoiceProvider(choicesModel);
+        return choiceProvider;
+    }
+
+    private IModel<List<ObjectAdapterMemento>> newModel(final List<ObjectAdapterMemento> choicesMementos) {
+        return new ModelAbstract<List<ObjectAdapterMemento>>(choicesMementos){
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected List<ObjectAdapterMemento> load() {
+                return getObject();
+            }};
+    }
+
+    private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argumentsIfAvailable) {
+        final List<ObjectAdapter> choices = scalarModel.getChoices(argumentsIfAvailable);
+        
+        // take a copy otherwise is only lazily evaluated
+        final List<ObjectAdapterMemento> choicesMementos = Lists.newArrayList(Lists.transform(choices, Mementos.fromAdapter()));
+        
+        final ObjectAdapterMemento currentValue = getModel().getObjectAdapterMemento();
+        if(currentValue != null && !choicesMementos.contains(currentValue)) {
+            choicesMementos.add(currentValue);
+        }
+        return choicesMementos;
+    }
+
     private Model<ObjectAdapterMemento> createModel() {
         return new Model<ObjectAdapterMemento>() {
 
@@ -137,23 +165,23 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
     private void setRequiredIfSpecified() {
         final ScalarModel scalarModel = getModel();
         final boolean required = scalarModel.isRequired();
-        valueField.setRequired(required);
+        select2ChoiceField.setRequired(required);
     }
 
     protected FormComponentLabel createFormComponentLabel() {
         final String name = getModel().getName();
-        valueField.setLabel(Model.of(name));
+        select2ChoiceField.setLabel(Model.of(name));
 
-        final FormComponentLabel labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, valueField);
+        final FormComponentLabel labelIfRegular = new FormComponentLabel(ID_SCALAR_IF_REGULAR, select2ChoiceField);
 
         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(valueField));
+        final Label scalarName = new Label(ID_SCALAR_NAME, getRendering().getLabelCaption(select2ChoiceField));
         labelIfRegular.add(scalarName);
-        labelIfRegular.add(valueField);
+        labelIfRegular.add(select2ChoiceField);
 
         return labelIfRegular;
     }
@@ -170,9 +198,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
         return scalarModel.getObject();
     }
 
-    private FormComponent<ObjectAdapterMemento> createDropDownChoices(final IModel<List<ObjectAdapterMemento>> choicesMementos, final IModel<ObjectAdapterMemento> modelObject) {
-        final String id = ID_VALUE_ID;
-        
+    protected ChoiceProvider<ObjectAdapterMemento> newChoiceProvider(final IModel<List<ObjectAdapterMemento>> choicesMementos) {
         ChoiceProvider<ObjectAdapterMemento> provider = new TextChoiceProvider<ObjectAdapterMemento>() {
 
             private static final long serialVersionUID = 1L;
@@ -210,45 +236,33 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract {
             }
 
         };
-        final Select2Choice<ObjectAdapterMemento> select2Choice = new Select2Choice<ObjectAdapterMemento>(id, modelObject, provider);
-        return select2Choice;
+        return provider;
     }
 
     @Override
     protected void onBeforeRenderWhenViewMode() { // View: Read only
-        valueField.setEnabled(false);
+        select2ChoiceField.setEnabled(false);
     }
 
     @Override
     protected void onBeforeRenderWhenEnabled() { // Edit: read/write
-        valueField.setEnabled(true);
+        select2ChoiceField.setEnabled(true);
     }
 
-    private IModel<List<ObjectAdapterMemento>> getChoicesModel() {
-        final List<ObjectAdapter> choices = scalarModel.getChoices();
-        
-        // take a copy otherwise is only lazily evaluated
-        final List<ObjectAdapterMemento> choicesMementos = Lists.newArrayList(Lists.transform(choices, Mementos.fromAdapter()));
-        
-        final ObjectAdapterMemento currentValue = getModel().getObjectAdapterMemento();
-        if(currentValue != null && !choicesMementos.contains(currentValue)) {
-            choicesMementos.add(currentValue);
-        }
-        
-
-        return new ModelAbstract<List<ObjectAdapterMemento>>(choicesMementos){
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            protected List<ObjectAdapterMemento> load() {
-                return getObject();
-            }};
-    }
     
     @Override
     protected void addFormComponentBehaviour(Behavior behavior) {
-        valueField.add(behavior);
+        select2ChoiceField.add(behavior);
     }
 
 
+    // //////////////////////////////////////
+
+    @Override
+    public void updateChoices(ObjectAdapter[] arguments) {
+        select2ChoiceField.setProvider(newChoiceProviderForArgs(arguments));
+        getModel().setPending(null);
+        select2ChoiceField.clearInput();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 956b4bd..322e530 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -86,43 +86,46 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
     ActionArgumentContext createProposedArgumentInteractionContext(AuthenticationSession session, InteractionInvocationMethod invocationMethod, ObjectAdapter targetObject, ObjectAdapter[] args, int position);
 
-    /**
-     * Whether proposed value for this parameter is valid.
-     * 
-     * @param adapter
-     * @param proposedValue
-     * @return
-     */
-    String isValid(ObjectAdapter adapter, Object proposedValue, Localization localization);
 
     /**
-     * Whether there are any choices provided (eg <tt>choicesXxx</tt> supporting
+     * Whether there is an autoComplete provided (eg <tt>autoCompleteXxx</tt> supporting
      * method) for the parameter.
      */
-    boolean hasChoices();
-
+    boolean hasAutoComplete();
+    
     /**
      * Returns a list of possible references/values for this parameter, which the
-     * user can choose from.
+     * user can choose from, based on the input search argument.
      */
-    ObjectAdapter[] getChoices(ObjectAdapter adapter);
+    ObjectAdapter[] getAutoComplete(ObjectAdapter adapter, String searchArg);
 
+    
+    
+    int getAutoCompleteMinLength();
     /**
-     * Whether there is an autoComplete provided (eg <tt>autoCompleteXxx</tt> supporting
+     * Whether there are any choices provided (eg <tt>choicesXxx</tt> supporting
      * method) for the parameter.
      */
-    boolean hasAutoComplete();
+    boolean hasChoices();
 
     /**
      * Returns a list of possible references/values for this parameter, which the
-     * user can choose from, based on the input search argument.
+     * user can choose from.
      */
-    ObjectAdapter[] getAutoComplete(ObjectAdapter adapter, String searchArg);
+    ObjectAdapter[] getChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable);
 
-    int getAutoCompleteMinLength();
 
     ObjectAdapter getDefault(ObjectAdapter adapter);
 
+    
+    /**
+     * Whether proposed value for this parameter is valid.
+     * 
+     * @param adapter
+     * @param proposedValue
+     * @return
+     */
+    String isValid(ObjectAdapter adapter, Object proposedValue, Localization localization);
  
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/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 1da4772..325bcb7 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
@@ -291,14 +291,14 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     }
 
     @Override
-    public ObjectAdapter[] getChoices(final ObjectAdapter adapter) {
-        final ObjectAdapter target = targetForDefaultOrChoices(adapter);
-        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter);
+    public ObjectAdapter[] getChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+        final ObjectAdapter target = targetForDefaultOrChoices(adapter, argumentsIfAvailable);
+        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter, argumentsIfAvailable);
         
-        return getChoices(target, args);
+        return findChoices(target, args);
     }
 
-    private ObjectAdapter[] getChoices(final ObjectAdapter target, final ObjectAdapter[] args) {
+    private ObjectAdapter[] findChoices(final ObjectAdapter target, final ObjectAdapter[] args) {
         final List<ObjectAdapter> adapters = Lists.newArrayList();
         final ActionParameterChoicesFacet facet = getFacet(ActionParameterChoicesFacet.class);
 
@@ -322,13 +322,13 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     @Override
     public ObjectAdapter getDefault(final ObjectAdapter adapter) {
         
-        final ObjectAdapter target = targetForDefaultOrChoices(adapter);;
-        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter);
+        final ObjectAdapter target = targetForDefaultOrChoices(adapter, null);
+        final ObjectAdapter[] args = argsForDefaultOrChoices(adapter, null);
         
-        return getDefault(target, args);
+        return findDefault(target, args);
     }
 
-    private ObjectAdapter getDefault(
+    private ObjectAdapter findDefault(
             final ObjectAdapter target, 
             final ObjectAdapter[] args) {
         final ActionParameterDefaultsFacet defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
@@ -347,14 +347,14 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
         return adapter;
     }
 
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter) {
+    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
index 4930fa1..53873c8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
@@ -16,9 +16,53 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 
 public interface ObjectActionParameterContributee extends ObjectActionParameter {
 
+    public static class Util {
+        
+        static <T> List<T> toList(final T[] inputArray) {
+            return inputArray != null? Arrays.asList(inputArray): Collections.<T>emptyList();
+        }
+
+        static <T> List<T> update(List<T> input, final int requiredLength, final int index, final T elementAtIndex) {
+            List<T> output;
+            if(input.isEmpty()) {
+                // nothing provided, so just create an empty list of the required length
+                output = newList(requiredLength);
+            } else if(input.size() == requiredLength) {
+                // exactly correct length, so just use
+                output = input;
+            } else if(input.size() == requiredLength - 1) {
+                // one short, so split the input at the index 
+                output = Lists.newArrayList();
+                output.addAll(input.subList(0, index));
+                output.add(null); 
+                output.addAll(input.subList(index, input.size()));
+            } else {
+                throw new IllegalArgumentException("Provided " + input.size() + " args for method taking " + requiredLength + " parameters");
+            }
+
+            // finally, overwrite the element
+            output.set(index, elementAtIndex);
+            return output;
+        }
+
+        static <T> List<T> newList(final int requiredLength) {
+            List<T> output;
+            output = Lists.newArrayList();
+            for(int i=0; i<requiredLength; i++) {
+                output.add(null);
+            }
+            return output;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
index cad997b..0de6bea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
@@ -16,6 +16,8 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -64,14 +66,19 @@ public class ObjectActionParameterParseableContributee extends ObjectActionParam
         return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg);
     }
 
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
         return serviceAdapter;
     }
 
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter) {
-        ObjectAdapter[] args = new ObjectAdapter[serviceAction.getParameterCount()];
-        args[contributeeAction.getContributeeParam()] = adapter;
-        return args;
+    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+        final int required = serviceAction.getParameterCount();
+        final int existing = contributeeAction.getContributeeParam();
+        
+        List<ObjectAdapter> input = Util.toList(argumentsIfAvailable);
+        List<ObjectAdapter> output = Util.update(input, required, existing, adapter);
+        
+        return output.toArray(new ObjectAdapter[]{});
     }
+
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/db418f5d/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 b706a1c..6470df2 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,9 +16,11 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
+import java.util.List;
+
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionParameterContributee.Util;
 
 public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
 
@@ -52,14 +54,18 @@ public class OneToOneActionParameterContributee extends OneToOneActionParameterI
         return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg);
     }
 
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter) {
+    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
         return serviceAdapter;
     }
 
-    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter) {
-        ObjectAdapter[] args = new ObjectAdapter[serviceAction.getParameterCount()];
-        args[contributeeAction.getContributeeParam()] = adapter;
-        return args;
+    protected ObjectAdapter[] argsForDefaultOrChoices(final ObjectAdapter adapter, final ObjectAdapter[] argumentsIfAvailable) {
+        final int required = serviceAction.getParameterCount();
+        final int existing = contributeeAction.getContributeeParam();
+        
+        List<ObjectAdapter> input = Util.toList(argumentsIfAvailable);
+        List<ObjectAdapter> output = Util.update(input, required, existing, adapter);
+        
+        return output.toArray(new ObjectAdapter[]{});
     }
-
+    
 }