You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/09/17 00:22:49 UTC

git commit: ISIS-478,ISIS-503: various fixes.

Updated Branches:
  refs/heads/master 4bdc6adb4 -> d82f3d3c7


ISIS-478,ISIS-503: various fixes.

ISIS_478, for conditional choices, for EntitySelect:
* clear link now should work
* if no choices/autocomplete then doesn't NPE (BankMandates#newBankMandate)
* removed ID_ENTITY_TITLE_NULL label, since never visible
* sets up a placeholder text
for conditional choices, for ValueSelect:
* correctly initializes second dropdown based

ISIS-503, for contributee actions/associations, calculate identifier
* was causing stack trace when go back to list, caused by call to getIdentifier() incorrectly returning the wrong value for a contributed association.


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

Branch: refs/heads/master
Commit: d82f3d3c7655f9a825a070f0f9cd3aa5e189b2c3
Parents: 4bdc6ad
Author: Dan Haywood <da...@apache.org>
Authored: Mon Sep 16 23:22:27 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Mon Sep 16 23:22:27 2013 +0100

----------------------------------------------------------------------
 .../model/models/ScalarModelWithPending.java    |  10 +-
 .../scalars/reference/ReferencePanel.java       |   3 +-
 .../entitylink/EntityLinkSelect2Panel.html      |   6 +-
 .../entitylink/EntityLinkSelect2Panel.java      | 125 +++++++++----------
 .../EntityLinkSelect2PanelFactory.java          |   5 +-
 .../valuechoices/ValueChoicesSelect2Panel.java  |   6 +-
 .../specimpl/ObjectActionContributee.java       |  20 +++
 .../specimpl/ObjectSpecificationAbstract.java   |   8 +-
 .../OneToManyAssociationContributee.java        |  27 +++-
 .../OneToOneAssociationContributee.java         |  28 +++--
 .../java/dom/todo/ToDoItemContributions.java    |   1 +
 11 files changed, 137 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index 3e0109a..47b4455 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -61,19 +61,15 @@ public interface ScalarModelWithPending extends Serializable {
                     final ObjectAdapterMemento objectAdapterMemento = owner.getScalarModel().getObjectAdapterMemento();
                     owner.setPending(objectAdapterMemento);
 
-//                    final ObjectAdapter adapter = scalarModel.getObject(); 
-//                    return ObjectAdapterMemento.createOrNull(adapter);
                     return objectAdapterMemento;
                 }
 
                 @Override
                 public void setObject(final ObjectAdapterMemento adapterMemento) {
-                    if (adapterMemento != null) {
-                        if (LOG.isDebugEnabled()) {
-                            LOG.debug("setting to: " + adapterMemento.toString());
-                        }
-                        owner.setPending(adapterMemento);
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("setting to: " + adapterMemento!=null?adapterMemento.toString():null);
                     }
+                    owner.setPending(adapterMemento);
                     if (owner.getScalarModel() != null && owner.getPending() != null) {
                         if (LOG.isDebugEnabled()) {
                             LOG.debug("setting to pending: " + owner.getPending().toString());

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 09faa65..c15bd1d 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -160,7 +160,8 @@ public class ReferencePanel extends ScalarPanelAbstract {
         final ScalarModel scalarModel = getModel();
         final String name = scalarModel.getName();
         
-        entityLink = (EntityLinkSelect2Panel) getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
+        final Component entityLinkComponent = getComponentFactoryRegistry().createComponent(ComponentType.ENTITY_LINK, getModel());
+        entityLink = (EntityLinkSelect2Panel) entityLinkComponent;
         
         entityLink.setOutputMarkupId(true);
         entityLink.setLabel(Model.of(name));

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
index c3109ca..a46232b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.html
@@ -33,17 +33,13 @@
 				<div>
 					<input wicket:id="autoComplete" type="hidden" class="autoComplete" />
 					<span wicket:id="entityIconAndTitle">[icon and title]</span>
-					<span wicket:id="entityTitleNull">(null)</span>
-					<div class="findUsingClearDetails">
+					<div>
 						<a href="#" wicket:id="entityClearLink" class="entityClearLink">
 							<span>clear</span>
 						</a>
 					</div>
 				    <div class="clear"/>
 	  			</div>
-			    <div class="xfeedbackPanel">
-			        <span xwicket:id="feedback"/>
-			    </div>
 			</div>
 		</wicket:panel>
 	</body>

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
index 51dac92..0ec864a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2Panel.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.viewer.wicket.ui.components.widgets.entitylink;
 
-import java.util.Collections;
 import java.util.List;
 
 import com.google.common.collect.Lists;
@@ -29,7 +28,6 @@ import com.vaynberg.wicket.select2.Settings;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
 import org.apache.wicket.markup.html.link.Link;
 import org.apache.wicket.model.IModel;
@@ -37,16 +35,13 @@ import org.apache.wicket.model.IModel;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
-import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending;
 import org.apache.isis.viewer.wicket.model.models.ScalarModelWithPending.Util;
 import org.apache.isis.viewer.wicket.model.util.MementoFunctions;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -66,10 +61,13 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     private static final String ID_AUTO_COMPLETE = "autoComplete";
 
     private static final String ID_ENTITY_ICON_AND_TITLE = "entityIconAndTitle";
-    private static final String ID_ENTITY_TITLE_NULL = "entityTitleNull";
+    //private static final String ID_ENTITY_TITLE_NULL = "entityTitleNull";
 
     private static final String ID_ENTITY_CLEAR_LINK = "entityClearLink";
     
+    /**
+     * This component may be null if there are no choices or autoComplete, or if in read-only mode.
+     */
     private Select2Choice<ObjectAdapterMemento> select2Field;
     private Link<String> entityDetailsLink;
     private Link<String> entityClearLink;
@@ -170,9 +168,6 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
 
         syncLinkWithInput(adapter);
 
-        // represent no object by a simple label displaying '(null)'
-        syncEntityTitleNullWithInput(adapter);
-
         syncEntityClearLinksWithInput(adapter);
 
         doSyncWithInputIfAutoCompleteOrChoices();
@@ -187,29 +182,28 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
             return;
         }
 
-        
-        final IModel<ObjectAdapterMemento> model = Util.createModel(getScalarModel().asScalarModelWithPending());       
+        final IModel<ObjectAdapterMemento> model = ScalarModelWithPending.Util.createModel(getScalarModel().asScalarModelWithPending());       
 
         if(select2Field == null) {
             select2Field = new Select2Choice<ObjectAdapterMemento>(ID_AUTO_COMPLETE, model);
-            setChoices(getScalarModel().getActionArgsHint());
+            setProviderAndCurrAndPending(select2Field, getScalarModel().getActionArgsHint());
             if(!getScalarModel().hasChoices()) {
                 final Settings settings = select2Field.getSettings();
-                ScalarModel scalarModel = (ScalarModel) getScalarModel();
+                ScalarModel scalarModel = getScalarModel();
                 final int minLength = scalarModel.getAutoCompleteMinLength();
                 settings.setMinimumInputLength(minLength);
+                settings.setPlaceholder(scalarModel.getName());
             }
             addOrReplace(select2Field);
         }
         
         
-        
         // no need for link, since can see in drop-down
         permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
 
         // no need for the 'null' title, since if there is no object yet
         // can represent this fact in the drop-down
-        permanentlyHide(ID_ENTITY_TITLE_NULL);
+        // permanentlyHide(ID_ENTITY_TITLE_NULL);
     }
 
 
@@ -238,14 +232,10 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
             
             @Override
             protected List<ObjectAdapterMemento> obtainMementos(String term) {
+                final List<ObjectAdapter> autoCompleteChoices = Lists.newArrayList();
                 final ScalarModel scalarModel = (ScalarModel) entityModel;
-                final boolean hasAutoComplete = scalarModel.hasAutoComplete();
-                if(!hasAutoComplete) {
-                    return Collections.emptyList();
-                }
-                final List<ObjectAdapter> autoCompleteChoices = scalarModel.getAutoComplete(term);
-                if(autoCompleteChoices.isEmpty()) {
-                    return Collections.emptyList();
+                if(scalarModel.hasAutoComplete()) {
+                    autoCompleteChoices.addAll(scalarModel.getAutoComplete(term));
                 }
                 // take a copy otherwise is only lazily evaluated
                 return Lists.newArrayList(Lists.transform(autoCompleteChoices, MementoFunctions.fromAdapter()));
@@ -256,14 +246,10 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     
     private List<ObjectAdapterMemento> getChoiceMementos(final ObjectAdapter[] argsIfAvailable) {
         
+        final List<ObjectAdapter> choices = Lists.newArrayList();
         final ScalarModel scalarModel = (ScalarModel) getScalarModel();;
-        final boolean hasChoices = scalarModel.hasChoices();
-        if(!hasChoices) {
-            return Collections.emptyList();
-        }
-        final List<ObjectAdapter> choices = scalarModel.getChoices(argsIfAvailable);
-        if(choices.isEmpty()) {
-            return Collections.emptyList();
+        if(scalarModel.hasChoices()) {
+            choices.addAll(scalarModel.getChoices(argsIfAvailable));
         }
         // take a copy otherwise is only lazily evaluated
         return Lists.newArrayList(Lists.transform(choices, MementoFunctions.fromAdapter()));
@@ -277,14 +263,6 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
         }
     }
 
-    private void syncEntityTitleNullWithInput(final ObjectAdapter adapter) {
-        if (adapter != null) {
-            permanentlyHide(ID_ENTITY_TITLE_NULL);
-        } else {
-            addOrReplace(new Label(ID_ENTITY_TITLE_NULL, ""));
-        }
-    }
-
 
     private void syncEntityClearLinksWithInput(final ObjectAdapter adapter) {
         if (adapter == null) {
@@ -325,6 +303,10 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
 
     public void onSelected(final ObjectAdapterMemento selectedAdapterMemento) {
         getScalarModel().setPending(selectedAdapterMemento);
+        getScalarModel().setObject(selectedAdapterMemento!=null?selectedAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK):null);
+        if(this.select2Field != null) {
+            select2Field.getModel().setObject(selectedAdapterMemento);
+        }
         renderSamePage();
     }
 
@@ -379,45 +361,56 @@ public class EntityLinkSelect2Panel extends FormComponentPanelAbstract<ObjectAda
     // //////////////////////////////////////
 
     public void addFormComponentBehavior(Behavior behavior) {
-        select2Field.add(behavior);
+        if(select2Field != null) {
+            select2Field.add(behavior);
+        }
     }
 
     public void updateChoices(ObjectAdapter[] argsIfAvailable) {
-        setChoices(argsIfAvailable);
+        if(select2Field != null) {
+            setProviderAndCurrAndPending(select2Field, argsIfAvailable);
+        }
     }
     
-    private void setChoices(final ObjectAdapter[] argsIfAvailable) {
+    private void setProviderAndCurrAndPending(
+            final Select2Choice<ObjectAdapterMemento> select2Field, 
+            final ObjectAdapter[] argsIfAvailable) {
         
-        final ChoiceProvider<ObjectAdapterMemento> provider;
         if (getScalarModel().hasChoices()) {
             final List<ObjectAdapterMemento> choiceMementos = getChoiceMementos(argsIfAvailable);
-            provider = new ObjectAdapterMementoProviderAbstract() {
-                private static final long serialVersionUID = 1L;
-                @Override
-                protected List<ObjectAdapterMemento> obtainMementos(String unused) {
-                    return choiceMementos;
-                }
-            };
-            final ObjectAdapterMemento curr = select2Field.getModelObject();
-            select2Field.setProvider(provider);
+            select2Field.setProvider(providerForChoices(choiceMementos));
             getScalarModel().clearPending();
-            if(curr == null || !curr.containedIn(choiceMementos)) {
-                final ObjectAdapterMemento newAdapterMemento = 
-                        !choiceMementos.isEmpty() 
-                        ? choiceMementos.get(0) 
-                                : null;
-                        select2Field.getModel().setObject(newAdapterMemento);
-                        getModel().setObject(
-                                newAdapterMemento != null? newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK): null);
-            }
+            resetIfCurrentNotInChoices(select2Field, choiceMementos);
         } else if(hasParamOrPropertyAutoComplete()) {
-            provider = providerForParamOrPropertyAutoComplete();
-            select2Field.setProvider(provider);
-            getScalarModel().setPending(null);
+            select2Field.setProvider(providerForParamOrPropertyAutoComplete());
+            getScalarModel().clearPending();
         } else {
-            provider = providerForObjectAutoComplete();
-            select2Field.setProvider(provider);
-            getScalarModel().setPending(null);
+            select2Field.setProvider(providerForObjectAutoComplete());
+            getScalarModel().clearPending();
+        }
+    }
+
+    private ObjectAdapterMementoProviderAbstract providerForChoices(final List<ObjectAdapterMemento> choiceMementos) {
+        return new ObjectAdapterMementoProviderAbstract() {
+            private static final long serialVersionUID = 1L;
+            @Override
+            protected List<ObjectAdapterMemento> obtainMementos(String unused) {
+                return choiceMementos;
+            }
+        };
+    }
+
+    private void resetIfCurrentNotInChoices(final Select2Choice<ObjectAdapterMemento> select2Field, final List<ObjectAdapterMemento> choiceMementos) {
+        final ObjectAdapterMemento curr = select2Field.getModelObject();
+        if(curr == null || !curr.containedIn(choiceMementos)) {
+            if(!choiceMementos.isEmpty()) {
+                final ObjectAdapterMemento newAdapterMemento = choiceMementos.get(0);
+                select2Field.getModel().setObject(newAdapterMemento);
+                getModel().setObject(newAdapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK));
+            } else {
+                select2Field.getModel().setObject(null);
+                getModel().setObject(null);
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
index cbe4f34..7f75eb7 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitylink/EntityLinkSelect2PanelFactory.java
@@ -24,7 +24,6 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
 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;
@@ -42,8 +41,8 @@ public class EntityLinkSelect2PanelFactory extends ComponentFactoryAbstract {
         if (!(model instanceof ScalarModel)) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
-        final ScalarModel entityModel = (ScalarModel) model;
-        final ObjectSpecification specification = entityModel.getTypeOfSpecification();
+        final ScalarModel scalarModel = (ScalarModel) model;
+        final ObjectSpecification specification = scalarModel.getTypeOfSpecification();
         return appliesIf(specification != null && !specification.containsFacet(ValueFacet.class));
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
index 8a6b8ce..f2cdf6a 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.java
@@ -70,10 +70,10 @@ public class ValueChoicesSelect2Panel extends ScalarPanelAbstract implements Sca
     @Override
     protected FormComponentLabel addComponentForRegular() {
 
-        final IModel<ObjectAdapterMemento> modelObject = Util.createModel(this);
-        
+        final IModel<ObjectAdapterMemento> modelObject = ScalarModelWithPending.Util.createModel(this);
+        final ObjectAdapter[] actionArgsHint = getScalarModel().getActionArgsHint();
         select2Field = new Select2Choice<ObjectAdapterMemento>(ID_VALUE_ID, modelObject);
-        setChoices(null);
+        setChoices(actionArgsHint);
 
         addStandardSemantics();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
index 20cb118..de00892 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import com.google.common.collect.Lists;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
@@ -53,6 +54,9 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
      * Lazily initialized by {@link #getParameters()} (so don't use directly!)
      */
     private List<ObjectActionParameterContributee> parameters;
+    
+    
+    private final Identifier identifier;
 
     /**
      * @param contributeeParam - the parameter number which corresponds to the contributee, and so should be suppressed.
@@ -72,6 +76,12 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
 
         // copy over facets from contributed to own.
         FacetUtil.copyFacets(serviceAction.getFacetedMethod(), facetHolder);
+
+        // calculate the identifier
+        final Identifier contributorIdentifier = serviceAction.getFacetedMethod().getIdentifier();
+        final String memberName = contributorIdentifier.getMemberName();
+        List<String> memberParameterNames = contributorIdentifier.getMemberParameterNames();
+        identifier = Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), memberName, memberParameterNames);
     }
 
     @Override
@@ -212,6 +222,16 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
 
     
     // //////////////////////////////////////
+    
+    /* (non-Javadoc)
+     * @see org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract#getIdentifier()
+     */
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
+    
+    // //////////////////////////////////////
 
     static <T> T[] addElementToArray(T[] array, final int n, final T element, final T[] type) {
         List<T> list = Lists.newArrayList(Arrays.asList(array));

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 481170c..e4fe466 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -932,19 +932,19 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             contributedActions.add((ObjectActionImpl) serviceAction);
         }
         
-        return Lists.newArrayList(Iterables.transform(contributedActions, createContributeeAssociationFunctor(serviceAdapter)));
+        return Lists.newArrayList(Iterables.transform(contributedActions, createContributeeAssociationFunctor(serviceAdapter, this)));
     }
 
 
     private Function<ObjectActionImpl, ObjectAssociation> createContributeeAssociationFunctor(
-            final ObjectAdapter serviceAdapter) {
+            final ObjectAdapter serviceAdapter, final ObjectSpecification contributeeType) {
         return new Function<ObjectActionImpl, ObjectAssociation>(){
             @Override
             public ObjectAssociation apply(ObjectActionImpl input) {
                 final ObjectSpecification returnType = input.getReturnType();
                 final ObjectAssociationAbstract association = returnType.isNotCollection() 
-                        ? new OneToOneAssociationContributee(serviceAdapter, input, objectMemberContext) 
-                        : new OneToManyAssociationContributee(serviceAdapter, input, objectMemberContext);
+                        ? new OneToOneAssociationContributee(serviceAdapter, input, contributeeType, objectMemberContext) 
+                        : new OneToManyAssociationContributee(serviceAdapter, input, contributeeType, objectMemberContext);
                 facetProcessor.processMemberOrder(metadataProperties, association);
                 return association;
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 3883f8d..4c66147 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Render;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -50,27 +51,40 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
      * use layout metadata to position the contributee in different ways)
      */
     private final FacetHolder facetHolder = new FacetHolderImpl();
+    
+    private final Identifier identifier;
 
     private static ObjectSpecification typeOfSpec(final ObjectActionImpl objectAction, ObjectMemberContext objectMemberContext) {
         final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
         return objectMemberContext.getSpecificationLookup().loadSpecification(actionTypeOfFacet.value());
     }
     
-    public OneToManyAssociationContributee(ObjectAdapter serviceAdapter, ObjectActionImpl objectAction, ObjectMemberContext objectMemberContext) {
-        super(objectAction.getFacetedMethod(), typeOfSpec(objectAction, objectMemberContext), objectMemberContext);
+    public OneToManyAssociationContributee(
+            final ObjectAdapter serviceAdapter, 
+            final ObjectActionImpl serviceAction,
+            final ObjectSpecification contributeeType,
+            final ObjectMemberContext objectMemberContext) {
+        super(serviceAction.getFacetedMethod(), typeOfSpec(serviceAction, objectMemberContext), objectMemberContext);
         this.serviceAdapter = serviceAdapter;
-        this.objectAction = objectAction;
+        this.objectAction = serviceAction;
         
         renderFacet = new RenderFacetAbstract(Render.Type.EAGERLY, this) {};
         notPersistedFacet = new NotPersistedFacetAbstract(this) {};
         typeOfFacet = new TypeOfFacetAbstract(getSpecification().getCorrespondingClass(), this, objectMemberContext.getSpecificationLookup()) {};
         
         // copy over facets from contributed to own.
-        FacetUtil.copyFacets(objectAction.getFacetedMethod(), facetHolder);
+        FacetUtil.copyFacets(serviceAction.getFacetedMethod(), facetHolder);
         
         FacetUtil.addFacet(renderFacet);
         FacetUtil.addFacet(notPersistedFacet);
         FacetUtil.addFacet(typeOfFacet);
+        
+        // calculate the identifier
+        final Identifier contributorIdentifier = serviceAction.getFacetedMethod().getIdentifier();
+        final String memberName = contributorIdentifier.getMemberName();
+        List<String> memberParameterNames = contributorIdentifier.getMemberParameterNames();
+        
+        identifier = Identifier.actionIdentifier(contributeeType.getCorrespondingClass().getName(), memberName, memberParameterNames);
     }
 
     
@@ -79,7 +93,10 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
         return objectAction.execute(serviceAdapter, new ObjectAdapter[]{ownerAdapter});
     }
 
-
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
     
     // //////////////////////////////////////
     // FacetHolder

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
index a835a95..5d21f60 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationContributee.java
@@ -18,6 +18,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -27,6 +28,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacet;
 import org.apache.isis.core.metamodel.facets.notpersisted.NotPersistedFacetAbstract;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberContext;
 
@@ -42,31 +44,41 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
      * use layout metadata to position the contributee in different ways)
      */
     private final FacetHolder facetHolder = new FacetHolderImpl();
+    
+    private final Identifier identifier;
 
     public OneToOneAssociationContributee(
             final ObjectAdapter serviceAdapter, 
-            final ObjectActionImpl objectAction, 
+            final ObjectActionImpl servceAction, 
+            final ObjectSpecification contributeeType,
             final ObjectMemberContext objectMemberContext) {
-        super(objectAction.getFacetedMethod(), objectAction.getReturnType(), objectMemberContext);
+        super(servceAction.getFacetedMethod(), servceAction.getReturnType(), objectMemberContext);
         this.serviceAdapter = serviceAdapter;
-        this.objectAction = objectAction;
+        this.objectAction = servceAction;
         
         notPersistedFacet = new NotPersistedFacetAbstract(this) {};
 
         // copy over facets from contributed to own.
-        FacetUtil.copyFacets(objectAction.getFacetedMethod(), facetHolder);
+        FacetUtil.copyFacets(servceAction.getFacetedMethod(), facetHolder);
         FacetUtil.addFacet(notPersistedFacet);
+        
+        // calculate the identifier
+        final Identifier contributorIdentifier = servceAction.getFacetedMethod().getIdentifier();
+        final String memberName = contributorIdentifier.getMemberName();
+        List<String> memberParameterNames = contributorIdentifier.getMemberParameterNames();
+        
+        identifier = Identifier.actionIdentifier(contributeeType.getCorrespondingClass().getName(), memberName, memberParameterNames);
     }
 
     @Override
     public ObjectAdapter get(final ObjectAdapter ownerAdapter) {
         return objectAction.execute(serviceAdapter, new ObjectAdapter[]{ownerAdapter});
     }
-    
-
-    
-
 
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
     
     // //////////////////////////////////////
     // FacetHolder

http://git-wip-us.apache.org/repos/asf/isis/blob/d82f3d3c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index 6bc670d..75531c5 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -168,6 +168,7 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
     // UpdateCategory (contributed action)
     // //////////////////////////////////////
 
+    @Named("Update")
     @DescribedAs("Update category and subcategory")
     @NotInServiceMenu
     @ActionSemantics(Of.IDEMPOTENT)