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/05 05:17:03 UTC
[isis] branch master updated: ISIS-2774: FieldEvaluator: honor
getters if available
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 3315414 ISIS-2774: FieldEvaluator: honor getters if available
3315414 is described below
commit 331541416b46bf7372c78718db40f1d69c20767a
Author: andi-huber <ah...@apache.org>
AuthorDate: Sun Sep 5 07:16:54 2021 +0200
ISIS-2774: FieldEvaluator: honor getters if available
when a getter is present, don't evaluate the field directly, use the
getter instead
also make Evaluator's methodHandle memoization thread-safe
---
.../isis/core/metamodel/facets/Evaluators.java | 33 +++++++++++++---------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
index af7ef63..4a89eaf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/Evaluators.java
@@ -30,6 +30,7 @@ import java.util.function.Predicate;
import java.util.stream.Stream;
import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
+import org.apache.isis.commons.functional.Result;
import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.commons.internal.reflection._ClassCache;
import org.apache.isis.commons.internal.reflection._Reflect;
@@ -38,6 +39,7 @@ import org.apache.isis.commons.internal.reflection._Reflect.TypeHierarchyPolicy;
import org.apache.isis.core.metamodel.commons.MethodUtil;
import org.apache.isis.core.metamodel.commons.ThrowableExtensions;
+import lombok.AccessLevel;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@@ -108,27 +110,27 @@ public final class Evaluators {
public static abstract class Evaluator {
- private MethodHandle mh;
+ @Getter(lazy = true, value = AccessLevel.PRIVATE)
+ private final Result<MethodHandle> methodHandleRef = Result.of(this::createMethodHandle);
protected abstract MethodHandle createMethodHandle() throws IllegalAccessException;
public abstract String name();
public Object value(final Object obj) {
- if(mh==null) {
+
+ return getMethodHandleRef()
+ .ifFailure(ex->{
+ throw new MetaModelException("failed to create a method handle for " + name(), ex);
+ })
+ .mapSuccess(mh->{
try {
- mh = createMethodHandle();
- } catch (IllegalAccessException e) {
- throw new MetaModelException("illegal access of " + name(), e);
+ return mh.invoke(obj);
+ } catch (Throwable e) {
+ return ThrowableExtensions.handleInvocationException(e, name());
}
- }
-
- try {
- return mh.invoke(obj);
- } catch (Throwable e) {
- return ThrowableExtensions.handleInvocationException(e, name());
- }
-
+ });
}
+
}
@RequiredArgsConstructor
@@ -161,7 +163,10 @@ public final class Evaluators {
@Override
protected MethodHandle createMethodHandle() throws IllegalAccessException {
- return _Reflect.handleOfGetterOn(field);
+ val getter = lookupGetter().orElse(null);
+ return getter!=null
+ ? _Reflect.handleOf(getter)
+ : _Reflect.handleOfGetterOn(field);
}
public Optional<Method> lookupGetter() {