This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new c9c348ed2d ISIS-3060: cleanup FacetHolder type hierarchy
c9c348ed2d is described below

commit c9c348ed2d01719af9b95d528f9b9917990f66fe
Author: Andi Huber <[email protected]>
AuthorDate: Wed Jul 6 10:57:06 2022 +0200

    ISIS-3060: cleanup FacetHolder type hierarchy
    
    - don't extend FacetHolder if possible (composition over inheritance)
---
 .../isis/core/metamodel/facetapi/FacetHolder.java  | 27 +++++++++++++++++++
 .../metamodel/facetapi/FacetHolderAbstract.java    | 26 +-----------------
 .../metamodel/facetapi/FacetHolderLayered.java     |  2 +-
 .../FacetHolderSimple.java}                        | 31 +++++++++-------------
 .../core/metamodel/facetapi/HasFacetHolder.java    | 13 +++++++++
 .../isis/core/metamodel/facets/TypedHolder.java    |  3 ++-
 .../core/metamodel/facets/TypedHolderAbstract.java |  8 +++---
 .../members/cssclassfa/CssClassFaFactory.java      | 11 +++++++-
 ...CssClassFaFacetOnMemberFromConfiguredRegex.java | 14 +++-------
 .../ObjectSpecificationPostProcessorAbstract.java  |  5 ++++
 .../isis/core/metamodel/spec/Specification.java    |  4 +--
 .../specloader/specimpl/ObjectActionMixedIn.java   |  3 +--
 .../specimpl/ObjectActionParameterAbstract.java    |  4 +--
 .../specloader/specimpl/ObjectMemberAbstract.java  |  4 +--
 .../specloader/specimpl/ObjectMemberContainer.java | 16 ++++++++---
 .../specimpl/ObjectSpecificationAbstract.java      |  3 +--
 .../specimpl/OneToManyAssociationMixedIn.java      |  3 +--
 .../specimpl/OneToOneAssociationMixedIn.java       |  3 +--
 .../core/metamodel/facetapi/FacetAbstractTest.java |  2 +-
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  3 +--
 .../metamodel/facets/AbstractFacetFactoryTest.java |  3 +--
 .../ViewModelSemanticCheckingFacetFactoryTest.java |  4 +--
 .../facets/object/mixin/MixinIntendedAs.java       |  3 +--
 .../interactions/InteractionUtils_isA_Test.java    |  3 +--
 .../testspec/ObjectSpecificationStub.java          |  8 +++---
 .../testing/AbstractFacetFactoryTest.java          |  3 +--
 26 files changed, 112 insertions(+), 97 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
index 140045789c..4971cb506d 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
@@ -23,9 +23,11 @@ import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.services.i18n.HasTranslationContext;
 import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
 
 import lombok.NonNull;
 import lombok.val;
@@ -37,6 +39,31 @@ import lombok.val;
 public interface FacetHolder
 extends HasMetaModelContext, HasTranslationContext {
 
+    // -- FACTORIES
+
+    public static FacetHolderAbstract simple(
+            final MetaModelContext mmc,
+            final Identifier featureIdentifier) {
+        return new FacetHolderSimple(mmc, featureIdentifier);
+    }
+
+    public static FacetHolder layered(
+            final Identifier featureIdentifier,
+            final FacetHolder parentLayer) {
+        return new FacetHolderLayered(featureIdentifier, parentLayer);
+    }
+
+    // -- JUNIT SUPPORT
+
+    /**
+     *  Meant for simple JUnit tests, that don't use the FacetHolder's 
identifier.
+     */
+    public static FacetHolderAbstract forTesting(final MetaModelContext mmc) {
+        return simple(mmc, 
Identifier.classIdentifier(LogicalType.fqcn(Object.class)));
+    }
+
+    // --
+
     /**
      * Identifier of the feature this holder represents or is associated with.
      */
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
index 894f17947c..003d3ce5dd 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
@@ -23,7 +23,6 @@ import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -42,23 +41,9 @@ import lombok.val;
 @AllArgsConstructor
 @RequiredArgsConstructor
 //@Log4j2
-public abstract class FacetHolderAbstract
+abstract class FacetHolderAbstract
 implements FacetHolder {
 
-    // -- FACTORIES
-
-    public static FacetHolderAbstract simple(
-            final MetaModelContext mmc,
-            final Identifier featureIdentifier) {
-        return new FacetHolderAbstract(mmc, featureIdentifier) {};
-    }
-
-    public static FacetHolder layered(
-            final Identifier featureIdentifier,
-            final FacetHolder parentLayer) {
-        return new FacetHolderLayered(featureIdentifier, parentLayer);
-    }
-
     // -- FIELDS
 
     @Getter(onMethod_ = {@Override}) private final @NonNull MetaModelContext 
metaModelContext;
@@ -124,15 +109,6 @@ implements FacetHolder {
         return Optional.ofNullable(rankingByType.get(facetType));
     }
 
-    // -- JUNIT SUPPORT
-
-    /**
-     *  Meant for simple JUnit tests, that don't use the FacetHolder's 
identifier.
-     */
-    public static FacetHolderAbstract forTesting(final MetaModelContext mmc) {
-        return simple(mmc, 
Identifier.classIdentifier(LogicalType.fqcn(Object.class)));
-    }
-
     // -- HELPER
 
     private final _Lazy<Map<Class<? extends Facet>, Facet>> snapshot = 
_Lazy.threadSafe(this::snapshot);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
index ad0c9fe7ed..64ef9bee99 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
@@ -59,7 +59,7 @@ implements FacetHolder {
             final @NonNull FacetHolder shared) {
         this.featureIdentifier = featureIdentifier;
         this.shared = shared;
-        this.local = FacetHolderAbstract.simple(shared.getMetaModelContext(), 
featureIdentifier);
+        this.local = FacetHolder.simple(shared.getMetaModelContext(), 
featureIdentifier);
     }
 
     @Override
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/facetapi/FacetHolderSimple.java
similarity index 51%
copy from 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/Specification.java
copy to 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderSimple.java
index 07705da0df..397c4d663c 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/facetapi/FacetHolderSimple.java
@@ -16,28 +16,23 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.spec;
+package org.apache.isis.core.metamodel.facetapi;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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.applib.Identifier;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+
+import lombok.NonNull;
 
 /**
- * Base interface for elements of the metamodel.
- *
- * <p>
- * The most significant sub-interfaces of this are {@link ObjectSpecification}
- * and {@link ObjectFeature} (which brings in {@link ObjectMember} and
- * {@link ObjectActionParameter}.
- *
- * <p>
- * Introduces so that viewers can deal with abstract Instances of said.
- *
+ * Provides a (simple) list of {@link Facet}s.
  */
-public interface Specification extends FacetHolder {
+class FacetHolderSimple
+extends FacetHolderAbstract {
 
-    FeatureType getFeatureType();
+    public FacetHolderSimple(
+            final @NonNull MetaModelContext metaModelContext,
+            final Identifier featureIdentifier) {
+        super(metaModelContext, featureIdentifier);
+    }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/HasFacetHolder.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/HasFacetHolder.java
index 4240743a24..67cbf98c05 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/HasFacetHolder.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/HasFacetHolder.java
@@ -21,6 +21,9 @@ package org.apache.isis.core.metamodel.facetapi;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+
 public interface HasFacetHolder extends FacetHolder {
 
     // -- INTERFACE
@@ -29,6 +32,16 @@ public interface HasFacetHolder extends FacetHolder {
 
     // -- SHORTCUTS
 
+    @Override
+    default MetaModelContext getMetaModelContext() {
+        return getFacetHolder().getMetaModelContext();
+    }
+
+    @Override
+    default Identifier getFeatureIdentifier() {
+        return getFacetHolder().getFeatureIdentifier();
+    }
+
     @Override
     default int getFacetCount() {
         return getFacetHolder().getFacetCount();
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
index cbe3ad859c..3a28ca2740 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolder.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 /**
@@ -28,7 +29,7 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
  * <p>
  * Used to represent class members when building up the metamodel.
  */
-public interface TypedHolder extends FacetHolder {
+public interface TypedHolder extends HasFacetHolder {
 
     public FeatureType getFeatureType();
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderAbstract.java
index 6835ccba7c..41c24e1b68 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/TypedHolderAbstract.java
@@ -20,15 +20,16 @@ package org.apache.isis.core.metamodel.facets;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 
 import lombok.Getter;
 
 public abstract class TypedHolderAbstract
-extends FacetHolderAbstract
 implements TypedHolder {
 
+    @Getter(onMethod_ = {@Override}) private FacetHolder facetHolder;
+
     @Getter(onMethod_ = {@Override}) private final FeatureType featureType;
 
     /**
@@ -46,7 +47,7 @@ implements TypedHolder {
             final FeatureType featureType,
             final Class<?> type,
             final Identifier featureIdentifier) {
-        super(mmc, featureIdentifier);
+        this.facetHolder = FacetHolder.simple(mmc, featureIdentifier);
         this.featureType = featureType;
         this.type = type;
     }
@@ -57,5 +58,4 @@ implements TypedHolder {
     }
 
 
-
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFactory.java
index 7cf5ff2a05..99fff0716d 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/CssClassFaFactory.java
@@ -49,7 +49,7 @@ public interface CssClassFaFactory {
      * Space separated (distinct) CSS-class strings.
      * @param additionalClasses - trimmed and filtered by non-empty, then 
added to the resulting string
      */
-    default String asSpaceSeparatedWithAdditional(String ... 
additionalClasses) {
+    default String asSpaceSeparatedWithAdditional(final String ... 
additionalClasses) {
 
         if(_NullSafe.size(additionalClasses)==0) {
             return asSpaceSeparated();
@@ -65,4 +65,13 @@ public interface CssClassFaFactory {
 
     }
 
+    /**
+     * @implNote because {@link CssClassFaStaticFacetAbstract} has all the 
fa-icon logic,
+     * we simply reuse it here by creating an anonymous instance
+     */
+    public static CssClassFaFactory ofIconAndPosition(final String faIcon, 
final CssClassFaPosition position) {
+        return new CssClassFaStaticFacetAbstract(
+                faIcon, position, null) {};
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
index 50106eb3df..1884d18b33 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFromConfiguredRegex.java
@@ -28,12 +28,10 @@ import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.layout.component.CssClassFaPosition;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import 
org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFactory;
 import 
org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaImperativeFacetAbstract;
-import 
org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaStaticFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -74,8 +72,8 @@ extends CssClassFaImperativeFacetAbstract {
     private CssClassFaFacetOnMemberFromConfiguredRegex(
             final ObjectSpecification objectSpecification,
             final MemberNamedFacet memberNamedFacet,
-            final FacetHolder holder) {
-        super(holder);
+            final FacetHolder facetHolder) {
+        super(facetHolder);
         this.objectSpecification = objectSpecification;
         this.faIconByPattern = getConfiguration()
                 
.getApplib().getAnnotation().getActionLayout().getCssClassFa().getPatternsAsMap();
@@ -136,7 +134,6 @@ extends CssClassFaImperativeFacetAbstract {
                 
hasImperativeName->hasImperativeName.textElseNull(targetFor(domainObjectProvider)));
 
         return cssClassFaFactoryForMemberFriendlyName(memberFriendlyName);
-
     }
 
     private ManagedObject targetFor(final Supplier<ManagedObject> 
domainObjectProvider) {
@@ -153,10 +150,6 @@ extends CssClassFaImperativeFacetAbstract {
                 : ownerAdapter;
     }
 
-    /**
-     * @implNote because {@link CssClassFaStaticFacetAbstract} has all the 
fa-icon logic,
-     * we simply reuse it here by creating an anonymous instance
-     */
     private Optional<CssClassFaFactory> cssClassFaFactoryForMemberFriendlyName(
             final String memberFriendlyName) {
 
@@ -174,8 +167,7 @@ extends CssClassFaImperativeFacetAbstract {
                 faIcon = _faIcon;
                 position = CssClassFaPosition.LEFT;
             }
-            return new CssClassFaStaticFacetAbstract(
-                    faIcon, position, 
FacetHolderAbstract.simple(getMetaModelContext(), null)) {};
+            return CssClassFaFactory.ofIconAndPosition(faIcon, position);
         });
 
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
index 0466b1df25..5c3a50e2bd 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/ObjectSpecificationPostProcessorAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.postprocessors;
 
 import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
@@ -75,6 +76,10 @@ implements ObjectSpecificationPostProcessor {
     protected void doPostProcess(final ObjectSpecification objSpec, final 
OneToOneAssociation prop) {};
     protected void doPostProcess(final ObjectSpecification objSpec, final 
OneToManyAssociation coll) {};
 
+    /**
+     * Use for domain-object-type agnostic facets only!
+     * @see Facet#isObjectTypeSpecific()
+     */
     protected static FacetedMethod facetedMethodFor(final ObjectMember 
objectMember) {
         // TODO: hacky, need to copy facet onto underlying peer, not to the 
action/association itself.
         val objectMemberImpl = (ObjectMemberAbstract) objectMember;
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 07705da0df..423dae2ddc 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
@@ -18,8 +18,8 @@
  */
 package org.apache.isis.core.metamodel.spec;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 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;
@@ -36,7 +36,7 @@ import 
org.apache.isis.core.metamodel.spec.feature.ObjectMember;
  * Introduces so that viewers can deal with abstract Instances of said.
  *
  */
-public interface Specification extends FacetHolder {
+public interface Specification extends HasFacetHolder {
 
     FeatureType getFeatureType();
 
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 90c7214dce..9b0d0689b9 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
@@ -28,7 +28,6 @@ import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
@@ -80,7 +79,7 @@ implements MixedInMember {
                     
mixinAction.getFacetedMethod().getFeatureIdentifier().getMemberParameterClassNames()),
                 mixinAction.getFacetedMethod(), false);
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolder.layered(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
         this.mixinType = mixinType;
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 6a95578098..7e20752901 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
@@ -32,7 +32,6 @@ import 
org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import 
org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
@@ -58,8 +57,7 @@ import lombok.val;
 
 public abstract class ObjectActionParameterAbstract
 implements
-    ObjectActionParameter,
-    HasFacetHolder {
+    ObjectActionParameter {
 
     @Getter(onMethod_ = {@Override}) private final FeatureType featureType;
     @Getter(onMethod_ = {@Override}) private final int parameterIndex;
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 f028465926..e0b2cea70e 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
@@ -35,7 +35,6 @@ import 
org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.Facet.Precedence;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import 
org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
@@ -63,8 +62,7 @@ import lombok.val;
 public abstract class ObjectMemberAbstract
 implements
     ObjectMember,
-    HasMetaModelContext,
-    HasFacetHolder {
+    HasMetaModelContext {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Identifier 
featureIdentifier;
     @Getter(onMethod_ = {@Override}) private final @NonNull FeatureType 
featureType;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
index 47c101a04e..2f29b09be4 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberContainer.java
@@ -22,10 +22,12 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.spec.ActionScope;
 import org.apache.isis.core.metamodel.spec.Hierarchical;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
@@ -34,6 +36,8 @@ import 
org.apache.isis.core.metamodel.spec.feature.ObjectActionContainer;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationContainer;
 
+import lombok.Getter;
+import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -47,14 +51,18 @@ import lombok.val;
  * (current elegant recursive solution will then need some tweaks to be 
efficient)
  */
 public abstract class ObjectMemberContainer
-extends FacetHolderAbstract
 implements
+    HasFacetHolder,
     ObjectActionContainer,
     ObjectAssociationContainer,
     Hierarchical {
 
-    protected ObjectMemberContainer(final MetaModelContext metaModelContext) {
-        super(metaModelContext);
+    @Getter(onMethod_ = {@Override}) private FacetHolder facetHolder;
+
+    protected ObjectMemberContainer(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull Identifier featureIdentifier) {
+        this.facetHolder = FacetHolder.simple(mmc, featureIdentifier);
     }
 
     // -- ACTIONS
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 ca46991de1..3c813e7680 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
@@ -199,7 +199,7 @@ implements ObjectSpecification {
             final FacetProcessor facetProcessor,
             final PostProcessor postProcessor) {
 
-        super(facetProcessor.getMetaModelContext());
+        super(facetProcessor.getMetaModelContext(), 
Identifier.classIdentifier(logicalType));
 
         this.correspondingClass = introspectedClass;
         this.logicalType = logicalType;
@@ -208,7 +208,6 @@ implements ObjectSpecification {
         this.beanSort = beanSort;
 
         this.isAbstract = ClassExtensions.isAbstract(introspectedClass);
-        super.featureIdentifier = Identifier.classIdentifier(logicalType);
 
         this.facetProcessor = facetProcessor;
         this.postProcessor = postProcessor;
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
index 690ae829d9..2d3ef6c6ed 100644
--- 
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
@@ -25,7 +25,6 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 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.all.named.MemberNamedFacet;
@@ -96,7 +95,7 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), typeOfSpec(mixinAction));
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolder.layered(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
 
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
index e6c3f0aca1..8618c0de79 100644
--- 
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
@@ -25,7 +25,6 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
@@ -80,7 +79,7 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), mixinAction.getReturnType());
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolder.layered(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
 
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
index e1f5515f87..6c468754d1 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facetapi/FacetAbstractTest.java
@@ -43,7 +43,7 @@ public class FacetAbstractTest extends TestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-        facetHolder = 
FacetHolderAbstract.forTesting(MetaModelContext_forTesting.buildDefault());
+        facetHolder = 
FacetHolder.forTesting(MetaModelContext_forTesting.buildDefault());
         fooFacet = new ConcreteFacet(FooFacet.class, facetHolder);
         new ConcreteFacet(BarFacet.class, facetHolder);
         facetHolder.addFacet(fooFacet);
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index b84e9acfe4..1ad1aa981e 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -34,7 +34,6 @@ import 
org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import 
org.apache.isis.core.metamodel.facets.object.domainobject.autocomplete.AutoCompleteFacetForDomainObjectAnnotation;
@@ -80,7 +79,7 @@ implements HasMetaModelContext {
                         .specificationLoader(mockSpecificationLoader)
                         .build();
 
-        facetHolder = FacetHolderAbstract.simple(
+        facetHolder = FacetHolder.simple(
                 metaModelContext,
                 
Identifier.propertyIdentifier(LogicalType.fqcn(Customer.class), "firstName"));
         facetedMethod = FacetedMethod.createForProperty(metaModelContext, 
AbstractFacetFactoryTest.Customer.class, "firstName");
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
index 2e503efd67..b72301b44b 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/AbstractFacetFactoryTest.java
@@ -36,7 +36,6 @@ import 
org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel._testing.MethodRemover_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
 import 
org.apache.isis.core.metamodel.facets.actions.layout.ActionLayoutFacetFactory;
@@ -103,7 +102,7 @@ public abstract class AbstractFacetFactoryTest extends 
TestCase {
             will(returnValue(Optional.of(iaContext)));
         }});
 
-        facetHolder = FacetHolderAbstract.simple(
+        facetHolder = FacetHolder.simple(
                 metaModelContext,
                 
Identifier.propertyIdentifier(LogicalType.fqcn(Customer.class), "firstName"));
 
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
index 017c207363..79d8d1ff39 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
@@ -31,7 +31,7 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
 import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
@@ -80,7 +80,7 @@ public class ViewModelSemanticCheckingFacetFactoryTest {
 
     private ValidationFailures processThenValidate(final Class<?> cls) {
 
-        val holder = FacetHolderAbstract.forTesting(metaModelContext);
+        val holder = FacetHolder.forTesting(metaModelContext);
         facetFactory.process(ProcessClassContext.forTesting(cls, null, 
holder));
 
         return 
metaModelContext.getSpecificationLoader().getOrAssessValidationResult();
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
index 363b5b3955..f44d6c8c35 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
@@ -25,7 +25,6 @@ import 
org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MethodRemover;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -62,7 +61,7 @@ abstract class MixinIntendedAs {
 
     protected FacetHolder runTypeContextOn(final Class<?> type) {
 
-        val facetHolder = FacetHolderAbstract.simple(
+        val facetHolder = FacetHolder.simple(
                 metaModelContext,
                 Identifier.classIdentifier(LogicalType.fqcn(type)));
 
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
index b5cf5906db..53cff84e61 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/interactions/InteractionUtils_isA_Test.java
@@ -23,7 +23,6 @@ import 
org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 
 import lombok.val;
 
@@ -65,7 +64,7 @@ public class InteractionUtils_isA_Test extends TestCase {
     protected void setUp() throws Exception {
         super.setUp();
 
-        facetHolder = 
FacetHolderAbstract.forTesting(MetaModelContext_forTesting.buildDefault());
+        facetHolder = 
FacetHolder.forTesting(MetaModelContext_forTesting.buildDefault());
         fooSuperFacet = new FooSuperFacet(FooSuperFacet.class, facetHolder);
         fooFacet = new FooFacet(facetHolder);
         fooSubFacet = new FooSubFacet(facetHolder);
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 68c1a43533..3711a415ae 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
@@ -36,7 +36,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.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.WhereValueFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
@@ -57,10 +57,10 @@ import 
org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.specimpl.IntrospectionState;
 
+import lombok.Getter;
 import lombok.val;
 
 public class ObjectSpecificationStub
-extends FacetHolderAbstract
 implements ObjectSpecification {
 
     private ObjectAction action;
@@ -75,6 +75,8 @@ implements ObjectSpecification {
     private final Class<?> correspondingClass;
     private final String name;
 
+    @Getter(onMethod_ = {@Override}) private FacetHolder facetHolder;
+
     @Override
     public Optional<? extends ObjectMember> getMember(final String memberId) {
         val objectAction = getAction(memberId);
@@ -100,7 +102,7 @@ implements ObjectSpecification {
     }
 
     public ObjectSpecificationStub(final MetaModelContext mmc, final Class<?> 
correspondingClass) {
-        super(mmc);
+        this.facetHolder = FacetHolder.simple(mmc, null);
         this.correspondingClass = correspondingClass;
         this.logicalType = LogicalType.infer(correspondingClass);
         this.title = "";
diff --git 
a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
 
b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
index 7f0ea1121f..cd29329076 100644
--- 
a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
+++ 
b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/testing/AbstractFacetFactoryTest.java
@@ -36,7 +36,6 @@ import 
org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel._testing.MethodRemover_forTesting;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
@@ -102,7 +101,7 @@ public abstract class AbstractFacetFactoryTest extends 
TestCase {
             will(returnValue(Optional.of(iaContext)));
         }});
 
-        facetHolder = FacetHolderAbstract.simple(
+        facetHolder = FacetHolder.simple(
                 metaModelContext,
                 
Identifier.propertyIdentifier(LogicalType.fqcn(Customer.class), "firstName"));
 

Reply via email to