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 2022/03/15 17:19:02 UTC

[isis] branch master updated (6b6bffd -> a5e16a6)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 6b6bffd  ISIS-2877: polishing prev. commit
     new 31ff6fd  ISIS-2877: more polishing
     new a5e16a6  ISIS-2976: purge MethodExtensions

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/isis/commons/internal/os/_OsUtil.java   |  27 +++--
 ...calParameterUtil.java => CanonicalInvoker.java} |  56 ++++++-----
 .../core/metamodel/commons/ClassExtensions.java    |   8 --
 .../core/metamodel/commons/MethodExtensions.java   | 109 ---------------------
 .../isis/core/metamodel/commons/MethodUtil.java    |   4 -
 .../metamodel/commons/ThrowableExtensions.java     |  37 ++-----
 .../isis/core/metamodel/facets/Evaluators.java     |  22 +++--
 ...ctionInvocationFacetForDomainEventAbstract.java |   6 +-
 .../metamodel/facets/object/title/TitleFacet.java  |   8 ++
 .../object/viewmodel/ViewModelFacetAbstract.java   |   4 +-
 .../interactions/managed/ManagedAction.java        |   4 +-
 .../interactions/managed/ManagedValue.java         |   3 -
 .../managed/ParameterNegotiationModel.java         |  12 ---
 .../managed/PropertyNegotiationModel.java          |   1 -
 .../isis/core/metamodel/spec/ManagedObjects.java   |  29 ++++--
 .../valuesemantics/EnumValueSemanticsAbstract.java |   4 +-
 .../CssClassFacetMethodWithProblemTest.java        |   3 +-
 .../object/ident/icon/IconFacetMethodTest.java     |   3 +-
 .../object/ident/layout/LayoutFacetMethodTest.java |   3 +-
 .../title/TitleAnnotationFacetFactoryTest.java     |   2 +-
 .../ident/title/TitleFacetViaMethodTest.java       |   4 +-
 .../title/TitleFacetViaTitleAnnotationTest.java    |   4 +-
 .../facets/object/ident/title/_TitleFacetUtil.java |  33 -------
 .../executor/MemberExecutorServiceDefault.java     |   4 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  29 ++----
 .../interaction/prop/PropertyInteractionWkt.java   |  12 ++-
 .../scalars/ScalarPanelFormFieldAbstract.java      |  15 +--
 27 files changed, 147 insertions(+), 299 deletions(-)
 rename core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/{CanonicalParameterUtil.java => CanonicalInvoker.java} (84%)
 delete mode 100644 core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
 delete mode 100644 core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/_TitleFacetUtil.java

[isis] 02/02: ISIS-2976: purge MethodExtensions

Posted by ah...@apache.org.
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

commit a5e16a6d7cfad1d4d85f7672eda4901f4669275d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Mar 15 18:09:36 2022 +0100

    ISIS-2976: purge MethodExtensions
    
    - use CanonicalInvoker instead
---
 ...calParameterUtil.java => CanonicalInvoker.java} |  56 ++++++-----
 .../core/metamodel/commons/ClassExtensions.java    |   8 --
 .../core/metamodel/commons/MethodExtensions.java   | 109 ---------------------
 .../isis/core/metamodel/commons/MethodUtil.java    |   4 -
 .../metamodel/commons/ThrowableExtensions.java     |  37 ++-----
 .../isis/core/metamodel/facets/Evaluators.java     |  22 +++--
 ...ctionInvocationFacetForDomainEventAbstract.java |   6 +-
 .../metamodel/facets/object/title/TitleFacet.java  |   8 ++
 .../object/viewmodel/ViewModelFacetAbstract.java   |   4 +-
 .../interactions/managed/ManagedAction.java        |   4 +-
 .../interactions/managed/ManagedValue.java         |   3 -
 .../managed/ParameterNegotiationModel.java         |  12 ---
 .../managed/PropertyNegotiationModel.java          |   1 -
 .../isis/core/metamodel/spec/ManagedObjects.java   |  29 ++++--
 .../valuesemantics/EnumValueSemanticsAbstract.java |   4 +-
 .../CssClassFacetMethodWithProblemTest.java        |   3 +-
 .../object/ident/icon/IconFacetMethodTest.java     |   3 +-
 .../object/ident/layout/LayoutFacetMethodTest.java |   3 +-
 .../title/TitleAnnotationFacetFactoryTest.java     |   2 +-
 .../ident/title/TitleFacetViaMethodTest.java       |   4 +-
 .../title/TitleFacetViaTitleAnnotationTest.java    |   4 +-
 .../facets/object/ident/title/_TitleFacetUtil.java |  33 -------
 .../executor/MemberExecutorServiceDefault.java     |   4 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  29 ++----
 .../interaction/prop/PropertyInteractionWkt.java   |  12 ++-
 .../scalars/ScalarPanelFormFieldAbstract.java      |  15 +--
 26 files changed, 134 insertions(+), 285 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalInvoker.java
similarity index 84%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalInvoker.java
index 724f476..2a6704e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalParameterUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanonicalInvoker.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.commons;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Executable;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.List;
@@ -29,16 +28,16 @@ import java.util.Set;
 import java.util.SortedSet;
 
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Collections;
 import org.apache.isis.commons.internal.reflection._Reflect;
 
-import static org.apache.isis.commons.internal.base._NullSafe.isEmpty;
-
 import lombok.NonNull;
 import lombok.val;
+import lombok.experimental.UtilityClass;
 
 /**
  * Utility for method invocation pre-processing.
@@ -46,11 +45,15 @@ import lombok.val;
  * For a given array of parameters, we intercept and adapt those,
  * that are not compatible with the expected target parameter type.
  * <p>
- * We do this for collection parameter types List, Set, SortedSet, Collection, Can and Arrays.
+ * We do this for collection parameter types List, Set, SortedSet, Collection, Can, Arrays
+ * missing arguments and primitives that are not initialized.
  */
-public final class CanonicalParameterUtil {
+@UtilityClass
+public class CanonicalInvoker {
+
+    // -- CONSTRUCT
 
-    public static <T> T construct(final Constructor<T> constructor, final Object[] executionParameters) {
+    public <T> T construct(final Constructor<T> constructor, final Object[] executionParameters) {
         val adaptedExecutionParameters = preprocess(constructor, executionParameters);
 
         // supports effective private constructors as well
@@ -59,8 +62,17 @@ public final class CanonicalParameterUtil {
         .presentElseFail();
     }
 
-    public static Object invoke(final Method method, final Object targetPojo, final Object[] executionParameters)
-            throws IllegalAccessException, InvocationTargetException {
+    // -- INVOKE
+
+    public void invokeAll(final Iterable<Method> methods, final Object object) {
+        methods.forEach(method->invoke(method, object));
+    }
+
+    public Object invoke(final Method method, final Object object) {
+        return invoke(method, object, _Constants.emptyObjects);
+    }
+
+    public Object invoke(final Method method, final Object targetPojo, final Object[] executionParameters) {
 
         val adaptedExecutionParameters = preprocess(method, executionParameters);
 
@@ -71,14 +83,15 @@ public final class CanonicalParameterUtil {
         .orElse(null);
     }
 
-    private static Object[] preprocess(final Executable executable, final Object[] executionParameters) {
-        if (isEmpty(executionParameters)) {
-            return executionParameters;
+    // -- HELPER
+
+    private Object[] preprocess(final Executable executable, final Object[] executionParameters) {
+        final int paramCount = executable.getParameterCount();
+        if(paramCount==0) {
+            return _Constants.emptyObjects;
         }
         val parameterTypes = executable.getParameterTypes();
-        val paramCount = parameterTypes.length;
         val adaptedExecutionParameters = new Object[paramCount];
-
         for(int i=0; i<paramCount; ++i) {
             val origParam = _Arrays.get(executionParameters, i).orElse(null);
             adaptedExecutionParameters[i] = adapt(origParam, parameterTypes[i]);
@@ -86,18 +99,17 @@ public final class CanonicalParameterUtil {
         return adaptedExecutionParameters;
     }
 
-    // -- OBJECT ADAPTER
-
-
     /**
      * Replaces obj (if required) to be conform with the parameterType
      * @param obj
      * @param parameterType
      */
-    private static Object adapt(Object obj, final Class<?> parameterType) {
+    private Object adapt(Object obj, final Class<?> parameterType) {
 
         if(obj==null) {
-            return null;
+            return parameterType.isPrimitive()
+                    ? ClassUtil.defaultByPrimitive.get(parameterType)
+                    : null;
         }
 
         if(parameterType == Can.class) {
@@ -143,7 +155,7 @@ public final class CanonicalParameterUtil {
         return obj;
     }
 
-    private static Throwable toVerboseException(
+    private Throwable toVerboseException(
             final Executable executable,
             final Object[] adaptedExecutionParameters,
             final Throwable e) {
@@ -194,11 +206,10 @@ public final class CanonicalParameterUtil {
             }
         }
 
-        // re-throw more verbose
-        return e;
+        return ThrowableExtensions.handleInvocationException(e, executable.getName());
     }
 
-    private static boolean isValueCompatibleWithType(
+    private boolean isValueCompatibleWithType(
             final @NonNull Optional<Object> value,
             final @NonNull Class<?> type) {
 
@@ -218,4 +229,5 @@ public final class CanonicalParameterUtil {
     }
 
 
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java
index 6586a86..970c129 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java
@@ -154,14 +154,6 @@ public final class ClassExtensions {
         return ClassUtil.defaultByPrimitive.get(extendee);
     }
 
-    /**
-     * Returns the corresponding 'null' value for the primitives, or just
-     * <tt>null</tt> if the class represents a non-primitive type.
-     */
-    public static Object getNullOrDefault(final Class<?> type) {
-        return ClassUtil.defaultByPrimitive.get(type);
-    }
-
     public static boolean isCompatibleAsReturnType(final Class<?> returnTypeExtendee, final CanBeVoid canBeVoid, final Class<?> type) {
         boolean mayBeVoid = canBeVoid == CanBeVoid.TRUE;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
deleted file mode 100644
index 04a306c..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
+++ /dev/null
@@ -1,109 +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.commons;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Executable;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-public class MethodExtensions {
-
-    private MethodExtensions() {
-    }
-
-    public static boolean isStatic(final Method method) {
-        return Modifier.isStatic(method.getModifiers());
-    }
-
-    // //////////////////////////////////////
-
-    public static <T> T construct(final Constructor<T> con) {
-        final Object[] parameters = MethodExtensions.getNullOrDefaultArgs(con);
-        return MethodExtensions.construct(con, parameters);
-    }
-
-    public static <T> T construct(final Constructor<T> con, final Object[] arguments) {
-        try {
-            Object[] defaultAnyPrimitive = defaultAnyPrimitive(con.getParameterTypes(), arguments);
-            return CanonicalParameterUtil.construct(con, defaultAnyPrimitive);
-        } catch (Exception e) {
-             ThrowableExtensions.handleInvocationException(e, con.getName());
-             return null;
-        }
-    }
-
-    public static Object invoke(final Method method, final Object object) {
-        final Object[] parameters = MethodExtensions.getNullOrDefaultArgs(method);
-        return MethodExtensions.invoke(method, object, parameters);
-    }
-
-    public static Object invoke(final Method method, final Object object, final Object[] arguments) {
-        try {
-            Object[] defaultAnyPrimitive = defaultAnyPrimitive(method.getParameterTypes(), arguments);
-            return CanonicalParameterUtil.invoke(method, object, defaultAnyPrimitive);
-        } catch (Exception e) {
-            return ThrowableExtensions.handleInvocationException(e, method.getName());
-        }
-    }
-
-    private static Object[] defaultAnyPrimitive(final Class<?>[] parameterTypes, final Object[] arguments) {
-        if(parameterTypes == null || arguments == null || parameterTypes.length != arguments.length) {
-            return arguments;
-        }
-        final Object[] argumentsWithPrimitivesDefaulted = new Object[arguments.length];
-        for(int i=0; i<argumentsWithPrimitivesDefaulted.length; i++) {
-            argumentsWithPrimitivesDefaulted[i] = valueIfPrimitiveThenDefaulted(parameterTypes[i], arguments[i]);
-        }
-        return argumentsWithPrimitivesDefaulted;
-    }
-
-    private static Object valueIfPrimitiveThenDefaulted(final Class<?> cls, final Object argument) {
-        if(argument != null) {
-            return argument;
-        }
-        if(!cls.isPrimitive()) {
-            return argument;
-        }
-        return ClassUtil.defaultByPrimitive.get(cls);
-    }
-
-    public static Object invokeStatic(final Method method, final Object[] parameters) {
-        return invoke(method, null, parameters);
-    }
-
-    public static Object invokeStatic(final Method method) {
-        return invoke(method, null, MethodExtensions.getNullOrDefaultArgs(method));
-    }
-
-    // //////////////////////////////////////
-
-    public static Object[] getNullOrDefaultArgs(final Executable method) {
-        final Class<?>[] paramTypes = method.getParameterTypes();
-        final Object[] parameters = new Object[paramTypes.length];
-        for (int i = 0; i < parameters.length; i++) {
-            parameters[i] = ClassExtensions.getNullOrDefault(paramTypes[i]);
-        }
-        return parameters;
-    }
-
-
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java
index 9fe241a..e02dd47 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java
@@ -34,10 +34,6 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 public class MethodUtil {
 
-    public static void invoke(final Iterable<Method> methods, final Object object) {
-        methods.forEach(method->MethodExtensions.invoke(method, object));
-    }
-
     public static boolean isNotStatic(final Method method) {
         return !isStatic(method);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java
index 2279061..49dc3fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.commons;
 
 import java.lang.invoke.WrongMethodTypeException;
 import java.lang.reflect.InvocationTargetException;
-import java.util.function.Consumer;
 
 import org.apache.isis.applib.exceptions.RecoverableException;
 import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
@@ -28,51 +27,31 @@ import org.apache.isis.applib.exceptions.unrecoverable.ReflectiveActionException
 
 public final class ThrowableExtensions {
 
-    public static Object handleInvocationException(
+    public static Exception handleInvocationException(
             final Throwable e,
             final String memberName) {
-        return handleInvocationException(e, memberName, null);
-    }
-
-    public static Object handleInvocationException(
-            final Throwable e,
-            final String memberName,
-            final Consumer<RecoverableException> recovery) {
 
         if(e instanceof InvocationTargetException) {
-            return handleInvocationException(((InvocationTargetException) e).getTargetException(), memberName, recovery);
+            return handleInvocationException(((InvocationTargetException) e).getTargetException(), memberName);
         }
         if(e instanceof WrongMethodTypeException) {
-            throw new MetaModelException("Wrong method type access of " + memberName, e);
+            return new MetaModelException("Wrong method type access of " + memberName, e);
         }
         if(e instanceof IllegalAccessException) {
-            throw new ReflectiveActionException("Illegal access of " + memberName, e);
+            return new ReflectiveActionException("Illegal access of " + memberName, e);
         }
         if(e instanceof IllegalStateException) {
-            throw new ReflectiveActionException( String.format(
+            return new ReflectiveActionException( String.format(
                     "IllegalStateException thrown while invoking %s %s",
                     memberName, e.getMessage()), e);
         }
         if(e instanceof RecoverableException) {
-            return handleRecoverableException((RecoverableException)e, memberName, recovery);
+            return new RecoverableException("Exception invoking " + memberName, e);
         }
         if (e instanceof RuntimeException) {
-            throw (RuntimeException) e;
+            return (RuntimeException) e;
         }
-        throw new MetaModelException("Exception invoking " + memberName, e);
-    }
-
-
-    private static Object handleRecoverableException(
-            final RecoverableException e,
-            final String memberName,
-            final Consumer<RecoverableException> recovery) {
-
-        if(recovery!=null)
-            recovery.accept(e);
-
-        // an application exception from the domain code is re-thrown as an
-        throw new RecoverableException("Exception invoking " + memberName, e);
+        return new MetaModelException("Exception invoking " + memberName, e);
     }
 
 }
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 4035f49..420f198 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
@@ -42,6 +42,7 @@ import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import lombok.val;
 
 //@Log4j2
@@ -129,20 +130,25 @@ public final class Evaluators  {
 
         protected abstract MethodHandle createMethodHandle() throws IllegalAccessException;
 
+        @SneakyThrows
         @Override
         public Object value(final Object obj) {
 
-            return getMethodHandleRef()
-            .mapSuccess(mh->{
-                try {
-                    return mh.invoke(obj);
-                } catch (Throwable e) {
-                    return ThrowableExtensions.handleInvocationException(e, name());
-                }
-            })
+            val mh = getMethodHandleRef()
             .optionalElseThrow(ex->
                 new MetaModelException("failed to create a method handle for " + name(), ex))
             .orElse(null);
+
+            if(mh==null) {
+                return null;
+            }
+
+            try {
+                return mh.invoke(obj);
+            } catch (Throwable e) {
+                throw ThrowableExtensions.handleInvocationException(e, name());
+            }
+
         }
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
index 7d9b5a2..6911527 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionInvocationFacetForDomainEventAbstract.java
@@ -33,7 +33,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.functional.Result;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.collections._Arrays;
-import org.apache.isis.core.metamodel.commons.CanonicalParameterUtil;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.execution.InteractionInternal;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -155,11 +155,11 @@ implements ImperativeFacet {
             final QueryResultsCache queryResultsCache = getQueryResultsCache();
             final Object[] targetPojoPlusExecutionParameters = _Arrays.combine(executionParameters, targetPojo);
             return queryResultsCache.execute(
-                    ()->CanonicalParameterUtil.invoke(method, targetPojo, executionParameters),
+                    ()->CanonicalInvoker.invoke(method, targetPojo, executionParameters),
                     targetPojo.getClass(), method.getName(), targetPojoPlusExecutionParameters);
 
         } else {
-            return CanonicalParameterUtil.invoke(method, targetPojo, executionParameters);
+            return CanonicalInvoker.invoke(method, targetPojo, executionParameters);
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacet.java
index 15c6014..af9f54d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/TitleFacet.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.object.title;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 
 /**
  * Mechanism for obtaining the title of an instance of a class, used to label
@@ -38,4 +39,11 @@ public interface TitleFacet extends Facet {
      */
     String title(TitleRenderRequest titleRenderRequest);
 
+
+    default String title(final ManagedObject targetAdapter) {
+        return title(TitleRenderRequest.builder()
+                .object(targetAdapter)
+                .build());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/viewmodel/ViewModelFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/viewmodel/ViewModelFacetAbstract.java
index faeb2c8..a742aec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/viewmodel/ViewModelFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/viewmodel/ViewModelFacetAbstract.java
@@ -23,8 +23,8 @@ import java.util.Optional;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
-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;
@@ -95,7 +95,7 @@ implements ViewModelFacet {
     private void invokePostConstructMethod(final Object viewModel) {
         final Method postConstructMethod = postConstructMethodCache.postConstructMethodFor(viewModel);
         if (postConstructMethod != null) {
-            MethodExtensions.invoke(postConstructMethod, viewModel);
+            CanonicalInvoker.invoke(postConstructMethod, viewModel);
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
index 142b07a..67f0da7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedAction.java
@@ -31,7 +31,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.commons.CanonicalParameterUtil;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
@@ -173,7 +173,7 @@ public final class ManagedAction extends ManagedMember {
         final Object[] executionParameters = UnwrapUtil.multipleAsArray(actionParameters);
         final Object targetPojo = UnwrapUtil.single(interactionHead().getTarget());
 
-        val resultPojo = CanonicalParameterUtil
+        val resultPojo = CanonicalInvoker
                 .invoke(method, targetPojo, executionParameters);
 
         return mmc().getObjectManager().adapt(resultPojo);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedValue.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedValue.java
index cc6b6c9..a2b05df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedValue.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ManagedValue.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.commons.binding.Bindable;
 import org.apache.isis.commons.binding.Observable;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.binding._Observables.BooleanObservable;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
@@ -33,8 +32,6 @@ import lombok.val;
 
 public interface ManagedValue {
 
-    BooleanObservable isCurrentValueAbsent();
-
     ObjectSpecification getElementType();
 
     Bindable<ManagedObject> getValue();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
index 98fe4aa..edc795a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/ParameterNegotiationModel.java
@@ -31,7 +31,6 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.binding._BindableAbstract;
 import org.apache.isis.commons.internal.binding._Bindables;
 import org.apache.isis.commons.internal.binding._Observables;
-import org.apache.isis.commons.internal.binding._Observables.BooleanObservable;
 import org.apache.isis.commons.internal.binding._Observables.LazyObservable;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.metamodel.consent.Consent;
@@ -262,7 +261,6 @@ public class ParameterNegotiationModel {
         @Getter @NonNull private final LazyObservable<String> observableParamValidation;
         @Getter @NonNull private final _BindableAbstract<String> bindableParamSearchArgument;
         @Getter @NonNull private final LazyObservable<Can<ManagedObject>> observableParamChoices;
-        private final BooleanObservable isCurrentValueAbsent;
         private Observable<String> bindableParamAsTitle;
         private Observable<String> bindableParamAsHtml;
         private Bindable<String> bindableParamAsParsableText;
@@ -318,12 +316,6 @@ public class ParameterNegotiationModel {
                         .getReason()
                 : (String)null);
 
-            // has no meaning for params, only has meaning for properties
-            // however, there are behavioral subtleties, that is, for a property
-            // the current value and the initial pending (negotiated) value might differ
-            // if the current value is absent (null)
-            // hence for params we always evaluate isCurrentValueAbsent() to false
-            this.isCurrentValueAbsent = _Observables.lazyBoolean(()->false);
         }
 
         public void invalidateChoicesAndValidation() {
@@ -414,10 +406,6 @@ public class ParameterNegotiationModel {
             return observableParamChoices;
         }
 
-        @Override
-        public BooleanObservable isCurrentValueAbsent() {
-            return isCurrentValueAbsent;
-        }
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
index 7697b55..1508cbf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/interactions/managed/PropertyNegotiationModel.java
@@ -101,7 +101,6 @@ public class PropertyNegotiationModel implements ManagedValue {
             : (String)null);
     }
 
-    @Override
     public BooleanObservable isCurrentValueAbsent() {
         return isCurrentValueAbsent;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
index 607d0ab..b2ba3b4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObjects.java
@@ -49,9 +49,8 @@ import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.commons.ClassExtensions;
-import org.apache.isis.core.metamodel.commons.MethodExtensions;
-import org.apache.isis.core.metamodel.commons.MethodUtil;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
@@ -285,6 +284,16 @@ public final class ManagedObjects {
 
     // -- DEFAULTS UTILITIES
 
+    public static ManagedObject nullToEmpty(
+            final @NonNull ObjectSpecification elementSpec,
+            final @Nullable ManagedObject adapter) {
+
+        if(adapter!=null) {
+            return adapter;
+        }
+        return ManagedObject.empty(elementSpec);
+    }
+
     public static ManagedObject emptyToDefault(
             final ObjectSpecification elementSpec,
             final boolean mandatory,
@@ -878,9 +887,9 @@ public final class ManagedObjects {
                 final Can<ManagedObject> pendingArguments,
                 final List<Object> additionalArguments) {
 
-            val ppmTuple = MethodExtensions.construct(ppmConstructor, UnwrapUtil.multipleAsArray(pendingArguments));
+            val ppmTuple = CanonicalInvoker.construct(ppmConstructor, UnwrapUtil.multipleAsArray(pendingArguments));
             val paramPojos = _Arrays.combineWithExplicitType(Object.class, ppmTuple, additionalArguments.toArray());
-            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), paramPojos);
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), paramPojos);
         }
 
         public static Object invokeWithPAT(
@@ -892,19 +901,19 @@ public final class ManagedObjects {
         }
 
         public static void invokeAll(final Iterable<Method> methods, final ManagedObject adapter) {
-            MethodUtil.invoke(methods, UnwrapUtil.single(adapter));
+            CanonicalInvoker.invokeAll(methods, UnwrapUtil.single(adapter));
         }
 
         public static Object invoke(final Method method, final ManagedObject adapter) {
-            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter));
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter));
         }
 
         public static Object invoke(final Method method, final ManagedObject adapter, final Object arg0) {
-            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), new Object[] {arg0});
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), new Object[] {arg0});
         }
 
         public static Object invoke(final Method method, final ManagedObject adapter, final Can<ManagedObject> argumentAdapters) {
-            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
         }
 
         public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject arg0Adapter) {
@@ -912,7 +921,7 @@ public final class ManagedObjects {
         }
 
         public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject[] argumentAdapters) {
-            return MethodExtensions.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(adapter), UnwrapUtil.multipleAsArray(argumentAdapters));
         }
 
         /**
@@ -945,7 +954,7 @@ public final class ManagedObjects {
 
             val argArray = adjust(method, pendingArgs, additionalArgValues);
 
-            return MethodExtensions.invoke(method, UnwrapUtil.single(target), argArray);
+            return CanonicalInvoker.invoke(method, UnwrapUtil.single(target), argArray);
         }
 
         /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
index b56e3ee..1a01cd6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
@@ -38,7 +38,7 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod;
-import org.apache.isis.core.metamodel.commons.MethodExtensions;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.schema.common.v2.EnumDto;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -151,7 +151,7 @@ implements
             val translationContext = TranslationContext.forMethod(titleMethod);
 
             try {
-                final Object returnValue = MethodExtensions.invoke(titleMethod, object);
+                final Object returnValue = CanonicalInvoker.invoke(titleMethod, object);
                 if(returnValue instanceof String) {
                     return (String) returnValue;
                 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
index ee79515..ce41115 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/cssclass/CssClassFacetMethodWithProblemTest.java
@@ -48,7 +48,7 @@ public class CssClassFacetMethodWithProblemTest {
 
     public static class DomainObjectWithProblemInCssClassMethod {
         public String cssClass() {
-            throw new NullPointerException();
+            throw new NullPointerException("for testing purposes");
         }
     }
 
@@ -78,6 +78,7 @@ public class CssClassFacetMethodWithProblemTest {
 
     @Test
     public void testCssClassThrowsException() {
+        //assertThrows(Exception.class, ()->facet.cssClass(mockOwningAdapter));
         final String iconName = facet.cssClass(mockOwningAdapter);
         assertThat(iconName, is(nullValue()));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/icon/IconFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/icon/IconFacetMethodTest.java
index ae1abf3..38bde53 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/icon/IconFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/icon/IconFacetMethodTest.java
@@ -48,7 +48,7 @@ public class IconFacetMethodTest {
 
     public static class DomainObjectWithProblemInIconNameMethod {
         public String iconName() {
-            throw new NullPointerException();
+            throw new NullPointerException("for testing purposes");
         }
     }
 
@@ -78,6 +78,7 @@ public class IconFacetMethodTest {
 
     @Test
     public void testIconNameThrowsException() {
+        //assertThrows(Exception.class, ()->facet.iconName(mockOwningAdapter));
         final String iconName = facet.iconName(mockOwningAdapter);
         assertThat(iconName, is(nullValue()));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
index fb9714c..9b648b8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/layout/LayoutFacetMethodTest.java
@@ -48,7 +48,7 @@ public class LayoutFacetMethodTest {
 
     public static class DomainObjectWithProblemInLayoutMethod {
         public String layout() {
-            throw new NullPointerException();
+            throw new NullPointerException("for testing purposes");
         }
     }
 
@@ -78,6 +78,7 @@ public class LayoutFacetMethodTest {
 
     @Test
     public void when_layout_throws_exception() {
+        //assertThrows(NullPointerException.class, ()->facet.layout(mockOwningAdapter));
         final String layout = facet.layout(mockOwningAdapter);
         assertThat(layout, is(nullValue()));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java
index 5793ccc..5a2d61c 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleAnnotationFacetFactoryTest.java
@@ -166,7 +166,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
             ignoring(mockStringSpec).assertPojoCompatible(with(any(String.class)));
 
         }});
-        final String title = _TitleFacetUtil.title(titleFacetViaTitleAnnotation, mockObjectAdapter);
+        final String title = titleFacetViaTitleAnnotation.title(mockObjectAdapter);
         assertThat(title, is("titleElement1. titleElement3,titleElement2"));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
index 17896d4..cb38e64 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
@@ -46,7 +46,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     public static class DomainObjectWithProblemInItsTitleMethod {
         public String title() {
-            throw new NullPointerException();
+            throw new NullPointerException("for testing purposes");
         }
     }
 
@@ -78,7 +78,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void testTitleThrowsException() {
-        final String title = _TitleFacetUtil.title(facet, mockOwningAdapter);
+        final String title = facet.title(mockOwningAdapter);
         assertThat(title, is("Failed Title"));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaTitleAnnotationTest.java
index 19edeac..cf76942 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/TitleFacetViaTitleAnnotationTest.java
@@ -115,7 +115,7 @@ public class TitleFacetViaTitleAnnotationTest {
             }
         });
 
-        final String title = _TitleFacetUtil.title(facet, mockManagedObject);
+        final String title = facet.title(mockManagedObject);
         assertThat(title, is("Normal Domain Object"));
     }
 
@@ -140,7 +140,7 @@ public class TitleFacetViaTitleAnnotationTest {
             }
         });
 
-        final String title = _TitleFacetUtil.title(facet, mockManagedObject);
+        final String title = facet.title(mockManagedObject);
         assertThat(title, is("Failed Title"));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/_TitleFacetUtil.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/_TitleFacetUtil.java
deleted file mode 100644
index efd4a30..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/ident/title/_TitleFacetUtil.java
+++ /dev/null
@@ -1,33 +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.object.ident.title;
-
-import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
-import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-final class _TitleFacetUtil {
-
-    static String title(final TitleFacet titleFacet, final ManagedObject targetAdapter) {
-        return titleFacet.title(TitleRenderRequest.builder()
-                .object(targetAdapter)
-                .build());
-    }
-
-}
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
index 68fae1c..c6d8a87 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/executor/MemberExecutorServiceDefault.java
@@ -45,7 +45,7 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.commons.CanonicalParameterUtil;
+import org.apache.isis.core.metamodel.commons.CanonicalInvoker;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.execution.InteractionInternal;
 import org.apache.isis.core.metamodel.execution.MemberExecutorService;
@@ -257,7 +257,7 @@ implements MemberExecutorService {
 
         final Object[] executionParameters = UnwrapUtil.multipleAsArray(arguments);
         final Object targetPojo = UnwrapUtil.single(head.getTarget());
-        return CanonicalParameterUtil.invoke(method, targetPojo, executionParameters);
+        return CanonicalInvoker.invoke(method, targetPojo, executionParameters);
     }
 
     private void setCommandResultIfEntity(
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index cf0ecaf..448e502 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -127,20 +127,21 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
         this.renderingHint = renderingHint;
     }
 
+
+    public <T> IModel<T> unwrapped(final Class<T> type) {
+        return new ScalarUnwrappingModel<T>(type, this);
+    }
+
     /**
      * Gets the proposed value as ManagedObject.
      * (override, so we don't return the target model, we are chained to)
      */
     @Override
     public final ManagedObject getObject() {
-        if(isCurrentValueAbsent()) {
-            return ManagedObject.empty(proposedValue().getElementType());
-        }
-        return proposedValue().getValue().getValue();
-    }
-
-    public <T> IModel<T> unwrapped(final Class<T> type) {
-        return new ScalarUnwrappingModel<T>(type, this);
+        val proposedValue = proposedValue();
+        return ManagedObjects.nullToEmpty(
+                proposedValue.getElementType(),
+                proposedValue.getValue().getValue());
     }
 
     /**
@@ -188,18 +189,6 @@ implements HasRenderingHints, ScalarUiModel, LinksProvider, FormExecutorContext
                 .anyMatch(x -> x.isAssignableFrom(scalarType));
     }
 
-    /**
-     * Has no meaning for <i>Parameters</i>, only has meaning for <i>Properties</i>.
-     * For a <i>Property</i>
-     * the current value and the initial pending (negotiated) value might differ,
-     * if the current value is absent (null).
-     * For <i>Parameters</i> we always evaluate {@code isCurrentValueAbsent()}
-     * to false.
-     */
-    public boolean isCurrentValueAbsent() {
-        return proposedValue().isCurrentValueAbsent().booleanValue();
-    }
-
     public abstract ManagedValue proposedValue();
 
     public abstract boolean whetherHidden();
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
index 2f31871..9af4ee4 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/interaction/prop/PropertyInteractionWkt.java
@@ -34,6 +34,8 @@ import org.apache.isis.core.metamodel.interactions.managed.PropertyNegotiationMo
 import org.apache.isis.viewer.wicket.model.models.interaction.BookmarkedObjectWkt;
 import org.apache.isis.viewer.wicket.model.models.interaction.HasBookmarkedOwnerAbstract;
 
+import lombok.val;
+
 /**
  * The parent (container) model of multiple <i>property models</i> which implement
  * {@link ChainingModel}.
@@ -73,7 +75,15 @@ extends HasBookmarkedOwnerAbstract<PropertyInteraction> {
 
         // restore the lazy field - don't evaluate yet
         propertyNegotiationModel =
-                _Lazy.threadSafe(()->propertyInteraction().startPropertyNegotiation());
+                _Lazy.threadSafe(()->{
+                    //bookmarkedObjectModel().getObjectAndRefetch();
+                    val propIa = propertyInteraction();
+                    val prop = propIa.getManagedProperty().orElseThrow();
+                    prop.getOwner().getBookmarkRefreshed();
+
+
+                    return propIa.startPropertyNegotiation();
+                });
 
         return PropertyInteraction.wrap(
                 ManagedProperty.lookupProperty(getBookmarkedOwner(), memberId, where)
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
index ec4c20e..a0ca426 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelFormFieldAbstract.java
@@ -39,8 +39,8 @@ import org.apache.isis.viewer.wicket.model.util.CommonContextUtils;
 import org.apache.isis.viewer.wicket.ui.components.scalars._FragmentFactory.CompactFragment;
 import org.apache.isis.viewer.wicket.ui.components.scalars._FragmentFactory.InputFragment;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
-import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
+import org.apache.isis.viewer.wicket.ui.util.WktTooltips;
 
 import lombok.val;
 
@@ -123,11 +123,14 @@ extends ScalarPanelAbstract {
                 id,
                 ()->{
                     val scalarModel = scalarModel();
-                    return scalarModel.isCurrentValueAbsent()
-                            ? ""
-                            : scalarModel.proposedValue()
-                                .getValueAsHtml().getValue();
-                                //.getValueAsParsableText().getValue();
+                    return scalarModel.proposedValue()
+                            .getValueAsHtml().getValue();
+
+//                    return scalarModel.isCurrentValueAbsent()
+//                            ? ""
+//                            : scalarModel.proposedValue()
+//                                .getValueAsHtml().getValue();
+//                                //.getValueAsParsableText().getValue();
                 });
     }
 

[isis] 01/02: ISIS-2877: more polishing

Posted by ah...@apache.org.
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

commit 31ff6fd7c338c4442ede0ee44329bb554f9d785d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Mar 15 10:05:23 2022 +0100

    ISIS-2877: more polishing
---
 .../apache/isis/commons/internal/os/_OsUtil.java   | 27 +++++++++++-----------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/os/_OsUtil.java b/commons/src/main/java/org/apache/isis/commons/internal/os/_OsUtil.java
index 02b7637..330f977 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/os/_OsUtil.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/os/_OsUtil.java
@@ -55,22 +55,21 @@ public class _OsUtil {
         public boolean isWindows() { return this==WINDOWS; }
         public boolean isLinux() { return this==LINUX; }
         public boolean isMacOs() { return this==MAC_OS; }
-    }
-
-    public OS currentOs() {
-        if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
-            return OS.WINDOWS;
-        }
-        if (System.getProperty("os.name").toLowerCase().contains("linux")) {
-            return OS.LINUX;
+        public static OS current() {
+            val osName = System.getProperty("os.name").toLowerCase();
+            if (osName.startsWith("windows")) {
+                return OS.WINDOWS;
+            }
+            if (osName.contains("linux")) {
+                return OS.LINUX;
+            }
+            if (osName.contains("mac")) {
+                return OS.MAC_OS;
+            }
+            return OS.OTHER;
         }
-        if (System.getProperty("os.name").toLowerCase().contains("mac")) {
-            return OS.MAC_OS;
-        }
-        return OS.OTHER;
     }
 
-
     /**
      * Uses given {@code pidFile} as a way to communicate between processes,
      * whether there is already a running one.
@@ -109,7 +108,7 @@ public class _OsUtil {
             return; // do nothing
         }
         val rt = Runtime.getRuntime();
-        val os = currentOs();
+        val os = OS.current();
         final String cmd;
         switch(os) {
         case WINDOWS: