You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/08 10:31:48 UTC
[isis] branch master updated: ISIS-2774: method finder overhaul (2)
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 035ccc3 ISIS-2774: method finder overhaul (2)
035ccc3 is described below
commit 035ccc3f6ba4dc40c87845704f1906247796cb9b
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 8 12:31:40 2021 +0200
ISIS-2774: method finder overhaul (2)
---
.../isis/core/metamodel/facets/ActionSupport.java | 16 ++---
.../facets/HasPostConstructMethodCache.java | 58 +++++++++++++++++
.../core/metamodel/facets/ParameterSupport.java | 48 +++++++-------
.../metamodel/facets/PostConstructMethodCache.java | 29 ---------
.../DescribedAsFacetForMemberViaMethodFactory.java | 5 +-
.../DisableForContextFacetViaMethodFactory.java | 5 +-
.../HideForContextFacetViaMethodFactory.java | 5 +-
.../NamedFacetForMemberViaMethodFactory.java | 5 +-
.../object/callbacks/CallbackFacetFactory.java | 3 +-
.../choices/enums/EnumValueSemanticsProvider.java | 2 +-
.../DomainObjectAnnotationFacetFactory.java | 18 ++----
...atableObjectFacetForDomainObjectAnnotation.java | 6 +-
.../RecreatableObjectFacetAbstract.java | 8 +--
...ObjectFacetDeclarativeInitializingAbstract.java | 4 +-
.../recreatable/RecreatableObjectFacetFactory.java | 22 ++-----
...ctFacetForRecreatableDomainObjectInterface.java | 4 +-
...eObjectFacetForRecreatableObjectAnnotation.java | 4 +-
...leObjectFacetForRecreatableObjectInterface.java | 4 +-
...ableObjectFacetForXmlRootElementAnnotation.java | 4 +-
.../object/support/ObjectSupportFacetFactory.java | 7 +-
.../PropertyAutoCompleteFacetMethodFactory.java | 5 +-
.../PropertyChoicesFacetViaMethodFactory.java | 5 +-
.../PropertyDefaultFacetViaMethodFactory.java | 5 +-
.../update/PropertySetterFacetFactory.java | 3 +-
.../PropertyValidateFacetViaMethodFactory.java | 5 +-
.../isis/core/metamodel/methods/MethodFinder.java | 31 +++------
.../metamodel/methods/MethodFinderOptions.java | 64 ++++++++++++++++---
.../core/metamodel/methods/MethodFinderUtils.java | 74 ++++------------------
.../metamodel/facets/MethodFinderUtilsTest.java | 31 +++++----
.../restfulobjects/viewer/mappers/FailureUtil.java | 4 +-
30 files changed, 246 insertions(+), 238 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
index c763356..6e09bbc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
@@ -119,8 +119,8 @@ public final class ActionSupport {
MethodFinder
.findMethodWithPPMArg_returningBoolean(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypes, additionalParamTypes)
.map(ActionSupport::toSearchResult)
.forEach(onMethodFound);
break;
@@ -128,8 +128,8 @@ public final class ActionSupport {
MethodFinder
.findMethodWithPPMArg_returningText(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypes, additionalParamTypes)
.map(ActionSupport::toSearchResult)
.forEach(onMethodFound);
break;
@@ -170,8 +170,8 @@ public final class ActionSupport {
MethodFinder
.findMethod_returningBoolean(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypesToLookFor)
.map(ActionSupport::toSearchResult)
.forEach(onMethodFound);
break;
@@ -179,8 +179,8 @@ public final class ActionSupport {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypesToLookFor)
.map(ActionSupport::toSearchResult)
.forEach(onMethodFound);
break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java
new file mode 100644
index 0000000..1812557
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/HasPostConstructMethodCache.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.isis.core.metamodel.facets;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.isis.core.metamodel.methods.MethodByClassMap;
+import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
+
+import lombok.val;
+
+/**
+ * Contract between implementations of RecreatableObjectFacet and their creating facet factories.
+ */
+public interface HasPostConstructMethodCache {
+
+ MethodByClassMap getPostConstructMethodsCache();
+
+ default Method postConstructMethodFor(final Object pojo) {
+ return findAnnotatedMethod(
+ // @PostConstruct is allowed to appear on non-public methods
+ MethodFinderOptions.notNecessarilyPublic(pojo.getClass(), MethodFinderOptions.ANY_NAME)
+ .withRequiredReturnType(void.class),
+ PostConstruct.class,
+ getPostConstructMethodsCache());
+ }
+
+ private static Method findAnnotatedMethod(
+ final MethodFinderOptions options,
+ final Class<? extends Annotation> annotationClass,
+ final MethodByClassMap methods) {
+
+ val type = options.getCorrespondingClass();
+ return methods.computeIfAbsent(type, __->options.streamMethodsIgnoringSignature()
+ .filter(method->method.getAnnotation(annotationClass)!=null)
+ .findFirst()).orElse(null);
+ }
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
index 762b30b..008835a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
@@ -136,8 +136,8 @@ public final class ParameterSupport {
MethodFinder
.findMethodWithPPMArg_returningBoolean(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypes, additionalParamTypes)
.map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
.forEach(onMethodFound);
break;
@@ -145,8 +145,8 @@ public final class ParameterSupport {
MethodFinder
.findMethodWithPPMArg_returningText(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypes, additionalParamTypes)
.map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
.forEach(onMethodFound);
break;
@@ -154,8 +154,8 @@ public final class ParameterSupport {
MethodFinder
.findMethodWithPPMArg_returningNonScalar(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, paramTypes, additionalParamTypes)
.map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
.forEach(onMethodFound);
break;
@@ -163,8 +163,8 @@ public final class ParameterSupport {
MethodFinder
.findMethodWithPPMArg(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, paramTypes, additionalParamTypes)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, paramTypes, additionalParamTypes)
.map(methodAndPpmConstructor->toSearchResult(paramIndex, paramType, methodAndPpmConstructor))
.forEach(onMethodFound);
break;
@@ -202,8 +202,8 @@ public final class ParameterSupport {
MethodFinder
.findMethod_returningBoolean(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, singleArg)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ singleArg)
.map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
.forEach(onMethodFound);
break;
@@ -211,8 +211,8 @@ public final class ParameterSupport {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, singleArg)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ singleArg)
.map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
.forEach(onMethodFound);
break;
@@ -220,8 +220,8 @@ public final class ParameterSupport {
MethodFinder
.findMethod_returningNonScalar(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, singleArg)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, singleArg)
.map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
.forEach(onMethodFound);
break;
@@ -229,8 +229,8 @@ public final class ParameterSupport {
MethodFinder
.findMethod(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, singleArg)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, singleArg)
.map(supportingMethod->toSearchResult(paramIndex, paramType, supportingMethod))
.forEach(onMethodFound);
break;
@@ -267,8 +267,8 @@ public final class ParameterSupport {
supportingMethod = MethodFinder
.findMethod_returningBoolean(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypesToLookFor)
.findFirst()
.orElse(null);
break;
@@ -276,8 +276,8 @@ public final class ParameterSupport {
supportingMethod = MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramTypesToLookFor)
.findFirst()
.orElse(null);
break;
@@ -285,8 +285,8 @@ public final class ParameterSupport {
supportingMethod = MethodFinder
.findMethod_returningNonScalar(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, paramTypesToLookFor)
.findFirst()
.orElse(null);
break;
@@ -294,8 +294,8 @@ public final class ParameterSupport {
supportingMethod = MethodFinder
.findMethod(
MethodFinderOptions
- .memberSupport(methodNames, processMethodContext.getIntrospectionPolicy()),
- type, paramType, paramTypesToLookFor)
+ .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
+ paramType, paramTypesToLookFor)
.findFirst()
.orElse(null);
break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java
deleted file mode 100644
index 591d908..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/PostConstructMethodCache.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.isis.core.metamodel.facets;
-
-import java.lang.reflect.Method;
-
-/**
- * Contract between implementations of RecreatableObjectFacet and their creating facet factories.
- */
-public interface PostConstructMethodCache {
- Method postConstructMethodFor(final Object pojo);
-
-}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
index 039d8a0..5c10c31 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
NO_ARG)
.peek(processMethodContext::removeMethod)
.forEach(describedMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
index 68945e6..3189028 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
NO_ARG)
.peek(processMethodContext::removeMethod)
.forEach(disableMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
index 24b9afd..08bc596 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/hidden/method/HideForContextFacetViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
boolean.class,
NO_ARG)
.peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
index 7139751..7427030 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethodFactory.java
@@ -44,8 +44,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
NO_ARG)
.peek(processMethodContext::removeMethod)
.forEach(namedMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
index 202d5ef..a20e5ee 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/callbacks/CallbackFacetFactory.java
@@ -69,9 +69,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
.findMethod(
MethodFinderOptions
.livecycleCallback(
+ cls,
callbackMethodEnum.getMethodNames(),
processClassContext.getIntrospectionPolicy()),
- cls, void.class, NO_ARG)
+ void.class, NO_ARG)
.peek(processClassContext::removeMethod)
.collect(Can.toCan());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index c0e3d46..4f3e042 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -83,9 +83,9 @@ implements EnumFacet {
.findMethod_returningText(
MethodFinderOptions
.objectSupport(
+ getAdaptedClass(),
ProgrammingModelConstants.ObjectSupportMethod.TITLE.getMethodNames(),
introspectionPolicy),
- getAdaptedClass(),
null)
.findFirst()
.orElse(null);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 16db365..ade3a39 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -24,7 +24,6 @@ import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
-import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.isis.applib.Identifier;
@@ -56,7 +55,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation;
import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedLifecycleEventFacetForDomainObjectAnnotation;
import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedLifecycleEventFacetForDomainObjectAnnotation;
@@ -78,8 +77,6 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.recreatable.Rec
import org.apache.isis.core.metamodel.facets.object.mixin.MetaModelValidatorForMixinTypes;
import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.specloader.validator.MetaModelVisitingValidatorAbstract;
@@ -88,6 +85,7 @@ import org.apache.isis.core.metamodel.util.EventUtil;
import static org.apache.isis.commons.internal.base._NullSafe.stream;
+import lombok.Getter;
import lombok.NonNull;
import lombok.val;
import lombok.extern.log4j.Log4j2;
@@ -97,7 +95,7 @@ public class DomainObjectAnnotationFacetFactory
extends FacetFactoryAbstract
implements
MetaModelRefiner,
- PostConstructMethodCache,
+ HasPostConstructMethodCache,
ObjectTypeFacetFactory {
private final MetaModelValidatorForMixinTypes mixinTypeValidator =
@@ -640,15 +638,7 @@ implements
// //////////////////////////////////////
+ @Getter(onMethod_ = {@Override})
private final @NonNull MethodByClassMap postConstructMethodsCache;
- @Override
- public Method postConstructMethodFor(final Object pojo) {
- return MethodFinderUtils.findAnnotatedMethod(
- // @PostConstruct is allowed to appear on non-public methods
- MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
- pojo, PostConstruct.class, postConstructMethodsCache);
- }
-
-
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
index 0d86f8e..2f3ddb8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/recreatable/RecreatableObjectFacetForDomainObjectAnnotation.java
@@ -24,7 +24,7 @@ import java.util.Optional;
import org.apache.isis.applib.annotation.DomainObject;
import org.apache.isis.core.metamodel.facetapi.Facet;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetDeclarativeInitializingAbstract;
public class RecreatableObjectFacetForDomainObjectAnnotation
@@ -33,7 +33,7 @@ extends RecreatableObjectFacetDeclarativeInitializingAbstract {
public static Optional<RecreatableObjectFacetForDomainObjectAnnotation> create(
final Optional<DomainObject> domainObjectIfAny,
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache,
+ final HasPostConstructMethodCache postConstructMethodCache,
final Facet.Precedence precedence) {
return domainObjectIfAny
@@ -58,7 +58,7 @@ extends RecreatableObjectFacetDeclarativeInitializingAbstract {
private RecreatableObjectFacetForDomainObjectAnnotation(
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache,
+ final HasPostConstructMethodCache postConstructMethodCache,
final Facet.Precedence precedence) {
super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache, precedence);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
index 829247b..0426954 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetAbstract.java
@@ -27,7 +27,7 @@ import org.apache.isis.core.metamodel.commons.MethodExtensions;
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.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import lombok.val;
@@ -36,7 +36,7 @@ public abstract class RecreatableObjectFacetAbstract
extends FacetAbstract
implements ViewModelFacet {
- private final PostConstructMethodCache postConstructMethodCache;
+ private final HasPostConstructMethodCache postConstructMethodCache;
private final ViewModelFacet.RecreationMechanism recreationMechanism;
private static final Class<? extends Facet> type() {
@@ -46,7 +46,7 @@ implements ViewModelFacet {
protected RecreatableObjectFacetAbstract(
final FacetHolder holder,
final RecreationMechanism recreationMechanism,
- final PostConstructMethodCache postConstructMethodCache) {
+ final HasPostConstructMethodCache postConstructMethodCache) {
super(type(), holder);
this.postConstructMethodCache = postConstructMethodCache;
this.recreationMechanism = recreationMechanism;
@@ -55,7 +55,7 @@ implements ViewModelFacet {
protected RecreatableObjectFacetAbstract(
final FacetHolder holder,
final RecreationMechanism recreationMechanism,
- final PostConstructMethodCache postConstructMethodCache,
+ final HasPostConstructMethodCache postConstructMethodCache,
final Facet.Precedence precedence) {
super(type(), holder, precedence);
this.postConstructMethodCache = postConstructMethodCache;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
index dbc2526..348f20b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetDeclarativeInitializingAbstract.java
@@ -24,7 +24,7 @@ import org.apache.isis.commons.internal.memento._Mementos.SerializingAdapter;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facetapi.Facet;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
import org.apache.isis.core.metamodel.spec.ManagedObject;
import org.apache.isis.core.metamodel.spec.feature.MixedIn;
@@ -37,7 +37,7 @@ extends RecreatableObjectFacetAbstract {
public RecreatableObjectFacetDeclarativeInitializingAbstract(
final FacetHolder holder,
final RecreationMechanism recreationMechanism,
- final PostConstructMethodCache postConstructMethodCache,
+ final HasPostConstructMethodCache postConstructMethodCache,
final Facet.Precedence precedence) {
super(holder, recreationMechanism, postConstructMethodCache, precedence);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
index f7c3ed6..44f6f9e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetFactory.java
@@ -18,9 +18,6 @@
*/
package org.apache.isis.core.metamodel.facets.object.recreatable;
-import java.lang.reflect.Method;
-
-import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.xml.bind.annotation.XmlRootElement;
@@ -31,14 +28,13 @@ import org.apache.isis.core.metamodel.facetapi.FacetUtil;
import org.apache.isis.core.metamodel.facetapi.FeatureType;
import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
+import lombok.Getter;
import lombok.NonNull;
import lombok.val;
@@ -46,7 +42,7 @@ public class RecreatableObjectFacetFactory
extends FacetFactoryAbstract
implements
MetaModelRefiner,
- PostConstructMethodCache {
+ HasPostConstructMethodCache {
@Inject
public RecreatableObjectFacetFactory(
@@ -122,19 +118,9 @@ implements
});
}
-
// //////////////////////////////////////
+ @Getter(onMethod_ = {@Override})
private final @NonNull MethodByClassMap postConstructMethodsCache;
- @Override
- public Method postConstructMethodFor(final Object pojo) {
- return MethodFinderUtils.findAnnotatedMethod(
- // @PostConstruct is allowed to appear on non-public methods
- MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
- pojo, PostConstruct.class, postConstructMethodsCache);
- }
-
-
-
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
index a670616..530343f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableDomainObjectInterface.java
@@ -20,14 +20,14 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
import org.apache.isis.applib.RecreatableDomainObject;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
public class RecreatableObjectFacetForRecreatableDomainObjectInterface
extends RecreatableObjectFacetAbstract {
public RecreatableObjectFacetForRecreatableDomainObjectInterface(
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache) {
+ final HasPostConstructMethodCache postConstructMethodCache) {
super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache);
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
index f1ef5f6..9ba6b07 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectAnnotation.java
@@ -19,14 +19,14 @@
package org.apache.isis.core.metamodel.facets.object.recreatable;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
public class RecreatableObjectFacetForRecreatableObjectAnnotation
extends RecreatableObjectFacetDeclarativeInitializingAbstract {
public RecreatableObjectFacetForRecreatableObjectAnnotation(
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache) {
+ final HasPostConstructMethodCache postConstructMethodCache) {
super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache, Precedence.DEFAULT);
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
index 861858b..3fedd86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForRecreatableObjectInterface.java
@@ -20,13 +20,13 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
import org.apache.isis.applib.ViewModel;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
public class RecreatableObjectFacetForRecreatableObjectInterface extends RecreatableObjectFacetAbstract {
public RecreatableObjectFacetForRecreatableObjectInterface(
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache) {
+ final HasPostConstructMethodCache postConstructMethodCache) {
super(holder, RecreationMechanism.INITIALIZES, postConstructMethodCache);
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
index 8ef221d..1b01e3b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/recreatable/RecreatableObjectFacetForXmlRootElementAnnotation.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.recreatable;
import org.apache.isis.applib.services.jaxb.JaxbService;
import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
+import org.apache.isis.core.metamodel.facets.HasPostConstructMethodCache;
public class RecreatableObjectFacetForXmlRootElementAnnotation
extends RecreatableObjectFacetAbstract {
@@ -29,7 +29,7 @@ extends RecreatableObjectFacetAbstract {
public RecreatableObjectFacetForXmlRootElementAnnotation(
final FacetHolder holder,
- final PostConstructMethodCache postConstructMethodCache) {
+ final HasPostConstructMethodCache postConstructMethodCache) {
super(holder, RecreationMechanism.INSTANTIATES, postConstructMethodCache, Precedence.HIGH);
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
index 08707ce..12a5e88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/support/ObjectSupportFacetFactory.java
@@ -114,9 +114,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
MethodFinder
.findMethod_returningCategory(
- MethodFinderOptions.publicOnly(toString.getMethodNames()),
+ MethodFinderOptions.publicOnly(
+ processClassContext.getCls(),
+ toString.getMethodNames()),
toString.getReturnTypeCategory(),
- processClassContext.getCls(),
NO_ARG)
.peek(processClassContext::removeMethod)
.forEach(method->{
@@ -135,10 +136,10 @@ extends MethodPrefixBasedFacetFactoryAbstract {
.findMethod_returningCategory(
MethodFinderOptions
.objectSupport(
+ processClassContext.getCls(),
objectSupportMethodEnum.getMethodNames(),
processClassContext.getIntrospectionPolicy()),
objectSupportMethodEnum.getReturnTypeCategory(),
- processClassContext.getCls(),
NO_ARG)
.peek(processClassContext::removeMethod)
.forEach(method->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
index dcc9201..f72fc3e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/autocomplete/method/PropertyAutoCompleteFacetMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningNonScalar(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
returnType,
STRING_ARG)
.peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
index 3562ac3..49fc907 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/method/PropertyChoicesFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningNonScalar(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
returnType,
NO_ARG)
.peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
index 8930253..56940f2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/defaults/method/PropertyDefaultFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
returnType,
NO_ARG)
.peek(processMethodContext::removeMethod)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
index 5b114d4..ed4fcb1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/update/PropertySetterFacetFactory.java
@@ -66,9 +66,8 @@ extends MethodPrefixBasedFacetFactoryAbstract {
val setterMethods = MethodFinder
.findMethod_returningCategory(
MethodFinderOptions
- .accessor(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
+ .accessor(processMethodContext.getCls(), methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
ReturnTypeCategory.VOID,
- processMethodContext.getCls(),
paramTypes)
.peek(processMethodContext::removeMethod)
.collect(Can.toCan());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
index 7d7bed0..f8c86b8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
@@ -49,8 +49,9 @@ extends MemberSupportFacetFactoryAbstract {
MethodFinder
.findMethod_returningText(
MethodFinderOptions
- .memberSupport(methodNameCandidates, processMethodContext.getIntrospectionPolicy()),
- processMethodContext.getCls(),
+ .memberSupport(processMethodContext.getCls(),
+ methodNameCandidates,
+ processMethodContext.getIntrospectionPolicy()),
new Class[] { returnType })
.peek(processMethodContext::removeMethod)
.forEach(validateMethod->{
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
index 276cb08..9e2b2fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
@@ -44,11 +44,9 @@ public final class MethodFinder {
public static Stream<Method> findMethod(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?> expectedReturnType,
final Class<?>[] paramTypes) {
-
- return options.streamMethods(type, paramTypes)
+ return options.streamMethodsMatchingSignature(paramTypes)
.filter(hasReturnType(expectedReturnType));
}
@@ -57,36 +55,32 @@ public final class MethodFinder {
public static Stream<Method> findMethod_returningCategory(
final MethodFinderOptions options,
final ReturnTypeCategory returnTypeCategory,
- final Class<?> type,
final Class<?>[] paramTypes) {
- return options.streamMethods(type, paramTypes)
+ return options.streamMethodsMatchingSignature(paramTypes)
.filter(hasReturnTypeAnyOf(returnTypeCategory.getReturnTypes()));
}
public static Stream<Method> findMethod_returningBoolean(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?>[] paramTypes) {
- return findMethod_returningCategory(options, ReturnTypeCategory.BOOLEAN, type, paramTypes);
+ return findMethod_returningCategory(options, ReturnTypeCategory.BOOLEAN, paramTypes);
}
public static Stream<Method> findMethod_returningText(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?>[] paramTypes) {
- return findMethod_returningCategory(options, ReturnTypeCategory.TRANSLATABLE, type, paramTypes);
+ return findMethod_returningCategory(options, ReturnTypeCategory.TRANSLATABLE, paramTypes);
}
public static Stream<Method> findMethod_returningNonScalar(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?> elementReturnType,
final Class<?>[] paramTypes) {
- return options.streamMethods(type, paramTypes)
+ return options.streamMethodsMatchingSignature(paramTypes)
.filter(hasReturnTypeAnyOf(ReturnTypeCategory.nonScalar(elementReturnType)));
}
@@ -95,60 +89,55 @@ public final class MethodFinder {
@Deprecated // redundant
public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?> returnType,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return MethodFinderUtils
- .findMethodWithPPMArg(options, type, returnType, paramTypes, additionalParamTypes);
+ .findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes);
}
@Deprecated // redundant
public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
final MethodFinderOptions options,
final Can<Class<?>> returnTypes,
- final Class<?> type,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return MethodFinderUtils
.findMethodWithPPMArg_returningAnyOf(
- options, returnTypes, type, paramTypes, additionalParamTypes);
+ options, returnTypes, paramTypes, additionalParamTypes);
}
public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningBoolean(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return MethodFinderUtils
.findMethodWithPPMArg_returningAnyOf(
- options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), type, paramTypes, additionalParamTypes);
+ options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), paramTypes, additionalParamTypes);
}
public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningText(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return MethodFinderUtils
.findMethodWithPPMArg_returningAnyOf(
- options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), type, paramTypes, additionalParamTypes);
+ options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), paramTypes, additionalParamTypes);
}
public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningNonScalar(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?> elementReturnType,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return MethodFinderUtils
.findMethodWithPPMArg_returningAnyOf(
- options, ReturnTypeCategory.nonScalar(elementReturnType), type, paramTypes, additionalParamTypes);
+ options, ReturnTypeCategory.nonScalar(elementReturnType), paramTypes, additionalParamTypes);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
index 8701091..ff4bf16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderOptions.java
@@ -20,9 +20,12 @@ package org.apache.isis.core.metamodel.methods;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
+import java.util.Arrays;
import java.util.function.Predicate;
import java.util.stream.Stream;
+import org.springframework.lang.Nullable;
+
import org.apache.isis.applib.annotation.Domain;
import org.apache.isis.applib.annotation.Introspection.EncapsulationPolicy;
import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
@@ -46,29 +49,34 @@ import lombok.val;
public class MethodFinderOptions {
public static MethodFinderOptions of(
- @NonNull final Can<String> methodNameCandidatesPossiblyDuplicated,
- @NonNull final EncapsulationPolicy encapsulationPolicy,
- @NonNull final Predicate<Method> mustSatisfy) {
+ final @NonNull Class<?> correspondingClass,
+ final @NonNull Can<String> methodNameCandidatesPossiblyDuplicated,
+ final @NonNull EncapsulationPolicy encapsulationPolicy,
+ final @NonNull Predicate<Method> mustSatisfy) {
final Predicate<Method> isNotStatic = MethodUtil::isNotStatic;
val methodNameCandidates = methodNameCandidatesPossiblyDuplicated.distinct();
return new MethodFinderOptions(
+ correspondingClass,
encapsulationPolicy,
methodNameCandidates.equals(ANY_NAME)
? isNotStatic.and(mustSatisfy)
: isNotStatic
.and(method->methodNameCandidates.contains(method.getName()))
.and(mustSatisfy),
- methodNameCandidates.distinct());
+ methodNameCandidates);
}
- public static final Can<String> ANY_NAME = Can.of("");
+ public static final Can<String> ANY_NAME = Can.of(""); // arbitrary marker
public static final Class<?>[] NO_ARG = new Class<?>[0];
+ //private static final Class<?>[] ANY_ARG = new Class<?>[] {void.class}; // arbitrary marker
public static MethodFinderOptions notNecessarilyPublic(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates) {
return of(
+ correspondingClass,
methodNameCandidates,
EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
_Predicates.alwaysTrue()
@@ -76,8 +84,10 @@ public class MethodFinderOptions {
}
public static MethodFinderOptions publicOnly(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates) {
return of(
+ correspondingClass,
methodNameCandidates,
EncapsulationPolicy.ONLY_PUBLIC_MEMBERS_SUPPORTED,
_Predicates.alwaysTrue()
@@ -85,17 +95,21 @@ public class MethodFinderOptions {
}
public static MethodFinderOptions accessor(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy) {
return havingAnyOrNoAnnotation(
+ correspondingClass,
methodNameCandidates,
memberIntrospectionPolicy);
}
public static MethodFinderOptions objectSupport(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy) {
return supportMethod(
+ correspondingClass,
methodNameCandidates,
memberIntrospectionPolicy,
Domain.Include.class,
@@ -103,9 +117,11 @@ public class MethodFinderOptions {
}
public static MethodFinderOptions livecycleCallback(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy) {
return supportMethod(
+ correspondingClass,
methodNameCandidates,
memberIntrospectionPolicy,
Domain.Include.class,
@@ -113,23 +129,30 @@ public class MethodFinderOptions {
}
public static MethodFinderOptions memberSupport(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy) {
return supportMethod(
+ correspondingClass,
methodNameCandidates,
memberIntrospectionPolicy,
Domain.Include.class,
ProgrammingModelConstants.ConflictingAnnotations.MEMBER_SUPPORT);
}
+ @Getter private final @NonNull Class<?> correspondingClass;
@Getter private final @NonNull EncapsulationPolicy encapsulationPolicy;
@Getter private final @NonNull Predicate<Method> mustSatisfy;
private final @NonNull Can<String> methodNameCandidates;
- public Stream<Method> streamMethods(
- final Class<?> type,
- final Class<?>[] paramTypes) {
+ public Stream<Method> streamMethodsMatchingSignature(
+ final @Nullable Class<?>[] paramTypes) {
+
+ if(paramTypes==null) {
+ return streamMethodsIgnoringSignature();
+ }
+ val type = getCorrespondingClass();
val classCache = _ClassCache.getInstance();
val isEncapsulationSupported = getEncapsulationPolicy().isEncapsulatedMembersSupported();
@@ -138,6 +161,7 @@ public class MethodFinderOptions {
return (isEncapsulationSupported
? classCache.streamPublicOrDeclaredMethods(type)
: classCache.streamPublicMethods(type))
+ .filter(method->Arrays.equals(paramTypes, method.getParameterTypes()))
.filter(mustSatisfy);
}
@@ -150,24 +174,48 @@ public class MethodFinderOptions {
}
+ public Stream<Method> streamMethodsIgnoringSignature() {
+ val type = getCorrespondingClass();
+ val classCache = _ClassCache.getInstance();
+ val isEncapsulationSupported = getEncapsulationPolicy().isEncapsulatedMembersSupported();
+ return (isEncapsulationSupported
+ ? classCache.streamPublicOrDeclaredMethods(type)
+ : classCache.streamPublicMethods(type))
+ .filter(mustSatisfy);
+ }
+
+ // -- WITHERS
+
+ public MethodFinderOptions withRequiredReturnType(final @NonNull Class<?> requiredReturnType) {
+ return new MethodFinderOptions(
+ correspondingClass,
+ encapsulationPolicy,
+ mustSatisfy.and(MethodFinder.hasReturnType(requiredReturnType)),
+ methodNameCandidates);
+ }
+
// -- HELPER
private static MethodFinderOptions havingAnyOrNoAnnotation(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy) {
return of(
+ correspondingClass,
methodNameCandidates,
memberIntrospectionPolicy.getEncapsulationPolicy(),
_Predicates.alwaysTrue());
}
private static MethodFinderOptions supportMethod(
+ final Class<?> correspondingClass,
final Can<String> methodNameCandidates,
final IntrospectionPolicy memberIntrospectionPolicy,
final Class<? extends Annotation> annotationType,
final ConflictingAnnotations conflictingAnnotations) {
return of(
+ correspondingClass,
methodNameCandidates,
// support methods are always allowed private
EncapsulationPolicy.ENCAPSULATED_MEMBERS_SUPPORTED,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
index 0aa9d9d..5b22871 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
@@ -18,15 +18,14 @@
*/
package org.apache.isis.core.metamodel.methods;
-import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
-import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
+import org.springframework.lang.Nullable;
+
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.reflection._ClassCache;
import org.apache.isis.commons.internal.reflection._Reflect;
import org.apache.isis.core.metamodel.commons.MethodUtil;
@@ -34,61 +33,14 @@ import static org.apache.isis.commons.internal.reflection._Reflect.Filter.paramS
import lombok.NonNull;
import lombok.Value;
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
-@Log4j2
public final class MethodFinderUtils {
private MethodFinderUtils() {
}
- private static Stream<Method> streamMethods(
- final MethodFinderOptions options,
- final Class<?> type,
- final Class<?> returnType) {
- try {
-
- return streamMethods(options, type)
- .filter(options.getMustSatisfy())
- .filter(method -> returnType == null
- || returnType.isAssignableFrom(method.getReturnType())
-//XXX for non-scalar types we should probably be a bit smarter
-// || (Iterable.class.isAssignableFrom(returnType)
-// && Iterable.class.isAssignableFrom(method.getReturnType()))
- );
- } catch (final SecurityException e) {
- log.error("failed to enumerate methods of class %s", type);
- return Stream.empty();
- }
- }
-
- public static Method findAnnotatedMethod(
- final MethodFinderOptions options,
- final Object pojo,
- final Class<? extends Annotation> annotationClass,
- final MethodByClassMap methods) {
-
- val clz = pojo.getClass();
- val annotatedMethodIfAny =
- methods.computeIfAbsent(clz, __->search(options, clz, annotationClass, methods));
- return annotatedMethodIfAny.orElse(null);
- }
-
- private static Optional<Method> search(
- final MethodFinderOptions options,
- final Class<?> clz,
- final Class<? extends Annotation> annotationClass,
- final Map<Class<?>, Optional<Method>> postConstructMethods) {
-
- return streamMethods(options, clz)
- .filter(method->method.getAnnotation(annotationClass)!=null)
- .findFirst();
- }
-
// -- PPM SUPPORT
-
@Value(staticConstructor = "of")
public static class MethodAndPpmConstructor {
@NonNull Method supportingMethod;
@@ -107,14 +59,15 @@ public final class MethodFinderUtils {
}
}
+ // -- HELPER
+
static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
final MethodFinderOptions options,
- final Class<?> type,
final Class<?> returnType,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
- return streamMethods(options, type, returnType)
+ return streamMethods(options, returnType)
.filter(MethodUtil.Predicates.paramCount(additionalParamTypes.size()+1))
.filter(MethodUtil.Predicates.matchParamTypes(1, additionalParamTypes))
.map(method->MethodAndPpmCandidate.of(method, method.getParameterTypes()[0]))
@@ -125,24 +78,21 @@ public final class MethodFinderUtils {
static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
final MethodFinderOptions options,
final Can<Class<?>> returnTypes,
- final Class<?> type,
final Class<?>[] paramTypes,
final Can<Class<?>> additionalParamTypes) {
return returnTypes.stream()
- .flatMap(returnType->findMethodWithPPMArg(options, type, returnType, paramTypes, additionalParamTypes));
+ .flatMap(returnType->findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes));
}
- // -- HELPER
-
private static Stream<Method> streamMethods(
final MethodFinderOptions options,
- final Class<?> type) {
- val classCache = _ClassCache.getInstance();
- return (options.getEncapsulationPolicy().isEncapsulatedMembersSupported()
- ? classCache.streamPublicOrDeclaredMethods(type)
- : classCache.streamPublicMethods(type))
- .filter(options.getMustSatisfy()::test);
+ final @Nullable Class<?> returnType) {
+
+ return options.streamMethodsIgnoringSignature()
+ .filter(method -> returnType == null
+ || returnType.isAssignableFrom(method.getReturnType()));
}
+
}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
index b52ab9b..9a445d5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/MethodFinderUtilsTest.java
@@ -23,6 +23,7 @@ import java.util.Optional;
import javax.annotation.PostConstruct;
+import org.junit.Before;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
@@ -31,8 +32,6 @@ import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils;
import lombok.val;
@@ -46,14 +45,25 @@ public class MethodFinderUtilsTest {
private void thisDoesHaveAnnotation(){}
}
+ private HasPostConstructMethodCache hasPostConstructMethodCache;
+
+ @Before
+ public void setup() {
+ val methodByClassMap = new MethodByClassMap();
+ this.hasPostConstructMethodCache = new HasPostConstructMethodCache() {
+ @Override
+ public MethodByClassMap getPostConstructMethodsCache() {
+ return methodByClassMap;
+ }
+ };
+ }
+
+
@Test
public void whenExists() throws Exception {
- val cache = new MethodByClassMap();
- final Method method = MethodFinderUtils
- .findAnnotatedMethod(
- MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
- new WithPostConstruct(), PostConstruct.class, cache );
+ val cache = hasPostConstructMethodCache.getPostConstructMethodsCache();
+ val method = hasPostConstructMethodCache.postConstructMethodFor(new WithPostConstruct());
assertThat(method, is(not(nullValue())));
final Optional<Method> actual = cache.get(WithPostConstruct.class);
@@ -65,11 +75,8 @@ public class MethodFinderUtilsTest {
@Test
public void whenDoesNotExist() throws Exception {
- val cache = new MethodByClassMap();
- final Method method = MethodFinderUtils
- .findAnnotatedMethod(
- MethodFinderOptions.notNecessarilyPublic(MethodFinderOptions.ANY_NAME),
- new NoPostConstruct(), PostConstruct.class, cache);
+ val cache = hasPostConstructMethodCache.getPostConstructMethodsCache();
+ val method = hasPostConstructMethodCache.postConstructMethodFor(new NoPostConstruct());
assertThat(method, is(nullValue()));
final Optional<Method> actual = cache.get(NoPostConstruct.class);
diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
index af39b8a..791476b 100644
--- a/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
+++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/isis/viewer/restfulobjects/viewer/mappers/FailureUtil.java
@@ -34,8 +34,8 @@ final class FailureUtil {
public static HttpStatusCode getFailureStatusCodeIfAny(final Throwable ex) {
- val errorCodeGetter = MethodFinderOptions.publicOnly(Can.ofSingleton("getErrorCode"))
- .streamMethods(ex.getClass(), MethodFinderOptions.NO_ARG)
+ val errorCodeGetter = MethodFinderOptions.publicOnly(ex.getClass(), Can.ofSingleton("getErrorCode"))
+ .streamMethodsMatchingSignature(MethodFinderOptions.NO_ARG)
.filter(MethodFinder.hasReturnType(int.class))
.findFirst()
.orElse(null);