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

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

ISIS-785: tidies up code, removes differences in method names, factors out the ChoiceProviders out of ReferencePanel and ValueChoicesSelect2Panel.


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

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

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


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

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

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
deleted file mode 100644
index 7d47b74..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/Select2.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.viewer.wicket.ui.components.scalars.reference;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.form.HiddenField;
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Select2Choice;
-import org.wicketstuff.select2.Select2MultiChoice;
-import org.wicketstuff.select2.Settings;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2ChoiceExt;
-import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2MultiChoiceExt;
-
-/**
- * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
- */
-public class Select2 implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    final Select2ChoiceExt select2Choice;
-    final Select2MultiChoiceExt select2MultiChoice;
-
-    public static Select2 newSelect2Choice(
-            final String id,
-            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
-        return new Select2(
-                Select2ChoiceExt.create(id, singleModel, parentModel),
-                null
-        );
-    }
-
-    public static Select2 newSelect2MultiChoice(
-            final String id,
-            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
-            final ScalarModel parentModel) {
-        return new Select2(
-                null,
-                Select2MultiChoiceExt.create(id, multiModel, parentModel)
-        );
-    }
-
-    private Select2(
-            final Select2ChoiceExt select2Choice,
-            final Select2MultiChoiceExt select2MultiChoice) {
-        this.select2Choice = select2Choice;
-        this.select2MultiChoice = select2MultiChoice;
-    }
-
-    public HiddenField<?> component() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public ChoiceExt choiceExt() {
-        return select2Choice != null
-                ? select2Choice
-                : select2MultiChoice;
-    }
-
-    public void clearInput() {
-        component().clearInput();
-    }
-
-    public void setEnabled(final boolean mutability) {
-        component().setEnabled(mutability);
-    }
-
-    public void setRequired(final boolean required) {
-        component().setRequired(required);
-    }
-    public boolean checkRequired() {
-        return component().checkRequired();
-    }
-
-    public Settings getSettings() {
-        return choiceExt().getSettings();
-    }
-
-    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
-        choiceExt().setProvider(providerForChoices);
-    }
-
-    public ObjectAdapterMemento getModelObject() {
-        if (select2Choice != null) {
-            return select2Choice.getModelObject();
-        } else {
-            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
-
-            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public IModel<ObjectAdapterMemento> getModel() {
-        if (select2Choice != null) {
-            return select2Choice.getModel();
-        } else {
-            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
-            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
-
-            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
-            return new IModel<ObjectAdapterMemento>() {
-                @Override
-                public ObjectAdapterMemento getObject() {
-                    return memento;
-                }
-
-                @Override
-                public void setObject(final ObjectAdapterMemento memento) {
-
-                    if(memento == null) {
-                        model.setObject(null);
-                        return;
-                    }
-
-                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
-                    model.setObject(mementos);
-                }
-
-                @Override
-                public void detach() {
-                }
-            };
-        }
-    }
-
-    public ObjectAdapterMemento getConvertedInput() {
-        if (select2Choice != null) {
-            return select2Choice.getConvertedInput();
-        } else {
-            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
-            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
-        }
-    }
-
-    public void setLabel(final Model<String> model) {
-        component().setLabel(model);
-    }
-
-    public void add(final Behavior behavior) {
-        component().add(behavior);
-    }
-
-    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
-        return component().getBehaviors(behaviorClass);
-    }
-
-    public void remove(final Behavior behavior) {
-        component().remove(behavior);
-    }
-
-
-}

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
new file mode 100644
index 0000000..0874436
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.html
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+  
+         http://www.apache.org/licenses/LICENSE-2.0
+         
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"  
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
+      xml:lang="en"  
+      lang="en">
+    <body>
+        <wicket:panel>
+            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
+                <div class="form-group" wicket:id="scalarIfRegular">
+                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                        </div>
+                        <span wicket:id="feedback" class="help-block"></span>
+                        <span wicket:id="associatedActionLinksBelow"></span>
+                    </span>
+                    <div class="clearfix"/>
+                </div>
+                <span wicket:id="scalarIfCompact"></span>
+            </div>
+        </wicket:panel>
+    </body>
+</html>

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

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
deleted file mode 100644
index cdc2250..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/ObjectAdapterMementoProviderAbstract.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.viewer.wicket.ui.components.widgets;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Locale;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.Session;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.string.Strings;
-import org.wicketstuff.select2.TextChoiceProvider;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
-
-public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
-
-    private static final long serialVersionUID = 1L;
-    
-    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
-    private static final String NULL_DISPLAY_TEXT = "";
-
-    private final ScalarModel scalarModel;
-    private final WicketViewerSettings wicketViewerSettings;
-
-    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
-        this.scalarModel = scalarModel;
-        this.wicketViewerSettings = wicketViewerSettings;
-    }
-    
-    @Override
-    protected String getDisplayText(final ObjectAdapterMemento choice) {
-        if (choice == null) {
-            return NULL_DISPLAY_TEXT;
-        }
-
-        final ObjectAdapter objectAdapter =
-                choice.getObjectAdapter(
-                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
-        final IConverter<Object> converter = findConverter(objectAdapter);
-        return converter != null
-                ? converter.convertToString(objectAdapter.getObject(), getLocale())
-                : objectAdapter.titleString(null);
-    }
-
-    protected Locale getLocale() {
-        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
-    }
-
-    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
-        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
-    }
-
-    @Override
-    protected Object getId(final ObjectAdapterMemento choice) {
-        return choice != null? choice.asString(): NULL_PLACEHOLDER;
-    }
-
-    @Override
-    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
-        
-        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
-        // if not mandatory, and the list doesn't contain null already, then add it in.
-        if(!scalarModel.isRequired() && !mementos.contains(null)) {
-            mementos.add(0, null);
-        }
-        response.addAll(mementos);
-    }
-
-    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
-
-    /**
-     * Filters all choices against a term by using their
-     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
-     *
-     * @param term The term entered by the user
-     * @param choicesMementos The collections of choices to filter
-     * @return A list of all matching choices
-     */
-    protected List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
-        List<ObjectAdapterMemento> matches = Lists.newArrayList();
-        if (Strings.isEmpty(term)) {
-            matches.addAll(choicesMementos);
-        } else {
-            for (ObjectAdapterMemento candidate : choicesMementos) {
-                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
-                        getPersistenceSession(), getSpecificationLoader());
-                String title = objectAdapter.titleString(objectAdapter);
-                if (title.toLowerCase().contains(term.toLowerCase())) {
-                    matches.add(candidate);
-                }
-            }
-        }
-
-        return matches;
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(final Collection<String> ids) {
-        final Function<String, ObjectAdapterMemento> function = new Function<String, ObjectAdapterMemento>() {
-
-            @Override
-            public ObjectAdapterMemento apply(final String input) {
-                if(NULL_PLACEHOLDER.equals(input)) {
-                    return null;
-                }
-                final RootOid oid = RootOid.deString(input);
-                return ObjectAdapterMemento.createPersistent(oid);
-            }
-        };
-        return Collections2.transform(ids, function);
-    }
-    
-    protected ScalarModel getScalarModel() {
-        return scalarModel;
-    }
-
-
-    ///////////////////////////////////////////////////////
-    // Dependencies (from context)
-    ///////////////////////////////////////////////////////
-
-
-    protected SpecificationLoader getSpecificationLoader() {
-        return getIsisSessionFactory().getSpecificationLoader();
-    }
-
-    PersistenceSession getPersistenceSession() {
-        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
-    }
-
-    private IsisSessionFactory getIsisSessionFactory() {
-        return IsisContext.getSessionFactory();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
deleted file mode 100644
index 0cb647b..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/EmptyChoiceProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.viewer.wicket.ui.components.widgets.select2;
-
-import java.util.Collection;
-
-import org.apache.wicket.ajax.json.JSONException;
-import org.apache.wicket.ajax.json.JSONWriter;
-import org.wicketstuff.select2.ChoiceProvider;
-import org.wicketstuff.select2.Response;
-
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-
-class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
-
-    static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
-
-    @Override
-    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
-    }
-
-    @Override
-    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
-    }
-
-    @Override
-    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
new file mode 100644
index 0000000..041af1e
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -0,0 +1,178 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.HiddenField;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Select2Choice;
+import org.wicketstuff.select2.Select2MultiChoice;
+import org.wicketstuff.select2.Settings;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+
+/**
+ * Wrapper around either a {@link Select2Choice} or a {@link Select2MultiChoice}.
+ */
+public class Select2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    final Select2ChoiceExt select2Choice;
+    final Select2MultiChoiceExt select2MultiChoice;
+
+    public static Select2 newSelect2Choice(
+            final String id,
+            final IModel<ObjectAdapterMemento> singleModel, final ScalarModel parentModel) {
+        return new Select2(
+                Select2ChoiceExt.create(id, singleModel, parentModel),
+                null
+        );
+    }
+
+    public static Select2 newSelect2MultiChoice(
+            final String id,
+            final IModel<ArrayList<ObjectAdapterMemento>> multiModel,
+            final ScalarModel parentModel) {
+        return new Select2(
+                null,
+                Select2MultiChoiceExt.create(id, multiModel, parentModel)
+        );
+    }
+
+    private Select2(
+            final Select2ChoiceExt select2Choice,
+            final Select2MultiChoiceExt select2MultiChoice) {
+        this.select2Choice = select2Choice;
+        this.select2MultiChoice = select2MultiChoice;
+    }
+
+    public HiddenField<?> component() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public ChoiceExt choiceExt() {
+        return select2Choice != null
+                ? select2Choice
+                : select2MultiChoice;
+    }
+
+    public void clearInput() {
+        component().clearInput();
+    }
+
+    public void setEnabled(final boolean mutability) {
+        component().setEnabled(mutability);
+    }
+
+    public void setRequired(final boolean required) {
+        component().setRequired(required);
+    }
+    public boolean checkRequired() {
+        return component().checkRequired();
+    }
+
+    public Settings getSettings() {
+        return choiceExt().getSettings();
+    }
+
+    public void setProvider(final ChoiceProvider<ObjectAdapterMemento> providerForChoices) {
+        choiceExt().setProvider(providerForChoices);
+    }
+
+    public ObjectAdapterMemento getModelObject() {
+        if (select2Choice != null) {
+            return select2Choice.getModelObject();
+        } else {
+            final Collection<ObjectAdapterMemento> modelObject = select2MultiChoice.getModelObject();
+
+            return ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public IModel<ObjectAdapterMemento> getModel() {
+        if (select2Choice != null) {
+            return select2Choice.getModel();
+        } else {
+            final IModel<Collection<ObjectAdapterMemento>> model = select2MultiChoice.getModel();
+            final Collection<ObjectAdapterMemento> modelObject = model.getObject();
+
+            final ObjectAdapterMemento memento = ObjectAdapterMemento.createForList(modelObject, select2MultiChoice.getSpecId());
+            return new IModel<ObjectAdapterMemento>() {
+                @Override
+                public ObjectAdapterMemento getObject() {
+                    return memento;
+                }
+
+                @Override
+                public void setObject(final ObjectAdapterMemento memento) {
+
+                    if(memento == null) {
+                        model.setObject(null);
+                        return;
+                    }
+
+                    final ArrayList<ObjectAdapterMemento> mementos = memento.getList();
+                    model.setObject(mementos);
+                }
+
+                @Override
+                public void detach() {
+                }
+            };
+        }
+    }
+
+    public ObjectAdapterMemento getConvertedInput() {
+        if (select2Choice != null) {
+            return select2Choice.getConvertedInput();
+        } else {
+            final Collection<ObjectAdapterMemento> convertedInput = select2MultiChoice.getConvertedInput();
+            return ObjectAdapterMemento.createForList(convertedInput, select2MultiChoice.getSpecId());
+        }
+    }
+
+    public void setLabel(final Model<String> model) {
+        component().setLabel(model);
+    }
+
+    public void add(final Behavior behavior) {
+        component().add(behavior);
+    }
+
+    public <M extends Behavior> List<M> getBehaviors(Class<M> behaviorClass) {
+        return component().getBehaviors(behaviorClass);
+    }
+
+    public void remove(final Behavior behavior) {
+        component().remove(behavior);
+    }
+
+
+}

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

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
new file mode 100644
index 0000000..dbc0e85
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/EmptyChoiceProvider.java
@@ -0,0 +1,44 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+
+import org.apache.wicket.ajax.json.JSONException;
+import org.apache.wicket.ajax.json.JSONWriter;
+import org.wicketstuff.select2.ChoiceProvider;
+import org.wicketstuff.select2.Response;
+
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+
+public class EmptyChoiceProvider extends ChoiceProvider<ObjectAdapterMemento> {
+
+    public static final EmptyChoiceProvider INSTANCE = new EmptyChoiceProvider();
+
+    @Override
+    public void query(String term, int page, Response<ObjectAdapterMemento> response) {
+    }
+
+    @Override
+    public void toJson(ObjectAdapterMemento choice, JSONWriter writer) throws JSONException {
+    }
+
+    @Override
+    public Collection<ObjectAdapterMemento> toChoices(Collection<String> ids) {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
new file mode 100644
index 0000000..0143749
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -0,0 +1,157 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.string.Strings;
+import org.wicketstuff.select2.TextChoiceProvider;
+
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.IsisConverterLocator;
+
+public abstract class ObjectAdapterMementoProviderAbstract extends TextChoiceProvider<ObjectAdapterMemento> {
+
+    private static final long serialVersionUID = 1L;
+    
+    protected static final String NULL_PLACEHOLDER = "$$_isis_null_$$";
+    private static final String NULL_DISPLAY_TEXT = "";
+
+    private final ScalarModel scalarModel;
+    private final WicketViewerSettings wicketViewerSettings;
+
+    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel, final WicketViewerSettings wicketViewerSettings) {
+        this.scalarModel = scalarModel;
+        this.wicketViewerSettings = wicketViewerSettings;
+    }
+    
+    @Override
+    protected String getDisplayText(final ObjectAdapterMemento choice) {
+        if (choice == null) {
+            return NULL_DISPLAY_TEXT;
+        }
+
+        final ObjectAdapter objectAdapter =
+                choice.getObjectAdapter(
+                        ConcurrencyChecking.NO_CHECK, getPersistenceSession(), getSpecificationLoader());
+        final IConverter<Object> converter = findConverter(objectAdapter);
+        return converter != null
+                ? converter.convertToString(objectAdapter.getObject(), getLocale())
+                : objectAdapter.titleString(null);
+    }
+
+    protected Locale getLocale() {
+        return Session.exists() ? Session.get().getLocale() : Locale.ENGLISH;
+    }
+
+    protected IConverter<Object> findConverter(final ObjectAdapter objectAdapter) {
+        return IsisConverterLocator.findConverter(objectAdapter, wicketViewerSettings);
+    }
+
+    @Override
+    protected Object getId(final ObjectAdapterMemento choice) {
+        return choice != null? choice.asString(): NULL_PLACEHOLDER;
+    }
+
+    @Override
+    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectAdapterMemento> response) {
+        
+        final List<ObjectAdapterMemento> mementos = Lists.newArrayList(obtainMementos(term));
+        // if not mandatory, and the list doesn't contain null already, then add it in.
+        if(!scalarModel.isRequired() && !mementos.contains(null)) {
+            mementos.add(0, null);
+        }
+        response.addAll(mementos);
+    }
+
+    protected abstract List<ObjectAdapterMemento> obtainMementos(String term);
+
+    /**
+     * Filters all choices against a term by using their
+     * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter#titleString(org.apache.isis.core.metamodel.adapter.ObjectAdapter) title string}
+     *
+     * @param term The term entered by the user
+     * @param choicesMementos The collections of choices to filter
+     * @return A list of all matching choices
+     */
+    protected final List<ObjectAdapterMemento> obtainMementos(String term, Collection<ObjectAdapterMemento> choicesMementos) {
+        List<ObjectAdapterMemento> matches = Lists.newArrayList();
+        if (Strings.isEmpty(term)) {
+            matches.addAll(choicesMementos);
+        } else {
+            for (ObjectAdapterMemento candidate : choicesMementos) {
+                ObjectAdapter objectAdapter = candidate.getObjectAdapter(ConcurrencyChecking.NO_CHECK,
+                        getPersistenceSession(), getSpecificationLoader());
+                String title = objectAdapter.titleString(objectAdapter);
+                if (title.toLowerCase().contains(term.toLowerCase())) {
+                    matches.add(candidate);
+                }
+            }
+        }
+
+        return matches;
+    }
+
+
+    protected ScalarModel getScalarModel() {
+        return scalarModel;
+    }
+
+
+    ///////////////////////////////////////////////////////
+    // Dependencies (from context)
+    ///////////////////////////////////////////////////////
+
+
+    protected SpecificationLoader getSpecificationLoader() {
+        return getIsisSessionFactory().getSpecificationLoader();
+    }
+
+    PersistenceSession getPersistenceSession() {
+        return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+    }
+
+    protected IsisSessionFactory getIsisSessionFactory() {
+        return IsisContext.getSessionFactory();
+    }
+
+    public AuthenticationSession getAuthenticationSession() {
+        return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+    }
+
+    public DeploymentCategory getDeploymentCategory() {
+        return getIsisSessionFactory().getDeploymentCategory();
+    }
+
+
+}

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

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

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

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

http://git-wip-us.apache.org/repos/asf/isis/blob/d9876504/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
deleted file mode 100644
index 0874436..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you under the Apache License, Version 2.0 (the
-  "License"); you may not use this file except in compliance
-  with the License.  You may obtain a copy of the License at
-  
-         http://www.apache.org/licenses/LICENSE-2.0
-         
-  Unless required by applicable law or agreed to in writing,
-  software distributed under the License is distributed on an
-  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-  KIND, either express or implied.  See the License for the
-  specific language governing permissions and limitations
-  under the License.
--->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"  
-      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd"  
-      xml:lang="en"  
-      lang="en">
-    <body>
-        <wicket:panel>
-            <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
-                <div class="form-group" wicket:id="scalarIfRegular">
-                    <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
-                    <span class="scalarValueWrapper">
-                        <div class="scalarPlaceholder">
-                            <span class="scalarValueInput">
-                                <span class="editing">
-                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
-                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
-                                </span>
-                            </span>
-                            <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
-                        </div>
-                        <span wicket:id="feedback" class="help-block"></span>
-                        <span wicket:id="associatedActionLinksBelow"></span>
-                    </span>
-                    <div class="clearfix"/>
-                </div>
-                <span wicket:id="scalarIfCompact"></span>
-            </div>
-        </wicket:panel>
-    </body>
-</html>