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();