You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/01/20 14:39:46 UTC

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

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
deleted file mode 100644
index 4615cfa..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2PanelFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.model.IModel;
-
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
-import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.scalars.string.StringPanel;
-
-public class ValueChoicesSelect2PanelFactory extends ComponentFactoryAbstract {
-
-    private static final long serialVersionUID = 1L;
-
-    public ValueChoicesSelect2PanelFactory() {
-        super(ComponentType.SCALAR_NAME_AND_VALUE, ValueChoicesSelect2Panel.class);
-    }
-
-    @Override
-    public ApplicationAdvice appliesTo(final IModel<?> model) {
-        if (!(model instanceof ScalarModel)) {
-            return ApplicationAdvice.DOES_NOT_APPLY;
-        }
-        final ScalarModel scalarModel = (ScalarModel) model;
-        final boolean hasChoices = scalarModel.hasChoices();
-        return appliesIf(hasChoices);
-    }
-
-    @Override
-    public final Component createComponent(final String id, final IModel<?> model) {
-        final ScalarModel scalarModel = (ScalarModel) model;
-        if(scalarModel.isViewMode()) {
-            return new StringPanel(id, scalarModel);
-        } else {
-            return new ValueChoicesSelect2Panel(id, scalarModel);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
deleted file mode 100644
index c151c44..0000000
--- a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/FixedObjectAdapterMementoProviderTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import com.google.common.collect.Lists;
-import org.jmock.Expectations;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-
-public class FixedObjectAdapterMementoProviderTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private List<ObjectAdapterMemento> mementos;
-
-    private ObjectAdapterMemento mockMemento1;
-    private ObjectAdapterMemento mockMemento2;
-    private ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider provider;
-
-    @Before
-    public void setUp() throws Exception {
-        mockMemento1 = mock("mockMemento1");
-        mockMemento2 = mock("mockMemento2");
-
-        mementos = Lists.newArrayList(
-                mockMemento1, mockMemento2
-        );
-
-        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
-        provider = new ValueChoicesSelect2Panel.FixedObjectAdapterMementoProvider(null, mementos, wicketViewerSettings);
-    }
-
-    @Test
-    public void whenInList() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
-    }
-
-    @Test
-    public void whenNullPlaceholder() throws Exception {
-        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
-        Assert.assertThat(mementos.size(), is(1));
-        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
-    }
-
-    private ObjectAdapterMemento mock(final String id) {
-        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
-        context.checking(new Expectations() {{
-            allowing(mock).asString();
-            will(returnValue(id));
-        }});
-        return mock;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
new file mode 100644
index 0000000..55e3025
--- /dev/null
+++ b/core/viewer-wicket-ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ObjectAdapterMementoProviderForValueChoicesTest.java
@@ -0,0 +1,88 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.widgets.valuechoices;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.jmock.Expectations;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderForValueChoices;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+public class ObjectAdapterMementoProviderForValueChoicesTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
+
+    private List<ObjectAdapterMemento> mementos;
+
+    private ObjectAdapterMemento mockMemento1;
+    private ObjectAdapterMemento mockMemento2;
+    private ObjectAdapterMementoProviderForValueChoices provider;
+
+    @Before
+    public void setUp() throws Exception {
+        mockMemento1 = mock("mockMemento1");
+        mockMemento2 = mock("mockMemento2");
+
+        mementos = Lists.newArrayList(
+                mockMemento1, mockMemento2
+        );
+
+        WicketViewerSettings wicketViewerSettings = context.mock(WicketViewerSettings.class);
+        provider = new ObjectAdapterMementoProviderForValueChoices(null, mementos, wicketViewerSettings);
+    }
+
+    @Test
+    public void whenInList() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("mockMemento1"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(mockMemento1));
+    }
+
+    @Test
+    public void whenNullPlaceholder() throws Exception {
+        final Collection<ObjectAdapterMemento> mementos = provider.toChoices(Collections.singletonList("$$_isis_null_$$"));
+        Assert.assertThat(mementos.size(), is(1));
+        Assert.assertThat(mementos.iterator().next(), is(nullValue()));
+    }
+
+    private ObjectAdapterMemento mock(final String id) {
+        final ObjectAdapterMemento mock = context.mock(ObjectAdapterMemento.class, id);
+        context.checking(new Expectations() {{
+            allowing(mock).asString();
+            will(returnValue(id));
+        }});
+        return mock;
+    }
+
+}