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 6d73ce039c ISIS-3060: adds concept of a layered facet-holder 
(FacetHolderLayered)
6d73ce039c is described below

commit 6d73ce039c5ac51fb4bcd58334428324008876ad
Author: Andi Huber <[email protected]>
AuthorDate: Sat May 21 10:15:54 2022 +0200

    ISIS-3060: adds concept of a layered facet-holder (FacetHolderLayered)
    
    - that is to encapsulate the complexity of creating a layered view where
    2 facet-holders are involved
    
    - it is still not clear to me why we do need this at all, and not just
    simply delegate/wrap
---
 .../metamodel/facetapi/FacetHolderAbstract.java    |  16 +++-
 .../metamodel/facetapi/FacetHolderLayered.java     | 101 +++++++++++++++++++++
 .../isis/core/metamodel/facetapi/FacetUtil.java    |   5 -
 .../specloader/specimpl/ObjectActionMixedIn.java   |  10 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |  14 +--
 .../specimpl/OneToOneAssociationMixedIn.java       |  15 +--
 6 files changed, 121 insertions(+), 40 deletions(-)

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 044b6ec801..2307c37b65 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
@@ -45,12 +45,18 @@ import lombok.val;
 public abstract class FacetHolderAbstract
 implements FacetHolder {
 
-    // -- FACTORY
+    // -- FACTORIES
 
-    public static FacetHolderAbstract simple(final MetaModelContext mmc, final 
Identifier featureIdentifier) {
-        final FacetHolderAbstract facetHolder = new FacetHolderAbstract(mmc) 
{};
-        facetHolder.featureIdentifier = featureIdentifier;
-        return facetHolder;
+    public static FacetHolderAbstract simple(
+            final MetaModelContext mmc,
+            final Identifier featureIdentifier) {
+        return new FacetHolderAbstract(mmc, featureIdentifier) {};
+    }
+
+    public static FacetHolderAbstract layered(
+            final Identifier featureIdentifier,
+            final FacetHolder parentLayer) {
+        return new FacetHolderLayered(featureIdentifier, parentLayer);
     }
 
     // -- FIELDS
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
new file mode 100644
index 0000000000..717610504d
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
@@ -0,0 +1,101 @@
+/*
+ *  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.facetapi;
+
+import org.apache.isis.applib.Identifier;
+
+import lombok.NonNull;
+
+/**
+ * Supposed to provide a merged view of the local and the parent-layer,
+ * where the parent is used as read-only fallback.
+ *
+ * @apiNote It is still not clear to me why we do need this at all,
+ * why not just simply delegate/wrap?
+ */
+class FacetHolderLayered
+extends FacetHolderAbstract {
+
+    private final @NonNull FacetHolder parentLayer;
+
+    public FacetHolderLayered(
+            final @NonNull Identifier featureIdentifier,
+            final @NonNull FacetHolder parentLayer) {
+        super(parentLayer.getMetaModelContext(), featureIdentifier);
+        this.parentLayer = parentLayer;
+
+        // legacy implementation, it will miss any changes that happen to the 
parent-layer after copying
+        copyFacetsTo(parentLayer, this);
+    }
+
+   /* XXX first attempt on an implementation, but does not handle facet 
precedence correctly
+    @Override
+    public int getFacetCount() {
+        // cannot simply add up this and parent
+        return (int)streamFacets().count();
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(final Class<T> facetType) {
+        return Optional.ofNullable(super.getFacet(facetType))
+                .orElse(parentLayer.getFacet(facetType));
+    }
+
+    @Override
+    public boolean containsFacet(final Class<? extends Facet> facetType) {
+        return super.containsFacet(facetType)
+                || parentLayer.containsFacet(facetType);
+    }
+
+    @Override
+    public Stream<Facet> streamFacets() {
+        val localFacetTypes = new HashSet<Class<? extends Facet>>();
+        return Stream.concat(
+                super.streamFacets()
+                .peek(facet->localFacetTypes.add(facet.facetType()))
+                ,
+                parentLayer.streamFacets()
+                .filter(facet->!localFacetTypes.contains(facet.facetType())));
+    }
+
+    @Override
+    public Stream<FacetRanking> streamFacetRankings() {
+        val localFacetTypes = new HashSet<Class<? extends Facet>>();
+        return Stream.concat(
+                super.streamFacetRankings()
+                .peek(ranking->localFacetTypes.add(ranking.facetType()))
+                ,
+                parentLayer.streamFacetRankings()
+                
.filter(ranking->!localFacetTypes.contains(ranking.facetType())));
+    }
+
+    @Override
+    public Optional<FacetRanking> getFacetRanking(final Class<? extends Facet> 
facetType) {
+        return Optional.ofNullable(super.getFacetRanking(facetType))
+                .orElse(parentLayer.getFacetRanking(facetType));
+    }*/
+
+    // -- HELPER
+
+    private static void copyFacetsTo(final FacetHolder source, final 
FacetHolder target) {
+        source.streamFacets()
+        .forEach(target::addFacet);
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
index 014c84572b..5f0c95ccc3 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
@@ -92,11 +92,6 @@ public final class FacetUtil {
         };
     }
 
-    public static void copyFacetsTo(final FacetHolder source, final 
FacetHolder target) {
-        source.streamFacets()
-        .forEach(target::addFacet);
-    }
-
     // -- DYNAMIC UPDATE SUPPORT
 
     /**
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 47de4a1e27..90c7214dce 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
@@ -29,7 +29,6 @@ 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;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
@@ -81,16 +80,13 @@ implements MixedInMember {
                     
mixinAction.getFacetedMethod().getFeatureIdentifier().getMemberParameterClassNames()),
                 mixinAction.getFacetedMethod(), false);
 
-        this.facetHolder = FacetHolderAbstract.simple(
-                mixedInType.getMetaModelContext(),
-                super.getFeatureIdentifier());
+        this.facetHolder = FacetHolderAbstract.layered(
+                super.getFeatureIdentifier(),
+                mixinAction.getFacetedMethod());
         this.mixinType = mixinType;
         this.mixinAction = mixinAction;
         this.mixedInType = mixedInType;
 
-        // copy over facets from mixin action to self
-        FacetUtil.copyFacetsTo(mixinAction.getFacetedMethod(), facetHolder);
-
         // adjust name if necessary
 
         val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
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 e96f592dd1..2b33d494ec 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
@@ -97,9 +97,9 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), typeOfSpec(mixinAction));
 
-        this.facetHolder = FacetHolderAbstract.simple(
-                mixeeSpec.getMetaModelContext(),
-                super.getFeatureIdentifier());
+        this.facetHolder = FacetHolderAbstract.layered(
+                super.getFeatureIdentifier(),
+                mixinAction.getFacetedMethod());
 
         this.mixinType = mixinType;
         this.mixinAction = mixinAction;
@@ -112,14 +112,6 @@ implements MixedInMember {
         FacetUtil.addFacet(disabledFacet());
         FacetUtil.addFacet(new 
TypeOfFacetAbstract(getElementType().getCorrespondingClass(), this) {});
 
-        //
-        // in addition, copy over facets from contributed to own.
-        //
-        // These could include everything under @Collection(...) because the
-        // CollectionAnnotationFacetFactory is also run against actions.
-        //
-        FacetUtil.copyFacetsTo(mixinAction.getFacetedMethod(), facetHolder);
-
         // adjust name if necessary
         val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
                 .isPresent();
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 8ee7f5dd91..e6c3f0aca1 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
@@ -80,9 +80,9 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), mixinAction.getReturnType());
 
-        this.facetHolder = FacetHolderAbstract.simple(
-                mixeeSpec.getMetaModelContext(),
-                super.getFeatureIdentifier());
+        this.facetHolder = FacetHolderAbstract.layered(
+                super.getFeatureIdentifier(),
+                mixinAction.getFacetedMethod());
 
         this.mixinType = mixinType;
         this.mixinAction = mixinAction;
@@ -93,15 +93,6 @@ implements MixedInMember {
         //
         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.copyFacetsTo(mixinAction.getFacetedMethod(), facetHolder);
-
         // adjust name if necessary
         val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
                 .isPresent();

Reply via email to