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