This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch v3
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/v3 by this push:
new f494e8d6c4c CAUSEWAY-2297: work on simplified tree model (part 12)
f494e8d6c4c is described below
commit f494e8d6c4c517d9e4544f2fd28ebb51113c043d
Author: Andi Huber <[email protected]>
AuthorDate: Sat Dec 14 09:22:42 2024 +0100
CAUSEWAY-2297: work on simplified tree model (part 12)
- refactor, optimize accessor facet creation
---
.../metamodel/facets/AccessorFacetFactory.java | 60 ++++++++++++++
...ract.java => AccessorFacetFactoryAbstract.java} | 26 +++++-
...ropertyOrCollectionIdentifyingFacetFactory.java | 84 -------------------
.../CollectionAccessorFacetViaAccessorFactory.java | 31 ++++---
.../PropertyAccessorFacetViaAccessorFactory.java | 33 ++++----
.../specloader/facetprocessor/FacetProcessor.java | 95 ++++++++++++----------
.../facets/object/navchild/TreeTraversalTest.java | 18 ++++
7 files changed, 182 insertions(+), 165 deletions(-)
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
new file mode 100644
index 00000000000..3c4e9e8a815
--- /dev/null
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactory.java
@@ -0,0 +1,60 @@
+/*
+ * 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.causeway.core.metamodel.facets;
+
+import java.util.function.Consumer;
+
+import
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
+import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
+import org.apache.causeway.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.causeway.core.metamodel.spec.feature.OneToOneAssociation;
+
+/**
+ * A {@link FacetFactory} implementation that is able to identify property or
+ * collection accessors.
+ * <p>
+ * For example, a <i>getter</i> method is most commonly used to represent
either
+ * a property (value or reference) or a collection, with the return type
+ * indicating which.
+ */
+public interface AccessorFacetFactory extends FacetFactory {
+
+ /**
+ * Whether is in support of {@link OneToOneAssociation}(s).
+ */
+ boolean supportsProperties();
+ /**
+ * Whether is in support of {@link OneToManyAssociation}(s).
+ */
+ boolean supportsCollections();
+
+ /**
+ * Whether (this facet is able to determine that) the supplied
+ * {@link ResolvedMethod} represents an accessor to an {@link
ObjectAssociation}.
+ */
+ boolean isAssociationAccessor(ResolvedMethod method);
+
+ /**
+ * Uses the provided {@link MethodRemover} to remove all matching accessors
+ * and calls back the supplied consumer.
+ */
+ void findAndRemoveAccessors(MethodRemover methodRemover,
Consumer<ResolvedMethod> onMatchingAccessor);
+
+}
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
similarity index 62%
rename from
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
rename to
core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
index 4e0f778abdd..5d8183eac95 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactoryAbstract.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/AccessorFacetFactoryAbstract.java
@@ -20,19 +20,21 @@ package org.apache.causeway.core.metamodel.facets;
import org.apache.causeway.commons.collections.Can;
import org.apache.causeway.commons.collections.ImmutableEnumSet;
+import
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
+import
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
import
org.apache.causeway.core.metamodel.methods.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
-public abstract class PropertyOrCollectionIdentifyingFacetFactoryAbstract
+public abstract class AccessorFacetFactoryAbstract
extends MethodPrefixBasedFacetFactoryAbstract
-implements PropertyOrCollectionIdentifyingFacetFactory {
+implements AccessorFacetFactory {
- protected PropertyOrCollectionIdentifyingFacetFactoryAbstract(
+ protected AccessorFacetFactoryAbstract(
final MetaModelContext mmc,
final ImmutableEnumSet<FeatureType> featureTypes,
final Can<String> prefixes) {
-
super(mmc, featureTypes, OrphanValidation.DONT_VALIDATE, prefixes);
}
@@ -46,4 +48,20 @@ implements PropertyOrCollectionIdentifyingFacetFactory {
return super.getFeatureTypes().contains(FeatureType.COLLECTION);
}
+ @Override
+ public final void process(final ProcessMethodContext processMethodContext)
{
+ var accessorMethod =
processMethodContext.getMethod().asMethodElseFail();
+ processMethodContext.removeMethod(accessorMethod);
+
+ var cls = processMethodContext.getCls();
+ var typeSpec = getSpecificationLoader().loadSpecification(cls);
+ var facetHolder = processMethodContext.getFacetHolder();
+
+
+ addFacet(createFacet(typeSpec, accessorMethod, facetHolder));
+ }
+
+ protected abstract PropertyOrCollectionAccessorFacet createFacet(
+ ObjectSpecification typeSpec, ResolvedMethod accessorMethod,
FacetedMethod facetHolder);
+
}
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
deleted file mode 100644
index 9f4483012e6..00000000000
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/PropertyOrCollectionIdentifyingFacetFactory.java
+++ /dev/null
@@ -1,84 +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.causeway.core.metamodel.facets;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import
org.apache.causeway.commons.internal.reflection._GenericResolver.ResolvedMethod;
-import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-
-/**
- * A {@link FacetFactory} implementation that is able to identify a property or
- * collection.
- * <p>
- * For example, a <i>getter</i> method is most commonly used to represent
either
- * a property (value or reference) or a collection, with the return type
- * indicating which.
- * <p>
- * Used by the Java 8 Reflector's <tt>ProgrammingModel</tt> to determine which
- * facet factories to ask whether a {@link Method} represents a property or a
- * collection.
- */
-public interface PropertyOrCollectionIdentifyingFacetFactory extends
FacetFactory {
-
-// /**
-// * Whether (this facet is able to determine that) the supplied
-// * {@link Method} possibly represents the accessor of either a
-// * {@link OneToOneAssociation reference property}
-// * or a {@link OneToManyAssociation collection}.
-// * <p>
-// * For example, if a method name has a prefix of <tt>get</tt> or
-// * alternatively has a prefix of <tt>is</tt> and returns a
<tt>boolean</tt>,
-// * then it would be a candidate.
-// */
-// boolean isPropertyOrCollectionGetterCandidate(ResolvedMethod method);
-
- boolean supportsProperties();
- boolean supportsCollections();
-
- boolean isAssociationAccessor(ResolvedMethod method);
- void findAndRemoveAccessors(MethodRemover methodRemover,
List<ResolvedMethod> methodListToAppendTo);
-
-
-// /**
-// * Whether (this facet is able to determine that) the supplied
-// * {@link Method} represents a
-// * {@link OneToOneAssociation reference property}.
-// */
-// boolean isPropertyAccessor(ResolvedMethod method);
-//
-// /**
-// * Whether (this facet is able to determine that) the supplied
-// * {@link Method} represents a {@link OneToManyAssociation collection}.
-// */
-// boolean isCollectionAccessor(ResolvedMethod method);
-//
-// /**
-// * Use the provided {@link MethodRemover} to remove all reference
property
-// * accessors, and append them to the supplied methodList.
-// */
-// void findAndRemovePropertyAccessors(MethodRemover methodRemover,
List<ResolvedMethod> methodListToAppendTo);
-//
-// /**
-// * Use the provided {@link MethodRemover} to remove all collection
-// * accessors, and append them to the supplied methodList.
-// */
-// void findAndRemoveCollectionAccessors(MethodRemover methodRemover,
List<ResolvedMethod> methodListToAppendTo);
-}
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index d33c86620c2..841f05804db 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -18,7 +18,7 @@
*/
package org.apache.causeway.core.metamodel.facets.collections.accessor;
-import java.util.List;
+import java.util.function.Consumer;
import jakarta.inject.Inject;
@@ -28,10 +28,13 @@ import
org.apache.causeway.commons.semantics.AccessorSemantics;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-import
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.FacetedMethod;
+import
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
public class CollectionAccessorFacetViaAccessorFactory
-extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
+extends AccessorFacetFactoryAbstract {
private static final Can<String> PREFIXES = Can.empty();
@@ -40,18 +43,6 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
super(mmc, FeatureType.COLLECTIONS_ONLY, PREFIXES);
}
- @Override
- public void process(final ProcessMethodContext processMethodContext) {
- var accessorMethod =
processMethodContext.getMethod().asMethodElseFail(); // no-arg method, should
have a regular facade
- processMethodContext.removeMethod(accessorMethod);
-
- var cls = processMethodContext.getCls();
- var typeSpec = getSpecificationLoader().loadSpecification(cls);
- var facetHolder = processMethodContext.getFacetHolder();
-
- addFacet(new CollectionAccessorFacetViaAccessor(typeSpec,
accessorMethod, facetHolder));
- }
-
@Override
public boolean isAssociationAccessor(final ResolvedMethod method) {
return AccessorSemantics.isCollectionAccessor(method);
@@ -59,8 +50,14 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
@Override
public void findAndRemoveAccessors(
- final MethodRemover methodRemover, final List<ResolvedMethod>
methodListToAppendTo) {
-
methodRemover.removeMethods(AccessorSemantics::hasSupportedNonScalarMethodReturnType,
methodListToAppendTo::add);
+ final MethodRemover methodRemover, final Consumer<ResolvedMethod>
onMatchingAccessor) {
+
methodRemover.removeMethods(AccessorSemantics::hasSupportedNonScalarMethodReturnType,
onMatchingAccessor);
+ }
+
+ @Override
+ protected PropertyOrCollectionAccessorFacet createFacet(
+ final ObjectSpecification typeSpec, final ResolvedMethod
accessorMethod, final FacetedMethod facetHolder) {
+ return new CollectionAccessorFacetViaAccessor(typeSpec,
accessorMethod, facetHolder);
}
}
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
index 7779dcbd69b..8508aeb30f1 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessorFactory.java
@@ -18,7 +18,7 @@
*/
package org.apache.causeway.core.metamodel.facets.properties.accessor;
-import java.util.List;
+import java.util.function.Consumer;
import jakarta.inject.Inject;
@@ -28,10 +28,13 @@ import
org.apache.causeway.commons.semantics.AccessorSemantics;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.facetapi.FeatureType;
import org.apache.causeway.core.metamodel.facetapi.MethodRemover;
-import
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactoryAbstract;
+import org.apache.causeway.core.metamodel.facets.FacetedMethod;
+import
org.apache.causeway.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.causeway.core.metamodel.spec.ObjectSpecification;
public class PropertyAccessorFacetViaAccessorFactory
-extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
+extends AccessorFacetFactoryAbstract {
private static final Can<String> PREFIXES = Can.empty();
@@ -40,18 +43,6 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
super(mmc, FeatureType.PROPERTIES_ONLY, PREFIXES);
}
- @Override
- public void process(final ProcessMethodContext processMethodContext) {
- var accessorMethod =
processMethodContext.getMethod().asMethodElseFail();
- processMethodContext.removeMethod(accessorMethod);
-
- var cls = processMethodContext.getCls();
- var typeSpec = getSpecificationLoader().loadSpecification(cls);
- var facetHolder = processMethodContext.getFacetHolder();
-
- addFacet(new PropertyAccessorFacetViaAccessor(typeSpec,
accessorMethod, facetHolder));
- }
-
@Override
public boolean isAssociationAccessor(final ResolvedMethod method) {
return AccessorSemantics.isPropertyAccessor(method);
@@ -59,9 +50,15 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
@Override
public void findAndRemoveAccessors(
- final MethodRemover methodRemover, final List<ResolvedMethod>
methodListToAppendTo) {
- methodRemover.removeMethods(AccessorSemantics::isBooleanGetter,
methodListToAppendTo::add);
- methodRemover.removeMethods(AccessorSemantics::isNonBooleanGetter,
methodListToAppendTo::add);
+ final MethodRemover methodRemover, final Consumer<ResolvedMethod>
onMatchingAccessor) {
+ methodRemover.removeMethods(AccessorSemantics::isBooleanGetter,
onMatchingAccessor);
+ methodRemover.removeMethods(AccessorSemantics::isNonBooleanGetter,
onMatchingAccessor);
+ }
+
+ @Override
+ protected PropertyOrCollectionAccessorFacet createFacet(
+ final ObjectSpecification typeSpec, final ResolvedMethod
accessorMethod, final FacetedMethod facetHolder) {
+ return new PropertyAccessorFacetViaAccessor(typeSpec, accessorMethod,
facetHolder);
}
}
diff --git
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index 3ffbd18d70d..10450f212b1 100644
---
a/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++
b/core/metamodel/src/main/java/org/apache/causeway/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -19,6 +19,7 @@
package org.apache.causeway.core.metamodel.specloader.facetprocessor;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -49,7 +50,7 @@ import
org.apache.causeway.core.metamodel.facets.FacetedMethod;
import org.apache.causeway.core.metamodel.facets.FacetedMethodParameter;
import org.apache.causeway.core.metamodel.facets.ObjectTypeFacetFactory;
import
org.apache.causeway.core.metamodel.facets.ObjectTypeFacetFactory.ProcessObjectTypeContext;
-import
org.apache.causeway.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactory;
+import org.apache.causeway.core.metamodel.facets.AccessorFacetFactory;
import org.apache.causeway.core.metamodel.methods.MethodFilteringFacetFactory;
import
org.apache.causeway.core.metamodel.methods.MethodPrefixBasedFacetFactory;
import org.apache.causeway.core.metamodel.progmodel.ProgrammingModel;
@@ -102,14 +103,22 @@ implements HasMetaModelContext, AutoCloseable{
_Lazy.threadSafe(this::init_methodFilteringFactories);
/**
- * All registered {@link FacetFactory factories} that implement
- * {@link PropertyOrCollectionIdentifyingFacetFactory}.
- *
+ * {@link FacetFactory factories} that implement {@link
AccessorFacetFactory}
+ * and support properties.
+ * <p>
+ * Used within {@link #recognizes(Method)}.
+ */
+ private final _Lazy<List<AccessorFacetFactory>> propertyAccessorFactories =
+ _Lazy.threadSafe(this::init_propertyIdentifyingFactories);
+
+ /**
+ * {@link FacetFactory factories} that implement {@link
AccessorFacetFactory}
+ * and support collections.
* <p>
* Used within {@link #recognizes(Method)}.
*/
- private final _Lazy<List<PropertyOrCollectionIdentifyingFacetFactory>>
propertyOrCollectionIdentifyingFactories =
-
_Lazy.threadSafe(this::init_propertyOrCollectionIdentifyingFactories);
+ private final _Lazy<List<AccessorFacetFactory>>
collectionAccessorFactories =
+ _Lazy.threadSafe(this::init_collectionIdentifyingFactories);
/**
* ObjectFeatureType => List<FacetFactory>
@@ -157,19 +166,25 @@ implements HasMetaModelContext, AutoCloseable{
/**
* Appends to the supplied {@link Set} all of the {@link Method}s that may
* represent a property or collection.
- *
* <p>
* Delegates to all known
- * {@link PropertyOrCollectionIdentifyingFacetFactory}s.
+ * {@link AccessorFacetFactory}s.
*/
public void findAssociationCandidateGetters(
final Stream<ResolvedMethod> methodStream,
final Consumer<ResolvedMethod> onCandidate) {
- var factories = propertyOrCollectionIdentifyingFactories.get();
+
methodStream.forEach(method->{
- for (var facetFactory : factories) {
+ for (var facetFactory : propertyAccessorFactories.get()) {
if (facetFactory.isAssociationAccessor(method)) {
onCandidate.accept(method);
+ return; // first wins
+ }
+ }
+ for (var facetFactory : collectionAccessorFactories.get()) {
+ if (facetFactory.isAssociationAccessor(method)) {
+ onCandidate.accept(method);
+ return; // first wins
}
}
});
@@ -177,42 +192,37 @@ implements HasMetaModelContext, AutoCloseable{
/**
* Use the provided {@link MethodRemover} to call all known
- * {@link PropertyOrCollectionIdentifyingFacetFactory}s to remove all
+ * {@link AccessorFacetFactory}s to remove all
* property accessors and append them to the supplied methodList.
* <p>
- * @see
PropertyOrCollectionIdentifyingFacetFactory#findAndRemoveAccessors(MethodRemover,
List)
+ * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover,
Consumer)
*/
public void findAndRemovePropertyAccessors(
final MethodRemover methodRemover,
final List<ResolvedMethod> methodListToAppendTo) {
-
- for (var facetFactory :
propertyOrCollectionIdentifyingFactories.get()) {
- if(!facetFactory.supportsProperties()) continue;
- facetFactory.findAndRemoveAccessors(methodRemover,
methodListToAppendTo);
+ for (var facetFactory : propertyAccessorFactories.get()) {
+ facetFactory.findAndRemoveAccessors(methodRemover,
methodListToAppendTo::add);
}
}
/**
* Use the provided {@link MethodRemover} to call all known
- * {@link PropertyOrCollectionIdentifyingFacetFactory}s to remove all
+ * {@link AccessorFacetFactory}s to remove all
* collection accessors and append them to the supplied methodList.
*
- * @see
PropertyOrCollectionIdentifyingFacetFactory#findAndRemoveAccessors(MethodRemover,
List)
+ * @see AccessorFacetFactory#findAndRemoveAccessors(MethodRemover,
Consumer)
*/
public void findAndRemoveCollectionAccessors(
final MethodRemover methodRemover,
final List<ResolvedMethod> methodListToAppendTo) {
-
- for (var facetFactory :
propertyOrCollectionIdentifyingFactories.get()) {
- if(!facetFactory.supportsCollections()) continue;
- facetFactory.findAndRemoveAccessors(methodRemover,
methodListToAppendTo);
+ for (var facetFactory : collectionAccessorFactories.get()) {
+ facetFactory.findAndRemoveAccessors(methodRemover,
methodListToAppendTo::add);
}
}
/**
* Whether this {@link Method method} is recognized by any of the
* {@link FacetFactory}s.
- *
* <p>
* Typically this is when method has a specific prefix, such as
* <tt>validate</tt> or <tt>hide</tt>. Specifically, it checks:
@@ -221,7 +231,6 @@ implements HasMetaModelContext, AutoCloseable{
* {@link MethodPrefixBasedFacetFactory}</li>
* <li>the method against any {@link MethodFilteringFacetFactory}</li>
* </ul>
- *
* <p>
* The design of {@link MethodPrefixBasedFacetFactory} (whereby this facet
* factory set does the work) is a slight performance optimization for when
@@ -230,17 +239,11 @@ implements HasMetaModelContext, AutoCloseable{
public boolean recognizes(final ResolvedMethod method) {
var methodName = method.name();
for (var prefix : methodPrefixes.get()) {
- if (methodName.startsWith(prefix)) {
- return true;
- }
+ if (methodName.startsWith(prefix)) return true;
}
-
for (var factory : methodFilteringFactories.get()) {
- if (factory.recognizes(method)) {
- return true;
- }
+ if (factory.recognizes(method)) return true;
}
-
return false;
}
@@ -272,7 +275,6 @@ implements HasMetaModelContext, AutoCloseable{
/**
* Attaches all facets applicable to the provided {@link FeatureType#OBJECT
* object}) to the supplied {@link FacetHolder}.
- *
* <p>
* Delegates to {@link
FacetFactory#process(FacetFactory.ProcessClassContext)} for each
* appropriate factory.
@@ -303,7 +305,6 @@ implements HasMetaModelContext, AutoCloseable{
/**
* Attaches all facets applicable to the provided {@link FeatureType type
of
* feature} to the supplied {@link FacetHolder}.
- *
* <p>
* Delegates to {@link
FacetFactory#process(FacetFactory.ProcessMethodContext)} for each
* appropriate factory.
@@ -352,7 +353,6 @@ implements HasMetaModelContext, AutoCloseable{
/**
* Attaches all facets applicable to the provided parameter to the supplied
* {@link FacetHolder}.
- *
* <p>
* Delegates to {@link FacetFactory#processParams(ProcessParameterContext)}
* for each appropriate factory.
@@ -389,7 +389,8 @@ implements HasMetaModelContext, AutoCloseable{
factoryListByFeatureType.clear();
methodPrefixes.clear();
methodFilteringFactories.clear();
- propertyOrCollectionIdentifyingFactories.clear();
+ propertyAccessorFactories.clear();
+ collectionAccessorFactories.clear();
}
// -- INITIALIZERS
@@ -415,7 +416,7 @@ implements HasMetaModelContext, AutoCloseable{
}
private List<MethodFilteringFacetFactory> init_methodFilteringFactories() {
- var methodFilteringFactories =
_Lists.<MethodFilteringFacetFactory>newArrayList();
+ var methodFilteringFactories = new
ArrayList<MethodFilteringFacetFactory>();
for (var factory : factories) {
if (factory instanceof MethodFilteringFacetFactory) {
var methodFilteringFacetFactory =
(MethodFilteringFacetFactory) factory;
@@ -425,12 +426,22 @@ implements HasMetaModelContext, AutoCloseable{
return methodFilteringFactories;
}
- private List<PropertyOrCollectionIdentifyingFacetFactory>
init_propertyOrCollectionIdentifyingFactories() {
- var propertyOrCollectionIdentifyingFactories =
_Lists.<PropertyOrCollectionIdentifyingFacetFactory>newArrayList();
+ private List<AccessorFacetFactory> init_propertyIdentifyingFactories() {
+ var propertyOrCollectionIdentifyingFactories = new
ArrayList<AccessorFacetFactory>();
+ for (var factory : factories) {
+ if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
+ if(!accessorFacetFactory.supportsProperties()) continue;
+
propertyOrCollectionIdentifyingFactories.add(accessorFacetFactory);
+ }
+ }
+ return propertyOrCollectionIdentifyingFactories;
+ }
+ private List<AccessorFacetFactory> init_collectionIdentifyingFactories() {
+ var propertyOrCollectionIdentifyingFactories = new
ArrayList<AccessorFacetFactory>();
for (var factory : factories) {
- if (factory instanceof
PropertyOrCollectionIdentifyingFacetFactory) {
- var identifyingFacetFactory =
(PropertyOrCollectionIdentifyingFacetFactory) factory;
-
propertyOrCollectionIdentifyingFactories.add(identifyingFacetFactory);
+ if (factory instanceof AccessorFacetFactory accessorFacetFactory) {
+ if(!accessorFacetFactory.supportsCollections()) continue;
+
propertyOrCollectionIdentifyingFactories.add(accessorFacetFactory);
}
}
return propertyOrCollectionIdentifyingFactories;
diff --git
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
index 66239aa1693..38bbc3110f8 100644
---
a/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
+++
b/core/metamodel/src/test/java/org/apache/causeway/core/metamodel/facets/object/navchild/TreeTraversalTest.java
@@ -1,3 +1,21 @@
+/*
+ * 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.causeway.core.metamodel.facets.object.navchild;
import java.util.stream.Collectors;