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