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

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

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[]{});
     }
-
+    
 }