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 2015/10/14 02:28:46 UTC

[01/12] isis git commit: ISIS-1213: @Mixin annotation, @DomainObject(nature=MIXIN), facet factories, implementation of ObjectActionMixin.

Repository: isis
Updated Branches:
  refs/heads/ISIS-1213 [created] 3a299c200


ISIS-1213: @Mixin annotation, @DomainObject(nature=MIXIN), facet factories, implementation of ObjectActionMixin.

still testing.  still need to do ObjectAssociationMixin.  still need to document


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

Branch: refs/heads/ISIS-1213
Commit: 643b39414c6bb1822f08c1ffbbb3ae3fd39d8fab
Parents: 10877d9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Oct 12 09:40:03 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Oct 12 09:41:23 2015 +0100

----------------------------------------------------------------------
 .../org/apache/isis/applib/AppManifest.java     |  15 +-
 .../apache/isis/applib/annotation/Mixin.java    |  38 +++
 .../apache/isis/applib/annotation/Nature.java   |  12 +-
 .../applib/fixturescripts/FixtureScripts.java   |   5 +-
 .../DomainObjectAnnotationFacetFactory.java     |  15 +-
 ...bleObjectFacetForDomainObjectAnnotation.java |   3 +-
 .../facets/object/mixin/MixinFacet.java         |  41 +++
 .../facets/object/mixin/MixinFacetAbstract.java |  88 ++++++
 .../MixinFacetForDomainObjectAnnotation.java    |  58 ++++
 .../mixin/MixinFacetForMixinAnnotation.java     |  57 ++++
 .../MixinFacetForMixinAnnotationFactory.java    |  57 ++++
 .../RecreatableObjectFacetFactory.java          |   4 +-
 ...jectFacetForRecreatableObjectAnnotation.java |  37 +++
 ...bjectFacetForRecreatableObjectInterface.java |  42 +++
 ...atableObjectFacetForViewModelAnnotation.java |  37 ---
 ...eatableObjectFacetForViewModelInterface.java |  42 ---
 .../specloader/specimpl/MixedInMember.java      |  33 +++
 .../specimpl/ObjectActionMixedIn.java           | 267 +++++++++++++++++++
 .../ObjectActionParameterParseable.java         |   6 +-
 .../specimpl/ObjectSpecificationAbstract.java   | 221 ++++++++-------
 .../specimpl/OneToOneActionParameterImpl.java   |  10 +-
 .../dflt/ProgrammingModelFacetsJava5.java       |   2 +
 .../RecreatableObjectFacetFactoryTest.java      |   2 +-
 .../IsisComponentProviderAbstract.java          |  27 ++
 .../IsisComponentProviderDefault2.java          |   3 +-
 .../IsisComponentProviderUsingInstallers.java   |   2 +-
 .../viewer/wicket/model/models/EntityModel.java |   2 +-
 27 files changed, 926 insertions(+), 200 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index a391a75..515ea54 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -160,7 +160,6 @@ public interface AppManifest {
      */
     public Map<String,String> getConfigurationProperties();
 
-
     /**
      * Holds the set of domain services, persistent entities and fixture scripts.services
      */
@@ -195,6 +194,20 @@ public interface AppManifest {
         }
         //endregion
 
+        //region > mixinTypes
+        private Set<Class<?>> mixinTypes;
+
+        /**
+         * @return <tt>null</tt> if no appManifest is defined
+         */
+        public Set<Class<?>> getMixinTypes() {
+            return mixinTypes;
+        }
+        public void setMixinTypes(final Set<Class<?>> mixinTypes) {
+            this.mixinTypes = mixinTypes;
+        }
+        //endregion
+
         //region > fixtureScriptTypes
         private Set<Class<? extends FixtureScript>> fixtureScriptTypes;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
new file mode 100644
index 0000000..7f4f646
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Mixin.java
@@ -0,0 +1,38 @@
+/*
+ *  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.applib.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * An object that acts as a mix-in to some other object, contributing behaviour and/or derived state based on the
+ * domain object.
+ */
+@Inherited
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Mixin {
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
index 42b5998..e941e2a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
@@ -75,6 +75,16 @@ public enum Nature {
      *     The identity of a view model is determined solely by the state of object's properties (that have
      *     not been set to be ignored using {@link org.apache.isis.applib.annotation.Property#notPersisted()}).
      * </p>
+     *
+     * @see ViewModel
+     */
+    VIEW_MODEL,
+
+    /**
+     * An object that acts as a mix-in to some other object, contributing behaviour and/or derived state based on the
+     * domain object.
+     *
+     * @see Mixin
      */
-    VIEW_MODEL
+    MIXIN
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index 7089de0..161140e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -50,9 +50,10 @@ import org.apache.isis.applib.services.memento.MementoService.Memento;
 import org.apache.isis.applib.util.ObjectContracts;
 
 /**
- * @deprecated - instead implement {@link org.apache.isis.applib.services.fixturespec.FixtureScriptsSpecificationProvider}.
+ * Rather than subclassing, instead implement
+ * {@link org.apache.isis.applib.services.fixturespec.FixtureScriptsSpecificationProvider}.  The framework will
+ * automatically provide a default implementation configured using that provider service.
  */
-@Deprecated
 public abstract class FixtureScripts extends AbstractService {
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 1d8e160..0d092b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -18,10 +18,11 @@
  */
 package org.apache.isis.core.metamodel.facets.object.domainobject;
 
-
 import java.util.Collection;
 import java.util.Map;
+
 import com.google.common.collect.Maps;
+
 import org.apache.isis.applib.annotation.Audited;
 import org.apache.isis.applib.annotation.AutoComplete;
 import org.apache.isis.applib.annotation.Bounded;
@@ -32,8 +33,6 @@ import org.apache.isis.applib.annotation.PublishedObject;
 import org.apache.isis.applib.services.HasTransactionId;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationAware;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAware;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -59,8 +58,12 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.publishing.Publ
 import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.RecreatableObjectFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.immutableannot.ImmutableFacetForImmutableAnnotation;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.publishedobject.PublishedObjectFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAware;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -271,10 +274,12 @@ public class DomainObjectAnnotationFacetFactory extends FacetFactoryAbstract imp
         final DomainObject domainObject = Annotations.getAnnotation(cls, DomainObject.class);
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
-        final ViewModelFacet facet = RecreatableObjectFacetForDomainObjectAnnotation.create(
+        final ViewModelFacet recreatableObjectFacet = RecreatableObjectFacetForDomainObjectAnnotation.create(
                 domainObject, getSpecificationLoader(), adapterManager, servicesInjector, facetHolder);
+        FacetUtil.addFacet(recreatableObjectFacet);
 
-        FacetUtil.addFacet(facet);
+        final MixinFacet mixinFacet = MixinFacetForDomainObjectAnnotation.create(cls, facetHolder, servicesInjector);
+        FacetUtil.addFacet(mixinFacet);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index 60e3a5f..4667611 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -43,7 +43,7 @@ public class RecreatableObjectFacetForDomainObjectAnnotation extends Recreatable
 
         final Nature nature = domainObject.nature();
 
-        if(nature == null || nature == Nature.JDO_ENTITY) {
+        if(nature == null) {
             return null;
         }
 
@@ -51,6 +51,7 @@ public class RecreatableObjectFacetForDomainObjectAnnotation extends Recreatable
         {
             case NOT_SPECIFIED:
             case JDO_ENTITY:
+            case MIXIN:
                 // not a recreatable object, so no facet
                 return null;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
new file mode 100644
index 0000000..b3d4e40
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacet.java
@@ -0,0 +1,41 @@
+/*
+ *  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.core.metamodel.facets.object.mixin;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+/**
+ * Applies to {@link ObjectSpecification}s of classes that can act as a mix-in, namely that they are annotated
+ * appropriately (eg {@link org.apache.isis.applib.annotation.Mixin} or {@link DomainObject} with
+ * {@link DomainObject#nature()} of {@link Nature#MIXIN}) and which have a 1-arg constructor accepting an object
+ * (being the object this is a mix-in for).
+ */
+public interface MixinFacet extends Facet {
+
+    boolean isMixinFor(Class<?> candidateDomainType);
+
+    /**
+     * Returns the mixin around the provided domain object
+     */
+    Object instantiate(Object domainPojo);
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
new file mode 100644
index 0000000..a957129
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetAbstract.java
@@ -0,0 +1,88 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.object.mixin;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.MarkerFacetAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public abstract class MixinFacetAbstract extends MarkerFacetAbstract implements MixinFacet {
+
+    private final Class<?> mixinType;
+    private final Class<?> constructorType;
+    private final ServicesInjector servicesInjector;
+
+    public static Class<? extends Facet> type() {
+        return MixinFacet.class;
+    }
+
+    public MixinFacetAbstract(
+            final Class<?> mixinType,
+            final Class<?> constructorType,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector) {
+        super(type(), holder);
+        this.mixinType = mixinType;
+        this.constructorType = constructorType;
+        this.servicesInjector = servicesInjector;
+    }
+
+    @Override
+    public boolean isMixinFor(final Class<?> candidateDomainType) {
+        if (candidateDomainType == null) {
+            return false;
+        }
+        return constructorType.isAssignableFrom(candidateDomainType);
+    }
+
+    @Override
+    public Object instantiate(final Object domainPojo) {
+        if(domainPojo == null) {
+            return null;
+        }
+        if(!constructorType.isAssignableFrom(domainPojo.getClass())) {
+            // shouldn't happen; ought we to fail-fast instead?
+            return null;
+        }
+        try {
+            final Constructor<?> constructor = mixinType.getConstructor(constructorType);
+            final Object mixinPojo = constructor.newInstance(domainPojo);
+            servicesInjector.injectServicesInto(mixinPojo);
+            return mixinPojo;
+        } catch (NoSuchMethodException e) {
+            // shouldn't happen; ought we to fail-fast instead?
+            return null;
+        } catch (InvocationTargetException e) {
+            // shouldn't happen; ought we to fail-fast instead?
+            return null;
+        } catch (InstantiationException e) {
+            // shouldn't happen; ought we to fail-fast instead?
+            return null;
+        } catch (IllegalAccessException e) {
+            // shouldn't happen; ought we to fail-fast instead?
+            return null;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
new file mode 100644
index 0000000..3493fcc
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -0,0 +1,58 @@
+/*
+ *  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.core.metamodel.facets.object.mixin;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
+
+    public static Class<? extends Facet> type() {
+        return MixinFacet.class;
+    }
+
+    private MixinFacetForDomainObjectAnnotation(
+            final Class<?> mixinType,
+            final Class<?> constructorType,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector) {
+        super(mixinType, constructorType, holder, servicesInjector);
+    }
+
+    public static MixinFacet create(
+            final Class<?> candidateMixinType, final FacetHolder facetHolder,
+            final ServicesInjector servicesInjector) {
+        final Constructor<?>[] constructors = candidateMixinType.getConstructors();
+        for (Constructor<?> constructor : constructors) {
+            final Class<?>[] constructorTypes = constructor.getParameterTypes();
+            if(constructorTypes.length != 1) {
+                continue;
+            }
+            final Class<?> constructorType = constructorTypes[0];
+            return new MixinFacetForDomainObjectAnnotation(candidateMixinType, constructorType, facetHolder,
+                    servicesInjector);
+        }
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
new file mode 100644
index 0000000..ed369c5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
@@ -0,0 +1,57 @@
+/*
+ *  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.core.metamodel.facets.object.mixin;
+
+import java.lang.reflect.Constructor;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+
+public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
+
+    public static Class<? extends Facet> type() {
+        return MixinFacet.class;
+    }
+
+    private MixinFacetForMixinAnnotation(
+            final Class<?> mixinType,
+            final Class<?> constructorType,
+            final FacetHolder holder,
+            final ServicesInjector servicesInjector) {
+        super(mixinType, constructorType, holder, servicesInjector);
+    }
+
+    public static MixinFacet create(
+            final Class<?> candidateMixinType, final FacetHolder facetHolder,
+            final ServicesInjector servicesInjector) {
+        final Constructor<?>[] constructors = candidateMixinType.getConstructors();
+        for (Constructor<?> constructor : constructors) {
+            final Class<?>[] constructorTypes = constructor.getParameterTypes();
+            if(constructorTypes.length != 1) {
+                continue;
+            }
+            final Class<?> constructorType = constructorTypes[0];
+            return new MixinFacetForMixinAnnotation(candidateMixinType, constructorType, facetHolder, servicesInjector);
+        }
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
new file mode 100644
index 0000000..9f333d7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotationFactory.java
@@ -0,0 +1,57 @@
+/*
+ *  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.core.metamodel.facets.object.mixin;
+
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
+
+public class MixinFacetForMixinAnnotationFactory extends FacetFactoryAbstract implements ServicesInjectorAware {
+
+    private ServicesInjector servicesInjector;
+
+    public MixinFacetForMixinAnnotationFactory() {
+        super(FeatureType.OBJECTS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+
+        final Class<?> candidateMixinType = processClassContext.getCls();
+
+        final Mixin mixinAnnotation = candidateMixinType.getAnnotation(Mixin.class);
+        if(mixinAnnotation == null) {
+            return;
+        }
+        final FacetHolder facetHolder = processClassContext.getFacetHolder();
+
+        final MixinFacet mixinFacet = MixinFacetForMixinAnnotation.create(candidateMixinType, facetHolder,
+                servicesInjector);
+        facetHolder.addFacet(mixinFacet);
+    }
+
+    @Override
+    public void setServicesInjector(final ServicesInjector servicesInjector) {
+        this.servicesInjector = servicesInjector;
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
index da8ccae..52bea48 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
@@ -57,7 +57,7 @@ public class RecreatableObjectFacetFactory extends FacetFactoryAbstract implemen
 
         // ViewModel interface
         if (ViewModel.class.isAssignableFrom(processClassContext.getCls())) {
-            FacetUtil.addFacet(new RecreatableObjectFacetForViewModelInterface(processClassContext.getFacetHolder()));
+            FacetUtil.addFacet(new RecreatableObjectFacetForRecreatableObjectInterface(processClassContext.getFacetHolder()));
         }
 
         // ViewModel annotation
@@ -73,7 +73,7 @@ public class RecreatableObjectFacetFactory extends FacetFactoryAbstract implemen
     }
 
     private ViewModelFacet create(final org.apache.isis.applib.annotation.ViewModel annotation, final FacetHolder holder) {
-        return annotation != null ? new RecreatableObjectFacetForViewModelAnnotation(holder, getSpecificationLoader(), adapterManager, servicesInjector) : null;
+        return annotation != null ? new RecreatableObjectFacetForRecreatableObjectAnnotation(holder, getSpecificationLoader(), adapterManager, servicesInjector) : null;
     }
 
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
new file mode 100644
index 0000000..d1b3406
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
@@ -0,0 +1,37 @@
+/*
+ *  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.core.metamodel.facets.object.recreatable;
+
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+public class RecreatableObjectFacetForRecreatableObjectAnnotation extends RecreatableObjectFacetDeclarativeAbstract {
+
+    public RecreatableObjectFacetForRecreatableObjectAnnotation(
+            final FacetHolder holder,
+            final SpecificationLoader specificationLoader,
+            final AdapterManager adapterManager,
+            final ServicesInjector servicesInjector) {
+        super(holder, ArchitecturalLayer.APPLICATION, specificationLoader, adapterManager, servicesInjector);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
new file mode 100644
index 0000000..e3c23b5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
@@ -0,0 +1,42 @@
+/*
+ *  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.core.metamodel.facets.object.recreatable;
+
+import org.apache.isis.applib.ViewModel;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class RecreatableObjectFacetForRecreatableObjectInterface extends RecreatableObjectFacetAbstract {
+
+    public RecreatableObjectFacetForRecreatableObjectInterface(final FacetHolder holder) {
+        super(holder, ArchitecturalLayer.APPLICATION);
+    }
+
+    @Override
+    public void initialize(Object pojo, String memento) {
+        final ViewModel viewModel = (ViewModel) pojo;
+        viewModel.viewModelInit(memento);
+    }
+
+    @Override
+    public String memento(Object pojo) {
+        final ViewModel viewModel = (ViewModel) pojo;
+        return viewModel.viewModelMemento();
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
deleted file mode 100644
index 17ba51f..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelAnnotation.java
+++ /dev/null
@@ -1,37 +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.core.metamodel.facets.object.recreatable;
-
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-
-public class RecreatableObjectFacetForViewModelAnnotation extends RecreatableObjectFacetDeclarativeAbstract {
-
-    public RecreatableObjectFacetForViewModelAnnotation(
-            final FacetHolder holder,
-            final SpecificationLoader specificationLoader,
-            final AdapterManager adapterManager,
-            final ServicesInjector servicesInjector) {
-        super(holder, ArchitecturalLayer.APPLICATION, specificationLoader, adapterManager, servicesInjector);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelInterface.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelInterface.java
deleted file mode 100644
index b503d69..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForViewModelInterface.java
+++ /dev/null
@@ -1,42 +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.core.metamodel.facets.object.recreatable;
-
-import org.apache.isis.applib.ViewModel;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public class RecreatableObjectFacetForViewModelInterface extends RecreatableObjectFacetAbstract {
-
-    public RecreatableObjectFacetForViewModelInterface(final FacetHolder holder) {
-        super(holder, ArchitecturalLayer.APPLICATION);
-    }
-
-    @Override
-    public void initialize(Object pojo, String memento) {
-        final ViewModel viewModel = (ViewModel) pojo;
-        viewModel.viewModelInit(memento);
-    }
-
-    @Override
-    public String memento(Object pojo) {
-        final ViewModel viewModel = (ViewModel) pojo;
-        return viewModel.viewModelMemento();
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/MixedInMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/MixedInMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/MixedInMember.java
new file mode 100644
index 0000000..a2fac68
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/MixedInMember.java
@@ -0,0 +1,33 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
+
+/**
+ * Interface indicating an a contributed association or action.
+ */
+public interface MixedInMember extends ObjectMember {
+
+    // not actually required, as of yet
+    // boolean isMixinOf(ObjectAction mixinAction);
+
+    // not actually required, as of yet
+    // ObjectSpecification getMixin();
+
+}
+

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
new file mode 100644
index 0000000..42abd39
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -0,0 +1,267 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.InvokedOn;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.Command.Executor;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+
+public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMember {
+
+    /**
+     * The type of the mixin (providing the action), eg annotated with {@link org.apache.isis.applib.annotation.Mixin}.
+     */
+    private final Class<?> mixinType;
+
+    /**
+     * The {@link ObjectActionImpl} for the action being mixed in (ie on the {@link #mixinType}.
+     */
+    private final ObjectActionImpl mixinAction;
+
+    /**
+     * The domain object type being mixed in to (being supplemented).
+     */
+    private final ObjectSpecification mixedInType;
+
+    /**
+     * Hold facets rather than delegate to the mixin action
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
+
+    private final Identifier identifier;
+
+    public ObjectActionMixedIn(
+            final Class<?> mixinType,
+            final ObjectActionImpl mixinAction,
+            final ObjectSpecification mixedInType,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(mixinAction.getFacetedMethod(), objectMemberDependencies);
+
+        this.mixinType = mixinType;
+        this.mixinAction = mixinAction;
+        this.mixedInType = mixedInType;
+
+        // copy over facets from mixin type to own.
+        FacetUtil.copyFacets(mixinAction.getFacetedMethod(), facetHolder);
+
+        // calculate the identifier
+        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        final String memberName = mixinIdentifier.getMemberName();
+        List<String> memberParameterNames = mixinIdentifier.getMemberParameterNames();
+        identifier = Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), memberName, memberParameterNames);
+    }
+
+    @Override
+    public ObjectSpecification getOnType() {
+        return mixedInType;
+    }
+
+    public int getParameterCount() {
+        return mixinAction.getParameterCount();
+    }
+
+    public synchronized List<ObjectActionParameter> getParameters() {
+        return mixinAction.getParameters();
+    }
+
+    @Override
+    public Consent isVisible(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        final VisibilityContext<?> ic = mixinAction.createVisibleInteractionContext(mixinAdapterFor(mixedInAdapter),
+                interactionInitiatedBy, where);
+        return InteractionUtils.isVisibleResult(this, ic).createConsent();
+    }
+
+    @Override
+    public Consent isUsable(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
+        final UsabilityContext<?> ic = mixinAction.createUsableInteractionContext(mixinAdapterFor(mixedInAdapter),
+                interactionInitiatedBy, where);
+        return InteractionUtils.isUsableResult(this, ic).createConsent();
+    }
+
+    @Override
+    public ObjectAdapter[] getDefaults(final ObjectAdapter mixedInAdapter) {
+        return mixinAction.getDefaults(mixinAdapterFor(mixedInAdapter));
+    }
+
+    @Override
+    public ObjectAdapter[][] getChoices(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return mixinAction.getChoices(mixinAdapterFor(mixedInAdapter), interactionInitiatedBy);
+    }
+
+    public Consent isProposedArgumentSetValid(
+            final ObjectAdapter mixedInAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return mixinAction.isProposedArgumentSetValid(mixinAdapterFor(mixedInAdapter), proposedArguments, interactionInitiatedBy);
+    }
+
+    @Override
+    public ObjectAdapter execute(
+            final ObjectAdapter mixedInAdapter,
+            final ObjectAdapter[] arguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        // this code also exists in ActionInvocationFacetViaMethod
+        // we need to repeat it here because the target adapter should be the mixedInAdapter, not the mixin
+
+        final BulkFacet bulkFacet = getFacet(BulkFacet.class);
+        if (bulkFacet != null) {
+
+            final ActionInvocationContext actionInvocationContext =
+                    getServicesInjector().lookupService(ActionInvocationContext.class);
+            if (actionInvocationContext != null &&
+                    actionInvocationContext.getInvokedOn() == null) {
+
+                actionInvocationContext.setInvokedOn(InvokedOn.OBJECT);
+                actionInvocationContext.setDomainObjects(Collections.singletonList(mixedInAdapter.getObject()));
+            }
+
+            final Bulk.InteractionContext bulkInteractionContext = getServicesInjector().lookupService(Bulk.InteractionContext.class);
+            if (bulkInteractionContext != null &&
+                    bulkInteractionContext.getInvokedAs() == null) {
+
+                bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.REGULAR);
+                actionInvocationContext.setDomainObjects(Collections.singletonList(mixedInAdapter.getObject()));
+            }
+
+
+        }
+
+        final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);
+        final Command command = commandContext != null ? commandContext.getCommand() : null;
+
+        if(command != null && command.getExecutor() == Executor.USER) {
+
+            if (command.getTarget() != null) {
+                // already set up by a edit form
+                // don't overwrite
+            } else {
+                command.setTargetClass(CommandUtil.targetClassNameFor(mixedInAdapter));
+                command.setTargetAction(CommandUtil.targetActionNameFor(this));
+                command.setArguments(CommandUtil.argDescriptionFor(this, arguments));
+
+                final Bookmark targetBookmark = CommandUtil.bookmarkFor(mixedInAdapter);
+                command.setTarget(targetBookmark);
+            }
+        }
+
+        return mixinAction.execute(mixinAdapterFor(mixedInAdapter), arguments, interactionInitiatedBy);
+    }
+
+    // //////////////////////////////////////
+    // FacetHolder
+    // //////////////////////////////////////
+
+    @Override
+    public Class<? extends Facet>[] getFacetTypes() {
+        return facetHolder.getFacetTypes();
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(Class<T> cls) {
+        return facetHolder.getFacet(cls);
+    }
+
+    @Override
+    public boolean containsFacet(Class<? extends Facet> facetType) {
+        return facetHolder.containsFacet(facetType);
+    }
+
+    @Override
+    public boolean containsDoOpFacet(Class<? extends Facet> facetType) {
+        return facetHolder.containsDoOpFacet(facetType);
+    }
+
+    @Override
+    public List<Facet> getFacets(Filter<Facet> filter) {
+        return facetHolder.getFacets(filter);
+    }
+
+    @Override
+    public void addFacet(Facet facet) {
+        facetHolder.addFacet(facet);
+    }
+
+    @Override
+    public void addFacet(MultiTypedFacet facet) {
+        facetHolder.addFacet(facet);
+    }
+    
+    @Override
+    public void removeFacet(Facet facet) {
+        facetHolder.removeFacet(facet);
+    }
+
+    @Override
+    public void removeFacet(Class<? extends Facet> facetType) {
+        facetHolder.removeFacet(facetType);
+    }
+
+    
+    // //////////////////////////////////////
+    
+    /* (non-Javadoc)
+     * @see org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract#getIdentifier()
+     */
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
+    
+    // //////////////////////////////////////
+
+    private ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
+        final ObjectSpecification objectSpecification = getSpecificationLoader().loadSpecification(mixinType);
+        final MixinFacet mixinFacet = objectSpecification.getFacet(MixinFacet.class);
+        final Object mixinPojo = mixinFacet.instantiate(mixedInAdapter.getObject());
+        return getPersistenceSessionService().adapterFor(mixinPojo);
+    }
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
index e58fcbb..70fa8ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
@@ -126,12 +126,10 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
     }
 
     private MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
-        final Instance instance = getInstance(owner);
-        if (!(instance instanceof MutableProposedHolder)) {
+        if (!(owner instanceof MutableProposedHolder)) {
             throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
         }
-        final MutableProposedHolder proposedHolder = (MutableProposedHolder) instance;
-        return proposedHolder;
+        return (MutableProposedHolder) owner;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/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 8718912..0ee3b2b 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
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
@@ -34,6 +35,7 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.NotPersistable;
 import org.apache.isis.applib.annotation.When;
@@ -65,6 +67,7 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
 import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.facets.object.notpersistable.NotPersistableFacet;
 import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
 import org.apache.isis.core.metamodel.facets.object.parented.ParentedCollectionFacet;
@@ -118,6 +121,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
     }
 
+    //region > fields
+
     private final DeploymentCategory deploymentCategory;
     private final ServicesInjector servicesInjector;
     private final SpecificationLoader specificationLoader;
@@ -168,11 +173,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     private CssClassFacet cssClassFacet;
 
     private IntrospectionState introspected = IntrospectionState.NOT_INTROSPECTED;
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // Constructor
-    // //////////////////////////////////////////////////////////////////////
-
+    //region > Constructor
     public ObjectSpecificationAbstract(
             final Class<?> introspectedClass, 
             final String shortName,
@@ -198,11 +201,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     protected DeploymentCategory getDeploymentCategory() {
         return deploymentCategory;
     }
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // Stuff immediately derivable from class
-    // //////////////////////////////////////////////////////////////////////
-
+    //region > Stuff immediately derivable from class
     @Override
     public FeatureType getFeatureType() {
         return FeatureType.OBJECT;
@@ -273,10 +274,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return !(getIntrospectionState() == IntrospectionState.INTROSPECTED);
     }
 
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // Introspection (part 1)
-    // //////////////////////////////////////////////////////////////////////
+    //region > Introspection (part 1)
 
     public abstract void introspectTypeHierarchyAndMembers();
 
@@ -356,9 +356,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Introspection (part 2)
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > Introspection (part 2)
 
     public void updateFromFacetValues() {
 
@@ -384,11 +384,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
     }
 
+    //endregion
 
-
-    // //////////////////////////////////////////////////////////////////////
-    // Title, Icon
-    // //////////////////////////////////////////////////////////////////////
+    //region > Title, Icon
 
     @Override
     public String getTitle(final ObjectAdapter targetAdapter, final Localization localization) {
@@ -423,19 +421,21 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return cssClassFacet == null ? null : cssClassFacet.cssClass(reference);
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Specification
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > getInstance (unused)
 
+    /**
+     * simply returns the input parameter.
+     */
+    @Deprecated
     @Override
     public Instance getInstance(final ObjectAdapter adapter) {
         return adapter;
     }
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // Hierarchical
-    // //////////////////////////////////////////////////////////////////////
-
+    //region > Hierarchical
     /**
      * Determines if this class represents the same class, or a subclass, of the
      * specified class.
@@ -474,10 +474,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return superclassSpec != null ? superclassSpec.isOfType(specification) : false;
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Name, Description, Persistability
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Name, Description, Persistability
     /**
      * The name according to any available {@link org.apache.isis.core.metamodel.facets.all.named.NamedFacet},
      * but falling back to {@link #getFullIdentifier()} otherwise.
@@ -525,9 +524,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
 
-    // //////////////////////////////////////////////////////////////////////
-    // Facet Handling
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > Facet Handling
 
     @Override
     public <Q extends Facet> Q getFacet(final Class<Q> facetType) {
@@ -573,38 +572,38 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return facet != null && !facet.isNoop();
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // DefaultValue
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > DefaultValue - unused
+    /**
+     * @deprecated  - never called.
+     * @return - always returns <tt>null</tt>
+     */
+    @Deprecated
     @Override
     public Object getDefaultValue() {
         return null;
     }
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // Identifier
-    // //////////////////////////////////////////////////////////////////////
-
+    //region > Identifier
     @Override
     public Identifier getIdentifier() {
         return identifier;
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // create InteractionContext
-    // //////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > createTitleInteractionContext
     @Override
     public ObjectTitleContext createTitleInteractionContext(final AuthenticationSession session, final InteractionInitiatedBy interactionMethod, final ObjectAdapter targetObjectAdapter) {
         return new ObjectTitleContext(targetObjectAdapter, getIdentifier(), targetObjectAdapter.titleString(null),
                 interactionMethod);
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Superclass, Interfaces, Subclasses, isAbstract
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Superclass, Interfaces, Subclasses, isAbstract
     @Override
     public ObjectSpecification superclass() {
         return superclassSpec;
@@ -630,10 +629,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return isAbstract;
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Associations
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Associations
     @Override
     public List<ObjectAssociation> getAssociations(final Contributed contributed) {
         // the "contributed.isIncluded()" guard is required because we cannot do this too early;
@@ -738,10 +736,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return list;
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // getObjectActions
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > getObjectActions
     @Override
     public List<ObjectAction> getObjectActions(
             final List<ActionType> types,
@@ -756,6 +753,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             synchronized (this.objectActions) {
                 final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
                 actions.addAll(createContributeeActions());
+                actions.addAll(createMixinActions());
                 sortCacheAndUpdateActions(actions);
                 contributeeActionsAdded = true;
             }
@@ -787,10 +785,10 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return getObjectActions(Collections.singletonList(type), contributed, filter);
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // sorting
-    // //////////////////////////////////////////////////////////////////////
-    
+    //endregion
+
+    //region > sorting
+
     protected List<ObjectAssociation> sortAssociations(final List<ObjectAssociation> associations) {
         final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(associations);
         final MemberGroupLayoutFacet memberGroupLayoutFacet = this.getFacet(MemberGroupLayoutFacet.class);
@@ -848,18 +846,13 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // getServiceActionsReturning
-    // //////////////////////////////////////////////////////////////////////
-
     private Iterable<Object> getServicePojos() {
         return getServicesInjector().getRegisteredServices();
     }
 
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // contributee associations (properties and collections)
-    // //////////////////////////////////////////////////////////////////////
+    //region > contributee associations (properties and collections)
 
     private List<ObjectAssociation> createContributeeAssociations() {
         if (isService() || isValue()) {
@@ -884,17 +877,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         contributeeAssociationsToAppendTo.addAll(contributeeAssociations);
     }
 
-    /**
-     * Synthesises {@link ObjectAssociation}s from matching {@link ObjectAction}s of any of the services
-     * that accept one parameter
-     */
-    private List<ObjectAssociation> createContributeeAssociations(
-            final ObjectAdapter serviceAdapter) {
-
-        final Object servicePojo = serviceAdapter.getObject();
-        return createContributeeAssociations(servicePojo);
-    }
-
     private List<ObjectAssociation> createContributeeAssociations(final Object servicePojo) {
         final Class<?> serviceClass = servicePojo.getClass();
         final ObjectSpecification specification = specificationLoader.loadSpecification(serviceClass);
@@ -930,12 +912,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     private Function<ObjectActionImpl, ObjectAssociation> createContributeeAssociationFunctor(
-            final ObjectAdapter serviceAdapter, final ObjectSpecification contributeeType) {
-        final Object servicePojo = serviceAdapter.getObject();
-        return createContributeeAssociationFunctor(servicePojo, contributeeType);
-    }
-
-    private Function<ObjectActionImpl, ObjectAssociation> createContributeeAssociationFunctor(
             final Object servicePojo,
             final ObjectSpecification contributeeType) {
         return new Function<ObjectActionImpl, ObjectAssociation>(){
@@ -953,10 +929,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         };
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // contributee actions
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > contributee actions
     /**
      * All contributee actions (each wrapping a service's contributed action) for this spec.
      * 
@@ -1032,11 +1007,71 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         }
         return -1;
     }
+    //endregion
+
+    //region > mixin actions
+    /**
+     * All contributee actions (each wrapping a service's contributed action) for this spec.
+     *
+     * <p>
+     * If this specification {@link #isService() is actually for} a service,
+     * then returns an empty list.
+     */
+    protected List<ObjectAction> createMixinActions() {
+        if (isService() || isValue()) {
+            return Collections.emptyList();
+        }
+        final Set<Class<?>> mixinTypes = AppManifest.Registry.instance().getMixinTypes();
+        if(mixinTypes == null) {
+            return Collections.emptyList();
+        }
+
+        final List<ObjectAction> mixinActions = Lists.newArrayList();
+
+        for (final Class<?> mixinType : mixinTypes) {
+            addMixinActionsIfAny(mixinType, mixinActions);
+        }
+        return mixinActions;
+    }
 
-    // //////////////////////////////////////////////////////////////////////
-    // validity
-    // //////////////////////////////////////////////////////////////////////
+    private void addMixinActionsIfAny(
+            final Class<?> mixinType,
+            final List<ObjectAction> mixinActionsToAppendTo) {
+        final ObjectSpecification specification = getSpecificationLoader().loadSpecification(mixinType);
+        if (specification == this) {
+            return;
+        }
+        final MixinFacet mixinFacet = specification.getFacet(MixinFacet.class);
+        if(mixinFacet == null) {
+            // this shouldn't happen; perhaps it would be more correct to throw an exception?
+            return;
+        }
+        if(!mixinFacet.isMixinFor(getCorrespondingClass())) {
+            return;
+        }
 
+        final List<ObjectAction> actions = Lists.newArrayList();
+        final List<ObjectAction> mixinActions = specification.getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters
+                .<ObjectAction>any());
+        for (final ObjectAction mixinTypeAction : mixinActions) {
+            if (isAlwaysHidden(mixinTypeAction)) {
+                continue;
+            }
+            if(!(mixinTypeAction instanceof ObjectActionImpl)) {
+                continue;
+            }
+            final ObjectActionImpl mixinAction = (ObjectActionImpl) mixinTypeAction;
+
+            ObjectActionMixedIn mixedInAction =
+                    new ObjectActionMixedIn(mixinType, mixinAction, this, objectMemberDependencies);
+            facetProcessor.processMemberOrder(metadataProperties, mixedInAction);
+            actions.add(mixedInAction);
+        }
+        mixinActionsToAppendTo.addAll(actions);
+    }
+
+    //endregion
+    //region > validity
     @Override
     public Consent isValid(final ObjectAdapter targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         return isValidResult(targetAdapter, interactionInitiatedBy).createConsent();
@@ -1061,11 +1096,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             final ObjectAdapter targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
         return new ObjectValidityContext(targetAdapter, getIdentifier(), interactionInitiatedBy);
     }
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////////
-    // convenience isXxx (looked up from facets)
-    // //////////////////////////////////////////////////////////////////////
-
+    //region > convenience isXxx (looked up from facets)
     @Override
     public boolean isImmutable() {
         return containsFacet(ImmutableFacet.class);
@@ -1112,9 +1145,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
 
-    // //////////////////////////////////////////////////////////////////////
-    // toString
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > toString
 
     @Override
     public String toString() {
@@ -1123,10 +1156,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return str.toString();
     }
 
-    // //////////////////////////////////////////////////////////////////////
-    // Dependencies (injected in constructor)
-    // //////////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Dependencies (injected in constructor)
     private ServicesInjector getServicesInjector() {
         return servicesInjector;
     }
@@ -1135,5 +1167,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return specificationLoader;
     }
 
+    //endregion
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
index ab6f362..1cbf084 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
@@ -60,7 +60,7 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
 
     /**
      * Gets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposed}, wrapping the proposed value into a
+     * {@link MutableProposedHolder}, wrapping the proposed value into a
      * {@link ObjectAdapter}.
      */
     @Override
@@ -72,7 +72,7 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
 
     /**
      * Sets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposed}, unwrapped the proposed value from a
+     * {@link MutableProposedHolder}, unwrapped the proposed value from a
      * {@link ObjectAdapter}.
      */
     public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {
@@ -82,12 +82,10 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
     }
 
     private MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
-        final Instance instance = getInstance(owner);
-        if (!(instance instanceof MutableProposedHolder)) {
+        if (!(owner instanceof MutableProposedHolder)) {
             throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
         }
-        final MutableProposedHolder proposedHolder = (MutableProposedHolder) instance;
-        return proposedHolder;
+        return (MutableProposedHolder) owner;
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 8ec148b..f21e958 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -109,6 +109,7 @@ import org.apache.isis.core.metamodel.facets.object.immutable.immutablemarkerifc
 import org.apache.isis.core.metamodel.facets.object.mask.annotation.MaskFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.maxlen.annotation.MaxLengthFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.membergroups.annotprop.MemberGroupLayoutFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForMixinAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.multiline.annotation.MultiLineFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.named.annotation.NamedFacetOnTypeAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.notpersistable.notpersistableannot.NotPersistableFacetAnnotationFactory;
@@ -362,6 +363,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(ImmutableFacetMarkerInterfaceFactory.class);
 
         addFactory(RecreatableObjectFacetFactory.class);
+        addFactory(MixinFacetForMixinAnnotationFactory.class);
 
         addFactory(MaxLengthFacetOnTypeAnnotationFactory.class);
         addFactory(MaxLengthFacetOnActionAnnotationFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java
index f946ef4..296f711 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactoryTest.java
@@ -60,7 +60,7 @@ public class RecreatableObjectFacetFactoryTest extends AbstractFacetFactoryTest
 
         final Facet facet = facetedMethod.getFacet(ViewModelFacet.class);
         assertNotNull(facet);
-        assertTrue(facet instanceof RecreatableObjectFacetForViewModelInterface);
+        assertTrue(facet instanceof RecreatableObjectFacetForRecreatableObjectInterface);
 
         assertNoMethodsRemoved();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
index 2a645b8..3a40061 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
@@ -28,14 +28,19 @@ import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 import org.reflections.Reflections;
 import org.reflections.vfs.Vfs;
 
 import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.Mixin;
+import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryServiceUsingReflections;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -129,7 +134,14 @@ public abstract class IsisComponentProviderAbstract implements IsisComponentProv
         }
     }
 
+    /**
+     * @deprecated - unused, renamed to {@link #findAndRegisterTypes(AppManifest)}.
+     */
+    @Deprecated
     protected void registerPackageNames(final AppManifest appManifest) {
+        findAndRegisterTypes(appManifest);
+    }
+    protected void findAndRegisterTypes(final AppManifest appManifest) {
         final Iterable<String> packageNameList = modulePackageNamesFrom(appManifest);
         final AppManifest.Registry registry = AppManifest.Registry.instance();
 
@@ -144,9 +156,24 @@ public abstract class IsisComponentProviderAbstract implements IsisComponentProv
         final Set<Class<?>> persistenceCapableTypes = reflections.getTypesAnnotatedWith(PersistenceCapable.class);
         final Set<Class<? extends FixtureScript>> fixtureScriptTypes = reflections.getSubTypesOf(FixtureScript.class);
 
+        final Set<Class<?>> mixinTypes = Sets.newHashSet();
+        mixinTypes.addAll(reflections.getTypesAnnotatedWith(Mixin.class));
+        final Set<Class<?>> domainObjectTypes = reflections.getTypesAnnotatedWith(DomainObject.class);
+        mixinTypes.addAll(
+                Lists.newArrayList(Iterables.filter(domainObjectTypes, new Predicate<Class<?>>() {
+                    @Override
+                    public boolean apply(@Nullable final Class<?> input) {
+                        if(input == null) { return false; }
+                        final DomainObject annotation = input.getAnnotation(DomainObject.class);
+                        return annotation.nature() == Nature.MIXIN;
+                    }
+                }))
+        );
+
         registry.setDomainServiceTypes(domainServiceTypes);
         registry.setPersistenceCapableTypes(persistenceCapableTypes);
         registry.setFixtureScriptTypes(fixtureScriptTypes);
+        registry.setMixinTypes(mixinTypes);
     }
 
     private Iterable<String> modulePackageNamesFrom(final AppManifest appManifest) {

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
index 6356335..2e128a0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderDefault2.java
@@ -39,7 +39,6 @@ import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
 import org.apache.isis.core.metamodel.layoutmetadata.json.LayoutMetadataReaderFromJson;
 import org.apache.isis.core.metamodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
-import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
@@ -83,7 +82,7 @@ public class IsisComponentProviderDefault2 extends IsisComponentProviderAbstract
         if(appManifest != null) {
 
             putAppManifestKey(appManifest);
-            registerPackageNames(appManifest);
+            findAndRegisterTypes(appManifest);
             specifyServicesAndRegisteredEntitiesUsing(appManifest);
 
             List<Class<? extends FixtureScript>> fixtureClasses = appManifest.getFixtures();

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
index 9b3a612..29f14ac 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
@@ -68,7 +68,7 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProviderA
         if(appManifest != null) {
 
             putAppManifestKey(appManifest);
-            registerPackageNames(appManifest);
+            findAndRegisterTypes(appManifest);
             specifyServicesAndRegisteredEntitiesUsing(appManifest);
 
             putConfigurationProperty(SystemConstants.SERVICES_INSTALLER_KEY, ServicesInstallerFromConfigurationAndAnnotation.NAME);

http://git-wip-us.apache.org/repos/asf/isis/blob/643b3941/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 460f843..fde03d7 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -492,7 +492,7 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> {
     /**
      * Apply changes to the underlying adapter (possibly returning a new adapter).
      *
-     * @return adapter, which may be different from the original (if a {@link org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet#isCloneable(Object) cloneable} view model, for example.
+     * @return adapter, which may be different from the original (if a {@link ViewModelFacet#isCloneable(Object) cloneable} view model, for example.
      */
     public ObjectAdapter apply() {
         ObjectAdapter adapter = getObjectAdapterMemento().getObjectAdapter(ConcurrencyChecking.CHECK);


[11/12] isis git commit: ISIS-1213: renamed metamodel classes ("...Impl" to "...Default"); derive name of ObjectActionMixedIn from mixin type (if "_"); simplified logic of #getParameters; also...

Posted by da...@apache.org.
ISIS-1213: renamed metamodel classes ("...Impl" to "...Default"); derive name of ObjectActionMixedIn from mixin type (if "_"); simplified logic of #getParameters; also...

renamed:
- ObjectActionImpl to ObjectActionDefault
- OneToOneAssociationImpl to OneToOneAssociationDefault
- OneToManyAssociationImpl to OneToManyAssociationDefault
- OneToOneActionParameterImpl to OneToOneActionParameterDefault

also:
- reduced number of methods subclassed under ObjectMemberAbstract by introducing overridable getFacetHolder()
  - OneToOneAssociationContributee
  -  OneToManyAssociationContributee
- similarly for ObjectActionParameterAbstract


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

Branch: refs/heads/ISIS-1213
Commit: 6c888136560b8648df110498cf5eb69f591095ed
Parents: 9f251d9
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 13 21:34:29 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 13 21:34:29 2015 +0100

----------------------------------------------------------------------
 .../core/commons/lang/StringExtensions.java     |   4 +-
 .../specimpl/ObjectActionContributee.java       |  17 +-
 .../specimpl/ObjectActionDefault.java           | 531 ++++++++++++++++++
 .../specloader/specimpl/ObjectActionImpl.java   | 535 -------------------
 .../specimpl/ObjectActionMixedIn.java           |  46 +-
 .../specimpl/ObjectActionParameterAbstract.java |  44 +-
 .../specimpl/ObjectMemberAbstract.java          |  34 +-
 .../specimpl/ObjectSpecificationAbstract.java   |  20 +-
 .../OneToManyAssociationContributee.java        |  65 +--
 .../specimpl/OneToManyAssociationDefault.java   | 298 +++++++++++
 .../specimpl/OneToManyAssociationImpl.java      | 298 -----------
 .../OneToOneActionParameterContributee.java     |   2 +-
 .../OneToOneActionParameterDefault.java         |  35 ++
 .../specimpl/OneToOneActionParameterImpl.java   |  35 --
 .../OneToOneActionParameterMixedIn.java         |   3 +-
 .../OneToOneAssociationContributee.java         |  56 +-
 .../specimpl/OneToOneAssociationDefault.java    | 345 ++++++++++++
 .../specimpl/OneToOneAssociationImpl.java       | 356 ------------
 .../dflt/ObjectSpecificationDefault.java        |  12 +-
 .../specimpl/ObjectActionMixedInTest.java       |  44 ++
 ...ParameterAbstractTest_getId_and_getName.java |   5 +-
 .../runtime/system/ObjectActionDefaultTest.java | 107 ++++
 .../runtime/system/ObjectActionImplTest.java    | 107 ----
 .../system/OneToManyAssociationDefaultTest.java | 188 +++++++
 .../system/OneToManyAssociationImplTest.java    | 188 -------
 ...WrapperFactoryDefaultTest_wrappedObject.java |   4 +-
 26 files changed, 1692 insertions(+), 1687 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
index 76b7f2d..8c3dfb7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/StringExtensions.java
@@ -560,7 +560,9 @@ public final class StringExtensions {
     }
 
     public static String asCapitalizedName(final String extendee) {
-        return Character.toUpperCase(extendee.charAt(0)) + extendee.substring(1);
+
+        return Character.toUpperCase(extendee.charAt(0)) +
+                extendee.substring(1);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/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 fe1a5df..117d2e4 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
@@ -19,13 +19,15 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+
 import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
@@ -39,8 +41,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
-import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
+import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
@@ -49,10 +51,10 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
-public class ObjectActionContributee extends ObjectActionImpl implements ContributeeMember2 {
+public class ObjectActionContributee extends ObjectActionDefault implements ContributeeMember2 {
 
     private final Object servicePojo;
-    private final ObjectActionImpl serviceAction;
+    private final ObjectActionDefault serviceAction;
     private final int contributeeParam;
     private final ObjectSpecification contributeeType;
     
@@ -75,7 +77,7 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
      */
     public ObjectActionContributee(
             final Object servicePojo,
-            final ObjectActionImpl serviceAction,
+            final ObjectActionDefault serviceAction,
             final int contributeeParam,
             final ObjectSpecification contributeeType,
             final ObjectMemberDependencies objectMemberDependencies) {
@@ -132,9 +134,10 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
                     // skip so is omitted from the Contributed action
                     continue;
                 }
-                
-                final ObjectActionParameterAbstract serviceParameter = 
+
+                final ObjectActionParameterAbstract serviceParameter =
                         (ObjectActionParameterAbstract) serviceParameters.get(serviceParamNum);
+
                 final ObjectActionParameterContributee contributedParam;
                 contributedParam = new OneToOneActionParameterContributee(
                         getServiceAdapter(), serviceParameter,

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
new file mode 100644
index 0000000..7060cf1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -0,0 +1,531 @@
+/*
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.exceptions.UnknownTypeException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResultSet;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
+import org.apache.isis.core.metamodel.facets.actions.debug.DebugFacet;
+import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
+import org.apache.isis.core.metamodel.facets.actions.exploration.ExplorationFacet;
+import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
+import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
+import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
+import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
+import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
+import org.apache.isis.core.metamodel.interactions.ActionUsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ActionVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.DomainModelException;
+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.ObjectActionParameter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+
+public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectAction {
+
+    private final static Logger LOG = LoggerFactory.getLogger(ObjectActionDefault.class);
+
+    public static ActionType getType(final String typeStr) {
+        final ActionType type = ActionType.valueOf(typeStr);
+        if (type == null) {
+            throw new IllegalArgumentException();
+        }
+        return type;
+    }
+
+    //region > fields
+
+    /**
+     * Lazily initialized by {@link #getParameters()} (so don't use directly!)
+     */
+    private List<ObjectActionParameter> parameters;
+
+    //endregion
+
+    //region > constructors
+
+    public ObjectActionDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(facetedMethod, FeatureType.ACTION, objectMemberDependencies);
+    }
+
+    //endregion
+
+    //region > ReturnType, OnType, Actions (set)
+    /**
+     * Always returns <tt>null</tt>.
+     */
+    @Override
+    public ObjectSpecification getSpecification() {
+        return null;
+    }
+
+    @Override
+    public ObjectSpecification getReturnType() {
+        final ActionInvocationFacet facet = getActionInvocationFacet();
+        return facet.getReturnType();
+    }
+
+    /**
+     * Returns true if the represented action returns something, else returns
+     * false.
+     */
+    @Override
+    public boolean hasReturn() {
+        if(getReturnType() == null) {
+            // this shouldn't happen; return Type always defined, even if represents void.class
+            return false;
+        }
+        return getReturnType() != getSpecificationLoader().loadSpecification(void.class);
+    }
+
+
+    @Override
+    public ObjectSpecification getOnType() {
+        final ActionInvocationFacet facet = getActionInvocationFacet();
+        return facet.getOnType();
+    }
+
+    @Override
+    public ActionSemantics.Of getSemantics() {
+        final ActionSemanticsFacet facet = getFacet(ActionSemanticsFacet.class);
+        return facet != null? facet.value(): ActionSemantics.Of.NON_IDEMPOTENT;
+    }
+
+    //endregion
+
+    //region > Type
+    @Override
+    public ActionType getType() {
+        return getType(this);
+    }
+
+    private static ActionType getType(final FacetHolder facetHolder) {
+        Facet facet = facetHolder.getFacet(DebugFacet.class);
+        if (facet != null) {
+            return ActionType.DEBUG;
+        }
+        facet = facetHolder.getFacet(ExplorationFacet.class);
+        if (facet != null) {
+            return ActionType.EXPLORATION;
+        }
+        facet = facetHolder.getFacet(PrototypeFacet.class);
+        if (facet != null) {
+            return ActionType.PROTOTYPE;
+        }
+        return ActionType.USER;
+    }
+    //endregion
+
+    //region > Parameters
+
+    @Override
+    public int getParameterCount() {
+        return getFacetedMethod().getParameters().size();
+    }
+
+    @Override
+    public boolean promptForParameters(final ObjectAdapter target) {
+        return getParameterCount() != 0;
+    }
+
+    /**
+     * Build lazily by {@link #getParameters()}.
+     * 
+     * <p>
+     * Although this is lazily loaded, the method is also <tt>synchronized</tt>
+     * so there shouldn't be any thread race conditions.
+     */
+    @Override
+    public synchronized List<ObjectActionParameter> getParameters() {
+        if (this.parameters == null) {
+            final int parameterCount = getParameterCount();
+            final List<ObjectActionParameter> parameters = Lists.newArrayList();
+            final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
+            for (int i = 0; i < parameterCount; i++) {
+                final TypedHolder paramPeer = paramPeers.get(i);
+                final ObjectSpecification specification = ObjectMemberAbstract.getSpecification(getSpecificationLoader(), paramPeer.getType());
+                
+                if (!specification.isNotCollection()) {
+                    throw new UnknownTypeException("collections not supported as parameters: " + getIdentifier());
+                }
+                final ObjectActionParameter parameter = new OneToOneActionParameterDefault(i, this, paramPeer);
+                parameters.add(parameter);
+            }
+            this.parameters = parameters;
+        }
+        return parameters;
+    }
+
+    @Override
+    public synchronized List<ObjectSpecification> getParameterTypes() {
+        final List<ObjectSpecification> parameterTypes = Lists.newArrayList();
+        final List<ObjectActionParameter> parameters = getParameters();
+        for (final ObjectActionParameter parameter : parameters) {
+            parameterTypes.add(parameter.getSpecification());
+        }
+        return parameterTypes;
+    }
+
+    @Override
+    public ObjectActionParameter getParameterById(final String paramId) {
+        final List<ObjectActionParameter> allParameters = getParameters();
+        for (int i = 0; i < allParameters.size(); i++) {
+            final ObjectActionParameter param = allParameters.get(i);
+            if (Objects.equal(paramId, param.getId())) {
+                return param;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public ObjectActionParameter getParameterByName(final String paramName) {
+        final List<ObjectActionParameter> allParameters = getParameters();
+        for (int i = 0; i < allParameters.size(); i++) {
+            final ObjectActionParameter param = allParameters.get(i);
+            if (Objects.equal(paramName, param.getName())) {
+                return param;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public List<ObjectActionParameter> getParameters(final Filter<ObjectActionParameter> filter) {
+        final List<ObjectActionParameter> allParameters = getParameters();
+        final List<ObjectActionParameter> selectedParameters = Lists.newArrayList();
+        for (int i = 0; i < allParameters.size(); i++) {
+            if (filter.accept(allParameters.get(i))) {
+                selectedParameters.add(allParameters.get(i));
+            }
+        }
+        return selectedParameters;
+    }
+
+    private ObjectActionParameter getParameter(final int position) {
+        final List<ObjectActionParameter> parameters = getParameters();
+        if (position >= parameters.size()) {
+            throw new IllegalArgumentException("getParameter(int): only " + parameters.size() + " parameters, position=" + position);
+        }
+        return parameters.get(position);
+    }
+
+    //endregion
+
+    //region > visable, usable
+
+    @Override
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new ActionVisibilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+    @Override
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new ActionUsabilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+    //endregion
+
+    //region > validate
+
+    @Override
+    public Consent isProposedArgumentSetValid(
+            final ObjectAdapter target,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isProposedArgumentSetValidResultSet(target, proposedArguments, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResultSet isProposedArgumentSetValidResultSet(
+            final ObjectAdapter objectAdapter,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final InteractionResultSet resultSet = new InteractionResultSet();
+        final List<ObjectActionParameter> actionParameters = getParameters();
+        if (proposedArguments != null) {
+            for (int i = 0; i < proposedArguments.length; i++) {
+                final ValidityContext<?> ic =
+                        actionParameters.get(i).createProposedArgumentInteractionContext(
+                                objectAdapter, proposedArguments, i, interactionInitiatedBy
+                        );
+                InteractionUtils.isValidResultSet(getParameter(i), ic, resultSet);
+            }
+        }
+        // only check the action's own validity if all the arguments are OK.
+        if (resultSet.isAllowed()) {
+            final ValidityContext<?> ic = createActionInvocationInteractionContext(
+                    objectAdapter, proposedArguments, interactionInitiatedBy);
+            InteractionUtils.isValidResultSet(this, ic, resultSet);
+        }
+        return resultSet;
+    }
+
+    private ActionInvocationContext createActionInvocationInteractionContext(
+            final ObjectAdapter targetObject,
+            final ObjectAdapter[] proposedArguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ActionInvocationContext(targetObject, getIdentifier(), proposedArguments,
+                interactionInitiatedBy);
+    }
+
+    //endregion
+
+    //region > executeWithRuleChecking, execute
+
+    @Override
+    public ObjectAdapter executeWithRuleChecking(
+            final ObjectAdapter target,
+            final ObjectAdapter[] arguments,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+
+        // see it?
+        final Consent visibility = isVisible(target, interactionInitiatedBy, where);
+        if (visibility.isVetoed()) {
+            throw new AuthorizationException();
+        }
+
+        // use it?
+        final Consent usability = isUsable(target, interactionInitiatedBy, where);
+        if(usability.isVetoed()) {
+            throw new AuthorizationException();
+        }
+
+        // do it?
+        final Consent validity = isProposedArgumentSetValid(target, arguments, interactionInitiatedBy);
+        if(validity.isVetoed()) {
+            throw new RecoverableException(validity.getReason());
+        }
+
+        return execute(target, arguments, interactionInitiatedBy);
+    }
+
+    @Override
+    public ObjectAdapter execute(
+            final ObjectAdapter target,
+            final ObjectAdapter[] arguments,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if(LOG.isDebugEnabled()) {
+            LOG.debug("execute action " + target + "." + getId());
+        }
+        final ActionInvocationFacet facet = getFacet(ActionInvocationFacet.class);
+        return facet.invoke(this, target, arguments,
+                interactionInitiatedBy);
+    }
+
+    protected ActionInvocationFacet getActionInvocationFacet() {
+        return getFacetedMethod().getFacet(ActionInvocationFacet.class);
+    }
+
+
+    //endregion
+
+    //region > defaults
+
+    @Override
+    public ObjectAdapter[] getDefaults(final ObjectAdapter target) {
+
+        final int parameterCount = getParameterCount();
+        final List<ObjectActionParameter> parameters = getParameters();
+
+        final Object[] parameterDefaultPojos;
+
+        final ActionDefaultsFacet facet = getFacet(ActionDefaultsFacet.class);
+        if (!facet.isNoop()) {
+            // use the old defaultXxx approach
+            parameterDefaultPojos = facet.getDefaults(target);
+            if (parameterDefaultPojos.length != parameterCount) {
+                throw new DomainModelException("Defaults array of incompatible size; expected " + parameterCount + " elements, but was " + parameterDefaultPojos.length + " for " + facet);
+            }
+            for (int i = 0; i < parameterCount; i++) {
+                if (parameterDefaultPojos[i] != null) {
+                    final ObjectSpecification componentSpec = getSpecificationLoader().loadSpecification(parameterDefaultPojos[i].getClass());
+                    final ObjectSpecification parameterSpec = parameters.get(i).getSpecification();
+                    if (!componentSpec.isOfType(parameterSpec)) {
+                        throw new DomainModelException("Defaults type incompatible with parameter " + (i + 1) + " type; expected " + parameterSpec.getFullIdentifier() + ", but was " + componentSpec.getFullIdentifier());
+                    }
+                }
+            }
+        } else {
+            // use the new defaultNXxx approach for each param in turn
+            // (the reflector will have made sure both aren't installed).
+            parameterDefaultPojos = new Object[parameterCount];
+            for (int i = 0; i < parameterCount; i++) {
+                final ActionParameterDefaultsFacet paramFacet = parameters.get(i).getFacet(ActionParameterDefaultsFacet.class);
+                if (paramFacet != null && !paramFacet.isNoop()) {
+                    parameterDefaultPojos[i] = paramFacet.getDefault(target, null);
+                } else {
+                    parameterDefaultPojos[i] = null;
+                }
+            }
+        }
+
+        final ObjectAdapter[] parameterDefaultAdapters = new ObjectAdapter[parameterCount];
+        if (parameterDefaultPojos != null) {
+            for (int i = 0; i < parameterCount; i++) {
+                parameterDefaultAdapters[i] = adapterFor(parameterDefaultPojos[i]);
+            }
+        }
+
+        return parameterDefaultAdapters;
+    }
+
+    private ObjectAdapter adapterFor(final Object pojo) {
+        return pojo == null ? null : getPersistenceSessionService().adapterFor(pojo);
+    }
+
+    //endregion
+
+    //region > choices
+
+    @Override
+    public ObjectAdapter[][] getChoices(
+            final ObjectAdapter target,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final int parameterCount = getParameterCount();
+        Object[][] parameterChoicesPojos;
+
+        final ActionChoicesFacet facet = getFacet(ActionChoicesFacet.class);
+        final List<ObjectActionParameter> parameters = getParameters();
+
+        if (!facet.isNoop()) {
+            // using the old choicesXxx() approach
+            parameterChoicesPojos = facet.getChoices(target,
+                    interactionInitiatedBy);
+
+            // if no options, or not the right number of pojos, then default
+            if (parameterChoicesPojos == null) {
+                parameterChoicesPojos = new Object[parameterCount][];
+            } else if (parameterChoicesPojos.length != parameterCount) {
+                throw new DomainModelException(
+                        String.format("Choices array of incompatible size; expected %d elements, but was %d for %s",
+                                parameterCount, parameterChoicesPojos.length, facet));
+            }
+        } else {
+            // use the new choicesNXxx approach for each param in turn
+            // (the reflector will have made sure both aren't installed).
+
+            parameterChoicesPojos = new Object[parameterCount][];
+            for (int i = 0; i < parameterCount; i++) {
+                final ActionParameterChoicesFacet paramFacet = parameters.get(i).getFacet(ActionParameterChoicesFacet.class);
+                if (paramFacet != null && !paramFacet.isNoop()) {
+                    parameterChoicesPojos[i] = paramFacet.getChoices(target, null,
+                            interactionInitiatedBy);
+                } else {
+                    parameterChoicesPojos[i] = new Object[0];
+                }
+            }
+        }
+
+        final ObjectAdapter[][] parameterChoicesAdapters = new ObjectAdapter[parameterCount][];
+        for (int i = 0; i < parameterCount; i++) {
+            final ObjectSpecification paramSpec = parameters.get(i).getSpecification();
+
+            if (parameterChoicesPojos[i] != null && parameterChoicesPojos[i].length > 0) {
+                ObjectActionParameterAbstract.checkChoicesOrAutoCompleteType(
+                        getSpecificationLoader(), parameterChoicesPojos[i], paramSpec);
+                parameterChoicesAdapters[i] = new ObjectAdapter[parameterChoicesPojos[i].length];
+                for (int j = 0; j < parameterChoicesPojos[i].length; j++) {
+                    parameterChoicesAdapters[i][j] = adapterFor(parameterChoicesPojos[i][j]);
+                }
+            } else if (paramSpec.isNotCollection()) {
+                parameterChoicesAdapters[i] = new ObjectAdapter[0];
+            } else {
+                throw new UnknownTypeException(paramSpec);
+            }
+
+            if (parameterChoicesAdapters[i].length == 0) {
+                parameterChoicesAdapters[i] = null;
+            }
+        }
+
+        return parameterChoicesAdapters;
+    }
+
+    //endregion
+
+    //region > debug, toString
+
+    @Override
+    public String debugData() {
+        final DebugString debugString = new DebugString();
+        getFacetedMethod().debugData(debugString);
+        return debugString.toString();
+    }
+
+    @Override
+    public String toString() {
+        final StringBuffer sb = new StringBuffer();
+        sb.append("Action [");
+        sb.append(super.toString());
+        sb.append(",type=");
+        sb.append(getType());
+        sb.append(",returns=");
+        sb.append(getReturnType());
+        sb.append(",parameters={");
+        for (int i = 0; i < getParameterCount(); i++) {
+            if (i > 0) {
+                sb.append(",");
+            }
+            sb.append(getParameters().get(i).getSpecification().getShortIdentifier());
+        }
+        sb.append("}]");
+        return sb.toString();
+    }
+
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
deleted file mode 100644
index ae38776..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ /dev/null
@@ -1,535 +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.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.Lists;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.RecoverableException;
-import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.exceptions.UnknownTypeException;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResultSet;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
-import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
-import org.apache.isis.core.metamodel.facets.actions.debug.DebugFacet;
-import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
-import org.apache.isis.core.metamodel.facets.actions.exploration.ExplorationFacet;
-import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
-import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
-import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
-import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
-import org.apache.isis.core.metamodel.interactions.ActionUsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ActionVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.DomainModelException;
-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.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-
-public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectAction {
-
-    private final static Logger LOG = LoggerFactory.getLogger(ObjectActionImpl.class);
-
-    public static ActionType getType(final String typeStr) {
-        final ActionType type = ActionType.valueOf(typeStr);
-        if (type == null) {
-            throw new IllegalArgumentException();
-        }
-        return type;
-    }
-
-    //region > fields
-
-    /**
-     * Lazily initialized by {@link #getParameters()} (so don't use directly!)
-     */
-    private List<ObjectActionParameter> parameters;
-
-    //endregion
-
-    //region > constructors
-
-    public ObjectActionImpl(final FacetedMethod facetedMethod, final ObjectMemberDependencies objectMemberDependencies) {
-        super(facetedMethod, FeatureType.ACTION, objectMemberDependencies);
-    }
-
-    //endregion
-
-    //region > ReturnType, OnType, Actions (set)
-    /**
-     * Always returns <tt>null</tt>.
-     */
-    @Override
-    public ObjectSpecification getSpecification() {
-        return null;
-    }
-
-    @Override
-    public ObjectSpecification getReturnType() {
-        final ActionInvocationFacet facet = getActionInvocationFacet();
-        return facet.getReturnType();
-    }
-
-    /**
-     * Returns true if the represented action returns something, else returns
-     * false.
-     */
-    @Override
-    public boolean hasReturn() {
-        if(getReturnType() == null) {
-            // this shouldn't happen; return Type always defined, even if represents void.class
-            return false;
-        }
-        return getReturnType() != getSpecificationLoader().loadSpecification(void.class);
-    }
-
-
-    @Override
-    public ObjectSpecification getOnType() {
-        final ActionInvocationFacet facet = getActionInvocationFacet();
-        return facet.getOnType();
-    }
-
-    @Override
-    public ActionSemantics.Of getSemantics() {
-        final ActionSemanticsFacet facet = getFacet(ActionSemanticsFacet.class);
-        return facet != null? facet.value(): ActionSemantics.Of.NON_IDEMPOTENT;
-    }
-
-    //endregion
-
-    //region > Type
-    @Override
-    public ActionType getType() {
-        return getType(this);
-    }
-
-    private static ActionType getType(final FacetHolder facetHolder) {
-        Facet facet = facetHolder.getFacet(DebugFacet.class);
-        if (facet != null) {
-            return ActionType.DEBUG;
-        }
-        facet = facetHolder.getFacet(ExplorationFacet.class);
-        if (facet != null) {
-            return ActionType.EXPLORATION;
-        }
-        facet = facetHolder.getFacet(PrototypeFacet.class);
-        if (facet != null) {
-            return ActionType.PROTOTYPE;
-        }
-        return ActionType.USER;
-    }
-    //endregion
-
-    //region > Parameters
-
-    @Override
-    public int getParameterCount() {
-        return getFacetedMethod().getParameters().size();
-    }
-
-    @Override
-    public boolean promptForParameters(final ObjectAdapter target) {
-        return getParameterCount() != 0;
-    }
-
-    /**
-     * Build lazily by {@link #getParameters()}.
-     * 
-     * <p>
-     * Although this is lazily loaded, the method is also <tt>synchronized</tt>
-     * so there shouldn't be any thread race conditions.
-     */
-    @Override
-    public synchronized List<ObjectActionParameter> getParameters() {
-        if (this.parameters == null) {
-            final int parameterCount = getParameterCount();
-            final List<ObjectActionParameter> parameters = Lists.newArrayList();
-            final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
-            for (int i = 0; i < parameterCount; i++) {
-                final TypedHolder paramPeer = paramPeers.get(i);
-                final ObjectSpecification specification = ObjectMemberAbstract.getSpecification(getSpecificationLoader(), paramPeer.getType());
-                
-                final ObjectActionParameter parameter;
-                if (specification.isParseable()) {
-                    parameter = new OneToOneActionParameterImpl(i, this, paramPeer);
-                } else if (specification.isNotCollection()) {
-                    parameter = new OneToOneActionParameterImpl(i, this, paramPeer);
-                } else if (specification.isParentedOrFreeCollection()) {
-                    throw new UnknownTypeException("collections not supported as parameters: " + getIdentifier());
-                } else {
-                    throw new UnknownTypeException(specification);
-                }
-                parameters.add(parameter);
-            }
-            this.parameters = parameters;
-        }
-        return parameters;
-    }
-
-    @Override
-    public synchronized List<ObjectSpecification> getParameterTypes() {
-        final List<ObjectSpecification> parameterTypes = Lists.newArrayList();
-        final List<ObjectActionParameter> parameters = getParameters();
-        for (final ObjectActionParameter parameter : parameters) {
-            parameterTypes.add(parameter.getSpecification());
-        }
-        return parameterTypes;
-    }
-
-    @Override
-    public ObjectActionParameter getParameterById(final String paramId) {
-        final List<ObjectActionParameter> allParameters = getParameters();
-        for (int i = 0; i < allParameters.size(); i++) {
-            final ObjectActionParameter param = allParameters.get(i);
-            if (Objects.equal(paramId, param.getId())) {
-                return param;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public ObjectActionParameter getParameterByName(final String paramName) {
-        final List<ObjectActionParameter> allParameters = getParameters();
-        for (int i = 0; i < allParameters.size(); i++) {
-            final ObjectActionParameter param = allParameters.get(i);
-            if (Objects.equal(paramName, param.getName())) {
-                return param;
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public List<ObjectActionParameter> getParameters(final Filter<ObjectActionParameter> filter) {
-        final List<ObjectActionParameter> allParameters = getParameters();
-        final List<ObjectActionParameter> selectedParameters = Lists.newArrayList();
-        for (int i = 0; i < allParameters.size(); i++) {
-            if (filter.accept(allParameters.get(i))) {
-                selectedParameters.add(allParameters.get(i));
-            }
-        }
-        return selectedParameters;
-    }
-
-    private ObjectActionParameter getParameter(final int position) {
-        final List<ObjectActionParameter> parameters = getParameters();
-        if (position >= parameters.size()) {
-            throw new IllegalArgumentException("getParameter(int): only " + parameters.size() + " parameters, position=" + position);
-        }
-        return parameters.get(position);
-    }
-
-    //endregion
-
-    //region > visable, usable
-
-    @Override
-    public VisibilityContext<?> createVisibleInteractionContext(
-            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new ActionVisibilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    @Override
-    public UsabilityContext<?> createUsableInteractionContext(
-            final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new ActionUsabilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-    //endregion
-
-    //region > validate
-
-    @Override
-    public Consent isProposedArgumentSetValid(
-            final ObjectAdapter target,
-            final ObjectAdapter[] proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isProposedArgumentSetValidResultSet(target, proposedArguments, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResultSet isProposedArgumentSetValidResultSet(
-            final ObjectAdapter objectAdapter,
-            final ObjectAdapter[] proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final InteractionResultSet resultSet = new InteractionResultSet();
-        final List<ObjectActionParameter> actionParameters = getParameters();
-        if (proposedArguments != null) {
-            for (int i = 0; i < proposedArguments.length; i++) {
-                final ValidityContext<?> ic =
-                        actionParameters.get(i).createProposedArgumentInteractionContext(
-                                objectAdapter, proposedArguments, i, interactionInitiatedBy
-                        );
-                InteractionUtils.isValidResultSet(getParameter(i), ic, resultSet);
-            }
-        }
-        // only check the action's own validity if all the arguments are OK.
-        if (resultSet.isAllowed()) {
-            final ValidityContext<?> ic = createActionInvocationInteractionContext(
-                    objectAdapter, proposedArguments, interactionInitiatedBy);
-            InteractionUtils.isValidResultSet(this, ic, resultSet);
-        }
-        return resultSet;
-    }
-
-    private ActionInvocationContext createActionInvocationInteractionContext(
-            final ObjectAdapter targetObject,
-            final ObjectAdapter[] proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ActionInvocationContext(targetObject, getIdentifier(), proposedArguments,
-                interactionInitiatedBy);
-    }
-
-    //endregion
-
-    //region > executeWithRuleChecking, execute
-
-    @Override
-    public ObjectAdapter executeWithRuleChecking(
-            final ObjectAdapter target,
-            final ObjectAdapter[] arguments,
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final Where where) {
-
-        // see it?
-        final Consent visibility = isVisible(target, interactionInitiatedBy, where);
-        if (visibility.isVetoed()) {
-            throw new AuthorizationException();
-        }
-
-        // use it?
-        final Consent usability = isUsable(target, interactionInitiatedBy, where);
-        if(usability.isVetoed()) {
-            throw new AuthorizationException();
-        }
-
-        // do it?
-        final Consent validity = isProposedArgumentSetValid(target, arguments, interactionInitiatedBy);
-        if(validity.isVetoed()) {
-            throw new RecoverableException(validity.getReason());
-        }
-
-        return execute(target, arguments, interactionInitiatedBy);
-    }
-
-    @Override
-    public ObjectAdapter execute(
-            final ObjectAdapter target,
-            final ObjectAdapter[] arguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("execute action " + target + "." + getId());
-        }
-        final ActionInvocationFacet facet = getFacet(ActionInvocationFacet.class);
-        return facet.invoke(this, target, arguments,
-                interactionInitiatedBy);
-    }
-
-    protected ActionInvocationFacet getActionInvocationFacet() {
-        return getFacetedMethod().getFacet(ActionInvocationFacet.class);
-    }
-
-
-    //endregion
-
-    //region > defaults
-
-    @Override
-    public ObjectAdapter[] getDefaults(final ObjectAdapter target) {
-
-        final int parameterCount = getParameterCount();
-        final List<ObjectActionParameter> parameters = getParameters();
-
-        final Object[] parameterDefaultPojos;
-
-        final ActionDefaultsFacet facet = getFacet(ActionDefaultsFacet.class);
-        if (!facet.isNoop()) {
-            // use the old defaultXxx approach
-            parameterDefaultPojos = facet.getDefaults(target);
-            if (parameterDefaultPojos.length != parameterCount) {
-                throw new DomainModelException("Defaults array of incompatible size; expected " + parameterCount + " elements, but was " + parameterDefaultPojos.length + " for " + facet);
-            }
-            for (int i = 0; i < parameterCount; i++) {
-                if (parameterDefaultPojos[i] != null) {
-                    final ObjectSpecification componentSpec = getSpecificationLoader().loadSpecification(parameterDefaultPojos[i].getClass());
-                    final ObjectSpecification parameterSpec = parameters.get(i).getSpecification();
-                    if (!componentSpec.isOfType(parameterSpec)) {
-                        throw new DomainModelException("Defaults type incompatible with parameter " + (i + 1) + " type; expected " + parameterSpec.getFullIdentifier() + ", but was " + componentSpec.getFullIdentifier());
-                    }
-                }
-            }
-        } else {
-            // use the new defaultNXxx approach for each param in turn
-            // (the reflector will have made sure both aren't installed).
-            parameterDefaultPojos = new Object[parameterCount];
-            for (int i = 0; i < parameterCount; i++) {
-                final ActionParameterDefaultsFacet paramFacet = parameters.get(i).getFacet(ActionParameterDefaultsFacet.class);
-                if (paramFacet != null && !paramFacet.isNoop()) {
-                    parameterDefaultPojos[i] = paramFacet.getDefault(target, null);
-                } else {
-                    parameterDefaultPojos[i] = null;
-                }
-            }
-        }
-
-        final ObjectAdapter[] parameterDefaultAdapters = new ObjectAdapter[parameterCount];
-        if (parameterDefaultPojos != null) {
-            for (int i = 0; i < parameterCount; i++) {
-                parameterDefaultAdapters[i] = adapterFor(parameterDefaultPojos[i]);
-            }
-        }
-
-        return parameterDefaultAdapters;
-    }
-
-    private ObjectAdapter adapterFor(final Object pojo) {
-        return pojo == null ? null : getPersistenceSessionService().adapterFor(pojo);
-    }
-
-    //endregion
-
-    //region > choices
-
-    @Override
-    public ObjectAdapter[][] getChoices(
-            final ObjectAdapter target,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final int parameterCount = getParameterCount();
-        Object[][] parameterChoicesPojos;
-
-        final ActionChoicesFacet facet = getFacet(ActionChoicesFacet.class);
-        final List<ObjectActionParameter> parameters = getParameters();
-
-        if (!facet.isNoop()) {
-            // using the old choicesXxx() approach
-            parameterChoicesPojos = facet.getChoices(target,
-                    interactionInitiatedBy);
-
-            // if no options, or not the right number of pojos, then default
-            if (parameterChoicesPojos == null) {
-                parameterChoicesPojos = new Object[parameterCount][];
-            } else if (parameterChoicesPojos.length != parameterCount) {
-                throw new DomainModelException(
-                        String.format("Choices array of incompatible size; expected %d elements, but was %d for %s",
-                                parameterCount, parameterChoicesPojos.length, facet));
-            }
-        } else {
-            // use the new choicesNXxx approach for each param in turn
-            // (the reflector will have made sure both aren't installed).
-
-            parameterChoicesPojos = new Object[parameterCount][];
-            for (int i = 0; i < parameterCount; i++) {
-                final ActionParameterChoicesFacet paramFacet = parameters.get(i).getFacet(ActionParameterChoicesFacet.class);
-                if (paramFacet != null && !paramFacet.isNoop()) {
-                    parameterChoicesPojos[i] = paramFacet.getChoices(target, null,
-                            interactionInitiatedBy);
-                } else {
-                    parameterChoicesPojos[i] = new Object[0];
-                }
-            }
-        }
-
-        final ObjectAdapter[][] parameterChoicesAdapters = new ObjectAdapter[parameterCount][];
-        for (int i = 0; i < parameterCount; i++) {
-            final ObjectSpecification paramSpec = parameters.get(i).getSpecification();
-
-            if (parameterChoicesPojos[i] != null && parameterChoicesPojos[i].length > 0) {
-                ObjectActionParameterAbstract.checkChoicesOrAutoCompleteType(
-                        getSpecificationLoader(), parameterChoicesPojos[i], paramSpec);
-                parameterChoicesAdapters[i] = new ObjectAdapter[parameterChoicesPojos[i].length];
-                for (int j = 0; j < parameterChoicesPojos[i].length; j++) {
-                    parameterChoicesAdapters[i][j] = adapterFor(parameterChoicesPojos[i][j]);
-                }
-            } else if (paramSpec.isNotCollection()) {
-                parameterChoicesAdapters[i] = new ObjectAdapter[0];
-            } else {
-                throw new UnknownTypeException(paramSpec);
-            }
-
-            if (parameterChoicesAdapters[i].length == 0) {
-                parameterChoicesAdapters[i] = null;
-            }
-        }
-
-        return parameterChoicesAdapters;
-    }
-
-    //endregion
-
-    //region > debug, toString
-
-    @Override
-    public String debugData() {
-        final DebugString debugString = new DebugString();
-        getFacetedMethod().debugData(debugString);
-        return debugString.toString();
-    }
-
-    @Override
-    public String toString() {
-        final StringBuffer sb = new StringBuffer();
-        sb.append("Action [");
-        sb.append(super.toString());
-        sb.append(",type=");
-        sb.append(getType());
-        sb.append(",returns=");
-        sb.append(getReturnType());
-        sb.append(",parameters={");
-        for (int i = 0; i < getParameterCount(); i++) {
-            if (i > 0) {
-                sb.append(",");
-            }
-            sb.append(getParameters().get(i).getSpecification().getShortIdentifier());
-        }
-        sb.append("}]");
-        return sb.toString();
-    }
-
-    //endregion
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 64b48e7..3f68d8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -19,6 +19,7 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.base.Objects;
 import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.Identifier;
@@ -32,6 +33,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
+import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -42,6 +44,7 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
@@ -50,7 +53,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
-public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMember {
+public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInMember {
 
     /**
      * The type of the mixin (providing the action), eg annotated with {@link org.apache.isis.applib.annotation.Mixin}.
@@ -58,9 +61,9 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
     private final Class<?> mixinType;
 
     /**
-     * The {@link ObjectActionImpl} for the action being mixed in (ie on the {@link #mixinType}.
+     * The {@link ObjectActionDefault} for the action being mixed in (ie on the {@link #mixinType}.
      */
-    private final ObjectActionImpl mixinAction;
+    private final ObjectActionDefault mixinAction;
 
     /**
      * The domain object type being mixed in to (being supplemented).
@@ -81,7 +84,7 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
 
     public ObjectActionMixedIn(
             final Class<?> mixinType,
-            final ObjectActionImpl mixinAction,
+            final ObjectActionDefault mixinAction,
             final ObjectSpecification mixedInType,
             final ObjectMemberDependencies objectMemberDependencies) {
         super(mixinAction.getFacetedMethod(), objectMemberDependencies);
@@ -90,16 +93,47 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
         this.mixinAction = mixinAction;
         this.mixedInType = mixedInType;
 
-        // copy over facets from mixin type to own.
+        // copy over facets from mixin action to self
         FacetUtil.copyFacets(mixinAction.getFacetedMethod(), facetHolder);
 
+        // adjust name if necessary
+        final String name = getName();
+
+        String memberName = null;
+        if(Objects.equal(name, "_")) {
+            memberName = determineNameFrom(mixinAction);
+            FacetUtil.addFacet(new NamedFacetInferred(memberName, facetHolder));
+        }
+
         // calculate the identifier
         final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
-        final String memberName = mixinIdentifier.getMemberName();
+        memberName = memberName != null? memberName : mixinIdentifier.getMemberName();
         List<String> memberParameterNames = mixinIdentifier.getMemberParameterNames();
         identifier = Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), memberName, memberParameterNames);
     }
 
+    private static String determineNameFrom(final ObjectActionDefault mixinAction) {
+        return suffixAfterUnderscore(mixinAction.getOnType().getSingularName());
+    }
+
+    static String suffixAfterUnderscore(final String singularName) {
+        return StringExtensions.asCapitalizedName(suffix(singularName));
+    }
+
+    private static String suffix(final String singularName) {
+        if (singularName.endsWith("_")) {
+            if (Objects.equal(singularName, "_")) {
+                return singularName;
+            }
+            return singularName;
+        }
+        final int indexOfUnderscore = singularName.lastIndexOf('_');
+        if (indexOfUnderscore == -1) {
+            return singularName;
+        }
+        return singularName.substring(indexOfUnderscore + 1);
+    }
+
     @Override
     public ObjectSpecification getOnType() {
         return mixedInType;

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 81bff3d..ec23dab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
@@ -64,10 +65,10 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 public abstract class ObjectActionParameterAbstract implements ObjectActionParameter {
 
     private final int number;
-    private final ObjectActionImpl parentAction;
+    private final ObjectActionDefault parentAction;
     private final TypedHolder peer;
 
-    protected ObjectActionParameterAbstract(final int number, final ObjectActionImpl objectAction, final TypedHolder peer) {
+    protected ObjectActionParameterAbstract(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
         this.number = number;
         this.parentAction = objectAction;
         this.peer = peer;
@@ -198,57 +199,70 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     //region > FacetHolder
 
+    protected FacetHolder getFacetHolder() {
+        return peer;
+    }
+
     @Override
     public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return peer != null && peer.containsFacet(facetType);
+        final FacetHolder facetHolder = getFacetHolder();
+        return facetHolder != null && facetHolder.containsFacet(facetType);
     }
 
     @Override
     public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        return peer != null && peer.containsDoOpFacet(facetType);
+        final FacetHolder facetHolder = getFacetHolder();
+        return facetHolder != null && facetHolder.containsDoOpFacet(facetType);
     }
 
     @Override
     public <T extends Facet> T getFacet(final Class<T> cls) {
-        return peer != null ? peer.getFacet(cls) : null;
+        final FacetHolder facetHolder = getFacetHolder();
+        return facetHolder != null ? facetHolder.getFacet(cls) : null;
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public Class<? extends Facet>[] getFacetTypes() {
-        return peer != null ? peer.getFacetTypes() : new Class[] {};
+        final FacetHolder facetHolder = getFacetHolder();
+        return facetHolder != null ? facetHolder.getFacetTypes() : new Class[] {};
     }
 
     @Override
     public List<Facet> getFacets(final Filter<Facet> filter) {
-        return peer != null ? peer.getFacets(filter) : Lists.<Facet> newArrayList();
+        final FacetHolder facetHolder = getFacetHolder();
+        return facetHolder != null ? facetHolder.getFacets(filter) : Lists.<Facet> newArrayList();
     }
 
     @Override
     public void addFacet(final Facet facet) {
-        if (peer != null) {
-            peer.addFacet(facet);
+        final FacetHolder facetHolder = getFacetHolder();
+        if (facetHolder != null) {
+            facetHolder.addFacet(facet);
         }
     }
 
     @Override
     public void addFacet(final MultiTypedFacet facet) {
-        if (peer != null) {
-            peer.addFacet(facet);
+        final FacetHolder facetHolder = getFacetHolder();
+        if (facetHolder != null) {
+            facetHolder.addFacet(facet);
         }
     }
 
     @Override
     public void removeFacet(final Facet facet) {
-        if (peer != null) {
-            peer.removeFacet(facet);
+        final FacetHolder facetHolder = getFacetHolder();
+        if (facetHolder != null) {
+            facetHolder.removeFacet(facet);
         }
     }
 
     @Override
     public void removeFacet(final Class<? extends Facet> facetType) {
-        if (peer != null) {
-            peer.removeFacet(facetType);
+        final FacetHolder facetHolder = getFacetHolder();
+        if (facetHolder != null) {
+            facetHolder.removeFacet(facetType);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 57eb6fb..85ba2f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -31,6 +31,7 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -96,13 +97,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return id;
     }
 
-    /**
-     * @return the facetedMethod
-     */
-    public FacetedMethod getFacetedMethod() {
-        return facetedMethod;
-    }
-
     @Override
     public Identifier getIdentifier() {
         return getFacetedMethod().getIdentifier();
@@ -117,49 +111,57 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
 
     //region > Facets
 
+    public FacetedMethod getFacetedMethod() {
+        return facetedMethod;
+    }
+
+    protected FacetHolder getFacetHolder() {
+        return getFacetedMethod();
+    }
+
     @Override
     public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return getFacetedMethod().containsFacet(facetType);
+        return getFacetHolder().containsFacet(facetType);
     }
 
     @Override
     public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        return getFacetedMethod().containsDoOpFacet(facetType);
+        return getFacetHolder().containsDoOpFacet(facetType);
     }
 
     @Override
     public <T extends Facet> T getFacet(final Class<T> cls) {
-        return getFacetedMethod().getFacet(cls);
+        return getFacetHolder().getFacet(cls);
     }
 
     @Override
     public Class<? extends Facet>[] getFacetTypes() {
-        return getFacetedMethod().getFacetTypes();
+        return getFacetHolder().getFacetTypes();
     }
 
     @Override
     public List<Facet> getFacets(final Filter<Facet> filter) {
-        return getFacetedMethod().getFacets(filter);
+        return getFacetHolder().getFacets(filter);
     }
 
     @Override
     public void addFacet(final Facet facet) {
-        getFacetedMethod().addFacet(facet);
+        getFacetHolder().addFacet(facet);
     }
 
     @Override
     public void addFacet(final MultiTypedFacet facet) {
-        getFacetedMethod().addFacet(facet);
+        getFacetHolder().addFacet(facet);
     }
 
     @Override
     public void removeFacet(final Facet facet) {
-        getFacetedMethod().removeFacet(facet);
+        getFacetHolder().removeFacet(facet);
     }
 
     @Override
     public void removeFacet(final Class<? extends Facet> facetType) {
-        getFacetedMethod().removeFacet(facetType);
+        getFacetHolder().removeFacet(facetType);
     }
 
     //endregion

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/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 7d60490..f7968a3 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
@@ -870,7 +870,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.USER, Contributed.INCLUDED, Filters
                 .<ObjectAction>any());
 
-        final List<ObjectActionImpl> contributedActions = Lists.newArrayList();
+        final List<ObjectActionDefault> contributedActions = Lists.newArrayList();
         for (final ObjectAction serviceAction : serviceActions) {
             if (isAlwaysHidden(serviceAction)) {
                 continue;
@@ -885,25 +885,25 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if (serviceAction.getParameterCount() != 1 || contributeeParameterMatchOf(serviceAction) == -1) {
                 continue;
             }
-            if(!(serviceAction instanceof ObjectActionImpl)) {
+            if(!(serviceAction instanceof ObjectActionDefault)) {
                 continue;
             }
             if(!serviceAction.getSemantics().isSafeInNature()) {
                 continue;
             }
-            contributedActions.add((ObjectActionImpl) serviceAction);
+            contributedActions.add((ObjectActionDefault) serviceAction);
         }
 
         return Lists.newArrayList(Iterables.transform(contributedActions, createContributeeAssociationFunctor(
                 servicePojo, this)));
     }
 
-    private Function<ObjectActionImpl, ObjectAssociation> createContributeeAssociationFunctor(
+    private Function<ObjectActionDefault, ObjectAssociation> createContributeeAssociationFunctor(
             final Object servicePojo,
             final ObjectSpecification contributeeType) {
-        return new Function<ObjectActionImpl, ObjectAssociation>(){
+        return new Function<ObjectActionDefault, ObjectAssociation>(){
             @Override
-            public ObjectAssociation apply(ObjectActionImpl input) {
+            public ObjectAssociation apply(ObjectActionDefault input) {
                 final ObjectSpecification returnType = input.getReturnType();
                 final ObjectAssociationAbstract association = returnType.isNotCollection()
                         ? new OneToOneAssociationContributee(servicePojo, input, contributeeType,
@@ -957,10 +957,10 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if(notContributed != null && notContributed.toActions()) {
                 continue;
             }
-            if(!(serviceAction instanceof ObjectActionImpl)) {
+            if(!(serviceAction instanceof ObjectActionDefault)) {
                 continue;
             }
-            final ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
+            final ObjectActionDefault contributedAction = (ObjectActionDefault) serviceAction;
 
             // see if qualifies by inspecting all parameters
             final int contributeeParam = contributeeParameterMatchOf(contributedAction);
@@ -1044,10 +1044,10 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             if (isAlwaysHidden(mixinTypeAction)) {
                 continue;
             }
-            if(!(mixinTypeAction instanceof ObjectActionImpl)) {
+            if(!(mixinTypeAction instanceof ObjectActionDefault)) {
                 continue;
             }
-            final ObjectActionImpl mixinAction = (ObjectActionImpl) mixinTypeAction;
+            final ObjectActionDefault mixinAction = (ObjectActionDefault) mixinTypeAction;
 
             ObjectActionMixedIn mixedInAction =
                     new ObjectActionMixedIn(mixinType, mixinAction, this, objectMemberDependencies);

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/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 953d4bc..98ed793 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
@@ -21,15 +21,12 @@ import java.util.List;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
@@ -44,7 +41,7 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
-public class OneToManyAssociationContributee extends OneToManyAssociationImpl implements ContributeeMember2 {
+public class OneToManyAssociationContributee extends OneToManyAssociationDefault implements ContributeeMember2 {
 
     private final Object servicePojo;
     private final ObjectAction serviceAction;
@@ -58,9 +55,12 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
     
     private final Identifier identifier;
 
-    private static ObjectSpecification typeOfSpec(final ObjectActionImpl objectAction, ObjectMemberDependencies objectMemberDependencies) {
+    private static ObjectSpecification typeOfSpec(
+            final ObjectActionDefault objectAction,
+            final ObjectMemberDependencies objectMemberDependencies) {
+
         final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
-        SpecificationLoader specificationLookup = objectMemberDependencies.getSpecificationLoader();
+        final SpecificationLoader specificationLookup = objectMemberDependencies.getSpecificationLoader();
         // TODO: a bit of a hack; ought really to set up a fallback TypeOfFacetDefault which ensures that there is always
         // a TypeOfFacet for any contributee associations created from contributed actions.
         Class<? extends Object> cls = actionTypeOfFacet != null? actionTypeOfFacet.value(): Object.class;
@@ -69,10 +69,11 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
     
     public OneToManyAssociationContributee(
             final Object servicePojo,
-            final ObjectActionImpl serviceAction,
+            final ObjectActionDefault serviceAction,
             final ObjectSpecification contributeeType,
             final ObjectMemberDependencies objectMemberDependencies) {
-        super(serviceAction.getFacetedMethod(), typeOfSpec(serviceAction, objectMemberDependencies),
+        super(serviceAction.getFacetedMethod(),
+                typeOfSpec(serviceAction, objectMemberDependencies),
                 objectMemberDependencies);
         this.servicePojo = servicePojo;
         this.serviceAction = serviceAction;
@@ -164,54 +165,18 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
     //region > FacetHolder
 
     @Override
-    public Class<? extends Facet>[] getFacetTypes() {
-        return facetHolder.getFacetTypes();
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(Class<T> cls) {
-        return facetHolder.getFacet(cls);
-    }
-    
-    @Override
-    public boolean containsFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
-        return facetHolder.containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public List<Facet> getFacets(Filter<Facet> filter) {
-        return facetHolder.getFacets(filter);
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
     }
 
-    @Override
-    public void addFacet(Facet facet) {
-        facetHolder.addFacet(facet);
-    }
-
-    @Override
-    public void addFacet(MultiTypedFacet facet) {
-        facetHolder.addFacet(facet);
-    }
-    
-    @Override
-    public void removeFacet(Facet facet) {
-        facetHolder.removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Class<? extends Facet> facetType) {
-        facetHolder.removeFacet(facetType);
-    }
+    //endregion
 
-    public ObjectAdapter getServiceAdapter() {
+    private ObjectAdapter getServiceAdapter() {
         return getPersistenceSessionService().adapterFor(servicePojo);
     }
 
+    //region > ContributeeMember2 impl (getServiceContributedBy)
+
     @Override
     public ObjectSpecification getServiceContributedBy() {
         return getServiceAdapter().getSpecification();


[03/12] isis git commit: ISIS-1194: deleting ParseableEntryFeature interface and related classes/modified implementors.

Posted by da...@apache.org.
ISIS-1194: deleting ParseableEntryFeature interface and related classes/modified implementors.


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

Branch: refs/heads/ISIS-1213
Commit: 9961b391645db88032f036e558be76d2bf39061b
Parents: 3fc01b5
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Oct 12 23:50:44 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Oct 12 23:50:44 2015 +0100

----------------------------------------------------------------------
 .../feature/ParseableEntryActionParameter.java  | 28 ------------
 .../spec/feature/ParseableEntryFeature.java     | 45 --------------------
 .../specimpl/ObjectActionParameterAbstract.java |  6 +--
 .../ObjectActionParameterParseable.java         | 30 +------------
 4 files changed, 4 insertions(+), 105 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9961b391/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryActionParameter.java
deleted file mode 100644
index 958ba1a..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryActionParameter.java
+++ /dev/null
@@ -1,28 +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.core.metamodel.spec.feature;
-
-/**
- * Equivalent to {@link ObjectAssociation}, but for parameter rather than
- * properties.
- */
-public interface ParseableEntryActionParameter extends OneToOneActionParameter, ParseableEntryFeature {
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/9961b391/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryFeature.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryFeature.java
deleted file mode 100644
index be86dd1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ParseableEntryFeature.java
+++ /dev/null
@@ -1,45 +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.core.metamodel.spec.feature;
-
-public interface ParseableEntryFeature extends OneToOneFeature {
-
-    /**
-     * The typical length of each line for this value, as a number of
-     * characters.
-     */
-    int getTypicalLineLength();
-
-    /**
-     * Returns the maximum number of characters for a value of this type.
-     */
-    int getMaximumLength();
-
-    /**
-     * Returns the number of lines for a multi-line value.
-     */
-    int getNoLines();
-
-    /**
-     * Determines if a multi-line value can be wrapped when displayed.
-     */
-    boolean canWrap();
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/9961b391/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index f43090b..9f664fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -191,12 +191,12 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     @Override
     public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return peer != null ? peer.containsFacet(facetType) : false;
+        return peer != null && peer.containsFacet(facetType);
     }
 
     @Override
     public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
-        return peer == null ? false : peer.containsDoOpFacet(facetType);
+        return peer != null && peer.containsDoOpFacet(facetType);
     }
 
     @Override
@@ -332,7 +332,7 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
             addAllInstancesForType(adapters);
         }
         */
-        return adapters.toArray(new ObjectAdapter[0]);
+        return adapters.toArray(new ObjectAdapter[adapters.size()]);
     }
     
     // /////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/9961b391/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
index 70fa8ef..40318c2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
@@ -25,45 +25,17 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.multiline.MultiLineFacet;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.ParseableEntryActionParameter;
 
-public class ObjectActionParameterParseable extends ObjectActionParameterAbstract implements ParseableEntryActionParameter {
+public class ObjectActionParameterParseable extends ObjectActionParameterAbstract implements OneToOneActionParameter {
 
     public ObjectActionParameterParseable(final int index, final ObjectActionImpl action, final TypedHolder peer) {
         super(index, action, peer);
     }
 
-    @Override
-    public int getNoLines() {
-        final MultiLineFacet facet = getFacet(MultiLineFacet.class);
-        return facet.numberOfLines();
-    }
-
-    @Override
-    public boolean canWrap() {
-        final MultiLineFacet facet = getFacet(MultiLineFacet.class);
-        return !facet.preventWrapping();
-    }
-
-    @Override
-    public int getMaximumLength() {
-        final MaxLengthFacet facet = getFacet(MaxLengthFacet.class);
-        return facet.value();
-    }
-
-    @Override
-    public int getTypicalLineLength() {
-        final TypicalLengthFacet facet = getFacet(TypicalLengthFacet.class);
-        return facet.value();
-    }
-    
     protected ObjectAdapter doCoerceProposedValue(
             final ObjectAdapter adapter,
             final Object proposedValue,


[07/12] isis git commit: ISIS-1194: removed the reset of the ObjectActionParameterParseable stuff, plus unused subclasses.

Posted by da...@apache.org.
ISIS-1194: removed the reset of the ObjectActionParameterParseable stuff, plus unused subclasses.


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

Branch: refs/heads/ISIS-1213
Commit: c62f937d0653c6c0ea25ae571350caf56414395b
Parents: e618fdc
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 13 06:44:12 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 13 06:44:12 2015 +0100

----------------------------------------------------------------------
 .../specimpl/ObjectActionContributee.java       | 14 +---
 .../specloader/specimpl/ObjectActionImpl.java   |  7 +-
 .../specimpl/ObjectActionMixedIn.java           |  8 +-
 .../ObjectActionParameterParseable.java         | 33 --------
 ...jectActionParameterParseableContributee.java | 86 --------------------
 .../ObjectActionParameterParseableMixedIn.java  | 59 --------------
 .../OneToOneActionParameterContributee.java     |  3 -
 .../OneToOneActionParameterMixedIn.java         | 10 +--
 8 files changed, 12 insertions(+), 208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/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 7db1bdf..8fcf8d8 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
@@ -136,17 +136,9 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
                 final ObjectActionParameterAbstract serviceParameter = 
                         (ObjectActionParameterAbstract) serviceParameters.get(serviceParamNum);
                 final ObjectActionParameterContributee contributedParam;
-                if(serviceParameter instanceof ObjectActionParameterParseable) {
-                    contributedParam = new ObjectActionParameterParseableContributee(
-                            getServiceAdapter(), serviceAction, serviceParameter, serviceParamNum,
-                            contributeeParamNum, this);
-                } else if(serviceParameter instanceof OneToOneActionParameterImpl) {
-                    contributedParam = new OneToOneActionParameterContributee(
-                            getServiceAdapter(), serviceAction, serviceParameter, serviceParamNum,
-                            contributeeParamNum, this);
-                } else {
-                    throw new RuntimeException("Unknown implementation of ObjectActionParameter; " + serviceParameter.getClass().getName());
-                }
+                contributedParam = new OneToOneActionParameterContributee(
+                        getServiceAdapter(), serviceAction, serviceParameter, serviceParamNum,
+                        contributeeParamNum, this);
                 contributeeParameters.add(contributedParam);
                 
                 contributeeParamNum++;

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
index 02e63a9..cdc0d56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
@@ -43,13 +43,13 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.debug.DebugFacet;
 import org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 import org.apache.isis.core.metamodel.facets.actions.exploration.ExplorationFacet;
-import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
 import org.apache.isis.core.metamodel.facets.actions.prototype.PrototypeFacet;
 import org.apache.isis.core.metamodel.facets.actions.semantics.ActionSemanticsFacet;
+import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
 import org.apache.isis.core.metamodel.facets.param.defaults.ActionParameterDefaultsFacet;
 import org.apache.isis.core.metamodel.interactions.ActionInvocationContext;
@@ -61,7 +61,6 @@ import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.DomainModelException;
-import org.apache.isis.core.metamodel.spec.Instance;
 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.ObjectActionParameter;
@@ -196,7 +195,7 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
                 
                 final ObjectActionParameter parameter;
                 if (specification.isParseable()) {
-                    parameter = new ObjectActionParameterParseable(i, this, paramPeer);
+                    parameter = new OneToOneActionParameterImpl(i, this, paramPeer);
                 } else if (specification.isNotCollection()) {
                     parameter = new OneToOneActionParameterImpl(i, this, paramPeer);
                 } else if (specification.isParentedOrFreeCollection()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 8e113a5..9574080 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -121,13 +121,7 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
                 final ObjectActionParameterAbstract mixinParameter =
                         (ObjectActionParameterAbstract) mixinActionParameters.get(paramNum);
                 final ObjectActionParameterMixedIn mixedInParameter;
-                if(mixinParameter instanceof ObjectActionParameterParseable) {
-                    mixedInParameter = new ObjectActionParameterParseableMixedIn(mixinParameter, this);
-                } else if(mixinParameter instanceof OneToOneActionParameterImpl) {
-                    mixedInParameter = new OneToOneActionParameterMixedIn(mixinParameter, this);
-                } else {
-                    throw new RuntimeException("Unknown implementation of ObjectActionParameter; " + mixinParameter.getClass().getName());
-                }
+                mixedInParameter = new OneToOneActionParameterMixedIn(mixinParameter, this);
                 mixedInParameters.add(mixedInParameter);
             }
             this.parameters = mixedInParameters;

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
deleted file mode 100644
index 8d44071..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ /dev/null
@@ -1,33 +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.core.metamodel.specloader.specimpl;
-
-import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
-
-public class ObjectActionParameterParseable extends ObjectActionParameterAbstract implements OneToOneActionParameter {
-
-    public ObjectActionParameterParseable(final int index, final ObjectActionImpl action, final TypedHolder peer) {
-        super(index, action, peer);
-    }
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
deleted file mode 100644
index d70de92..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableContributee.java
+++ /dev/null
@@ -1,86 +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.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.lang.ListExtensions;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-
-/**
- * REVIEW: this is a bit hacky having 'Contributed' subtypes of both {@link ObjectActionParameterParseable} and also
- * {@link OneToOneActionParameterImpl}.  However, the {@link ObjectActionParameterParseable parseable} version
- * only seems to be used by the DnD viewer; Scimpi, Wicket and RO do not.  So, we could hopefully simplify the
- * hierarchy at some point.
- */
-public class ObjectActionParameterParseableContributee extends ObjectActionParameterParseable implements ObjectActionParameterContributee {
-
-    private final ObjectAdapter serviceAdapter;
-    @SuppressWarnings("unused")
-    private final ObjectActionImpl serviceAction;
-    private final ObjectActionParameter serviceActionParameter;
-    @SuppressWarnings("unused")
-    private final int serviceParamNumber;
-    @SuppressWarnings("unused")
-    private final int contributeeParamNumber;
-    private final ObjectActionContributee contributeeAction;
-
-    public ObjectActionParameterParseableContributee(
-            final ObjectAdapter serviceAdapter,
-            final ObjectActionImpl serviceAction,
-            final ObjectActionParameterAbstract serviceActionParameter,
-            final int serviceParamNumber,
-            final int contributeeParamNumber,
-            final ObjectActionContributee contributeeAction) {
-        super(contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
-        this.serviceAdapter = serviceAdapter;
-        this.serviceAction = serviceAction;
-        this.serviceActionParameter = serviceActionParameter;
-        this.serviceParamNumber = serviceParamNumber;
-        this.contributeeParamNumber = contributeeParamNumber;
-        this.contributeeAction = contributeeAction;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter adapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return serviceActionParameter.getAutoComplete(serviceAdapter, searchArg,
-                interactionInitiatedBy);
-    }
-
-    protected ObjectAdapter targetForDefaultOrChoices(ObjectAdapter adapter, final List<ObjectAdapter> argumentsIfAvailable) {
-        return serviceAdapter;
-    }
-
-    protected List<ObjectAdapter> argsForDefaultOrChoices(final ObjectAdapter contributee, final List<ObjectAdapter> argumentsIfAvailable) {
-
-        final List<ObjectAdapter> suppliedArgs = ListExtensions.mutableCopy(argumentsIfAvailable);
-        
-        final int contributeeParam = contributeeAction.getContributeeParam();
-        ListExtensions.insert(suppliedArgs, contributeeParam, contributee);
-        
-        return suppliedArgs;
-    }
-
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
deleted file mode 100644
index 333487a..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
+++ /dev/null
@@ -1,59 +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.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-
-/**
- * REVIEW: this is a bit hacky having 'Contributed' subtypes of both {@link ObjectActionParameterParseable} and also
- * {@link OneToOneActionParameterImpl}.  However, the {@link ObjectActionParameterParseable parseable} version
- * only seems to be used by the DnD viewer; Scimpi, Wicket and RO do not.  So, we could hopefully simplify the
- * hierarchy at some point.
- */
-public class ObjectActionParameterParseableMixedIn extends ObjectActionParameterParseable implements ObjectActionParameterMixedIn {
-
-    private final ObjectActionParameterAbstract mixinParameter;
-    private final ObjectActionMixedIn objectActionMixedIn;
-
-    public ObjectActionParameterParseableMixedIn(
-            final ObjectActionParameterAbstract mixinParameter,
-            final ObjectActionMixedIn objectActionMixedIn) {
-        super(mixinParameter.getNumber(), objectActionMixedIn, mixinParameter.getPeer());
-        this.mixinParameter = mixinParameter;
-        this.objectActionMixedIn = objectActionMixedIn;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter mixedInAdapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinParameter.getAutoComplete(objectActionMixedIn.mixinAdapterFor(mixedInAdapter), searchArg, interactionInitiatedBy);
-    }
-
-    protected ObjectAdapter targetForDefaultOrChoices(
-            final ObjectAdapter mixedInAdapter,
-            final List<ObjectAdapter> argumentsIfAvailable) {
-        return objectActionMixedIn.mixinAdapterFor(mixedInAdapter);
-    }
-
-
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index 77ed327..c9df053 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -26,12 +26,9 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
 
     private final ObjectAdapter serviceAdapter;
-    @SuppressWarnings("unused")
     private final ObjectActionImpl serviceAction;
     private final ObjectActionParameter serviceActionParameter;
-    @SuppressWarnings("unused")
     private final int serviceParamNumber;
-    @SuppressWarnings("unused")
     private final int contributeeParamNumber;
     private final ObjectActionContributee contributeeAction;
 

http://git-wip-us.apache.org/repos/asf/isis/blob/c62f937d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index f8e12a0..d832cf8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -24,14 +24,14 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl implements ObjectActionParameterMixedIn {
 
-    private final ObjectActionParameter mixinActionParameter;
+    private final ObjectActionParameter mixinParameter;
     private final ObjectActionMixedIn mixedInAction;
 
     public OneToOneActionParameterMixedIn(
-            final ObjectActionParameterAbstract mixinActionParameter,
+            final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
-        super(mixinActionParameter.getNumber(), mixedInAction, mixinActionParameter.getPeer());
-        this.mixinActionParameter = mixinActionParameter;
+        super(mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
+        this.mixinParameter = mixinParameter;
         this.mixedInAction = mixedInAction;
     }
 
@@ -40,7 +40,7 @@ public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl
             final ObjectAdapter mixedInAdapter,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinActionParameter.getAutoComplete(
+        return mixinParameter.getAutoComplete(
                 mixinAdapterFor(mixedInAdapter), searchArg,
                 interactionInitiatedBy);
     }


[02/12] isis git commit: ISIS-1213: add in parameters for mix-in actions.

Posted by da...@apache.org.
ISIS-1213: add in parameters for mix-in actions.


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

Branch: refs/heads/ISIS-1213
Commit: 3fc01b5494391a1aea3010506412d15b0617484d
Parents: 643b394
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Oct 12 23:41:03 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Oct 12 23:41:03 2015 +0100

----------------------------------------------------------------------
 .../specimpl/ObjectActionMixedIn.java           | 34 ++++++++++-
 .../specimpl/ObjectActionParameterMixedIn.java  | 23 ++++++++
 .../ObjectActionParameterParseableMixedIn.java  | 59 ++++++++++++++++++++
 .../OneToOneActionParameterMixedIn.java         | 59 ++++++++++++++++++++
 4 files changed, 173 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/3fc01b54/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 42abd39..8e113a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -19,6 +19,8 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
@@ -29,6 +31,7 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
 import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.core.commons.lang.ObjectExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -69,6 +72,11 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
      */
     private final FacetHolder facetHolder = new FacetHolderImpl();
 
+    /**
+     * Lazily initialized by {@link #getParameters()} (so don't use directly!)
+     */
+    private List<ObjectActionParameterMixedIn> parameters;
+
     private final Identifier identifier;
 
     public ObjectActionMixedIn(
@@ -102,7 +110,29 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
     }
 
     public synchronized List<ObjectActionParameter> getParameters() {
-        return mixinAction.getParameters();
+        //return mixinAction.getParameters();
+
+        if (this.parameters == null) {
+            final List<ObjectActionParameter> mixinActionParameters = mixinAction.getParameters();
+            final List<ObjectActionParameterMixedIn> mixedInParameters = Lists.newArrayList();
+
+            for (int paramNum = 0; paramNum < mixinActionParameters.size(); paramNum++ ) {
+
+                final ObjectActionParameterAbstract mixinParameter =
+                        (ObjectActionParameterAbstract) mixinActionParameters.get(paramNum);
+                final ObjectActionParameterMixedIn mixedInParameter;
+                if(mixinParameter instanceof ObjectActionParameterParseable) {
+                    mixedInParameter = new ObjectActionParameterParseableMixedIn(mixinParameter, this);
+                } else if(mixinParameter instanceof OneToOneActionParameterImpl) {
+                    mixedInParameter = new OneToOneActionParameterMixedIn(mixinParameter, this);
+                } else {
+                    throw new RuntimeException("Unknown implementation of ObjectActionParameter; " + mixinParameter.getClass().getName());
+                }
+                mixedInParameters.add(mixedInParameter);
+            }
+            this.parameters = mixedInParameters;
+        }
+        return ObjectExtensions.asListT(parameters, ObjectActionParameter.class);
     }
 
     @Override
@@ -258,7 +288,7 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
     
     // //////////////////////////////////////
 
-    private ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
+    ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
         final ObjectSpecification objectSpecification = getSpecificationLoader().loadSpecification(mixinType);
         final MixinFacet mixinFacet = objectSpecification.getFacet(MixinFacet.class);
         final Object mixinPojo = mixinFacet.instantiate(mixedInAdapter.getObject());

http://git-wip-us.apache.org/repos/asf/isis/blob/3fc01b54/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedIn.java
new file mode 100644
index 0000000..905c075
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedIn.java
@@ -0,0 +1,23 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+
+public interface ObjectActionParameterMixedIn extends ObjectActionParameter {
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3fc01b54/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
new file mode 100644
index 0000000..333487a
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseableMixedIn.java
@@ -0,0 +1,59 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+
+/**
+ * REVIEW: this is a bit hacky having 'Contributed' subtypes of both {@link ObjectActionParameterParseable} and also
+ * {@link OneToOneActionParameterImpl}.  However, the {@link ObjectActionParameterParseable parseable} version
+ * only seems to be used by the DnD viewer; Scimpi, Wicket and RO do not.  So, we could hopefully simplify the
+ * hierarchy at some point.
+ */
+public class ObjectActionParameterParseableMixedIn extends ObjectActionParameterParseable implements ObjectActionParameterMixedIn {
+
+    private final ObjectActionParameterAbstract mixinParameter;
+    private final ObjectActionMixedIn objectActionMixedIn;
+
+    public ObjectActionParameterParseableMixedIn(
+            final ObjectActionParameterAbstract mixinParameter,
+            final ObjectActionMixedIn objectActionMixedIn) {
+        super(mixinParameter.getNumber(), objectActionMixedIn, mixinParameter.getPeer());
+        this.mixinParameter = mixinParameter;
+        this.objectActionMixedIn = objectActionMixedIn;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter mixedInAdapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return mixinParameter.getAutoComplete(objectActionMixedIn.mixinAdapterFor(mixedInAdapter), searchArg, interactionInitiatedBy);
+    }
+
+    protected ObjectAdapter targetForDefaultOrChoices(
+            final ObjectAdapter mixedInAdapter,
+            final List<ObjectAdapter> argumentsIfAvailable) {
+        return objectActionMixedIn.mixinAdapterFor(mixedInAdapter);
+    }
+
+
+    
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3fc01b54/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
new file mode 100644
index 0000000..f8e12a0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -0,0 +1,59 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+
+public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl implements ObjectActionParameterMixedIn {
+
+    private final ObjectActionParameter mixinActionParameter;
+    private final ObjectActionMixedIn mixedInAction;
+
+    public OneToOneActionParameterMixedIn(
+            final ObjectActionParameterAbstract mixinActionParameter,
+            final ObjectActionMixedIn mixedInAction) {
+        super(mixinActionParameter.getNumber(), mixedInAction, mixinActionParameter.getPeer());
+        this.mixinActionParameter = mixinActionParameter;
+        this.mixedInAction = mixedInAction;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter mixedInAdapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return mixinActionParameter.getAutoComplete(
+                mixinAdapterFor(mixedInAdapter), searchArg,
+                interactionInitiatedBy);
+    }
+
+    protected ObjectAdapter targetForDefaultOrChoices(
+            final ObjectAdapter mixedInAdapter,
+            final List<ObjectAdapter> argumentsIfAvailable) {
+        return mixinAdapterFor(mixedInAdapter);
+    }
+
+    private ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
+        return mixedInAction.mixinAdapterFor(mixedInAdapter);
+    }
+
+
+}


[09/12] isis git commit: ISIS-1213: renamed metamodel classes ("...Impl" to "...Default"); derive name of ObjectActionMixedIn from mixin type (if "_"); simplified logic of #getParameters; also...

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
new file mode 100644
index 0000000..ee4253d
--- /dev/null
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationDefaultTest.java
@@ -0,0 +1,188 @@
+/*
+ *  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.core.runtime.system;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
+import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationDefault;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+public class OneToManyAssociationDefaultTest {
+
+    private static final String COLLECTION_ID = "orders";
+
+    public static class Customer {
+    }
+
+    public static class Order {
+    }
+
+    private static final Class<?> COLLECTION_TYPE = Order.class;
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    @Mock
+    private ObjectAdapter mockOwnerAdapter;
+    @Mock
+    private ObjectAdapter mockAssociatedAdapter;
+    @Mock
+    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock
+    private SpecificationLoader mockSpecificationLookup;
+    @Mock
+    private AdapterManager mockAdapterManager;
+    @Mock
+    private MessageBrokerService mockMessageBrokerService;
+    @Mock
+    private PersistenceSessionService mockPersistenceSessionService;
+    @Mock
+    private FacetedMethod mockPeer;
+    @Mock
+    private NamedFacet mockNamedFacet;
+    @Mock
+    private ServicesInjector mockServicesInjector;
+    @Mock
+    private CollectionAddToFacet mockCollectionAddToFacet;
+
+    private OneToManyAssociation association;
+
+    @Before
+    public void setUp() {
+        allowingPeerToReturnCollectionType();
+        allowingPeerToReturnIdentifier();
+        allowingSpecLoaderToReturnSpecs();
+        association = new OneToManyAssociationDefault(mockPeer, new ObjectMemberDependencies(
+                mockSpecificationLookup, mockServicesInjector,
+                mockPersistenceSessionService));
+    }
+
+    private void allowingSpecLoaderToReturnSpecs() {
+        context.checking(new Expectations() {
+            {
+                allowing(mockSpecificationLookup).loadSpecification(Order.class);
+            }
+        });
+    }
+
+    @Test
+    public void id() {
+        assertThat(association.getId(), is(equalTo(COLLECTION_ID)));
+    }
+
+    @Test
+    public void name() {
+        expectPeerToReturnNamedFacet();
+        assertThat(association.getName(), is(equalTo("My name")));
+    }
+
+    @Test
+    public void delegatesToUnderlying() {
+        final ObjectSpecification spec = association.getSpecification();
+    }
+
+    @Test
+    public void canAddPersistable() {
+        context.checking(new Expectations() {
+            {
+                one(mockPeer).containsFacet(NotPersistedFacet.class);
+                will(returnValue(false));
+
+                one(mockOwnerAdapter).representsPersistent();
+                will(returnValue(true));
+
+                one(mockAssociatedAdapter).isTransient();
+                will(returnValue(false));
+
+                one(mockPeer).getFacet(CollectionAddToFacet.class);
+                will(returnValue(mockCollectionAddToFacet));
+
+                one(mockCollectionAddToFacet).add(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
+            }
+        });
+        association.addElement(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void cannotRemoveNull() {
+        association.removeElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void cannotAddNull() {
+        association.addElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
+    }
+
+    private void allowingPeerToReturnCollectionType() {
+        context.checking(new Expectations() {
+            {
+                allowing(mockPeer).getType();
+                will(returnValue(COLLECTION_TYPE));
+            }
+        });
+    }
+
+    private void allowingPeerToReturnIdentifier() {
+        context.checking(new Expectations() {
+            {
+                one(mockPeer).getIdentifier();
+                will(returnValue(Identifier.propertyOrCollectionIdentifier(Customer.class, COLLECTION_ID)));
+            }
+        });
+    }
+
+    private void expectPeerToReturnNamedFacet() {
+        context.checking(new Expectations() {
+            {
+                one(mockPeer).getFacet(NamedFacet.class);
+                will(returnValue(mockNamedFacet));
+
+                one(mockNamedFacet).value();
+                will(returnValue("My name"));
+            }
+        });
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
deleted file mode 100644
index c4f082f..0000000
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/OneToManyAssociationImplTest.java
+++ /dev/null
@@ -1,188 +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.core.runtime.system;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-
-public class OneToManyAssociationImplTest {
-
-    private static final String COLLECTION_ID = "orders";
-
-    public static class Customer {
-    }
-
-    public static class Order {
-    }
-
-    private static final Class<?> COLLECTION_TYPE = Order.class;
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    private ObjectAdapter mockOwnerAdapter;
-    @Mock
-    private ObjectAdapter mockAssociatedAdapter;
-    @Mock
-    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    private SpecificationLoader mockSpecificationLookup;
-    @Mock
-    private AdapterManager mockAdapterManager;
-    @Mock
-    private MessageBrokerService mockMessageBrokerService;
-    @Mock
-    private PersistenceSessionService mockPersistenceSessionService;
-    @Mock
-    private FacetedMethod mockPeer;
-    @Mock
-    private NamedFacet mockNamedFacet;
-    @Mock
-    private ServicesInjector mockServicesInjector;
-    @Mock
-    private CollectionAddToFacet mockCollectionAddToFacet;
-
-    private OneToManyAssociation association;
-
-    @Before
-    public void setUp() {
-        allowingPeerToReturnCollectionType();
-        allowingPeerToReturnIdentifier();
-        allowingSpecLoaderToReturnSpecs();
-        association = new OneToManyAssociationImpl(mockPeer, new ObjectMemberDependencies(
-                mockSpecificationLookup, mockServicesInjector,
-                mockPersistenceSessionService));
-    }
-
-    private void allowingSpecLoaderToReturnSpecs() {
-        context.checking(new Expectations() {
-            {
-                allowing(mockSpecificationLookup).loadSpecification(Order.class);
-            }
-        });
-    }
-
-    @Test
-    public void id() {
-        assertThat(association.getId(), is(equalTo(COLLECTION_ID)));
-    }
-
-    @Test
-    public void name() {
-        expectPeerToReturnNamedFacet();
-        assertThat(association.getName(), is(equalTo("My name")));
-    }
-
-    @Test
-    public void delegatesToUnderlying() {
-        final ObjectSpecification spec = association.getSpecification();
-    }
-
-    @Test
-    public void canAddPersistable() {
-        context.checking(new Expectations() {
-            {
-                one(mockPeer).containsFacet(NotPersistedFacet.class);
-                will(returnValue(false));
-
-                one(mockOwnerAdapter).representsPersistent();
-                will(returnValue(true));
-
-                one(mockAssociatedAdapter).isTransient();
-                will(returnValue(false));
-
-                one(mockPeer).getFacet(CollectionAddToFacet.class);
-                will(returnValue(mockCollectionAddToFacet));
-
-                one(mockCollectionAddToFacet).add(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
-            }
-        });
-        association.addElement(mockOwnerAdapter, mockAssociatedAdapter, InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void cannotRemoveNull() {
-        association.removeElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void cannotAddNull() {
-        association.addElement(mockOwnerAdapter, null, InteractionInitiatedBy.USER);
-    }
-
-    private void allowingPeerToReturnCollectionType() {
-        context.checking(new Expectations() {
-            {
-                allowing(mockPeer).getType();
-                will(returnValue(COLLECTION_TYPE));
-            }
-        });
-    }
-
-    private void allowingPeerToReturnIdentifier() {
-        context.checking(new Expectations() {
-            {
-                one(mockPeer).getIdentifier();
-                will(returnValue(Identifier.propertyOrCollectionIdentifier(Customer.class, COLLECTION_ID)));
-            }
-        });
-    }
-
-    private void expectPeerToReturnNamedFacet() {
-        context.checking(new Expectations() {
-            {
-                one(mockPeer).getFacet(NamedFacet.class);
-                will(returnValue(mockNamedFacet));
-
-                one(mockNamedFacet).value();
-                will(returnValue("My name"));
-            }
-        });
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
----------------------------------------------------------------------
diff --git a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
index 3bfd512..e5d488f 100644
--- a/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
+++ b/core/wrapper/src/test/java/org/apache/isis/progmodel/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
@@ -54,7 +54,7 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationImpl;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationDefault;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 import org.apache.isis.core.runtime.authentication.standard.SimpleSession;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
@@ -157,7 +157,7 @@ public class WrapperFactoryDefaultTest_wrappedObject {
         final Method employeeDisableNameMethod = methodOf(Employee.class, "disableName");
         final Method employeeValidateNameMethod = methodOf(Employee.class, "validateName", String.class);
         final Method employeeClearNameMethod = methodOf(Employee.class, "clearName");
-        employeeNameMember = new OneToOneAssociationImpl(
+        employeeNameMember = new OneToOneAssociationDefault(
                 facetedMethodForProperty(
                         employeeSetNameMethod, employeeGetNameMethod, employeeModifyNameMethod, employeeClearNameMethod, employeeHideNameMethod, employeeDisableNameMethod, employeeValidateNameMethod),
                 objectMemberDependencies);


[12/12] isis git commit: ISIS-1213: mix-ins for associations.

Posted by da...@apache.org.
ISIS-1213: mix-ins for associations.


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

Branch: refs/heads/ISIS-1213
Commit: 3a299c2000812dc039709895d37bbe6b2e23028d
Parents: 6c88813
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Wed Oct 14 01:28:04 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Wed Oct 14 01:28:04 2015 +0100

----------------------------------------------------------------------
 .../layout/ActionLayoutFacetFactory.java        |  17 +-
 ...otContributedFacetDerivedFromMixinFacet.java |  32 +++
 ...ibutedFacetDerivedFromMixinFacetFactory.java |  52 +++++
 .../MixinFacetForDomainObjectAnnotation.java    |   9 +
 .../mixin/MixinFacetForMixinAnnotation.java     |   5 +
 .../specloader/ObjectReflectorDefault.java      |   8 +
 .../specloader/specimpl/ContributeeMember.java  |  13 +-
 .../specimpl/ObjectActionContributee.java       |   3 -
 .../specimpl/ObjectActionMixedIn.java           | 115 +++--------
 .../specimpl/ObjectMemberAbstract.java          |  55 +++++-
 .../specimpl/ObjectSpecificationAbstract.java   | 152 +++++++++++++--
 .../specimpl/OneToManyAssociationMixedIn.java   | 193 +++++++++++++++++++
 .../specimpl/OneToOneAssociationMixedIn.java    | 174 +++++++++++++++++
 .../dflt/ProgrammingModelFacetsJava5.java       |   4 +
 .../specimpl/ObjectActionMixedInTest.java       |  12 +-
 15 files changed, 711 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index 7e3becf..6219faa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -18,9 +18,9 @@
  */
 package org.apache.isis.core.metamodel.facets.actions.layout;
 
-
 import java.lang.reflect.Method;
 import java.util.Properties;
+
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 
@@ -122,7 +123,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
         // contributing
 
-        if (isContributingService(processMethodContext)) {
+        if (isContributingServiceOrMixinObject(processMethodContext)) {
             NotContributedFacet notContributedFacet = NotContributedFacetForLayoutProperties.create(properties, holder);
             if(notContributedFacet == null) {
                 notContributedFacet = NotContributedFacetForActionLayoutAnnotation.create(actionLayout, holder);
@@ -131,18 +132,28 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         }
     }
 
-    protected boolean isContributingService(final ProcessMethodContext processMethodContext) {
+    protected boolean isContributingServiceOrMixinObject(final ProcessMethodContext processMethodContext) {
         final Method method = processMethodContext.getMethod();
         final Class<?> declaringClass = method.getDeclaringClass();
         final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
 
+        return isContributingService(spec) || isMixinObject(spec);
+    }
+
+    private static boolean isContributingService(final ObjectSpecification spec) {
         final DomainServiceFacet domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
         return domainServiceFacet != null && !domainServiceFacet.isNoop() &&
                 domainServiceFacet.getNatureOfService() != NatureOfService.VIEW_MENU_ONLY &&
                 domainServiceFacet.getNatureOfService() != NatureOfService.DOMAIN;
     }
 
+    private static boolean isMixinObject(final ObjectSpecification spec) {
+        final MixinFacet mixinFacet = spec.getFacet(MixinFacet.class);
+        final boolean b = mixinFacet != null && !mixinFacet.isNoop();
+        return b;
+    }
 
+    // UNUSED
     protected boolean skipContributing(final DomainServiceFacet domainServiceFacet) {
         return domainServiceFacet == null || domainServiceFacet.isNoop() || domainServiceFacet.getNatureOfService() == NatureOfService.VIEW_MENU_ONLY || domainServiceFacet.getNatureOfService() == NatureOfService.DOMAIN;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacet.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacet.java
new file mode 100644
index 0000000..ba6f38f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacet.java
@@ -0,0 +1,32 @@
+/*
+ *  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.core.metamodel.facets.actions.notcontributed.derived;
+
+import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacetAbstract;
+
+public class NotContributedFacetDerivedFromMixinFacet extends NotContributedFacetAbstract {
+
+    public NotContributedFacetDerivedFromMixinFacet(
+            final FacetHolder holder) {
+        super(NotContributed.As.EITHER, holder, Derivation.DERIVED);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacetFactory.java
new file mode 100644
index 0000000..1e7a052
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromMixinFacetFactory.java
@@ -0,0 +1,52 @@
+/*
+ *  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.core.metamodel.facets.actions.notcontributed.derived;
+
+import java.lang.reflect.Method;
+
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+
+public class NotContributedFacetDerivedFromMixinFacetFactory extends FacetFactoryAbstract {
+
+    public NotContributedFacetDerivedFromMixinFacetFactory() {
+        super(FeatureType.ACTIONS_ONLY);
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        final Method method = processMethodContext.getMethod();
+        final Class<?> declaringClass = method.getDeclaringClass();
+        final ObjectSpecification spec = getSpecificationLoader().loadSpecification(declaringClass);
+
+        final MixinFacet mixinFacet = spec.getFacet(MixinFacet.class);
+        if(mixinFacet == null || mixinFacet.isNoop()) {
+            return;
+        }
+
+        final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
+        FacetUtil.addFacet(new NotContributedFacetDerivedFromMixinFacet(facetHolder));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
index 3493fcc..cdd0c2a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForDomainObjectAnnotation.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.metamodel.facets.object.mixin;
 
 import java.lang.reflect.Constructor;
 
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -42,6 +44,13 @@ public class MixinFacetForDomainObjectAnnotation extends MixinFacetAbstract {
     public static MixinFacet create(
             final Class<?> candidateMixinType, final FacetHolder facetHolder,
             final ServicesInjector servicesInjector) {
+        final DomainObject domainObject = candidateMixinType.getAnnotation(DomainObject.class);
+        if(domainObject == null) {
+            return null;
+        }
+        if(domainObject.nature() != Nature.MIXIN) {
+            return null;
+        }
         final Constructor<?>[] constructors = candidateMixinType.getConstructors();
         for (Constructor<?> constructor : constructors) {
             final Class<?>[] constructorTypes = constructor.getParameterTypes();

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
index ed369c5..7aedf55 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinFacetForMixinAnnotation.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.mixin;
 
 import java.lang.reflect.Constructor;
 
+import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -42,6 +43,10 @@ public class MixinFacetForMixinAnnotation extends MixinFacetAbstract {
     public static MixinFacet create(
             final Class<?> candidateMixinType, final FacetHolder facetHolder,
             final ServicesInjector servicesInjector) {
+        final Mixin mixin = candidateMixinType.getAnnotation(Mixin.class);
+        if(mixin == null) {
+            return null;
+        }
         final Constructor<?>[] constructors = candidateMixinType.getConstructors();
         for (Constructor<?> constructor : constructors) {
             final Class<?>[] constructorTypes = constructor.getParameterTypes();

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index cdea01b..4bb6a47 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -32,6 +32,7 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebugBuilder;
@@ -250,6 +251,7 @@ public final class ObjectReflectorDefault
         metaModelValidator.init();
 
         loadSpecificationsForServices();
+        loadSpecificationsForMixins();
     }
 
     private void loadSpecificationsForServices() {
@@ -258,6 +260,12 @@ public final class ObjectReflectorDefault
         }
     }
 
+    private void loadSpecificationsForMixins() {
+        for (final Class<?> mixinType : AppManifest.Registry.instance().getMixinTypes()) {
+            internalLoadSpecification(mixinType);
+        }
+    }
+
     private void cacheBySpecId() {
         final Map<ObjectSpecId, ObjectSpecification> specById = Maps.newHashMap();
         for (final ObjectSpecification objSpec : allSpecifications()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
index 97dd48d..9aca015 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ContributeeMember.java
@@ -26,15 +26,14 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
  * Interface indicating an a contributed association or action.
  */
 public interface ContributeeMember extends ObjectMember {
-    
+
+
     public static class Predicates {
         
         private Predicates(){}
-        
+
         /**
-         * Evaluates the supplied {@link ObjectMember} and includes either if it is not a {@link ContributeeMember}
-         * (ie is a regular member) or is a {@link ContributeeMember} and contributed are to be
-         * {@link Contributed#isIncluded() included}.  
+         * Now generalized to handle {@link MixedInMember}s as well as {@link ContributeeMember}s.
          */
         public static <T extends ObjectMember> Predicate<T> regularElse(final Contributed contributed) {
             return com.google.common.base.Predicates.or(regular(), is(contributed));
@@ -44,7 +43,7 @@ public interface ContributeeMember extends ObjectMember {
             return new Predicate<T>() {
                 @Override
                 public boolean apply(ObjectMember input) {
-                    return !(input instanceof ContributeeMember);
+                    return !(input instanceof ContributeeMember) && !(input instanceof MixedInMember);
                 }
             };
         }
@@ -53,7 +52,7 @@ public interface ContributeeMember extends ObjectMember {
             return new Predicate<T>() {
                 @Override
                 public boolean apply(ObjectMember input) {
-                    return input instanceof ContributeeMember && contributed.isIncluded();
+                    return contributed.isIncluded();
                 }
             };
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/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 117d2e4..5aa6444 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
@@ -72,9 +72,6 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
     
     private final Identifier identifier;
 
-    /**
-     * @param contributeeParam - the parameter number which corresponds to the contributee, and so should be suppressed.
-     */
     public ObjectActionContributee(
             final Object servicePojo,
             final ObjectActionDefault serviceAction,

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 3f68d8e..067be24 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -25,27 +25,25 @@ import com.google.common.collect.Lists;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Bulk;
 import org.apache.isis.applib.annotation.InvokedOn;
+import org.apache.isis.applib.annotation.NotContributed;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.applib.services.actinvoc.ActionInvocationContext;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.applib.services.command.Command.Executor;
 import org.apache.isis.applib.services.command.CommandContext;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
-import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.actions.action.invocation.CommandUtil;
 import org.apache.isis.core.metamodel.facets.actions.bulk.BulkFacet;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacet;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacetAbstract;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
-import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
@@ -99,39 +97,20 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         // adjust name if necessary
         final String name = getName();
 
-        String memberName = null;
         if(Objects.equal(name, "_")) {
-            memberName = determineNameFrom(mixinAction);
+            String memberName = determineNameFrom(mixinAction);
             FacetUtil.addFacet(new NamedFacetInferred(memberName, facetHolder));
         }
 
         // calculate the identifier
         final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
-        memberName = memberName != null? memberName : mixinIdentifier.getMemberName();
         List<String> memberParameterNames = mixinIdentifier.getMemberParameterNames();
-        identifier = Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), memberName, memberParameterNames);
+        identifier = Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), getId(), memberParameterNames);
     }
 
-    private static String determineNameFrom(final ObjectActionDefault mixinAction) {
-        return suffixAfterUnderscore(mixinAction.getOnType().getSingularName());
-    }
-
-    static String suffixAfterUnderscore(final String singularName) {
-        return StringExtensions.asCapitalizedName(suffix(singularName));
-    }
-
-    private static String suffix(final String singularName) {
-        if (singularName.endsWith("_")) {
-            if (Objects.equal(singularName, "_")) {
-                return singularName;
-            }
-            return singularName;
-        }
-        final int indexOfUnderscore = singularName.lastIndexOf('_');
-        if (indexOfUnderscore == -1) {
-            return singularName;
-        }
-        return singularName.substring(indexOfUnderscore + 1);
+    @Override
+    public String getId() {
+        return determineIdFrom(this.mixinAction);
     }
 
     @Override
@@ -166,9 +145,10 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
     public Consent isVisible(
             final ObjectAdapter mixedInAdapter,
             final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        final VisibilityContext<?> ic = mixinAction.createVisibleInteractionContext(mixinAdapterFor(mixedInAdapter),
-                interactionInitiatedBy, where);
+            final Where where) {
+        final VisibilityContext<?> ic =
+                mixinAction.createVisibleInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
         return InteractionUtils.isVisibleResult(this, ic).createConsent();
     }
 
@@ -176,28 +156,29 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
     public Consent isUsable(
             final ObjectAdapter mixedInAdapter,
             final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
-        final UsabilityContext<?> ic = mixinAction.createUsableInteractionContext(mixinAdapterFor(mixedInAdapter),
-                interactionInitiatedBy, where);
+        final UsabilityContext<?> ic =
+                mixinAction.createUsableInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
     @Override
     public ObjectAdapter[] getDefaults(final ObjectAdapter mixedInAdapter) {
-        return mixinAction.getDefaults(mixinAdapterFor(mixedInAdapter));
+        return mixinAction.getDefaults(mixinAdapterFor(mixinType, mixedInAdapter));
     }
 
     @Override
     public ObjectAdapter[][] getChoices(
             final ObjectAdapter mixedInAdapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinAction.getChoices(mixinAdapterFor(mixedInAdapter), interactionInitiatedBy);
+        return mixinAction.getChoices(mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy);
     }
 
     public Consent isProposedArgumentSetValid(
             final ObjectAdapter mixedInAdapter,
             final ObjectAdapter[] proposedArguments,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return mixinAction.isProposedArgumentSetValid(mixinAdapterFor(mixedInAdapter), proposedArguments, interactionInitiatedBy);
+        return mixinAction.isProposedArgumentSetValid(mixinAdapterFor(mixinType, mixedInAdapter), proposedArguments, interactionInitiatedBy);
     }
 
     @Override
@@ -248,61 +229,22 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
             }
         }
 
-        return mixinAction.execute(mixinAdapterFor(mixedInAdapter), arguments, interactionInitiatedBy);
-    }
-
-    // //////////////////////////////////////
-    // FacetHolder
-    // //////////////////////////////////////
-
-    @Override
-    public Class<? extends Facet>[] getFacetTypes() {
-        return facetHolder.getFacetTypes();
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(Class<T> cls) {
-        return facetHolder.getFacet(cls);
-    }
-
-    @Override
-    public boolean containsFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsFacet(facetType);
+        return mixinAction.execute(mixinAdapterFor(mixinType, mixedInAdapter), arguments, interactionInitiatedBy);
     }
 
-    @Override
-    public boolean containsDoOpFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsDoOpFacet(facetType);
-    }
 
+    //region > facetHolder
     @Override
-    public List<Facet> getFacets(Filter<Facet> filter) {
-        return facetHolder.getFacets(filter);
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
     }
+    //endregion
 
-    @Override
-    public void addFacet(Facet facet) {
-        facetHolder.addFacet(facet);
-    }
 
-    @Override
-    public void addFacet(MultiTypedFacet facet) {
-        facetHolder.addFacet(facet);
-    }
-    
-    @Override
-    public void removeFacet(Facet facet) {
-        facetHolder.removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Class<? extends Facet> facetType) {
-        facetHolder.removeFacet(facetType);
+    ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
+        return mixinAdapterFor(mixinType, mixedInAdapter);
     }
 
-    
-    // //////////////////////////////////////
-    
     /* (non-Javadoc)
      * @see org.apache.isis.core.metamodel.specloader.specimpl.ObjectMemberAbstract#getIdentifier()
      */
@@ -311,12 +253,5 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
         return identifier;
     }
     
-    // //////////////////////////////////////
 
-    ObjectAdapter mixinAdapterFor(final ObjectAdapter mixedInAdapter) {
-        final ObjectSpecification objectSpecification = getSpecificationLoader().loadSpecification(mixinType);
-        final MixinFacet mixinFacet = objectSpecification.getFacet(MixinFacet.class);
-        final Object mixinPojo = mixinFacet.instantiate(mixedInAdapter.getObject());
-        return getPersistenceSessionService().adapterFor(mixinPojo);
-    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 85ba2f3..2fc4fc3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import java.util.List;
 
+import com.google.common.base.Objects;
+
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
@@ -39,6 +41,7 @@ import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
 import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
@@ -63,7 +66,6 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     //region > fields
     private final CollectionTypeRegistry collectionTypeRegistry = new CollectionTypeRegistry();
 
-    protected final String defaultName;
     private final String id;
     private final FacetedMethod facetedMethod;
     private final FeatureType featureType;
@@ -78,12 +80,11 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
             final ObjectMemberDependencies objectMemberDependencies) {
         final String id = facetedMethod.getIdentifier().getMemberName();
         if (id == null) {
-            throw new IllegalArgumentException("Name must always be set");
+            throw new IllegalArgumentException("Id must always be set");
         }
         this.facetedMethod = facetedMethod;
         this.featureType = featureType;
         this.id = id;
-        this.defaultName = StringExtensions.asNaturalName2(this.id);
 
         this.specificationLookup = objectMemberDependencies.getSpecificationLoader();
         this.servicesInjector = objectMemberDependencies.getServicesInjector();
@@ -182,7 +183,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         }
         else {
             // this should now be redundant, see NamedFacetDefault
-            return defaultName;
+            return StringExtensions.asNaturalName2(getId());
         }
     }
 
@@ -310,6 +311,52 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     }
     //endregion
 
+    //region > mixinAdapterFor
+    /**
+     * For mixins
+     */
+    protected ObjectAdapter mixinAdapterFor(
+            final Class<?> mixinType,
+            final ObjectAdapter mixedInAdapter) {
+        final ObjectSpecification objectSpecification = getSpecificationLoader().loadSpecification(mixinType);
+        final MixinFacet mixinFacet = objectSpecification.getFacet(MixinFacet.class);
+        final Object mixinPojo = mixinFacet.instantiate(mixedInAdapter.getObject());
+        return getPersistenceSessionService().adapterFor(mixinPojo);
+    }
+
+    static String determineNameFrom(final ObjectActionDefault mixinAction) {
+        return StringExtensions.asCapitalizedName(suffix(mixinAction));
+    }
+
+    static String determineIdFrom(final ObjectActionDefault mixinAction) {
+        final String id = compress(suffix(mixinAction));
+        return id;
+    }
+
+    private static String compress(final String suffix) {
+        return suffix.replaceAll(" ","");
+    }
+
+    static String suffix(final ObjectActionDefault mixinAction) {
+        return suffix(mixinAction.getOnType().getSingularName());
+    }
+
+    static String suffix(final String singularName) {
+        if (singularName.endsWith("_")) {
+            if (Objects.equal(singularName, "_")) {
+                return singularName;
+            }
+            return singularName;
+        }
+        final int indexOfUnderscore = singularName.lastIndexOf('_');
+        if (indexOfUnderscore == -1) {
+            return singularName;
+        }
+        return singularName.substring(indexOfUnderscore + 1);
+    }
+
+    //endregion
+
     //region > toString
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/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 f7968a3..fd6bf5c 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
@@ -27,6 +27,7 @@ import java.util.Properties;
 import java.util.Set;
 
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -148,8 +149,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return map;
     }
 
-    private boolean contributeeAssociationsAdded;
-    private boolean contributeeActionsAdded;
+    private boolean contributeeAndMixedInAssociationsAdded;
+    private boolean contributeeAndMixedInActionsAdded;
 
 
     private final List<ObjectSpecification> interfaces = Lists.newArrayList();
@@ -623,12 +624,13 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     public List<ObjectAssociation> getAssociations(final Contributed contributed) {
         // the "contributed.isIncluded()" guard is required because we cannot do this too early;
         // there must be a session available
-        if(contributed.isIncluded() && !contributeeAssociationsAdded) {
+        if(contributed.isIncluded() && !contributeeAndMixedInAssociationsAdded) {
             synchronized (this.associations) {
                 List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
                 associations.addAll(createContributeeAssociations());
+                associations.addAll(createMixedInAssociations());
                 sortAndUpdateAssociations(associations);
-                contributeeAssociationsAdded = true;
+                contributeeAndMixedInAssociationsAdded = true;
             }
         }
         final List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
@@ -736,13 +738,13 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         // and they have not yet been added
         // the "contributed.isIncluded()" guard is required because we cannot do this too early;
         // there must be a session available
-        if(contributed.isIncluded() && !contributeeActionsAdded) {
+        if(contributed.isIncluded() && !contributeeAndMixedInActionsAdded) {
             synchronized (this.objectActions) {
                 final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
                 actions.addAll(createContributeeActions());
-                actions.addAll(createMixinActions());
+                actions.addAll(createMixedInActions());
                 sortCacheAndUpdateActions(actions);
-                contributeeActionsAdded = true;
+                contributeeAndMixedInActionsAdded = true;
             }
         }
 
@@ -894,8 +896,11 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             contributedActions.add((ObjectActionDefault) serviceAction);
         }
 
-        return Lists.newArrayList(Iterables.transform(contributedActions, createContributeeAssociationFunctor(
-                servicePojo, this)));
+        return Lists.newArrayList(
+                Iterables.transform(
+                    contributedActions,
+                    createContributeeAssociationFunctor(servicePojo, this)
+                ));
     }
 
     private Function<ObjectActionDefault, ObjectAssociation> createContributeeAssociationFunctor(
@@ -905,14 +910,114 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             @Override
             public ObjectAssociation apply(ObjectActionDefault input) {
                 final ObjectSpecification returnType = input.getReturnType();
-                final ObjectAssociationAbstract association = returnType.isNotCollection()
-                        ? new OneToOneAssociationContributee(servicePojo, input, contributeeType,
-                        objectMemberDependencies)
-                        : new OneToManyAssociationContributee(servicePojo, input, contributeeType,
-                        objectMemberDependencies);
+                final ObjectAssociationAbstract association = createObjectAssociation(input, returnType);
                 facetProcessor.processMemberOrder(metadataProperties, association);
                 return association;
             }
+
+            ObjectAssociationAbstract createObjectAssociation(
+                    final ObjectActionDefault input,
+                    final ObjectSpecification returnType) {
+                if (returnType.isNotCollection()) {
+                    return new OneToOneAssociationContributee(servicePojo, input, contributeeType,
+                            objectMemberDependencies);
+                } else {
+                    return new OneToManyAssociationContributee(servicePojo, input, contributeeType,
+                            objectMemberDependencies);
+                }
+            }
+        };
+    }
+
+    //endregion
+
+    //region > mixin associations (properties and collections)
+
+    private List<ObjectAssociation> createMixedInAssociations() {
+        if (isService() || isValue()) {
+            return Collections.emptyList();
+        }
+
+        final Set<Class<?>> mixinTypes = AppManifest.Registry.instance().getMixinTypes();
+        if(mixinTypes == null) {
+            return Collections.emptyList();
+        }
+
+        final List<ObjectAssociation> mixedInAssociations = Lists.newArrayList();
+
+        for (final Class<?> mixinType : mixinTypes) {
+            addMixedInAssociationsIfAny(mixinType, mixedInAssociations);
+        }
+        return mixedInAssociations;
+    }
+
+    private void addMixedInAssociationsIfAny(
+            final Class<?> mixinType, final List<ObjectAssociation> toAppendTo) {
+
+        final ObjectSpecification specification = getSpecificationLoader().loadSpecification(mixinType);
+        if (specification == this) {
+            return;
+        }
+        final MixinFacet mixinFacet = specification.getFacet(MixinFacet.class);
+        if(mixinFacet == null) {
+            // this shouldn't happen; perhaps it would be more correct to throw an exception?
+            return;
+        }
+        if(!mixinFacet.isMixinFor(getCorrespondingClass())) {
+            return;
+        }
+
+        final List<ObjectActionDefault> mixinActions = getObjectActions(specification);
+
+        final List<ObjectAssociation> mixedInAssociations = Lists.newArrayList(
+                Iterables.transform(
+                        Iterables.filter(mixinActions, new Predicate<ObjectActionDefault>() {
+                            @Override public boolean apply(final ObjectActionDefault input) {
+                                final NotContributedFacet notContributedFacet = input.getFacet(NotContributedFacet.class);
+                                if (notContributedFacet == null || !notContributedFacet.toActions()) {
+                                    return false;
+                                }
+                                if(input.getParameterCount() != 0) {
+                                    return false;
+                                }
+                                if(!input.getSemantics().isSafeInNature()) {
+                                    return false;
+                                }
+                                return true;
+                            }
+                        }),
+                        createMixedInAssociationFunctor(this, mixinType)
+                ));
+
+        toAppendTo.addAll(mixedInAssociations);
+    }
+
+    private List getObjectActions(final ObjectSpecification specification) {
+        return specification.getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters.<ObjectAction>any());
+    }
+
+    private Function<ObjectActionDefault, ObjectAssociation> createMixedInAssociationFunctor(
+            final ObjectSpecification mixedInType,
+            final Class<?> mixinType) {
+        return new Function<ObjectActionDefault, ObjectAssociation>(){
+            @Override
+            public ObjectAssociation apply(final ObjectActionDefault mixinAction) {
+                final ObjectAssociationAbstract association = createObjectAssociation(mixinAction);
+                facetProcessor.processMemberOrder(metadataProperties, association);
+                return association;
+            }
+
+            ObjectAssociationAbstract createObjectAssociation(
+                    final ObjectActionDefault mixinAction) {
+                final ObjectSpecification returnType = mixinAction.getReturnType();
+                if (returnType.isNotCollection()) {
+                    return new OneToOneAssociationMixedIn(
+                            mixinAction, mixedInType, mixinType, objectMemberDependencies);
+                } else {
+                    return new OneToManyAssociationMixedIn(
+                            mixinAction, mixedInType, mixinType, objectMemberDependencies);
+                }
+            }
         };
     }
 
@@ -1004,7 +1109,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
      * If this specification {@link #isService() is actually for} a service,
      * then returns an empty list.
      */
-    protected List<ObjectAction> createMixinActions() {
+    protected List<ObjectAction> createMixedInActions() {
         if (isService() || isValue()) {
             return Collections.emptyList();
         }
@@ -1013,17 +1118,17 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             return Collections.emptyList();
         }
 
-        final List<ObjectAction> mixinActions = Lists.newArrayList();
+        final List<ObjectAction> mixedInActions = Lists.newArrayList();
 
         for (final Class<?> mixinType : mixinTypes) {
-            addMixinActionsIfAny(mixinType, mixinActions);
+            addMixedInActionsIfAny(mixinType, mixedInActions);
         }
-        return mixinActions;
+        return mixedInActions;
     }
 
-    private void addMixinActionsIfAny(
+    private void addMixedInActionsIfAny(
             final Class<?> mixinType,
-            final List<ObjectAction> mixinActionsToAppendTo) {
+            final List<ObjectAction> mixedInActionsToAppendTo) {
         final ObjectSpecification specification = getSpecificationLoader().loadSpecification(mixinType);
         if (specification == this) {
             return;
@@ -1048,16 +1153,21 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
                 continue;
             }
             final ObjectActionDefault mixinAction = (ObjectActionDefault) mixinTypeAction;
+            final NotContributedFacet notContributedFacet = mixinAction.getFacet(NotContributedFacet.class);
+            if(notContributedFacet.toActions()) {
+                continue;
+            }
 
             ObjectActionMixedIn mixedInAction =
                     new ObjectActionMixedIn(mixinType, mixinAction, this, objectMemberDependencies);
             facetProcessor.processMemberOrder(metadataProperties, mixedInAction);
             actions.add(mixedInAction);
         }
-        mixinActionsToAppendTo.addAll(actions);
+        mixedInActionsToAppendTo.addAll(actions);
     }
 
     //endregion
+
     //region > validity
     @Override
     public Consent isValid(final ObjectAdapter targetAdapter, final InteractionInitiatedBy interactionInitiatedBy) {

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
new file mode 100644
index 0000000..1890b3d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -0,0 +1,193 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
+import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacetAbstract;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+
+public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault implements MixedInMember {
+
+    /**
+     * The type of the mixin (providing the action), eg annotated with {@link org.apache.isis.applib.annotation.Mixin}.
+     */
+    private final Class<?> mixinType;
+
+    /**
+     * The {@link ObjectActionDefault} for the action being mixed in (ie on the {@link #mixinType}.
+     */
+    private final ObjectActionDefault mixinAction;
+
+    /**
+     * The domain object type being mixed in to (being supplemented).
+     */
+    private final ObjectSpecification mixedInType;
+
+
+    /**
+     * Hold facets rather than delegate to the mixin action (different types might use layout metadata to position
+     * the mixin in different ways)
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
+
+    private final Identifier identifier;
+
+    private static ObjectSpecification typeOfSpec(
+            final ObjectActionDefault objectAction,
+            final ObjectMemberDependencies objectMemberDependencies) {
+
+        final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
+        final SpecificationLoader specificationLookup = objectMemberDependencies.getSpecificationLoader();
+        // TODO: a bit of a hack; ought really to set up a fallback TypeOfFacetDefault which ensures that there is always
+        // a TypeOfFacet for any mixedIn associations created from mixin actions.
+        Class<? extends Object> cls = actionTypeOfFacet != null? actionTypeOfFacet.value(): Object.class;
+        return specificationLookup.loadSpecification(cls);
+    }
+
+    public OneToManyAssociationMixedIn(
+            final ObjectActionDefault mixinAction,
+            final ObjectSpecification mixedInType,
+            final Class<?> mixinType,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(mixinAction.getFacetedMethod(),
+                typeOfSpec(mixinAction, objectMemberDependencies),
+                objectMemberDependencies);
+
+        this.mixinType = mixinType;
+        this.mixinAction = mixinAction;
+        this.mixedInType = mixedInType;
+
+        //
+        // ensure the mixedIn collection cannot be modified, and derive its TypeOfFaccet
+        //
+        final NotPersistedFacet notPersistedFacet = new NotPersistedFacetAbstract(this) {};
+        final DisabledFacet disabledFacet = disabledFacet();
+        final TypeOfFacet typeOfFacet = new TypeOfFacetAbstract(getSpecification().getCorrespondingClass(), this, objectMemberDependencies
+                .getSpecificationLoader()) {};
+
+        FacetUtil.addFacet(notPersistedFacet);
+        FacetUtil.addFacet(disabledFacet);
+        FacetUtil.addFacet(typeOfFacet);
+
+
+        //
+        // in addition, copy over facets from contributed to own.
+        //
+        // These could include everything under @Collection(...) because the
+        // CollectionAnnotationFacetFactory is also run against actions.
+        //
+        FacetUtil.copyFacets(mixinAction.getFacetedMethod(), facetHolder);
+
+        // adjust name if necessary
+        final String name = getName();
+
+        if(Objects.equal(name, "_")) {
+            String memberName = ObjectActionMixedIn.determineNameFrom(mixinAction);
+            FacetUtil.addFacet(new NamedFacetInferred(memberName, facetHolder));
+        }
+
+        // calculate the identifier
+        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        List<String> memberParameterNames = mixinIdentifier.getMemberParameterNames();
+
+        identifier = Identifier.actionIdentifier(mixedInType.getCorrespondingClass().getName(), getId(), memberParameterNames);
+    }
+
+    private DisabledFacet disabledFacet() {
+        final DisabledFacet originalFacet = facetHolder.getFacet(DisabledFacet.class);
+        if( originalFacet != null && 
+            originalFacet.when() == When.ALWAYS && 
+            originalFacet.where() == Where.ANYWHERE) {
+            return originalFacet;
+        }
+        // ensure that the contributed association is always disabled
+        return new DisabledFacetForContributee("Contributed collection", this);
+    }
+
+    @Override
+    public ObjectAdapter get(final ObjectAdapter mixedInAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+        final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
+        return mixinAction.execute(mixinAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+    }
+
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
+
+    @Override
+    public String getId() {
+        return determineIdFrom(this.mixinAction);
+    }
+
+    @Override
+    public Consent isVisible(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        final VisibilityContext<?> ic =
+                mixinAction.createVisibleInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
+        return InteractionUtils.isVisibleResult(this, ic).createConsent();
+    }
+
+    @Override
+    public Consent isUsable(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final Where where) {
+        final UsabilityContext<?> ic =
+                mixinAction.createUsableInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
+        return InteractionUtils.isUsableResult(this, ic).createConsent();
+    }
+
+    //region > FacetHolder
+
+    @Override
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
+    }
+
+    //endregion
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
new file mode 100644
index 0000000..71daf26
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -0,0 +1,174 @@
+/**
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import com.google.common.base.Objects;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.applib.annotation.When;
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacet;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.NotContributedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacetInferred;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
+import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
+import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.notpersisted.NotPersistedFacetAbstract;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+
+public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault implements MixedInMember {
+
+    /**
+     * The type of the mixin (providing the action), eg annotated with {@link org.apache.isis.applib.annotation.Mixin}.
+     */
+    private final Class<?> mixinType;
+
+    /**
+     * The {@link ObjectActionDefault} for the action being mixed in (ie on the {@link #mixinType}.
+     */
+    private final ObjectActionDefault mixinAction;
+
+    /**
+     * The domain object type being mixed in to (being supplemented).
+     */
+    private final ObjectSpecification mixedInType;
+
+
+    /**
+     * Hold facets rather than delegate to the contributed action (different types might
+     * use layout metadata to position the contributee in different ways)
+     */
+    private final FacetHolder facetHolder = new FacetHolderImpl();
+
+    private final Identifier identifier;
+
+    public OneToOneAssociationMixedIn(
+            final ObjectActionDefault mixinAction,
+            final ObjectSpecification mixedInType,
+            final Class<?> mixinType,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(mixinAction.getFacetedMethod(), mixinAction.getReturnType(), objectMemberDependencies);
+
+        this.mixinType = mixinType;
+        this.mixinAction = mixinAction;
+        this.mixedInType = mixedInType;
+
+        //
+        // ensure the contributed property cannot be modified
+        //
+        final NotPersistedFacet notPersistedFacet = new NotPersistedFacetAbstract(this) {};
+        final DisabledFacet disabledFacet = disabledFacet();
+
+        FacetUtil.addFacet(notPersistedFacet);
+        FacetUtil.addFacet(disabledFacet);
+
+        //
+        // in addition, copy over facets from contributed to own.
+        //
+        // These could include everything under @Property(...) because the
+        // PropertyAnnotationFacetFactory is also run against actions.
+        //
+        FacetUtil.copyFacets(mixinAction.getFacetedMethod(), facetHolder);
+
+
+
+        // adjust name if necessary
+        final String name = getName();
+
+        if(Objects.equal(name, "_")) {
+            String memberName = ObjectActionMixedIn.determineNameFrom(mixinAction);
+            FacetUtil.addFacet(new NamedFacetInferred(memberName, facetHolder));
+        }
+
+
+        // calculate the identifier
+        final Identifier mixinIdentifier = mixinAction.getFacetedMethod().getIdentifier();
+        List<String> memberParameterNames = mixinIdentifier.getMemberParameterNames();
+
+        identifier = Identifier.actionIdentifier(mixedInType.getCorrespondingClass().getName(), getId(), memberParameterNames);
+    }
+
+    private DisabledFacet disabledFacet() {
+        final DisabledFacet originalFacet = facetHolder.getFacet(DisabledFacet.class);
+        if( originalFacet != null && 
+            originalFacet.when() == When.ALWAYS && 
+            originalFacet.where() == Where.ANYWHERE) {
+            return originalFacet;
+        }
+        // ensure that the contributed association is always disabled
+        return new DisabledFacetForContributee("Contributed property", this);
+    }
+
+    @Override
+    public ObjectAdapter get(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final ObjectAdapter mixinAdapter = mixinAdapterFor(mixinType, mixedInAdapter);
+        return mixinAction.execute(mixinAdapter, new ObjectAdapter[0], interactionInitiatedBy);
+    }
+
+    @Override
+    public Identifier getIdentifier() {
+        return identifier;
+    }
+
+    @Override
+    public String getId() {
+        return determineIdFrom(this.mixinAction);
+    }
+
+    @Override
+    public Consent isVisible(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        final VisibilityContext<?> ic =
+                mixinAction.createVisibleInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
+        return InteractionUtils.isVisibleResult(this, ic).createConsent();
+    }
+
+    @Override
+    public Consent isUsable(
+            final ObjectAdapter mixedInAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy, final Where where) {
+        final UsabilityContext<?> ic =
+                mixinAction.createUsableInteractionContext(
+                        mixinAdapterFor(mixinType, mixedInAdapter), interactionInitiatedBy, where);
+        return InteractionUtils.isUsableResult(this, ic).createConsent();
+    }
+
+    @Override
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index f21e958..4b9c4b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -28,6 +28,7 @@ import org.apache.isis.core.metamodel.facets.actions.interaction.ActionNamedDebu
 import org.apache.isis.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notcontributed.annotation.NotContributedFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.actions.notcontributed.derived.NotContributedFacetDerivedFromDomainServiceFacetFactory;
+import org.apache.isis.core.metamodel.facets.actions.notcontributed.derived.NotContributedFacetDerivedFromMixinFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.annotation.NotInServiceMenuFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived.NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.method.NotInServiceMenuFacetViaMethodFactory;
@@ -365,6 +366,7 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         addFactory(RecreatableObjectFacetFactory.class);
         addFactory(MixinFacetForMixinAnnotationFactory.class);
 
+
         addFactory(MaxLengthFacetOnTypeAnnotationFactory.class);
         addFactory(MaxLengthFacetOnActionAnnotationFactory.class);
 
@@ -389,6 +391,8 @@ public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract
         // must come after DomainObjectAnnotationFacetFactory
         addFactory(DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory.class);
         addFactory(DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.class);
+        // must come after DomainObjectAnnotationFacetFactory & MixinFacetFactory
+        addFactory(NotContributedFacetDerivedFromMixinFacetFactory.class);
 
         addFactory(DomainServiceLayoutFactory.class);
         addFactory(DomainObjectLayoutFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/3a299c20/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
index fdb3eaf..9707af6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
@@ -2,6 +2,8 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.junit.Test;
 
+import org.apache.isis.core.commons.lang.StringExtensions;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
@@ -12,31 +14,31 @@ public class ObjectActionMixedInTest {
 
         @Test
         public void exactly_underscore() throws Exception {
-            final String s = ObjectActionMixedIn.suffixAfterUnderscore("_");
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("_"));
             assertThat(s, is("_"));
         }
 
         @Test
         public void ends_with_underscore() throws Exception {
-            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_");
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_"));
             assertThat(s, is("Abc_"));
         }
 
         @Test
         public void has_no_underscore() throws Exception {
-            final String s = ObjectActionMixedIn.suffixAfterUnderscore("defghij");
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("defghij"));
             assertThat(s, is("Defghij"));
         }
 
         @Test
         public void contains_one_underscore() throws Exception {
-            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def");
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_def"));
             assertThat(s, is("Def"));
         }
 
         @Test
         public void contains_more_than_one_underscore() throws Exception {
-            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def_ghi");
+            final String s = StringExtensions.asCapitalizedName(ObjectMemberAbstract.suffix("abc_def_ghi"));
             assertThat(s, is("Ghi"));
         }
     }


[06/12] isis git commit: ISIS-1194: removing unused methods from ObjectActionParameter and implementataions.

Posted by da...@apache.org.
ISIS-1194: removing unused methods from ObjectActionParameter and implementataions.


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

Branch: refs/heads/ISIS-1213
Commit: e618fdc6ccd4ea2a052900f2196333f67c3df67c
Parents: 9f83958
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 13 06:31:48 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 13 06:31:48 2015 +0100

----------------------------------------------------------------------
 .../spec/feature/ObjectActionParameter.java     | 16 -----------
 .../specimpl/ObjectActionParameterAbstract.java | 20 --------------
 .../specimpl/OneToOneActionParameterImpl.java   | 28 +++-----------------
 3 files changed, 4 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e618fdc6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index a99967d..902faa8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -34,22 +34,6 @@ import org.apache.isis.core.metamodel.interactions.ActionArgumentContext;
 public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
 
     /**
-     * If true then can cast to a {@link OneToOneActionParameter}.
-     * 
-     * <p>
-     * Either this or {@link #isCollection()} will be true.
-     * </p>
-     */
-    boolean isObject();
-
-    /**
-     * Only for symmetry with {@link ObjectAssociation}, however since the NOF
-     * does not support collections as actions all implementations should return
-     * <tt>false</tt>.
-     */
-    boolean isCollection();
-
-    /**
      * Owning {@link ObjectAction}.
      */
     ObjectAction getAction();

http://git-wip-us.apache.org/repos/asf/isis/blob/e618fdc6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 9a43566..4552f0a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -102,26 +102,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     }
 
 
-
-
-    /**
-     * Subclasses should override either {@link #isObject()} or
-     * {@link #isCollection()}.
-     */
-    @Override
-    public boolean isObject() {
-        return false;
-    }
-
-    /**
-     * Subclasses should override either {@link #isObject()} or
-     * {@link #isCollection()}.
-     */
-    @Override
-    public boolean isCollection() {
-        return false;
-    }
-
     /**
      * Parameter number, 0-based.
      */

http://git-wip-us.apache.org/repos/asf/isis/blob/e618fdc6/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
index 77b3598..7260d5a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
@@ -24,32 +24,12 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract implements OneToOneActionParameter {
 
-    public OneToOneActionParameterImpl(final int index, final ObjectActionImpl actionImpl, final TypedHolder peer) {
+    public OneToOneActionParameterImpl(
+            final int index,
+            final ObjectActionImpl actionImpl,
+            final TypedHolder peer) {
         super(index, actionImpl, peer);
     }
 
 
-    @Override
-    public boolean isObject() {
-        return true;
-    }
-
-
-//    // //////////////////////////////////////////////////////////////////////
-//    // get, set
-//    // //////////////////////////////////////////////////////////////////////
-//
-//    /**
-//     * Sets the proposed value of the {@link Instance} (downcast as a
-//     * {@link MutableProposedHolder}, unwrapped the proposed value from a
-//     * {@link ObjectAdapter}.
-//     */
-//    public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {
-//        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-//        final Object newValuePojo = newValue.getObject();
-//        proposedHolder.setProposed(newValuePojo);
-//    }
-
-
-
 }


[10/12] isis git commit: ISIS-1213: renamed metamodel classes ("...Impl" to "...Default"); derive name of ObjectActionMixedIn from mixin type (if "_"); simplified logic of #getParameters; also...

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
new file mode 100644
index 0000000..69019aa
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -0,0 +1,298 @@
+/*
+ *  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.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.util.ToString;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResult;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
+import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
+import org.apache.isis.core.metamodel.interactions.CollectionUsabilityContext;
+import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+
+public class OneToManyAssociationDefault extends ObjectAssociationAbstract implements OneToManyAssociation {
+
+    public OneToManyAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
+                objectMemberDependencies);
+    }
+
+    protected OneToManyAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectSpecification objectSpec,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(facetedMethod, FeatureType.COLLECTION, objectSpec, objectMemberDependencies);
+    }
+
+    @Override
+    public CollectionSemantics getCollectionSemantics() {
+        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
+        return getCollectionTypeRegistry().semanticsOf(underlyingClass);
+    }
+
+    //region > visible, usable
+
+    @Override
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new CollectionVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+
+    @Override
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new CollectionUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+    //endregion
+
+    //region > Validate Add
+    // Not API
+    private ValidityContext<?> createValidateAddInteractionContext(
+            final InteractionInitiatedBy interactionInitiatedBy,
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter) {
+        return new CollectionAddToContext(ownerAdapter, getIdentifier(), proposedToAddAdapter,
+                interactionInitiatedBy);
+    }
+
+    @Override
+    public Consent isValidToAdd(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isValidToAddResult(ownerAdapter, proposedToAddAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isValidToAddResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToAddAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext = createValidateAddInteractionContext(
+                interactionInitiatedBy, ownerAdapter, proposedToAddAdapter);
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    //endregion
+
+    //region > Validate Remove
+    private ValidityContext<?> createValidateRemoveInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new CollectionRemoveFromContext(
+                ownerAdapter, getIdentifier(), proposedToRemoveAdapter, interactionInitiatedBy
+        );
+    }
+
+    @Override
+    public Consent isValidToRemove(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isValidToRemoveResult(
+                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isValidToRemoveResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToRemoveAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext = createValidateRemoveInteractionContext(
+                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy);
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    private boolean readWrite() {
+        return !isNotPersisted();
+    }
+
+    //endregion
+
+    //region > get, isEmpty, add, clear
+
+    @Override
+    public ObjectAdapter get(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+
+        final PropertyOrCollectionAccessorFacet accessor = getFacet(PropertyOrCollectionAccessorFacet.class);
+        final Object collection = accessor.getProperty(ownerAdapter,
+                interactionInitiatedBy);
+        if (collection == null) {
+            return null;
+        }
+        return getPersistenceSessionService().adapterFor(collection, ownerAdapter, this);
+    }
+
+    @Override
+    public boolean isEmpty(final ObjectAdapter parentAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+        // REVIEW should we be able to determine if a collection is empty
+        // without loading it?
+        final ObjectAdapter collection = get(parentAdapter, interactionInitiatedBy);
+        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
+        return facet.size(collection) == 0;
+    }
+
+    //endregion
+
+    //region > add, clear
+
+    @Override
+    public void addElement(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter referencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (referencedAdapter == null) {
+            throw new IllegalArgumentException("Can't use null to add an item to a collection");
+        }
+        if (readWrite()) {
+            if (ownerAdapter.representsPersistent() && referencedAdapter.isTransient()) {
+                throw new IsisException("can't set a reference to a transient object from a persistent one: " + ownerAdapter.titleString(null) + " (persistent) -> " + referencedAdapter.titleString() + " (transient)");
+            }
+            final CollectionAddToFacet facet = getFacet(CollectionAddToFacet.class);
+            facet.add(ownerAdapter, referencedAdapter, interactionInitiatedBy);
+        }
+    }
+
+    @Override
+    public void removeElement(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter referencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (referencedAdapter == null) {
+            throw new IllegalArgumentException("element should not be null");
+        }
+        if (readWrite()) {
+            final CollectionRemoveFromFacet facet = getFacet(CollectionRemoveFromFacet.class);
+            facet.remove(ownerAdapter, referencedAdapter, interactionInitiatedBy);
+        }
+    }
+
+    public void removeAllAssociations(final ObjectAdapter ownerAdapter) {
+        final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
+        facet.clear(ownerAdapter);
+    }
+
+    @Override
+    public void clearCollection(final ObjectAdapter ownerAdapter) {
+        if (readWrite()) {
+            final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
+            facet.clear(ownerAdapter);
+        }
+    }
+
+    //endregion
+
+    //region > defaults
+    @Override
+    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
+        return null;
+    }
+
+    @Override
+    public void toDefault(final ObjectAdapter ownerAdapter) {
+    }
+
+    //endregion
+
+    //region > choices & autoComplete
+
+    @Override
+    public ObjectAdapter[] getChoices(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ObjectAdapter[0];
+    }
+
+    @Override
+    public boolean hasChoices() {
+        return false;
+    }
+
+    
+    @Override
+    public boolean hasAutoComplete() {
+        return false;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            ObjectAdapter object,
+            String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new ObjectAdapter[0];
+    }
+    
+    @Override
+    public int getAutoCompleteMinLength() {
+        return 0; // n/a
+    }
+
+    //endregion
+
+    //region > debug, toString
+    @Override
+    public String debugData() {
+        final DebugString debugString = new DebugString();
+        debugString.indent();
+        debugString.indent();
+        getFacetedMethod().debugData(debugString);
+        return debugString.toString();
+    }
+
+    @Override
+    public String toString() {
+        final ToString str = new ToString(this);
+        str.append(super.toString());
+        str.append(",");
+        str.append("persisted", !isNotPersisted());
+        str.append("type", getSpecification() == null ? "unknown" : getSpecification().getShortIdentifier());
+        return str.toString();
+    }
+
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
deleted file mode 100644
index fda40d2..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
+++ /dev/null
@@ -1,298 +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.core.metamodel.specloader.specimpl;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.util.ToString;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
-import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
-import org.apache.isis.core.metamodel.interactions.CollectionUsabilityContext;
-import org.apache.isis.core.metamodel.interactions.CollectionVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-public class OneToManyAssociationImpl extends ObjectAssociationAbstract implements OneToManyAssociation {
-
-    public OneToManyAssociationImpl(
-            final FacetedMethod facetedMethod, 
-            final ObjectMemberDependencies objectMemberDependencies) {
-        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
-                objectMemberDependencies);
-    }
-
-    protected OneToManyAssociationImpl(
-            final FacetedMethod facetedMethod, 
-            final ObjectSpecification objectSpec, 
-            final ObjectMemberDependencies objectMemberDependencies) {
-        super(facetedMethod, FeatureType.COLLECTION, objectSpec, objectMemberDependencies);
-    }
-
-    @Override
-    public CollectionSemantics getCollectionSemantics() {
-        final Class<?> underlyingClass = getSpecification().getCorrespondingClass();
-        return getCollectionTypeRegistry().semanticsOf(underlyingClass);
-    }
-
-    //region > visible, usable
-
-    @Override
-    public VisibilityContext<?> createVisibleInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new CollectionVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-
-    @Override
-    public UsabilityContext<?> createUsableInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new CollectionUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    //endregion
-
-    //region > Validate Add
-    // Not API
-    private ValidityContext<?> createValidateAddInteractionContext(
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter) {
-        return new CollectionAddToContext(ownerAdapter, getIdentifier(), proposedToAddAdapter,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isValidToAdd(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToAddResult(ownerAdapter, proposedToAddAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToAddResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToAddAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext = createValidateAddInteractionContext(
-                interactionInitiatedBy, ownerAdapter, proposedToAddAdapter);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    //endregion
-
-    //region > Validate Remove
-    private ValidityContext<?> createValidateRemoveInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new CollectionRemoveFromContext(
-                ownerAdapter, getIdentifier(), proposedToRemoveAdapter, interactionInitiatedBy
-        );
-    }
-
-    @Override
-    public Consent isValidToRemove(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isValidToRemoveResult(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isValidToRemoveResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToRemoveAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext = createValidateRemoveInteractionContext(
-                ownerAdapter, proposedToRemoveAdapter, interactionInitiatedBy);
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    private boolean readWrite() {
-        return !isNotPersisted();
-    }
-
-    //endregion
-
-    //region > get, isEmpty, add, clear
-
-    @Override
-    public ObjectAdapter get(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final PropertyOrCollectionAccessorFacet accessor = getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object collection = accessor.getProperty(ownerAdapter,
-                interactionInitiatedBy);
-        if (collection == null) {
-            return null;
-        }
-        return getPersistenceSessionService().adapterFor(collection, ownerAdapter, this);
-    }
-
-    @Override
-    public boolean isEmpty(final ObjectAdapter parentAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        // REVIEW should we be able to determine if a collection is empty
-        // without loading it?
-        final ObjectAdapter collection = get(parentAdapter, interactionInitiatedBy);
-        final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
-        return facet.size(collection) == 0;
-    }
-
-    //endregion
-
-    //region > add, clear
-
-    @Override
-    public void addElement(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("Can't use null to add an item to a collection");
-        }
-        if (readWrite()) {
-            if (ownerAdapter.representsPersistent() && referencedAdapter.isTransient()) {
-                throw new IsisException("can't set a reference to a transient object from a persistent one: " + ownerAdapter.titleString(null) + " (persistent) -> " + referencedAdapter.titleString() + " (transient)");
-            }
-            final CollectionAddToFacet facet = getFacet(CollectionAddToFacet.class);
-            facet.add(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-        }
-    }
-
-    @Override
-    public void removeElement(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter referencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (referencedAdapter == null) {
-            throw new IllegalArgumentException("element should not be null");
-        }
-        if (readWrite()) {
-            final CollectionRemoveFromFacet facet = getFacet(CollectionRemoveFromFacet.class);
-            facet.remove(ownerAdapter, referencedAdapter, interactionInitiatedBy);
-        }
-    }
-
-    public void removeAllAssociations(final ObjectAdapter ownerAdapter) {
-        final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
-        facet.clear(ownerAdapter);
-    }
-
-    @Override
-    public void clearCollection(final ObjectAdapter ownerAdapter) {
-        if (readWrite()) {
-            final CollectionClearFacet facet = getFacet(CollectionClearFacet.class);
-            facet.clear(ownerAdapter);
-        }
-    }
-
-    //endregion
-
-    //region > defaults
-    @Override
-    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
-        return null;
-    }
-
-    @Override
-    public void toDefault(final ObjectAdapter ownerAdapter) {
-    }
-
-    //endregion
-
-    //region > choices & autoComplete
-
-    @Override
-    public ObjectAdapter[] getChoices(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ObjectAdapter[0];
-    }
-
-    @Override
-    public boolean hasChoices() {
-        return false;
-    }
-
-    
-    @Override
-    public boolean hasAutoComplete() {
-        return false;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            ObjectAdapter object,
-            String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new ObjectAdapter[0];
-    }
-    
-    @Override
-    public int getAutoCompleteMinLength() {
-        return 0; // n/a
-    }
-
-    //endregion
-
-    //region > debug, toString
-    @Override
-    public String debugData() {
-        final DebugString debugString = new DebugString();
-        debugString.indent();
-        debugString.indent();
-        getFacetedMethod().debugData(debugString);
-        return debugString.toString();
-    }
-
-    @Override
-    public String toString() {
-        final ToString str = new ToString(this);
-        str.append(super.toString());
-        str.append(",");
-        str.append("persisted", !isNotPersisted());
-        str.append("type", getSpecification() == null ? "unknown" : getSpecification().getShortIdentifier());
-        return str.toString();
-    }
-
-    //endregion
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index f387d1f..00f4c89 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -23,7 +23,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
+public class OneToOneActionParameterContributee extends OneToOneActionParameterDefault implements ObjectActionParameterContributee{
 
     private final ObjectAdapter serviceAdapter;
     private final ObjectActionParameter serviceActionParameter;

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
new file mode 100644
index 0000000..65cf664
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterDefault.java
@@ -0,0 +1,35 @@
+/*
+ *  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.core.metamodel.specloader.specimpl;
+
+import org.apache.isis.core.metamodel.facets.TypedHolder;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
+
+public class OneToOneActionParameterDefault extends ObjectActionParameterAbstract implements OneToOneActionParameter {
+
+    public OneToOneActionParameterDefault(
+            final int index,
+            final ObjectActionDefault actionImpl,
+            final TypedHolder peer) {
+        super(index, actionImpl, peer);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
deleted file mode 100644
index 7260d5a..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
+++ /dev/null
@@ -1,35 +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.core.metamodel.specloader.specimpl;
-
-import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
-
-public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract implements OneToOneActionParameter {
-
-    public OneToOneActionParameterImpl(
-            final int index,
-            final ObjectActionImpl actionImpl,
-            final TypedHolder peer) {
-        super(index, actionImpl, peer);
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
index d832cf8..1d4a7ce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterMixedIn.java
@@ -22,7 +22,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl implements ObjectActionParameterMixedIn {
+public class OneToOneActionParameterMixedIn extends OneToOneActionParameterDefault implements ObjectActionParameterMixedIn {
 
     private final ObjectActionParameter mixinParameter;
     private final ObjectActionMixedIn mixedInAction;
@@ -56,4 +56,5 @@ public class OneToOneActionParameterMixedIn extends OneToOneActionParameterImpl
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/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 42997b9..61b0984 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
@@ -21,15 +21,12 @@ import java.util.List;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.When;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
@@ -42,7 +39,7 @@ 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.ObjectMemberDependencies;
 
-public class OneToOneAssociationContributee extends OneToOneAssociationImpl implements ContributeeMember2 {
+public class OneToOneAssociationContributee extends OneToOneAssociationDefault implements ContributeeMember2 {
 
     private final Object servicePojo;
     private final ObjectAction serviceAction;
@@ -57,7 +54,7 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
 
     public OneToOneAssociationContributee(
             final Object servicePojo,
-            final ObjectActionImpl serviceAction,
+            final ObjectActionDefault serviceAction,
             final ObjectSpecification contributeeType,
             final ObjectMemberDependencies objectMemberDependencies) {
         super(serviceAction.getFacetedMethod(), serviceAction.getReturnType(), objectMemberDependencies);
@@ -145,62 +142,21 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    //region > FacetHolder
     @Override
-    public Class<? extends Facet>[] getFacetTypes() {
-        return facetHolder.getFacetTypes();
+    protected FacetHolder getFacetHolder() {
+        return facetHolder;
     }
 
-    @Override
-    public <T extends Facet> T getFacet(Class<T> cls) {
-        return facetHolder.getFacet(cls);
-    }
-
-    @Override
-    public boolean containsFacet(Class<? extends Facet> facetType) {
-        return facetHolder.containsFacet(facetType);
-    }
-
-    @Override
-    public boolean containsDoOpFacet(java.lang.Class<? extends Facet> facetType) {
-        return facetHolder.containsDoOpFacet(facetType);
-    }
-
-    @Override
-    public List<Facet> getFacets(Filter<Facet> filter) {
-        return facetHolder.getFacets(filter);
-    }
-
-    @Override
-    public void addFacet(Facet facet) {
-        facetHolder.addFacet(facet);
-    }
-
-    @Override
-    public void addFacet(MultiTypedFacet facet) {
-        facetHolder.addFacet(facet);
-    }
-    
-    @Override
-    public void removeFacet(Facet facet) {
-        facetHolder.removeFacet(facet);
-    }
-
-    @Override
-    public void removeFacet(Class<? extends Facet> facetType) {
-        facetHolder.removeFacet(facetType);
-    }
-
-    //endregion
-
     private ObjectAdapter getServiceAdapter() {
         return getPersistenceSessionService().adapterFor(servicePojo);
     }
 
+    //region > Contributee2 impl - getServiceContributedBy()
     @Override
     public ObjectSpecification getServiceContributedBy() {
         return getServiceAdapter().getSpecification();
     }
 
+    //endregion
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
new file mode 100644
index 0000000..8089ca4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -0,0 +1,345 @@
+/*
+ *  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.core.metamodel.specloader.specimpl;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.debug.DebugString;
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.util.ToString;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.consent.Consent;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.consent.InteractionResult;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
+import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacet;
+import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacet;
+import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet;
+import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.core.metamodel.interactions.InteractionUtils;
+import org.apache.isis.core.metamodel.interactions.PropertyAccessContext;
+import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
+import org.apache.isis.core.metamodel.interactions.PropertyUsabilityContext;
+import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.ValidityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.MutableCurrentHolder;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+
+public class OneToOneAssociationDefault extends ObjectAssociationAbstract implements OneToOneAssociation {
+
+    public OneToOneAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
+                objectMemberDependencies);
+    }
+    
+    protected OneToOneAssociationDefault(
+            final FacetedMethod facetedMethod,
+            final ObjectSpecification objectSpec,
+            final ObjectMemberDependencies objectMemberDependencies) {
+        super(facetedMethod, FeatureType.PROPERTY, objectSpec, objectMemberDependencies);
+    }
+
+    //region > visible, usable
+
+    @Override
+    public VisibilityContext<?> createVisibleInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new PropertyVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+
+    @Override
+    public UsabilityContext<?> createUsableInteractionContext(
+            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
+            Where where) {
+        return new PropertyUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
+    }
+
+    //endregion
+
+    //region > Validity
+    private ValidityContext<?> createValidateInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToReferenceAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return new PropertyModifyContext(ownerAdapter, getIdentifier(), proposedToReferenceAdapter,
+                interactionInitiatedBy);
+    }
+
+    @Override
+    public Consent isAssociationValid(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        return isAssociationValidResult(ownerAdapter, proposedAdapter, interactionInitiatedBy).createConsent();
+    }
+
+    private InteractionResult isAssociationValidResult(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter proposedToReferenceAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ValidityContext<?> validityContext =
+                createValidateInteractionContext(
+                        ownerAdapter, proposedToReferenceAdapter, interactionInitiatedBy
+                );
+        return InteractionUtils.isValidResult(this, validityContext);
+    }
+
+    //endregion
+
+    //region > init
+    @Override
+    public void initAssociation(final ObjectAdapter ownerAdapter, final ObjectAdapter referencedAdapter) {
+        final PropertyInitializationFacet initializerFacet = getFacet(PropertyInitializationFacet.class);
+        if (initializerFacet != null) {
+            initializerFacet.initProperty(ownerAdapter, referencedAdapter);
+        }
+    }
+
+    //endregion
+
+    //region > Access (get, isEmpty)
+
+    @Override
+    public ObjectAdapter get(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyOrCollectionAccessorFacet facet = getFacet(PropertyOrCollectionAccessorFacet.class);
+        final Object referencedPojo =
+                facet.getProperty(ownerAdapter, interactionInitiatedBy);
+
+        if (referencedPojo == null) {
+            return null;
+        }
+
+        return getPersistenceSessionService().adapterFor(referencedPojo);
+    }
+
+    // UNUSED
+    private PropertyAccessContext createAccessInteractionContext(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final ObjectAdapter referencedAdapter = get(ownerAdapter, interactionInitiatedBy);
+        return new PropertyAccessContext(
+                ownerAdapter, getIdentifier(), referencedAdapter, interactionInitiatedBy
+        );
+    }
+
+    @Override
+    public boolean isEmpty(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
+        return get(ownerAdapter, interactionInitiatedBy) == null;
+    }
+
+    //endregion
+
+    //region > Set
+    @Override
+    public void set(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter) {
+        set(ownerAdapter, newReferencedAdapter, InteractionInitiatedBy.USER);
+    }
+
+    @Override
+    public void set(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        if (newReferencedAdapter != null) {
+            setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+        } else {
+            clearValue(ownerAdapter, interactionInitiatedBy);
+        }
+    }
+
+    /**
+     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
+     */
+    @Deprecated
+    @Override
+    public void setAssociation(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+    }
+
+    private void setValue(
+            final ObjectAdapter ownerAdapter,
+            final ObjectAdapter newReferencedAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertySetterFacet setterFacet = getFacet(PropertySetterFacet.class);
+        if (setterFacet == null) {
+            return;
+        }
+        if (ownerAdapter.representsPersistent() && newReferencedAdapter != null && newReferencedAdapter.isTransient() && !newReferencedAdapter.getSpecification().isParented()) {
+            // TODO: move to facet ?
+            throw new IsisException("can't set a reference to a transient object from a persistent one: " + newReferencedAdapter.titleString(null) + " (transient)");
+        }
+        setterFacet.setProperty(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
+    }
+
+    /**
+     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
+     */
+    @Deprecated
+    @Override
+    public void clearAssociation(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        clearValue(ownerAdapter, interactionInitiatedBy);
+    }
+
+    private void clearValue(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyClearFacet facet = getFacet(PropertyClearFacet.class);
+        facet.clearProperty(ownerAdapter, interactionInitiatedBy);
+    }
+
+    //endregion
+
+    //region > defaults
+    @Override
+    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
+        PropertyDefaultFacet propertyDefaultFacet = getFacet(PropertyDefaultFacet.class);
+        // if no default on the association, attempt to find a default on the
+        // specification (eg an int should
+        // default to 0).
+        if (propertyDefaultFacet == null || propertyDefaultFacet.isNoop()) {
+            propertyDefaultFacet = this.getSpecification().getFacet(PropertyDefaultFacet.class);
+        }
+        if (propertyDefaultFacet == null) {
+            return null;
+        }
+        return propertyDefaultFacet.getDefault(ownerAdapter);
+    }
+
+    @Override
+    public void toDefault(final ObjectAdapter ownerAdapter) {
+        // don't default optional fields
+        final MandatoryFacet mandatoryFacet = getFacet(MandatoryFacet.class);
+        if (mandatoryFacet != null && mandatoryFacet.isInvertedSemantics()) {
+            return;
+        }
+
+        final ObjectAdapter defaultValue = getDefault(ownerAdapter);
+        if (defaultValue != null) {
+            initAssociation(ownerAdapter, defaultValue);
+        }
+    }
+
+    //endregion
+
+    //region > choices and autoComplete
+    @Override
+    public boolean hasChoices() {
+        return getFacet(PropertyChoicesFacet.class) != null;
+    }
+
+    @Override
+    public ObjectAdapter[] getChoices(
+            final ObjectAdapter ownerAdapter,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyChoicesFacet propertyChoicesFacet = getFacet(PropertyChoicesFacet.class);
+        if (propertyChoicesFacet == null) {
+            return null;
+        }
+        final Object[] pojoOptions = propertyChoicesFacet.getChoices(
+                ownerAdapter,
+                getSpecificationLoader(),
+                interactionInitiatedBy);
+        List<ObjectAdapter> adapters = Lists.transform(
+                Lists.newArrayList(pojoOptions), ObjectAdapter.Functions.adapterForUsing(getPersistenceSessionService()));
+        return adapters.toArray(new ObjectAdapter[]{});
+    }
+
+
+    @Override
+    public boolean hasAutoComplete() {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        return propertyAutoCompleteFacet != null;
+    }
+
+    @Override
+    public ObjectAdapter[] getAutoComplete(
+            final ObjectAdapter ownerAdapter,
+            final String searchArg,
+            final InteractionInitiatedBy interactionInitiatedBy) {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        final Object[] pojoOptions = propertyAutoCompleteFacet.autoComplete(ownerAdapter, searchArg,
+                interactionInitiatedBy);
+        if (pojoOptions != null) {
+            final ObjectAdapter[] options = new ObjectAdapter[pojoOptions.length];
+            for (int i = 0; i < options.length; i++) {
+                options[i] = getPersistenceSessionService().adapterFor(pojoOptions[i]);
+            }
+            return options;
+        }
+        return null;
+    }
+
+    @Override
+    public int getAutoCompleteMinLength() {
+        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
+        return propertyAutoCompleteFacet != null? propertyAutoCompleteFacet.getMinLength(): MinLengthUtil.MIN_LENGTH_DEFAULT;
+    }
+
+    //endregion
+
+    //region > debug, toString
+    @Override
+    public String debugData() {
+        final DebugString debugString = new DebugString();
+        debugString.indent();
+        debugString.indent();
+        getFacetedMethod().debugData(debugString);
+        return debugString.toString();
+    }
+
+    @Override
+    public String toString() {
+        final ToString str = new ToString(this);
+        str.append(super.toString());
+        str.setAddComma();
+        str.append("persisted", !isNotPersisted());
+        str.append("type", getSpecification().getShortIdentifier());
+        return str.toString();
+    }
+    //endregion
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
deleted file mode 100644
index 07874fa..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
+++ /dev/null
@@ -1,356 +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.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.debug.DebugString;
-import org.apache.isis.core.commons.exceptions.IsisException;
-import org.apache.isis.core.commons.util.ToString;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.consent.InteractionResult;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
-import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
-import org.apache.isis.core.metamodel.facets.properties.autocomplete.PropertyAutoCompleteFacet;
-import org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacet;
-import org.apache.isis.core.metamodel.facets.properties.defaults.PropertyDefaultFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.clear.PropertyClearFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.init.PropertyInitializationFacet;
-import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.PropertyAccessContext;
-import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
-import org.apache.isis.core.metamodel.interactions.PropertyUsabilityContext;
-import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.ValidityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.MutableCurrentHolder;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-
-public class OneToOneAssociationImpl extends ObjectAssociationAbstract implements OneToOneAssociation {
-
-    public OneToOneAssociationImpl(
-            final FacetedMethod facetedMethod,
-            final ObjectMemberDependencies objectMemberDependencies) {
-        this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
-                objectMemberDependencies);
-    }
-    
-    protected OneToOneAssociationImpl(
-            final FacetedMethod facetedMethod,
-            final ObjectSpecification objectSpec,
-            final ObjectMemberDependencies objectMemberDependencies) {
-        super(facetedMethod, FeatureType.PROPERTY, objectSpec, objectMemberDependencies);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Hidden (or visible)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public VisibilityContext<?> createVisibleInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new PropertyVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Disabled (or enabled)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public UsabilityContext<?> createUsableInteractionContext(
-            final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        return new PropertyUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Validate
-    // /////////////////////////////////////////////////////////////
-
-    private ValidityContext<?> createValidateInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToReferenceAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return new PropertyModifyContext(ownerAdapter, getIdentifier(), proposedToReferenceAdapter,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isAssociationValid(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        return isAssociationValidResult(ownerAdapter, proposedAdapter, interactionInitiatedBy).createConsent();
-    }
-
-    private InteractionResult isAssociationValidResult(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter proposedToReferenceAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ValidityContext<?> validityContext =
-                createValidateInteractionContext(
-                        ownerAdapter, proposedToReferenceAdapter, interactionInitiatedBy
-                );
-        return InteractionUtils.isValidResult(this, validityContext);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // init
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public void initAssociation(final ObjectAdapter ownerAdapter, final ObjectAdapter referencedAdapter) {
-        final PropertyInitializationFacet initializerFacet = getFacet(PropertyInitializationFacet.class);
-        if (initializerFacet != null) {
-            initializerFacet.initProperty(ownerAdapter, referencedAdapter);
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Access (get, isEmpty)
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public ObjectAdapter get(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyOrCollectionAccessorFacet facet = getFacet(PropertyOrCollectionAccessorFacet.class);
-        final Object referencedPojo =
-                facet.getProperty(ownerAdapter, interactionInitiatedBy);
-
-        if (referencedPojo == null) {
-            return null;
-        }
-
-        return getPersistenceSessionService().adapterFor(referencedPojo);
-    }
-
-    // UNUSED
-    private PropertyAccessContext createAccessInteractionContext(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final ObjectAdapter referencedAdapter = get(ownerAdapter, interactionInitiatedBy);
-        return new PropertyAccessContext(
-                ownerAdapter, getIdentifier(), referencedAdapter, interactionInitiatedBy
-        );
-    }
-
-    @Override
-    public boolean isEmpty(final ObjectAdapter ownerAdapter, final InteractionInitiatedBy interactionInitiatedBy) {
-        return get(ownerAdapter, interactionInitiatedBy) == null;
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // Set
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public void set(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter) {
-        set(ownerAdapter, newReferencedAdapter, InteractionInitiatedBy.USER);
-    }
-
-    @Override
-    public void set(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        if (newReferencedAdapter != null) {
-            setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-        } else {
-            clearValue(ownerAdapter, interactionInitiatedBy);
-        }
-    }
-
-    /**
-     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
-     */
-    @Deprecated
-    @Override
-    public void setAssociation(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        setValue(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-    }
-
-    private void setValue(
-            final ObjectAdapter ownerAdapter,
-            final ObjectAdapter newReferencedAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertySetterFacet setterFacet = getFacet(PropertySetterFacet.class);
-        if (setterFacet == null) {
-            return;
-        }
-        if (ownerAdapter.representsPersistent() && newReferencedAdapter != null && newReferencedAdapter.isTransient() && !newReferencedAdapter.getSpecification().isParented()) {
-            // TODO: move to facet ?
-            throw new IsisException("can't set a reference to a transient object from a persistent one: " + newReferencedAdapter.titleString(null) + " (transient)");
-        }
-        setterFacet.setProperty(ownerAdapter, newReferencedAdapter, interactionInitiatedBy);
-    }
-
-    /**
-     * @see MutableCurrentHolder#set(ObjectAdapter, ObjectAdapter, InteractionInitiatedBy)
-     */
-    @Deprecated
-    @Override
-    public void clearAssociation(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        clearValue(ownerAdapter, interactionInitiatedBy);
-    }
-
-    private void clearValue(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyClearFacet facet = getFacet(PropertyClearFacet.class);
-        facet.clearProperty(ownerAdapter, interactionInitiatedBy);
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // defaults
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
-        PropertyDefaultFacet propertyDefaultFacet = getFacet(PropertyDefaultFacet.class);
-        // if no default on the association, attempt to find a default on the
-        // specification (eg an int should
-        // default to 0).
-        if (propertyDefaultFacet == null || propertyDefaultFacet.isNoop()) {
-            propertyDefaultFacet = this.getSpecification().getFacet(PropertyDefaultFacet.class);
-        }
-        if (propertyDefaultFacet == null) {
-            return null;
-        }
-        return propertyDefaultFacet.getDefault(ownerAdapter);
-    }
-
-    @Override
-    public void toDefault(final ObjectAdapter ownerAdapter) {
-        // don't default optional fields
-        final MandatoryFacet mandatoryFacet = getFacet(MandatoryFacet.class);
-        if (mandatoryFacet != null && mandatoryFacet.isInvertedSemantics()) {
-            return;
-        }
-
-        final ObjectAdapter defaultValue = getDefault(ownerAdapter);
-        if (defaultValue != null) {
-            initAssociation(ownerAdapter, defaultValue);
-        }
-    }
-
-    // /////////////////////////////////////////////////////////////
-    // choices and autoComplete
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public boolean hasChoices() {
-        return getFacet(PropertyChoicesFacet.class) != null;
-    }
-
-    @Override
-    public ObjectAdapter[] getChoices(
-            final ObjectAdapter ownerAdapter,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyChoicesFacet propertyChoicesFacet = getFacet(PropertyChoicesFacet.class);
-        if (propertyChoicesFacet == null) {
-            return null;
-        }
-        final Object[] pojoOptions = propertyChoicesFacet.getChoices(
-                ownerAdapter,
-                getSpecificationLoader(),
-                interactionInitiatedBy);
-        List<ObjectAdapter> adapters = Lists.transform(
-                Lists.newArrayList(pojoOptions), ObjectAdapter.Functions.adapterForUsing(getPersistenceSessionService()));
-        return adapters.toArray(new ObjectAdapter[]{});
-    }
-
-
-    @Override
-    public boolean hasAutoComplete() {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        return propertyAutoCompleteFacet != null;
-    }
-
-    @Override
-    public ObjectAdapter[] getAutoComplete(
-            final ObjectAdapter ownerAdapter,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        final Object[] pojoOptions = propertyAutoCompleteFacet.autoComplete(ownerAdapter, searchArg,
-                interactionInitiatedBy);
-        if (pojoOptions != null) {
-            final ObjectAdapter[] options = new ObjectAdapter[pojoOptions.length];
-            for (int i = 0; i < options.length; i++) {
-                options[i] = getPersistenceSessionService().adapterFor(pojoOptions[i]);
-            }
-            return options;
-        }
-        return null;
-    }
-
-    @Override
-    public int getAutoCompleteMinLength() {
-        final PropertyAutoCompleteFacet propertyAutoCompleteFacet = getFacet(PropertyAutoCompleteFacet.class);
-        return propertyAutoCompleteFacet != null? propertyAutoCompleteFacet.getMinLength(): MinLengthUtil.MIN_LENGTH_DEFAULT;
-    }
-
-
-    // /////////////////////////////////////////////////////////////
-    // debug, toString
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public String debugData() {
-        final DebugString debugString = new DebugString();
-        debugString.indent();
-        debugString.indent();
-        getFacetedMethod().debugData(debugString);
-        return debugString.toString();
-    }
-
-    @Override
-    public String toString() {
-        final ToString str = new ToString(this);
-        str.append(super.toString());
-        str.setAddComma();
-        str.append("persisted", !isNotPersisted());
-        str.append("type", getSpecification().getShortIdentifier());
-        return str.toString();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 2e0512f..071f760 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -65,10 +65,10 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilder;
 import org.apache.isis.core.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl;
-import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationImpl;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationDefault;
+import org.apache.isis.core.metamodel.specloader.specimpl.OneToOneAssociationDefault;
 
 public class ObjectSpecificationDefault extends ObjectSpecificationAbstract implements DebuggableWithTitle, FacetHolder {
 
@@ -223,9 +223,9 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     private ObjectAssociation createAssociation(final FacetedMethod facetMethod) {
         if (facetMethod.getFeatureType().isCollection()) {
-            return new OneToManyAssociationImpl(facetMethod, objectMemberDependencies);
+            return new OneToManyAssociationDefault(facetMethod, objectMemberDependencies);
         } else if (facetMethod.getFeatureType().isProperty()) {
-            return new OneToOneAssociationImpl(facetMethod, objectMemberDependencies);
+            return new OneToOneAssociationDefault(facetMethod, objectMemberDependencies);
         } else {
             return null;
         }
@@ -246,7 +246,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     private ObjectAction createAction(final FacetedMethod facetedMethod) {
         if (facetedMethod.getFeatureType().isAction()) {
-            return new ObjectActionImpl(facetedMethod, objectMemberDependencies);
+            return new ObjectActionDefault(facetedMethod, objectMemberDependencies);
         } else {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
new file mode 100644
index 0000000..fdb3eaf
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedInTest.java
@@ -0,0 +1,44 @@
+package org.apache.isis.core.metamodel.specloader.specimpl;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class ObjectActionMixedInTest {
+
+
+    public static class SuffixAfterUnderscore extends ObjectActionMixedInTest {
+
+        @Test
+        public void exactly_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("_");
+            assertThat(s, is("_"));
+        }
+
+        @Test
+        public void ends_with_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_");
+            assertThat(s, is("Abc_"));
+        }
+
+        @Test
+        public void has_no_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("defghij");
+            assertThat(s, is("Defghij"));
+        }
+
+        @Test
+        public void contains_one_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def");
+            assertThat(s, is("Def"));
+        }
+
+        @Test
+        public void contains_more_than_one_underscore() throws Exception {
+            final String s = ObjectActionMixedIn.suffixAfterUnderscore("abc_def_ghi");
+            assertThat(s, is("Ghi"));
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index a115fda..5bf63dc 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -37,7 +37,6 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
@@ -49,7 +48,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
     @Mock
-    private ObjectActionImpl parentAction;
+    private ObjectActionDefault parentAction;
     @Mock
     private TypedHolder actionParamPeer;
     @Mock
@@ -64,7 +63,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
 
     private final static class ObjectActionParameterAbstractToTest extends ObjectActionParameterAbstract {
-        private ObjectActionParameterAbstractToTest(final int number, final ObjectActionImpl objectAction, final TypedHolder peer) {
+        private ObjectActionParameterAbstractToTest(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
             super(number, objectAction, peer);
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
new file mode 100644
index 0000000..7e446c1
--- /dev/null
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionDefaultTest.java
@@ -0,0 +1,107 @@
+/*
+ *  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.core.runtime.system;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
+import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
+import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+public class ObjectActionDefaultTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+    
+    
+    private ObjectActionDefault action;
+    
+    @Mock
+    private FacetedMethod mockFacetedMethod;
+
+    @Mock
+    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock
+    private SpecificationLoader mockSpecificationLookup;
+    @Mock
+    private AdapterManager mockAdapterManager;
+    @Mock
+    private ServicesInjector mockServicesInjector;
+    @Mock
+    private MessageBrokerService mockMessageBrokerService;
+    @Mock
+    private PersistenceSessionService mockPersistenceSessionService;
+
+    @Before
+    public void setUp() throws Exception {
+
+        context.checking(new Expectations() {
+            {
+                one(mockFacetedMethod).getIdentifier();
+                will(returnValue(Identifier.actionIdentifier("Customer", "reduceheadcount")));
+            }
+        });
+
+        action = new ObjectActionDefault(mockFacetedMethod, new ObjectMemberDependencies(
+                mockSpecificationLookup, mockServicesInjector,
+                mockPersistenceSessionService));
+    }
+
+
+    @Test
+    public void testNameDefaultsToActionsMethodName() {
+        final String name = "Reduceheadcount";
+        final NamedFacet facet = new NamedFacetAbstract(name, true, mockFacetedMethod) {
+        };
+        context.checking(new Expectations() {
+            {
+                one(mockFacetedMethod).getFacet(NamedFacet.class);
+                will(returnValue(facet));
+            }
+        });
+        assertThat(action.getName(), is(equalTo(name)));
+    }
+
+    @Test
+    public void testId() {
+        assertEquals("reduceheadcount", action.getId());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/6c888136/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
deleted file mode 100644
index 307ff00..0000000
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectActionImplTest.java
+++ /dev/null
@@ -1,107 +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.core.runtime.system;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
-import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
-import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
-import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-public class ObjectActionImplTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-    
-    
-    private ObjectActionImpl action;
-    
-    @Mock
-    private FacetedMethod mockFacetedMethod;
-
-    @Mock
-    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    private SpecificationLoader mockSpecificationLookup;
-    @Mock
-    private AdapterManager mockAdapterManager;
-    @Mock
-    private ServicesInjector mockServicesInjector;
-    @Mock
-    private MessageBrokerService mockMessageBrokerService;
-    @Mock
-    private PersistenceSessionService mockPersistenceSessionService;
-
-    @Before
-    public void setUp() throws Exception {
-
-        context.checking(new Expectations() {
-            {
-                one(mockFacetedMethod).getIdentifier();
-                will(returnValue(Identifier.actionIdentifier("Customer", "reduceheadcount")));
-            }
-        });
-
-        action = new ObjectActionImpl(mockFacetedMethod, new ObjectMemberDependencies(
-                mockSpecificationLookup, mockServicesInjector,
-                mockPersistenceSessionService));
-    }
-
-
-    @Test
-    public void testNameDefaultsToActionsMethodName() {
-        final String name = "Reduceheadcount";
-        final NamedFacet facet = new NamedFacetAbstract(name, true, mockFacetedMethod) {
-        };
-        context.checking(new Expectations() {
-            {
-                one(mockFacetedMethod).getFacet(NamedFacet.class);
-                will(returnValue(facet));
-            }
-        });
-        assertThat(action.getName(), is(equalTo(name)));
-    }
-
-    @Test
-    public void testId() {
-        assertEquals("reduceheadcount", action.getId());
-    }
-
-}


[04/12] isis git commit: ISIS-1194: deleting Specification#getInstance() and implementations - never used.

Posted by da...@apache.org.
ISIS-1194: deleting Specification#getInstance() and implementations - never used.


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

Branch: refs/heads/ISIS-1213
Commit: 49dc51be61ea5d0690134bf1cee60f5752ab324d
Parents: 9961b39
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Oct 12 23:55:39 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Oct 12 23:55:39 2015 +0100

----------------------------------------------------------------------
 .../isis/core/metamodel/spec/Specification.java | 27 +-------------------
 .../specloader/specimpl/ObjectActionImpl.java   |  9 -------
 .../ObjectActionParameterParseable.java         | 14 ++--------
 .../specimpl/ObjectSpecificationAbstract.java   | 12 ---------
 .../specimpl/OneToManyAssociationImpl.java      | 10 --------
 .../specimpl/OneToOneActionParameterImpl.java   | 10 --------
 .../specimpl/OneToOneAssociationImpl.java       | 10 --------
 ...ParameterAbstractTest_getId_and_getName.java |  5 ----
 .../specimpl/ObjectAssociationAbstractTest.java |  5 ----
 ...ectAssociationAbstractTest_alwaysHidden.java |  5 ----
 .../testspec/ObjectSpecificationStub.java       | 14 ++++------
 .../system/ObjectMemberAbstractTest.java        | 12 +++------
 12 files changed, 12 insertions(+), 121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java
index 07d82c1..88ee27d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java
@@ -19,13 +19,11 @@
 
 package org.apache.isis.core.metamodel.spec;
 
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 /**
  * Base interface for elements of the metamodel.
@@ -44,32 +42,9 @@ public interface Specification extends IdentifiedHolder {
     FeatureType getFeatureType();
 
     /**
-     * Returns a description of how the member is used - this complements the
-     * help text.
-     * 
-     * @see #getHelp()
+     * Returns a description of how the member is used.
      */
     String getDescription();
 
-    /**
-     * Return an {@link Instance} of this {@link Specification} with respect to
-     * the provided {@link ObjectAdapter}.
-     * 
-     * <p>
-     * For example, if the {@link Specification} is a
-     * {@link OneToOneAssociation}, then is an {@link Instance} implementation
-     * representing the { {@link ObjectAdapter}/ {@link OneToOneAssociation}
-     * tuple.
-     * 
-     * <p>
-     * Implementations are expected to use a double-dispatch back to the
-     * provided {@link ObjectAdapter} (passing themselves as a parameter), using
-     * {@link ObjectAdapter#getInstance(Specification)}.
-     * 
-     * <p>
-     * Note: this method may throw an {@link UnsupportedOperationException}; see
-     * {@link ObjectAdapter#getInstance(Specification)} for details.
-     */
-    Instance getInstance(final ObjectAdapter adapter);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
index 4d6ac09..02e63a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
@@ -137,15 +137,6 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return facet != null? facet.value(): ActionSemantics.Of.NON_IDEMPOTENT;
     }
 
-    // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        final ObjectAction specification = this;
-        return adapter.getInstance(specification);
-    }
 
     // /////////////////////////////////////////////////////////////
     // Type, IsContributed

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
index 40318c2..4aa2c5e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
@@ -60,23 +60,13 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
     }
 
 
-    // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        final OneToOneActionParameter specification = this;
-        return adapter.getInstance(specification);
-    }
-
     // //////////////////////////////////////////////////////////////////////
     // get, set
     // //////////////////////////////////////////////////////////////////////
 
     /**
      * Gets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposed}, wrapping the proposed value into a
+     * {@link MutableProposedHolder}, wrapping the proposed value into a
      * {@link ObjectAdapter}.
      */
     @Override
@@ -88,7 +78,7 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
 
     /**
      * Sets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposed}, unwrapped the proposed value from a
+     * {@link MutableProposedHolder}, unwrapped the proposed value from a
      * {@link ObjectAdapter}.
      */
     public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/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 0ee3b2b..548bf43 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
@@ -423,18 +423,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     //endregion
 
-    //region > getInstance (unused)
-
-    /**
-     * simply returns the input parameter.
-     */
-    @Deprecated
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        return adapter;
-    }
-    //endregion
-
     //region > Hierarchical
     /**
      * Determines if this class represents the same class, or a subclass, of the

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
index 093523d..41291a1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
@@ -280,16 +280,6 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
     }
 
     // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        final OneToManyAssociation specification = this;
-        return adapter.getInstance(specification);
-    }
-
-    // /////////////////////////////////////////////////////////////
     // debug, toString
     // /////////////////////////////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
index 1cbf084..ece1864 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
@@ -44,16 +44,6 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
     }
 
 
-    // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        final OneToOneActionParameter specification = this;
-        return adapter.getInstance(specification);
-    }
-
     // //////////////////////////////////////////////////////////////////////
     // get, set
     // //////////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
index 955530a..94d70e1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
@@ -326,16 +326,6 @@ public class OneToOneAssociationImpl extends ObjectAssociationAbstract implement
 
 
     // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter ownerAdapter) {
-        final OneToOneAssociation specification = this;
-        return ownerAdapter.getInstance(specification);
-    }
-
-    // /////////////////////////////////////////////////////////////
     // debug, toString
     // /////////////////////////////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index 259c999..a115fda 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -76,11 +76,6 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
         }
 
         @Override
-        public Instance getInstance(final ObjectAdapter adapter) {
-            return null;
-        }
-
-        @Override
         public FeatureType getFeatureType() {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
index 80894f4..5ad8d26 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest.java
@@ -122,11 +122,6 @@ public class ObjectAssociationAbstractTest {
             }
 
             @Override
-            public Instance getInstance(final ObjectAdapter adapter) {
-                return null;
-            }
-
-            @Override
             public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
                 return false;
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
index ee765cd..1c8da27 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstractTest_alwaysHidden.java
@@ -117,11 +117,6 @@ public class ObjectAssociationAbstractTest_alwaysHidden {
             }
 
             @Override
-            public Instance getInstance(final ObjectAdapter adapter) {
-                return null;
-            }
-
-            @Override
             public boolean containsDoOpFacet(final Class<? extends Facet> facetType) {
                 return false;
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index a56a549..7f405c0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -363,15 +363,11 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
         return null;
     }
 
-    // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public ObjectAdapter getInstance(final ObjectAdapter adapter) {
-        return adapter;
-    }
-
+    /**
+     * @deprecated - unused ?
+     * @return
+     */
+    @Deprecated
     public RuntimeContext getRuntimeContext() {
         return runtimeContext;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/49dc51be/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
index 0f8b0f9..3af1e0e 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
@@ -280,6 +280,10 @@ class ObjectMemberAbstractImpl extends ObjectMemberAbstract {
         return null;
     }
 
+    /**
+     * @deprecated - unused ?
+     */
+    @Deprecated
     public Consent isUsable(final ObjectAdapter target) {
         return null;
     }
@@ -304,13 +308,5 @@ class ObjectMemberAbstractImpl extends ObjectMemberAbstract {
                 where);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // getInstance
-    // /////////////////////////////////////////////////////////////
-
-    @Override
-    public Instance getInstance(final ObjectAdapter adapter) {
-        return null;
-    }
 
 }


[08/12] isis git commit: ISIS-1194: converting regions to use IntelliJ-style. Removing one or two unused instance vars.

Posted by da...@apache.org.
ISIS-1194: converting regions to use IntelliJ-style.  Removing one or two unused instance vars.


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

Branch: refs/heads/ISIS-1213
Commit: 9f251d9c9db58fac4e252a7304067cf5de14a32c
Parents: c62f937
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 13 06:59:33 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 13 06:59:33 2015 +0100

----------------------------------------------------------------------
 .../specimpl/ObjectActionContributee.java       |  2 +-
 .../specloader/specimpl/ObjectActionImpl.java   | 66 +++++++++-----------
 .../specimpl/ObjectActionMixedIn.java           |  3 -
 .../specimpl/ObjectActionParameterAbstract.java | 46 ++++++--------
 .../ObjectActionParameterContributee.java       |  1 -
 .../specimpl/ObjectAssociationAbstract.java     |  1 -
 .../specimpl/ObjectMemberAbstract.java          | 52 +++++++--------
 .../OneToManyAssociationContributee.java        |  9 ++-
 .../specimpl/OneToManyAssociationImpl.java      | 50 +++++++--------
 .../OneToOneActionParameterContributee.java     |  8 ---
 .../OneToOneAssociationContributee.java         |  9 ++-
 .../specimpl/OneToOneAssociationImpl.java       | 10 ++-
 12 files changed, 109 insertions(+), 148 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/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 8fcf8d8..fe1a5df 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
@@ -137,7 +137,7 @@ public class ObjectActionContributee extends ObjectActionImpl implements Contrib
                         (ObjectActionParameterAbstract) serviceParameters.get(serviceParamNum);
                 final ObjectActionParameterContributee contributedParam;
                 contributedParam = new OneToOneActionParameterContributee(
-                        getServiceAdapter(), serviceAction, serviceParameter, serviceParamNum,
+                        getServiceAdapter(), serviceParameter,
                         contributeeParamNum, this);
                 contributeeParameters.add(contributedParam);
                 

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
index cdc0d56..ae38776 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionImpl.java
@@ -67,6 +67,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
 public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectAction {
+
     private final static Logger LOG = LoggerFactory.getLogger(ObjectActionImpl.class);
 
     public static ActionType getType(final String typeStr) {
@@ -77,25 +78,24 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return type;
     }
 
+    //region > fields
 
     /**
      * Lazily initialized by {@link #getParameters()} (so don't use directly!)
      */
     private List<ObjectActionParameter> parameters;
 
-    
-    // //////////////////////////////////////////////////////////////////
-    // Constructors
-    // //////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > constructors
 
     public ObjectActionImpl(final FacetedMethod facetedMethod, final ObjectMemberDependencies objectMemberDependencies) {
         super(facetedMethod, FeatureType.ACTION, objectMemberDependencies);
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // ReturnType, OnType, Actions (set)
-    // //////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > ReturnType, OnType, Actions (set)
     /**
      * Always returns <tt>null</tt>.
      */
@@ -136,11 +136,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return facet != null? facet.value(): ActionSemantics.Of.NON_IDEMPOTENT;
     }
 
+    //endregion
 
-    // /////////////////////////////////////////////////////////////
-    // Type, IsContributed
-    // /////////////////////////////////////////////////////////////
-
+    //region > Type
     @Override
     public ActionType getType() {
         return getType(this);
@@ -161,10 +159,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         }
         return ActionType.USER;
     }
+    //endregion
 
-    // /////////////////////////////////////////////////////////////
-    // Parameters
-    // /////////////////////////////////////////////////////////////
+    //region > Parameters
 
     @Override
     public int getParameterCount() {
@@ -264,9 +261,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return parameters.get(position);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Visible (or hidden)
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > visable, usable
 
     @Override
     public VisibilityContext<?> createVisibleInteractionContext(
@@ -275,20 +272,15 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return new ActionVisibilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Usable (or disabled)
-    // /////////////////////////////////////////////////////////////
-
     @Override
     public UsabilityContext<?> createUsableInteractionContext(
             final ObjectAdapter targetObjectAdapter, final InteractionInitiatedBy interactionInitiatedBy,
             Where where) {
         return new ActionUsabilityContext(targetObjectAdapter, getIdentifier(), interactionInitiatedBy, where);
     }
+    //endregion
 
-    // //////////////////////////////////////////////////////////////////
-    // validate
-    // //////////////////////////////////////////////////////////////////
+    //region > validate
 
     @Override
     public Consent isProposedArgumentSetValid(
@@ -331,9 +323,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
                 interactionInitiatedBy);
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // executeWithRuleChecking, execute
-    // //////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > executeWithRuleChecking, execute
 
     @Override
     public ObjectAdapter executeWithRuleChecking(
@@ -381,9 +373,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
     }
 
 
-    // //////////////////////////////////////////////////////////////////
-    // defaults
-    // //////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > defaults
 
     @Override
     public ObjectAdapter[] getDefaults(final ObjectAdapter target) {
@@ -437,9 +429,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return pojo == null ? null : getPersistenceSessionService().adapterFor(pojo);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // options (choices)
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > choices
 
     @Override
     public ObjectAdapter[][] getChoices(
@@ -506,9 +498,9 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return parameterChoicesAdapters;
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // debug, toString
-    // //////////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > debug, toString
 
     @Override
     public String debugData() {
@@ -537,5 +529,7 @@ public class ObjectActionImpl extends ObjectMemberAbstract implements ObjectActi
         return sb.toString();
     }
 
+    //endregion
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 9574080..64b48e7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -110,7 +110,6 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
     }
 
     public synchronized List<ObjectActionParameter> getParameters() {
-        //return mixinAction.getParameters();
 
         if (this.parameters == null) {
             final List<ObjectActionParameter> mixinActionParameters = mixinAction.getParameters();
@@ -195,8 +194,6 @@ public class ObjectActionMixedIn extends ObjectActionImpl implements MixedInMemb
                 bulkInteractionContext.setInvokedAs(Bulk.InteractionContext.InvokedAs.REGULAR);
                 actionInvocationContext.setDomainObjects(Collections.singletonList(mixedInAdapter.getObject()));
             }
-
-
         }
 
         final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 4552f0a..81bff3d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -67,8 +67,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     private final ObjectActionImpl parentAction;
     private final TypedHolder peer;
 
-
-
     protected ObjectActionParameterAbstract(final int number, final ObjectActionImpl objectAction, final TypedHolder peer) {
         this.number = number;
         this.parentAction = objectAction;
@@ -93,7 +91,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return getAdapterMap().adapterFor(proposed);
     }
 
-
     protected MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
         if (!(owner instanceof MutableProposedHolder)) {
             throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
@@ -101,7 +98,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return (MutableProposedHolder) owner;
     }
 
-
     /**
      * Parameter number, 0-based.
      */
@@ -116,9 +112,10 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     }
 
     /**
-     * NOT API, but exposed for the benefit of {@link ObjectActionParameterContributee}.
+     * NOT API, but exposed for the benefit of {@link ObjectActionParameterContributee}
+     * and {@link ObjectActionParameterMixedIn}.
      */
-    public TypedHolder getPeer() {
+    TypedHolder getPeer() {
         return peer;
     }
 
@@ -199,9 +196,7 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return Allow.DEFAULT;
     }
 
-    // //////////////////////////////////////////////////////////
-    // FacetHolder
-    // //////////////////////////////////////////////////////////
+    //region > FacetHolder
 
     @Override
     public boolean containsFacet(final Class<? extends Facet> facetType) {
@@ -257,10 +252,9 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         }
     }
 
+    //endregion
 
-    // /////////////////////////////////////////////////////////////
-    // AutoComplete
-    // /////////////////////////////////////////////////////////////
+    //region > AutoComplete
 
     @Override
     public boolean hasAutoComplete() {
@@ -300,10 +294,9 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return facet != null? facet.getMinLength(): MinLengthUtil.MIN_LENGTH_DEFAULT;
     }
 
+    //endregion
 
-    // /////////////////////////////////////////////////////////////
-    // Choices
-    // /////////////////////////////////////////////////////////////
+    //region > Choices
 
     @Override
     public boolean hasChoices() {
@@ -348,10 +341,10 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         */
         return adapters.toArray(new ObjectAdapter[adapters.size()]);
     }
-    
-    // /////////////////////////////////////////////////////////////
-    // Defaults
-    // /////////////////////////////////////////////////////////////
+
+    //endregion
+
+    //region > Defaults
 
     @Override
     public ObjectAdapter getDefault(final ObjectAdapter adapter) {
@@ -437,10 +430,9 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         }
     }
 
-    
-    // /////////////////////////////////////////////////////////////
-    // Validation
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > Validation
 
     @Override
     public ActionArgumentContext createProposedArgumentInteractionContext(
@@ -499,9 +491,9 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return arguments;
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Dependencies (from parent)
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > Dependencies (from parent)
 
     protected SpecificationLoader getSpecificationLoader() {
         return parentAction.getSpecificationLoader();
@@ -515,4 +507,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         return parentAction.getPersistenceSessionService();
     }
 
+    //endregion
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
index 4930fa1..877a994 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributee.java
@@ -18,7 +18,6 @@ package org.apache.isis.core.metamodel.specloader.specimpl;
 
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
-
 public interface ObjectActionParameterContributee extends ObjectActionParameter {
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
index 8787b5d..3884074 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectAssociationAbstract.java
@@ -31,7 +31,6 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 
-// TODO need to pull up the common methods. like getName(), from subclasses
 public abstract class ObjectAssociationAbstract extends ObjectMemberAbstract implements ObjectAssociation {
 
     private final ObjectSpecification specification;

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 30e3e4e..57eb6fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -27,7 +27,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.lang.StringExtensions;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
@@ -56,12 +55,11 @@ import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.Collecti
 
 public abstract class ObjectMemberAbstract implements ObjectMember {
 
-    private final PersistenceSessionService persistenceSessionService;
-
     public static ObjectSpecification getSpecification(final SpecificationLoader specificationLookup, final Class<?> type) {
         return type == null ? null : specificationLookup.loadSpecification(type);
     }
 
+    //region > fields
     private final CollectionTypeRegistry collectionTypeRegistry = new CollectionTypeRegistry();
 
     protected final String defaultName;
@@ -70,6 +68,8 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     private final FeatureType featureType;
     private final SpecificationLoader specificationLookup;
     private final ServicesInjector servicesInjector;
+    private final PersistenceSessionService persistenceSessionService;
+    //endregion
 
     protected ObjectMemberAbstract(
             final FacetedMethod facetedMethod,
@@ -89,10 +89,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         this.persistenceSessionService = objectMemberDependencies.getPersistenceSessionService();
     }
 
-
-    // /////////////////////////////////////////////////////////////
-    // Identifiers
-    // /////////////////////////////////////////////////////////////
+    //region > Identifiers
 
     @Override
     public String getId() {
@@ -116,9 +113,9 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return featureType;
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Facets
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > Facets
 
     @Override
     public boolean containsFacet(final Class<? extends Facet> facetType) {
@@ -165,10 +162,9 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         getFacetedMethod().removeFacet(facetType);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Name, Description, Help (convenience for facets)
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Name, Description, Help (convenience for facets)
     /**
      * Return the default label for this member. This is based on the name of
      * this member.
@@ -200,10 +196,9 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return facet.value();
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Hidden (or visible)
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Hidden (or visible)
     /**
      * Create an {@link InteractionContext} to represent an attempt to view this
      * member (that is, to check if it is visible or not).
@@ -251,11 +246,9 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         final VisibilityContext<?> ic = createVisibleInteractionContext(target, interactionInitiatedBy, where);
         return InteractionUtils.isVisibleResult(this, ic);
     }
+    //endregion
 
-    // /////////////////////////////////////////////////////////////
-    // Disabled (or enabled)
-    // /////////////////////////////////////////////////////////////
-
+    //region > Disabled (or enabled)
     /**
      * Create an {@link InteractionContext} to represent an attempt to
      * use this member (that is, to check if it is usable or not).
@@ -291,10 +284,9 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
         return InteractionUtils.isUsableResult(this, ic);
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // isAssociation, isAction
-    // //////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > isAssociation, isAction
     @Override
     public boolean isAction() {
         return featureType.isAction();
@@ -314,21 +306,18 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     public boolean isOneToOneAssociation() {
         return featureType.isProperty();
     }
+    //endregion
 
-
-    // //////////////////////////////////////////////////////////////////
-    // toString
-    // //////////////////////////////////////////////////////////////////
+    //region > toString
 
     @Override
     public String toString() {
         return String.format("id=%s,name='%s'", getId(), getName());
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // Dependencies
-    // //////////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Dependencies
 
     public SpecificationLoader getSpecificationLoader() {
         return specificationLookup;
@@ -345,4 +334,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember {
     public CollectionTypeRegistry getCollectionTypeRegistry() {
         return collectionTypeRegistry;
     }
+
+    //endregion
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/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 0762472..953d4bc 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
@@ -161,11 +161,8 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    
-    // //////////////////////////////////////
-    // FacetHolder
-    // //////////////////////////////////////
-    
+    //region > FacetHolder
+
     @Override
     public Class<? extends Facet>[] getFacetTypes() {
         return facetHolder.getFacetTypes();
@@ -220,4 +217,6 @@ public class OneToManyAssociationContributee extends OneToManyAssociationImpl im
         return getServiceAdapter().getSpecification();
     }
 
+    //endregion
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
index 41291a1..fda40d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationImpl.java
@@ -29,11 +29,11 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionClearFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionRemoveFromFacet;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.interactions.CollectionAddToContext;
 import org.apache.isis.core.metamodel.interactions.CollectionRemoveFromContext;
 import org.apache.isis.core.metamodel.interactions.CollectionUsabilityContext;
@@ -42,7 +42,6 @@ import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
@@ -69,9 +68,7 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return getCollectionTypeRegistry().semanticsOf(underlyingClass);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Hidden (or visible)
-    // /////////////////////////////////////////////////////////////
+    //region > visible, usable
 
     @Override
     public VisibilityContext<?> createVisibleInteractionContext(
@@ -80,9 +77,6 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return new CollectionVisibilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Disabled (or enabled)
-    // /////////////////////////////////////////////////////////////
 
     @Override
     public UsabilityContext<?> createUsableInteractionContext(
@@ -91,10 +85,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return new CollectionUsabilityContext(ownerAdapter, getIdentifier(), interactionInitiatedBy, where);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Validate Add
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Validate Add
     // Not API
     private ValidityContext<?> createValidateAddInteractionContext(
             final InteractionInitiatedBy interactionInitiatedBy,
@@ -121,10 +114,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return InteractionUtils.isValidResult(this, validityContext);
     }
 
-    // /////////////////////////////////////////////////////////////
-    // Validate Remove
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > Validate Remove
     private ValidityContext<?> createValidateRemoveInteractionContext(
             final ObjectAdapter ownerAdapter,
             final ObjectAdapter proposedToRemoveAdapter,
@@ -156,9 +148,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return !isNotPersisted();
     }
 
-    // /////////////////////////////////////////////////////////////
-    // get, isEmpty, add, clear
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > get, isEmpty, add, clear
 
     @Override
     public ObjectAdapter get(
@@ -183,9 +175,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return facet.size(collection) == 0;
     }
 
-    // /////////////////////////////////////////////////////////////
-    // add, clear
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > add, clear
 
     @Override
     public void addElement(
@@ -231,10 +223,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         }
     }
 
-    // /////////////////////////////////////////////////////////////
-    // defaults
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > defaults
     @Override
     public ObjectAdapter getDefault(final ObjectAdapter ownerAdapter) {
         return null;
@@ -244,9 +235,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
     public void toDefault(final ObjectAdapter ownerAdapter) {
     }
 
-    // /////////////////////////////////////////////////////////////
-    // choices & autoComplete
-    // /////////////////////////////////////////////////////////////
+    //endregion
+
+    //region > choices & autoComplete
 
     @Override
     public ObjectAdapter[] getChoices(
@@ -279,10 +270,9 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return 0; // n/a
     }
 
-    // /////////////////////////////////////////////////////////////
-    // debug, toString
-    // /////////////////////////////////////////////////////////////
+    //endregion
 
+    //region > debug, toString
     @Override
     public String debugData() {
         final DebugString debugString = new DebugString();
@@ -302,5 +292,7 @@ public class OneToManyAssociationImpl extends ObjectAssociationAbstract implemen
         return str.toString();
     }
 
+    //endregion
+
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
index c9df053..f387d1f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
@@ -26,25 +26,17 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 public class OneToOneActionParameterContributee extends OneToOneActionParameterImpl implements ObjectActionParameterContributee{
 
     private final ObjectAdapter serviceAdapter;
-    private final ObjectActionImpl serviceAction;
     private final ObjectActionParameter serviceActionParameter;
-    private final int serviceParamNumber;
-    private final int contributeeParamNumber;
     private final ObjectActionContributee contributeeAction;
 
     public OneToOneActionParameterContributee(
             final ObjectAdapter serviceAdapter,
-            final ObjectActionImpl serviceAction,
             final ObjectActionParameterAbstract serviceActionParameter,
-            final int serviceParamNumber,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
         super(contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
         this.serviceAdapter = serviceAdapter;
-        this.serviceAction = serviceAction;
         this.serviceActionParameter = serviceActionParameter;
-        this.serviceParamNumber = serviceParamNumber;
-        this.contributeeParamNumber = contributeeParamNumber;
         this.contributeeAction = contributeeAction;
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/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 6901257..42997b9 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
@@ -145,11 +145,7 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         return InteractionUtils.isUsableResult(this, ic).createConsent();
     }
 
-    
-    // //////////////////////////////////////
-    // FacetHolder
-    // //////////////////////////////////////
-    
+    //region > FacetHolder
     @Override
     public Class<? extends Facet>[] getFacetTypes() {
         return facetHolder.getFacetTypes();
@@ -195,6 +191,8 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         facetHolder.removeFacet(facetType);
     }
 
+    //endregion
+
     private ObjectAdapter getServiceAdapter() {
         return getPersistenceSessionService().adapterFor(servicePojo);
     }
@@ -204,4 +202,5 @@ public class OneToOneAssociationContributee extends OneToOneAssociationImpl impl
         return getServiceAdapter().getSpecification();
     }
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f251d9c/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
index 94d70e1..07874fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationImpl.java
@@ -50,7 +50,6 @@ import org.apache.isis.core.metamodel.interactions.PropertyVisibilityContext;
 import org.apache.isis.core.metamodel.interactions.UsabilityContext;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MutableCurrentHolder;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMemberDependencies;
@@ -58,12 +57,17 @@ import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
 public class OneToOneAssociationImpl extends ObjectAssociationAbstract implements OneToOneAssociation {
 
-    public OneToOneAssociationImpl(final FacetedMethod facetedMethod, final ObjectMemberDependencies objectMemberDependencies) {
+    public OneToOneAssociationImpl(
+            final FacetedMethod facetedMethod,
+            final ObjectMemberDependencies objectMemberDependencies) {
         this(facetedMethod, getSpecification(objectMemberDependencies.getSpecificationLoader(), facetedMethod.getType()),
                 objectMemberDependencies);
     }
     
-    protected OneToOneAssociationImpl(final FacetedMethod facetedMethod, final ObjectSpecification objectSpec, final ObjectMemberDependencies objectMemberDependencies) {
+    protected OneToOneAssociationImpl(
+            final FacetedMethod facetedMethod,
+            final ObjectSpecification objectSpec,
+            final ObjectMemberDependencies objectMemberDependencies) {
         super(facetedMethod, FeatureType.PROPERTY, objectSpec, objectMemberDependencies);
     }
 


[05/12] isis git commit: ISIS-1194: move common behaviour between ObjectActionParameterParseable and OnetoOneActionParameterImpl to ObjectActionParameterAbstract. Also...

Posted by da...@apache.org.
ISIS-1194: move common behaviour between ObjectActionParameterParseable and OnetoOneActionParameterImpl to ObjectActionParameterAbstract.  Also...

... delete ObjectActionParameterAbstract#set since doesn't seem to be called anywhere.
... (possibly through a long-standing bug), the doCoerceProposedValue of ObjectActionParameterParseable is never called... so delete it.


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

Branch: refs/heads/ISIS-1213
Commit: 9f83958ade4a821fe75b744c769b10edd71067ea
Parents: 49dc51b
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Oct 13 00:16:32 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Oct 13 00:16:32 2015 +0100

----------------------------------------------------------------------
 .../specimpl/ObjectActionParameterAbstract.java | 53 +++++++++------
 .../ObjectActionParameterParseable.java         | 69 --------------------
 .../specimpl/ObjectSpecificationAbstract.java   |  3 +-
 .../specimpl/OneToOneActionParameterImpl.java   | 55 ++++------------
 4 files changed, 49 insertions(+), 131 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9f83958a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 9f664fc..9a43566 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -31,6 +31,7 @@ import org.apache.isis.applib.query.QueryFindAllInstances;
 import org.apache.isis.core.commons.lang.ClassExtensions;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.commons.lang.StringExtensions;
+import org.apache.isis.core.metamodel.adapter.MutableProposedHolder;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.consent.Allow;
@@ -38,6 +39,7 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MultiTypedFacet;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.all.describedas.DescribedAsFacet;
@@ -53,6 +55,7 @@ import org.apache.isis.core.metamodel.interactions.InteractionUtils;
 import org.apache.isis.core.metamodel.interactions.ValidityContext;
 import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionService;
 import org.apache.isis.core.metamodel.spec.DomainModelException;
+import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -64,12 +67,43 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     private final ObjectActionImpl parentAction;
     private final TypedHolder peer;
 
+
+
     protected ObjectActionParameterAbstract(final int number, final ObjectActionImpl objectAction, final TypedHolder peer) {
         this.number = number;
         this.parentAction = objectAction;
         this.peer = peer;
     }
 
+    @Override
+    public FeatureType getFeatureType() {
+        return FeatureType.ACTION_PARAMETER;
+    }
+
+
+    /**
+     * Gets the proposed value of the {@link Instance} (downcast as a
+     * {@link MutableProposedHolder}, wrapping the proposed value into a
+     * {@link ObjectAdapter}.
+     */
+    @Override
+    public ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy) {
+        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
+        final Object proposed = proposedHolder.getProposed();
+        return getAdapterMap().adapterFor(proposed);
+    }
+
+
+    protected MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
+        if (!(owner instanceof MutableProposedHolder)) {
+            throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
+        }
+        return (MutableProposedHolder) owner;
+    }
+
+
+
+
     /**
      * Subclasses should override either {@link #isObject()} or
      * {@link #isCollection()}.
@@ -449,14 +483,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         ObjectSpecification proposedValueSpec;
         if(proposedValue != null) {
             proposedValueAdapter = getAdapterMap().adapterFor(proposedValue);
-            proposedValueSpec = proposedValueAdapter.getSpecification();
-            if(!proposedValueSpec.isOfType(proposedValueSpec)) {
-                proposedValueAdapter = doCoerceProposedValue(adapter, proposedValue, interactionInitiatedBy,
-                        localization
-                );
-            }
-            
-            // check has been coerced into correct type; otherwise give up
             if(proposedValueAdapter == null) {
                 return null;
             }
@@ -481,17 +507,6 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
     }
 
     /**
-     * Optional hook for parsing.
-     */
-    protected ObjectAdapter doCoerceProposedValue(
-            final ObjectAdapter adapter,
-            final Object proposedValue,
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final Localization localization) {
-        return null;
-    }
-
-    /**
      * TODO: this is not ideal, because we can only populate the array for
      * single argument, rather than the entire argument set. Instead, we ought
      * to do this in two passes, one to build up the argument set as a single

http://git-wip-us.apache.org/repos/asf/isis/blob/9f83958a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
index 4aa2c5e..8d44071 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterParseable.java
@@ -19,15 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.applib.profiles.Localization;
-import org.apache.isis.core.metamodel.adapter.MutableProposedHolder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
-import org.apache.isis.core.metamodel.spec.Instance;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class ObjectActionParameterParseable extends ObjectActionParameterAbstract implements OneToOneActionParameter {
@@ -36,67 +28,6 @@ public class ObjectActionParameterParseable extends ObjectActionParameterAbstrac
         super(index, action, peer);
     }
 
-    protected ObjectAdapter doCoerceProposedValue(
-            final ObjectAdapter adapter,
-            final Object proposedValue,
-            final InteractionInitiatedBy interactionInitiatedBy,
-            final Localization localization) {
-        // try to parse
-        if (!(proposedValue instanceof String)) {
-            return null;
-        }
-        final String proposedString = (String) proposedValue;
 
-        final ObjectSpecification parameterSpecification = getSpecification();
-        final ParseableFacet p = parameterSpecification.getFacet(ParseableFacet.class);
-        try {
-            final ObjectAdapter parsedAdapter = p.parseTextEntry(null, proposedString, interactionInitiatedBy,
-                    localization
-            );
-            return parsedAdapter;
-        } catch(Exception ex) {
-            return null;
-        }
-    }
-
-
-    // //////////////////////////////////////////////////////////////////////
-    // get, set
-    // //////////////////////////////////////////////////////////////////////
-
-    /**
-     * Gets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposedHolder}, wrapping the proposed value into a
-     * {@link ObjectAdapter}.
-     */
-    @Override
-    public ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy) {
-        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-        final Object proposed = proposedHolder.getProposed();
-        return getAdapterMap().adapterFor(proposed);
-    }
-
-    /**
-     * Sets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposedHolder}, unwrapped the proposed value from a
-     * {@link ObjectAdapter}.
-     */
-    public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {
-        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-        final Object newValuePojo = newValue.getObject();
-        proposedHolder.setProposed(newValuePojo);
-    }
-
-    private MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
-        if (!(owner instanceof MutableProposedHolder)) {
-            throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
-        }
-        return (MutableProposedHolder) owner;
-    }
-
-    @Override
-    public FeatureType getFeatureType() {
-        return FeatureType.ACTION_PARAMETER;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9f83958a/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 548bf43..7d60490 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
@@ -82,7 +82,6 @@ import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
 import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ActionType;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecificationDependencies;
@@ -459,7 +458,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             }
         }
         final ObjectSpecification superclassSpec = superclass();
-        return superclassSpec != null ? superclassSpec.isOfType(specification) : false;
+        return superclassSpec != null && superclassSpec.isOfType(specification);
     }
 
     //endregion

http://git-wip-us.apache.org/repos/asf/isis/blob/9f83958a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
index ece1864..77b3598 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterImpl.java
@@ -19,12 +19,7 @@
 
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.core.metamodel.adapter.MutableProposedHolder;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.spec.Instance;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
 
 public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract implements OneToOneActionParameter {
@@ -33,10 +28,6 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
         super(index, actionImpl, peer);
     }
 
-    @Override
-    public FeatureType getFeatureType() {
-        return FeatureType.ACTION_PARAMETER;
-    }
 
     @Override
     public boolean isObject() {
@@ -44,39 +35,21 @@ public class OneToOneActionParameterImpl extends ObjectActionParameterAbstract i
     }
 
 
-    // //////////////////////////////////////////////////////////////////////
-    // get, set
-    // //////////////////////////////////////////////////////////////////////
-
-    /**
-     * Gets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposedHolder}, wrapping the proposed value into a
-     * {@link ObjectAdapter}.
-     */
-    @Override
-    public ObjectAdapter get(final ObjectAdapter owner, final InteractionInitiatedBy interactionInitiatedBy) {
-        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-        final Object proposed = proposedHolder.getProposed();
-        return getAdapterMap().adapterFor(proposed);
-    }
-
-    /**
-     * Sets the proposed value of the {@link Instance} (downcast as a
-     * {@link MutableProposedHolder}, unwrapped the proposed value from a
-     * {@link ObjectAdapter}.
-     */
-    public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {
-        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
-        final Object newValuePojo = newValue.getObject();
-        proposedHolder.setProposed(newValuePojo);
-    }
+//    // //////////////////////////////////////////////////////////////////////
+//    // get, set
+//    // //////////////////////////////////////////////////////////////////////
+//
+//    /**
+//     * Sets the proposed value of the {@link Instance} (downcast as a
+//     * {@link MutableProposedHolder}, unwrapped the proposed value from a
+//     * {@link ObjectAdapter}.
+//     */
+//    public void set(final ObjectAdapter owner, final ObjectAdapter newValue) {
+//        final MutableProposedHolder proposedHolder = getProposedHolder(owner);
+//        final Object newValuePojo = newValue.getObject();
+//        proposedHolder.setProposed(newValuePojo);
+//    }
 
-    private MutableProposedHolder getProposedHolder(final ObjectAdapter owner) {
-        if (!(owner instanceof MutableProposedHolder)) {
-            throw new IllegalArgumentException("Instance should implement MutableProposedHolder");
-        }
-        return (MutableProposedHolder) owner;
-    }
 
 
 }