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/10 16:32:42 UTC

[isis] branch master updated: ISIS-2774: switch my IDE to lombok-edge (final var)

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 bcea6ec  ISIS-2774: switch my IDE to lombok-edge (final var)
bcea6ec is described below

commit bcea6ecc5baf18ef59b85618d0d4d530c7e783c7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Sep 10 18:31:54 2021 +0200

    ISIS-2774: switch my IDE to lombok-edge (final var)
    
    required some working around issues with val in lambda expressions
---
 .../exceprecog/ExceptionRecognizerAbstract.java    | 25 ++++---
 .../commons/internal/ioc/_IocContainer_Spring.java | 18 ++---
 .../isis/core/metamodel/facets/ActionSupport.java  | 44 ++++++-------
 .../core/metamodel/facets/ParameterSupport.java    | 76 +++++++++++-----------
 ...tedFacetAnnotationElseConfigurationFactory.java | 12 ++--
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  3 +-
 .../core/metamodel/spec/feature/ObjectFeature.java | 39 +++++++++++
 .../handlers/DomainObjectInvocationHandler.java    | 16 ++---
 .../manager/AuthenticationManager.java             | 18 +++--
 .../authenticator/AuthenticatorSecman.java         |  4 +-
 .../TableColumnVisibilityServiceForSecman.java     |  5 +-
 .../userreg/UserRegistrationServiceForSecman.java  |  5 +-
 .../jpa/applib/integration/IsisEntityListener.java |  3 +-
 .../tooling/javamodel/ast/TypeDeclarations.java    |  3 +-
 .../AbstractTypeFeatureReprRenderer.java           | 44 ++++---------
 .../wicket/model/models/ActionArgumentCache.java   | 14 ++--
 .../wicket/model/models/BookmarkTreeNode.java      | 21 +++---
 .../ObjectAdapterMementoProviderAbstract.java      | 19 +++---
 18 files changed, 188 insertions(+), 181 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
index 95f59ac..44ed999 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/exceprecog/ExceptionRecognizerAbstract.java
@@ -32,7 +32,6 @@ import org.apache.isis.commons.internal.exceptions._Exceptions;
 
 import lombok.Getter;
 import lombok.Setter;
-import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 /**
@@ -76,25 +75,25 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
     protected boolean logRecognizedExceptions;
 
     public ExceptionRecognizerAbstract(
-            final Category category, 
-            final Predicate<Throwable> predicate, 
+            final Category category,
+            final Predicate<Throwable> predicate,
             final Function<Throwable, String> rootCauseMessageFormatter) {
         Objects.requireNonNull(predicate);
         this.category = category;
         this.predicate = predicate;
-        this.rootCauseMessageFormatter = rootCauseMessageFormatter != null 
-                ? rootCauseMessageFormatter 
+        this.rootCauseMessageFormatter = rootCauseMessageFormatter != null
+                ? rootCauseMessageFormatter
                 : Throwable::getMessage;
     }
 
     public ExceptionRecognizerAbstract(
-            final Predicate<Throwable> predicate, 
+            final Predicate<Throwable> predicate,
             final Function<Throwable, String> rootCauseMessageFormatter) {
         this(Category.OTHER, predicate, rootCauseMessageFormatter);
     }
 
     public ExceptionRecognizerAbstract(
-            final Category category, 
+            final Category category,
             final Predicate<Throwable> predicate) {
         this(category, predicate, null);
     }
@@ -106,7 +105,7 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
 
 
 
-    private Optional<String> recognizeRootCause(Throwable ex) {
+    private Optional<String> recognizeRootCause(final Throwable ex) {
 
         return _Exceptions.streamCausalChain(ex)
         .filter(predicate)
@@ -115,10 +114,10 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
                 log.info("Recognized exception, stacktrace : ", throwable);
             }
             if(ex instanceof TranslatableException) {
-                val translatableException = (TranslatableException) ex;
-                val translatableMessage = translatableException.getTranslatableMessage();
-                val translationContext = translatableException.getTranslationContext();
-                if(translatableMessage != null 
+                final var translatableException = (TranslatableException) ex;
+                final var translatableMessage = translatableException.getTranslatableMessage();
+                final var translationContext = translatableException.getTranslationContext();
+                if(translatableMessage != null
                         && translationContext != null) {
                     return translatableMessage.translate(translationService, translationContext);
                 }
@@ -132,7 +131,7 @@ public abstract class ExceptionRecognizerAbstract implements ExceptionRecognizer
     }
 
     @Override
-    public Optional<Recognition> recognize(Throwable ex) {
+    public Optional<Recognition> recognize(final Throwable ex) {
         if(disabled) {
             return Optional.empty();
         }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
index 4595c10..60c3739 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/ioc/_IocContainer_Spring.java
@@ -25,12 +25,12 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.springframework.lang.Nullable;
 import javax.inject.Qualifier;
 
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Primary;
 import org.springframework.core.ResolvableType;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -69,22 +69,22 @@ final class _IocContainer_Spring implements _IocContainer {
         return Stream.of(context.getBeanDefinitionNames())
                 .map(name->{
 
-                    val type = context.getType(name);
-                    val id = name; // just reuse the bean's name
+                    final var type = context.getType(name);
+                    final var id = name; // just reuse the bean's name
 
                     //val scope = beanFactory.getBeanDefinition(name).getScope();
 
-                    val resolvableType = ResolvableType.forClass(type);
-                    val bean = context.getBeanProvider(resolvableType);
+                    final var resolvableType = ResolvableType.forClass(type);
+                    final var bean = context.getBeanProvider(resolvableType);
 
-                    val beanAdapter = _ManagedBeanAdapter_Spring.of(id, type, bean);
+                    final var beanAdapter = _ManagedBeanAdapter_Spring.of(id, type, bean);
 
                     return beanAdapter;
                 });
     }
 
     @Override
-    public Optional<?> lookupById(String id) {
+    public Optional<?> lookupById(final String id) {
         return springContext.containsBean(id)
                 ? Optional.of(springContext.getBean(id))
                 : Optional.empty();
@@ -107,7 +107,7 @@ final class _IocContainer_Spring implements _IocContainer {
 
         if(_NullSafe.isEmpty(qualifiersRequired)) {
 
-            val allMatchingBeans = springContext.getBeanProvider(requiredType)
+            final var allMatchingBeans = springContext.getBeanProvider(requiredType)
                     .orderedStream()
                     .collect(Can.toCan());
 
@@ -147,7 +147,7 @@ final class _IocContainer_Spring implements _IocContainer {
      * @param annotation
      * @return whether or not the annotation is a valid qualifier for Spring
      */
-    private static boolean isGenericQualifier(Annotation annotation) {
+    private static boolean isGenericQualifier(final Annotation annotation) {
         if(annotation==null) {
             return false;
         }
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 75f6ae3..36bf6bb 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
@@ -25,9 +25,8 @@ import java.util.EnumSet;
 import java.util.Optional;
 import java.util.function.Consumer;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderPAT;
@@ -38,9 +37,7 @@ import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.Value;
-import lombok.val;
 
-//@Log4j2
 public final class ActionSupport {
 
     @Value @Builder
@@ -50,10 +47,11 @@ public final class ActionSupport {
         @Getter @NonNull MethodFinder methodFinder;
         @NonNull EnumSet<SearchAlgorithm> searchAlgorithms;
 
-        Class<?> additionalParamType;
+        @Builder.Default
+        final @NonNull Can<Class<?>> additionalParamTypes = Can.empty();
 
-        @Getter(lazy = true)
-        Class<?>[] paramTypes = getProcessMethodContext().getMethod().getParameterTypes();
+        @Getter(lazy = true) Class<?>[] paramTypes =
+                getProcessMethodContext().getMethod().getParameterTypes();
     }
 
     @FunctionalInterface
@@ -90,7 +88,7 @@ public final class ActionSupport {
             final ActionSupportingMethodSearchRequest searchRequest,
             final Consumer<ActionSupportingMethodSearchResult> onMethodFound) {
 
-        for (val searchAlgorithm : searchRequest.searchAlgorithms) {
+        for (final var searchAlgorithm : searchRequest.searchAlgorithms) {
             searchAlgorithm.search(searchRequest, onMethodFound);
         }
 
@@ -102,14 +100,11 @@ public final class ActionSupport {
             final ActionSupportingMethodSearchRequest searchRequest,
             final Consumer<ActionSupportingMethodSearchResult> onMethodFound) {
 
-        val paramTypes = searchRequest.getParamTypes();
-        val finderOptions = searchRequest.getMethodFinder();
-        val additionalParamTypes = Can.ofNullable(searchRequest.getAdditionalParamType());
-
         MethodFinderPAT
         .findMethodWithPATArg(
-                finderOptions,
-                paramTypes, additionalParamTypes)
+                searchRequest.getMethodFinder(),
+                searchRequest.getParamTypes(),
+                searchRequest.getAdditionalParamTypes())
         .map(ActionSupport::toSearchResult)
         .forEach(onMethodFound);
     }
@@ -127,22 +122,21 @@ public final class ActionSupport {
             final ActionSupportingMethodSearchRequest searchRequest,
             final Consumer<ActionSupportingMethodSearchResult> onMethodFound) {
 
-        val paramTypes = searchRequest.getParamTypes();
-        val finderOptions = searchRequest.getMethodFinder();
+        final var paramTypes = searchRequest.getParamTypes();
+        final var finderOptions = searchRequest.getMethodFinder();
 
-        val additionalParamType = searchRequest.getAdditionalParamType();
-        val additionalParamCount = additionalParamType!=null ? 1 : 0;
+        final var additionalParamTypes = searchRequest.getAdditionalParamTypes();
+        final var additionalParamCount = additionalParamTypes.size();
 
         final int paramsConsideredCount = paramTypes.length + additionalParamCount;
         if(paramsConsideredCount>=0) {
 
-            val signature = concat(paramTypes, paramsConsideredCount, additionalParamType);
+            final var signature = concat(paramTypes, paramsConsideredCount, additionalParamTypes);
 
             finderOptions
             .streamMethodsMatchingSignature(signature)
             .map(ActionSupport::toSearchResult)
             .forEach(onMethodFound);
-
         }
     }
 
@@ -157,20 +151,20 @@ public final class ActionSupport {
     private static Class<?>[] concat(
             final Class<?>[] paramTypes,
             final int paramsConsidered,
-            final @Nullable Class<?> additionalParamType) {
+            final Can<Class<?>> additionalParamTypes) {
 
         if(paramsConsidered>paramTypes.length) {
-            val msg = String.format("paramsConsidered %d exceeds size of paramTypes %d",
+            final var msg = String.format("paramsConsidered %d exceeds size of paramTypes %d",
                     paramsConsidered, paramTypes.length);
             throw new IllegalArgumentException(msg);
         }
 
-        val paramTypesConsidered = paramsConsidered<paramTypes.length
+        final var paramTypesConsidered = paramsConsidered<paramTypes.length
                 ? Arrays.copyOf(paramTypes, paramsConsidered)
                 : paramTypes;
 
-        val withAdditional = additionalParamType!=null
-                ? _Arrays.combine(paramTypesConsidered, additionalParamType)
+        final var withAdditional = additionalParamTypes.isNotEmpty()
+                ? _Arrays.combine(paramTypesConsidered, additionalParamTypes.toArray(_Constants.emptyClasses))
                 : paramTypesConsidered;
 
         return withAdditional;
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 66c803a..cb649b7 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
@@ -26,9 +26,8 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.IntFunction;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnTypePattern;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
@@ -40,7 +39,6 @@ import lombok.Getter;
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.Value;
-import lombok.val;
 
 /**
  *
@@ -56,16 +54,18 @@ public final class ParameterSupport {
         @NonNull Can<IntFunction<String>> paramIndexToMethodNameProviders;
         @NonNull EnumSet<SearchAlgorithm> searchAlgorithms;
         @NonNull ReturnTypePattern returnTypePattern;
+        
+        @Builder.Default
+        final @NonNull Can<Class<?>> additionalParamTypes = Can.empty();
 
-        Class<?> additionalParamType;
-
-        @Getter(lazy = true)
-        Class<?>[] paramTypes = getProcessMethodContext().getMethod().getParameterTypes();
+        @Getter(lazy = true) Class<?>[] paramTypes =
+                getProcessMethodContext().getMethod().getParameterTypes();
 
         Can<String> getSupporingMethodNameCandidates(final int paramNr) {
             return getParamIndexToMethodNameProviders()
                     .map(provider->provider.apply(paramNr));
         }
+
     }
 
     @Value(staticConstructor = "of")
@@ -109,12 +109,12 @@ public final class ParameterSupport {
             final ParamSupportingMethodSearchRequest searchRequest,
             final Consumer<ParamSupportingMethodSearchResult> onMethodFound) {
 
-        val actionMethod = searchRequest.getProcessMethodContext().getMethod();
-        val paramCount = actionMethod.getParameterCount();
+        final var actionMethod = searchRequest.getProcessMethodContext().getMethod();
+        final var paramCount = actionMethod.getParameterCount();
 
         for (int i = 0; i < paramCount; i++) {
-            for (val searchAlgorithm : searchRequest.searchAlgorithms) {
-                val paramNum = i;
+            for (final var searchAlgorithm : searchRequest.searchAlgorithms) {
+                final var paramNum = i;
                 searchAlgorithm.search(searchRequest, paramNum, onMethodFound);
             }
         }
@@ -126,20 +126,20 @@ public final class ParameterSupport {
             final int paramIndex,
             final Consumer<ParamSupportingMethodSearchResult> onMethodFound) {
 
-        val processMethodContext = searchRequest.getProcessMethodContext();
-        val type = processMethodContext.getCls();
-        val paramTypes = searchRequest.getParamTypes();
-        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
+        final var processMethodContext = searchRequest.getProcessMethodContext();
+        final var type = processMethodContext.getCls();
+        final var paramTypes = searchRequest.getParamTypes();
+        final var methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
 
-        val paramType = paramTypes[paramIndex];
-        val additionalParamTypes = Can.ofNullable(searchRequest.getAdditionalParamType());
+        final var paramType = paramTypes[paramIndex];
 
         MethodFinderPAT
         .findMethodWithPATArg(
                 MethodFinder
                 .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy())
                 .withReturnTypeAnyOf(searchRequest.getReturnTypePattern().matchingTypes(paramType)),
-                paramTypes, additionalParamTypes)
+                paramTypes,
+                searchRequest.getAdditionalParamTypes())
         .map(methodAndPatConstructor->toSearchResult(paramIndex, paramType, methodAndPatConstructor))
         .forEach(onMethodFound);
     }
@@ -160,12 +160,12 @@ public final class ParameterSupport {
             final int paramIndex,
             final Consumer<ParamSupportingMethodSearchResult> onMethodFound) {
 
-        val processMethodContext = searchRequest.getProcessMethodContext();
-        val type = processMethodContext.getCls();
-        val paramTypes = searchRequest.getParamTypes();
-        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
-        val paramType = paramTypes[paramIndex];
-        val signature = new Class<?>[]{paramType};
+        final var processMethodContext = searchRequest.getProcessMethodContext();
+        final var type = processMethodContext.getCls();
+        final var paramTypes = searchRequest.getParamTypes();
+        final var methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
+        final var paramType = paramTypes[paramIndex];
+        final var signature = new Class<?>[]{paramType};
 
         MethodFinder
         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy())
@@ -183,20 +183,20 @@ public final class ParameterSupport {
             final int paramIndex,
             final Consumer<ParamSupportingMethodSearchResult> onMethodFound) {
 
-        val processMethodContext = searchRequest.getProcessMethodContext();
-        val type = processMethodContext.getCls();
-        val paramTypes = searchRequest.getParamTypes();
-        val methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
-        val paramType = paramTypes[paramIndex];
-        val additionalParamType = searchRequest.getAdditionalParamType();
-        val additionalParamCount = additionalParamType!=null ? 1 : 0;
+        final var processMethodContext = searchRequest.getProcessMethodContext();
+        final var type = processMethodContext.getCls();
+        final var paramTypes = searchRequest.getParamTypes();
+        final var methodNames = searchRequest.getSupporingMethodNameCandidates(paramIndex);
+        final var paramType = paramTypes[paramIndex];
+        final var additionalParamTypes = searchRequest.getAdditionalParamTypes();
+        final var additionalParamCount = additionalParamTypes.size();
 
         int paramsConsideredCount = paramIndex + additionalParamCount;
         while(paramsConsideredCount>=0) {
 
-            val signature = concat(paramTypes, paramsConsideredCount, additionalParamType);
+            final var signature = concat(paramTypes, paramsConsideredCount, additionalParamTypes);
 
-            val supportingMethod =
+            final var supportingMethod =
             MethodFinder
             .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy())
             .withReturnTypeAnyOf(searchRequest.getReturnTypePattern().matchingTypes(paramType))
@@ -229,20 +229,20 @@ public final class ParameterSupport {
     private static Class<?>[] concat(
             final Class<?>[] paramTypes,
             final int paramsConsidered,
-            final @Nullable Class<?> additionalParamType) {
+            final Can<Class<?>> additionalParamTypes) {
 
         if(paramsConsidered>paramTypes.length) {
-            val msg = String.format("paramsConsidered %d exceeds size of paramTypes %d",
+            final var msg = String.format("paramsConsidered %d exceeds size of paramTypes %d",
                     paramsConsidered, paramTypes.length);
             throw new IllegalArgumentException(msg);
         }
 
-        val paramTypesConsidered = paramsConsidered<paramTypes.length
+        final var paramTypesConsidered = paramsConsidered<paramTypes.length
                 ? Arrays.copyOf(paramTypes, paramsConsidered)
                 : paramTypes;
 
-        val withAdditional = additionalParamType!=null
-                ? _Arrays.combine(paramTypesConsidered, additionalParamType)
+        final var withAdditional = additionalParamTypes.isNotEmpty()
+                ? _Arrays.combine(paramTypesConsidered, additionalParamTypes.toArray(_Constants.emptyClasses))
                 : paramTypesConsidered;
 
         return withAdditional;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
index cfdd2e9..fd9406bb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
@@ -29,8 +29,6 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultsProviderUtil;
 
-import lombok.val;
-
 public class DefaultedFacetAnnotationElseConfigurationFactory
 extends FacetFactoryAbstract {
 
@@ -42,10 +40,10 @@ extends FacetFactoryAbstract {
     @Override
     public void process(final ProcessClassContext processClassContext) {
 
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-        val config = super.getConfiguration();
-        val defaultedIfAny = processClassContext.synthesizeOnType(Defaulted.class);
+        final var cls = processClassContext.getCls();
+        final var facetHolder = processClassContext.getFacetHolder();
+        final var config = super.getConfiguration();
+        final var defaultedIfAny = processClassContext.synthesizeOnType(Defaulted.class);
 
         addFacetIfPresent(
 
@@ -56,7 +54,7 @@ extends FacetFactoryAbstract {
 
                 // otherwise, try to create from configuration, if present
                 ()->{
-                    val providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, cls);
+                    final var providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, cls);
                     return _Strings.isNotEmpty(providerName)
                         ? DefaultedFacetFromConfiguration.create(providerName, facetHolder)
                         : Optional.empty();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index 08d45e4..8e0f782 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.param.autocomplete.method;
 
 import javax.inject.Inject;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
@@ -35,7 +36,7 @@ extends ActionParameterSupportFacetFactoryAbstract {
     public ActionParameterAutoCompleteFacetViaMethodFactory(final MetaModelContext mmc) {
         super(mmc, MemberSupportPrefix.AUTO_COMPLETE, searchOptions->
             searchOptions
-            .additionalParamType(String.class));
+            .additionalParamTypes(Can.of(String.class)));
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
index 618e876..b67c812 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectFeature.java
@@ -22,12 +22,16 @@ import java.util.Optional;
 import java.util.function.Supplier;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.objectvalue.mandatory.MandatoryFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
 
+import lombok.val;
+
 /**
  * A specification representing a non-{@link FeatureType#OBJECT object}, that
  * therefore has an underlying type (the type of the property, collection)
@@ -72,6 +76,24 @@ public interface ObjectFeature extends Specification {
     Optional<String> getStaticFriendlyName();
 
     /**
+     * TODO
+     */
+    default String getCanonicalFriendlyName() {
+        //FIXME this is too low level, we have abstracted that
+        return _Strings.asNaturalName2.apply(getId());
+    }
+
+    /**
+     * TODO
+     */
+    default _Either<String, String> getStaticOrCanonicalFriendlyName() {
+        val staticFriendlyName = getStaticFriendlyName();
+        return staticFriendlyName.isPresent()
+                ? _Either.left(staticFriendlyName.get())
+                : _Either.right(getCanonicalFriendlyName());
+    }
+
+    /**
      * Returns a (translated) description of how the member is used - this complements the
      * help text.
      *
@@ -90,6 +112,23 @@ public interface ObjectFeature extends Specification {
     Optional<String> getStaticDescription();
 
     /**
+     * TODO
+     */
+    default String getCanonicalDescription() {
+        return "";
+    }
+
+    /**
+     * TODO
+     */
+    default _Either<String, String> getStaticOrCanonicalDescription() {
+        val staticDescription = getStaticDescription();
+        return staticDescription.isPresent()
+                ? _Either.left(staticDescription.get())
+                : _Either.right(getCanonicalDescription());
+    }
+
+    /**
      * The specification of the underlying type.
      *
      * <p>
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index 6b3ea7e..9f8fa8f 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -338,12 +338,12 @@ extends DelegatingInvocationHandlerDefault<T> {
 
         return runExecutionTask(()->{
 
-            val interactionInitiatedBy = getInteractionInitiatedBy();
-            val currentReferencedAdapter = property.get(targetAdapter, interactionInitiatedBy);
+            final var interactionInitiatedBy = getInteractionInitiatedBy();
+            final var currentReferencedAdapter = property.get(targetAdapter, interactionInitiatedBy);
 
-            val currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
+            final var currentReferencedObj = UnwrapUtil.single(currentReferencedAdapter);
 
-            val propertyAccessEvent = new PropertyAccessEvent(
+            final var propertyAccessEvent = new PropertyAccessEvent(
                     getDelegate(), property.getFeatureIdentifier(), currentReferencedObj);
             notifyListeners(propertyAccessEvent);
             return currentReferencedObj;
@@ -410,12 +410,12 @@ extends DelegatingInvocationHandlerDefault<T> {
             val collectionAccessEvent = new CollectionAccessEvent(getDelegate(), collection.getFeatureIdentifier());
 
             if (currentReferencedObj instanceof Collection) {
-                val collectionViewObject = lookupWrappingObject(
+                final var collectionViewObject = lookupWrappingObject(
                         (Collection<?>) currentReferencedObj, collection);
                 notifyListeners(collectionAccessEvent);
                 return collectionViewObject;
             } else if (currentReferencedObj instanceof Map) {
-                val mapViewObject = lookupWrappingObject((Map<?, ?>) currentReferencedObj,
+                final var mapViewObject = lookupWrappingObject((Map<?, ?>) currentReferencedObj,
                         collection);
                 notifyListeners(collectionAccessEvent);
                 return mapViewObject;
@@ -469,9 +469,9 @@ extends DelegatingInvocationHandlerDefault<T> {
         });
 
         return runExecutionTask(()->{
-            val interactionInitiatedBy = getInteractionInitiatedBy();
+            final var interactionInitiatedBy = getInteractionInitiatedBy();
 
-            val returnedAdapter = objectAction.execute(
+            final var returnedAdapter = objectAction.execute(
                     head, argAdapters,
                     interactionInitiatedBy);
             return UnwrapUtil.single(returnedAdapter);
diff --git a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java b/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
index 3760f8c..ac3b92a 100644
--- a/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
+++ b/core/security/src/main/java/org/apache/isis/core/security/authentication/manager/AuthenticationManager.java
@@ -85,13 +85,13 @@ public class AuthenticationManager {
 
     @Transactional(readOnly = true) // let Spring handle the transactional context for this method
     // cannot use final here, as Spring provides a transaction aware proxy for this type
-    public /*final*/ InteractionContext authenticate(AuthenticationRequest request) {
+    public /*final*/ InteractionContext authenticate(final AuthenticationRequest request) {
 
         if (request == null) {
             return null;
         }
 
-        val compatibleAuthenticators = authenticators
+        final var compatibleAuthenticators = authenticators
                 .filter(authenticator->authenticator.canAuthenticate(request.getClass()));
 
         if (compatibleAuthenticators.isEmpty()) {
@@ -103,8 +103,8 @@ public class AuthenticationManager {
         // we simply participate with the current transaction
         return interactionService.callAnonymous(()->{
 
-            for (val authenticator : compatibleAuthenticators) {
-                val interactionContext = authenticator.authenticate(request, getUnusedRandomCode());
+            for (final var authenticator : compatibleAuthenticators) {
+                final var interactionContext = authenticator.authenticate(request, getUnusedRandomCode());
                 if (interactionContext != null) {
                     val userMemento = refineUserWithin(interactionContext);
                     userByValidationCode.put(
@@ -126,7 +126,7 @@ public class AuthenticationManager {
      * @return
      */
     @NonNull
-    private UserMemento refineUserWithin(InteractionContext interactionContext) {
+    private UserMemento refineUserWithin(final InteractionContext interactionContext) {
         val userMementoOrig = interactionContext.getUser();
         UserMemento userMemento = userMementoOrig;
         for (UserMementoRefiner refiner : userMementoRefiners) {
@@ -176,7 +176,7 @@ public class AuthenticationManager {
     }
 
 
-    public void closeSession(InteractionContext context) {
+    public void closeSession(final InteractionContext context) {
         for (val authenticator : authenticators) {
             authenticator.logout(context);
         }
@@ -185,7 +185,7 @@ public class AuthenticationManager {
 
     // -- AUTHENTICATORS
 
-    public boolean register(RegistrationDetails registrationDetails) {
+    public boolean register(final RegistrationDetails registrationDetails) {
         for (val registrar : this.registrars) {
             if (registrar.canRegister(registrationDetails.getClass())) {
                 return registrar.register(registrationDetails);
@@ -195,7 +195,7 @@ public class AuthenticationManager {
     }
 
 
-    public boolean supportsRegistration(Class<? extends RegistrationDetails> registrationDetailsClass) {
+    public boolean supportsRegistration(final Class<? extends RegistrationDetails> registrationDetailsClass) {
         for (val registrar : this.registrars) {
             if (registrar.canRegister(registrationDetailsClass)) {
                 return true;
@@ -204,8 +204,6 @@ public class AuthenticationManager {
         return false;
     }
 
-
-
     // -- DEBUGGING
 
     private static final ToString<AuthenticationManager> toString =
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
index 052a62d..3d1ee17 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/authenticator/AuthenticatorSecman.java
@@ -75,10 +75,10 @@ public class AuthenticatorSecman implements Authenticator {
         return applicationUserRepository.findByUsername(username)
                 .filter(appUser -> appUser.getEncryptedPassword().equals(encryptedPassword))
                 .map(appUser -> {
-                    val roleNames = Stream.concat(
+                    final var roleNames = Stream.concat(
                             appUser.getRoles().stream().map(ApplicationRole::getName),
                             request.streamRoles());
-                    val user = UserMemento.ofNameAndRoleNames(username, roleNames)
+                    final var user = UserMemento.ofNameAndRoleNames(username, roleNames)
                             .withAuthenticationCode(code);
                     return InteractionContext.ofUserWithSystemDefaults(user);
                 })
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/spiimpl/TableColumnVisibilityServiceForSecman.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/spiimpl/TableColumnVisibilityServiceForSecman.java
index b27b384..996fb7f 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/spiimpl/TableColumnVisibilityServiceForSecman.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/spiimpl/TableColumnVisibilityServiceForSecman.java
@@ -48,14 +48,15 @@ public class TableColumnVisibilityServiceForSecman implements TableColumnVisibil
     final SpecificationLoader specificationLoader;
 
     @Override
-    public boolean hides(Class<?> elementType, String memberId) {
+    public boolean hides(final Class<?> elementType, final String memberId) {
         val me = factoryService.mixin(MeService.me.class, meService).act();
         val permissionSet = me.getPermissionSet();
 
         final boolean granted = specificationLoader.specForType(elementType)
             .map(ObjectSpecification::getLogicalTypeName)
             .map(logicalTypeName->{
-                val featureId = ApplicationFeatureId.newMember(logicalTypeName, memberId);
+                //XXX lombok val issue with lambda
+                final var featureId = ApplicationFeatureId.newMember(logicalTypeName, memberId);
                 return permissionSet.evaluate(featureId, ApplicationPermissionMode.VIEWING).isGranted();
             })
             .orElse(false); // do not grant if elementType has no logicalTypeName
diff --git a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/userreg/UserRegistrationServiceForSecman.java b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/userreg/UserRegistrationServiceForSecman.java
index bf2cad3..e2fec94 100644
--- a/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/userreg/UserRegistrationServiceForSecman.java
+++ b/extensions/security/secman/integration/src/main/java/org/apache/isis/extensions/secman/integration/userreg/UserRegistrationServiceForSecman.java
@@ -23,10 +23,10 @@ import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.userreg.UserDetails;
 import org.apache.isis.applib.services.userreg.UserRegistrationService;
 import org.apache.isis.applib.value.Password;
@@ -38,7 +38,6 @@ import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserReposito
 import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUserStatus;
 
 import lombok.RequiredArgsConstructor;
-import lombok.val;
 
 /**
  * An implementation of {@link org.apache.isis.applib.services.userreg.UserRegistrationService}
@@ -94,7 +93,7 @@ public class UserRegistrationServiceForSecman implements UserRegistrationService
     public boolean updatePasswordByEmail(final String emailAddress, final String password) {
         return applicationUserRepository.findByEmailAddress(emailAddress)
                 .map(user -> {
-                    val passwordWasUpdated = applicationUserRepository.updatePassword(user, password);
+                    final var passwordWasUpdated = applicationUserRepository.updatePassword(user, password);
                     return passwordWasUpdated;
                 })
                 .orElse(false);
diff --git a/persistence/jpa/applib/src/main/java/org/apache/isis/persistence/jpa/applib/integration/IsisEntityListener.java b/persistence/jpa/applib/src/main/java/org/apache/isis/persistence/jpa/applib/integration/IsisEntityListener.java
index a3035dc..9fb4cb9 100644
--- a/persistence/jpa/applib/src/main/java/org/apache/isis/persistence/jpa/applib/integration/IsisEntityListener.java
+++ b/persistence/jpa/applib/src/main/java/org/apache/isis/persistence/jpa/applib/integration/IsisEntityListener.java
@@ -94,7 +94,8 @@ public class IsisEntityListener {
             .filter(DirectToFieldChangeRecord.class::isInstance)
             .map(DirectToFieldChangeRecord.class::cast)
             .map(changeRecord -> {
-                val propertyName = changeRecord.getAttribute();
+                //XXX lombok val issue with nested lambda
+                final String propertyName = changeRecord.getAttribute();
                 return entity
                         .getSpecification()
                         .getProperty(propertyName)
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
index 279d975..c59ef11 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
@@ -24,7 +24,6 @@ import com.github.javaparser.ast.type.TypeParameter;
 import org.apache.isis.commons.collections.Can;
 
 import lombok.NonNull;
-import lombok.val;
 
 public final class TypeDeclarations {
 
@@ -38,7 +37,7 @@ public final class TypeDeclarations {
         return td.getJavadoc()
         .map(javadoc->{
 
-            val toBeIncluded = Javadocs.streamTagContent(javadoc, "since")
+            final var toBeIncluded = Javadocs.streamTagContent(javadoc, "since")
             .anyMatch(since->since.toText().contains("{@index}"));
 
             return toBeIncluded;
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeFeatureReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeFeatureReprRenderer.java
index 4d65f6d..49aa286 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeFeatureReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/AbstractTypeFeatureReprRenderer.java
@@ -19,7 +19,6 @@
 package org.apache.isis.viewer.restfulobjects.rendering.domaintypes;
 
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
@@ -27,8 +26,6 @@ import org.apache.isis.viewer.restfulobjects.rendering.IResourceContext;
 import org.apache.isis.viewer.restfulobjects.rendering.LinkFollowSpecs;
 import org.apache.isis.viewer.restfulobjects.rendering.ReprRendererAbstract;
 
-import lombok.val;
-
 public abstract class AbstractTypeFeatureReprRenderer<T extends ObjectFeature>
 extends ReprRendererAbstract<ParentSpecAndFeature<T>> {
 
@@ -101,38 +98,21 @@ extends ReprRendererAbstract<ParentSpecAndFeature<T>> {
     protected abstract void putExtensionsSpecificToFeature();
 
     protected void putExtensionsName() {
-
-        val staticFriendlyName = getObjectFeature().getStaticFriendlyName();
-        if(staticFriendlyName.isPresent()) {
-            getExtensions()
-                .mapPut("staticFriendlyName", staticFriendlyName.get());
-        } else {
-            getExtensions()
-                .mapPut("canonicalFriendlyName",
-                        objectFeature instanceof ObjectAssociation
-                            ? ((ObjectAssociation)objectFeature)
-                                    .getCanonicalFriendlyName()
-                            : objectFeature.getId()
-                        );
-        }
-
+        getObjectFeature().getStaticOrCanonicalFriendlyName()
+        .accept(
+                staticForm->
+                    getExtensions().mapPut("staticFriendlyName", staticForm),
+                canonicalForm->
+                    getExtensions().mapPut("canonicalFriendlyName", canonicalForm));
     }
 
     protected void putExtensionsDescriptionIfAvailable() {
-
-        val staticDescription = getObjectFeature().getStaticDescription();
-        if(staticDescription.isPresent()) {
-            getExtensions()
-                .mapPut("staticDescription", staticDescription.get());
-        } else {
-            getExtensions()
-                .mapPut("canonicalDescription",
-                        objectFeature instanceof ObjectAssociation
-                            ? ((ObjectAssociation)objectFeature)
-                                    .getCanonicalDescription()
-                            : ""
-                        );
-        }
+        getObjectFeature().getStaticOrCanonicalDescription()
+        .accept(
+                staticForm->
+                    getExtensions().mapPut("staticDescription", staticForm),
+                canonicalForm->
+                    getExtensions().mapPut("canonicalDescription", canonicalForm));
     }
 
 }
\ No newline at end of file
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
index 713fbf2..8eac2c3 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
@@ -66,8 +66,8 @@ class ActionArgumentCache implements PendingParameterManager {
 
         return streamParamNumbers()
         .mapToObj(paramIndex->{
-            val actionArgumentModel = Optional.ofNullable(arguments.get(paramIndex));
-            val adapter = actionArgumentModel
+            final var actionArgumentModel = Optional.ofNullable(arguments.get(paramIndex));
+            final var adapter = actionArgumentModel
                     .map(ParameterUiModel::getValue)
                     .orElse(ManagedObject.empty(paramTypes.getElseFail(paramIndex)));
             return adapter;
@@ -76,14 +76,14 @@ class ActionArgumentCache implements PendingParameterManager {
         .collect(Can.toCan());
     }
 
-    public void resetTo(Can<ManagedObject> defaultsFixedPoint) {
+    public void resetTo(final Can<ManagedObject> defaultsFixedPoint) {
 
         arguments.clear();
 
         streamParamUiModels()
         .forEach(actionArgumentModel -> {
             int paramIndex = actionArgumentModel.getNumber();
-            val paramDefaultValue = defaultsFixedPoint.getElseFail(paramIndex);
+            final var paramDefaultValue = defaultsFixedPoint.getElseFail(paramIndex);
             actionArgumentModel.setValue(paramDefaultValue);
         });
     }
@@ -95,13 +95,13 @@ class ActionArgumentCache implements PendingParameterManager {
     }
 
     @Override
-    public void setParameterValue(ObjectActionParameter actionParameter, ManagedObject newParamValue) {
+    public void setParameterValue(final ObjectActionParameter actionParameter, final ManagedObject newParamValue) {
         val actionArgumentModel = computeIfAbsent(actionParameter.getNumber(), actionParameter::getMemento);
         actionArgumentModel.setValue(newParamValue);
     }
 
     @Override
-    public void clearParameterValue(ObjectActionParameter actionParameter) {
+    public void clearParameterValue(final ObjectActionParameter actionParameter) {
         setParameterValue(actionParameter, null);
     }
 
@@ -112,7 +112,7 @@ class ActionArgumentCache implements PendingParameterManager {
         return IntStream.range(0, paramCount);
     }
 
-    private ParameterUiModel createArgumentModel(int paramIndex) {
+    private ParameterUiModel createArgumentModel(final int paramIndex) {
         val param = action.getParameters().getElseFail(paramIndex);
         val actionArgumentModel = new ScalarParameterModel(entityModel, param.getMemento());
         return actionArgumentModel;
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
index e9e97b5..f0c63f0 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkTreeNode.java
@@ -22,9 +22,8 @@ import java.io.Serializable;
 import java.util.List;
 import java.util.Objects;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.base._NullSafe;
@@ -53,7 +52,7 @@ public class BookmarkTreeNode implements Serializable {
     private PageParameters pageParameters;
 
     public static BookmarkTreeNode newRoot(
-            BookmarkableModel bookmarkableModel) {
+            final BookmarkableModel bookmarkableModel) {
         return new BookmarkTreeNode(bookmarkableModel, 0);
     }
 
@@ -80,14 +79,14 @@ public class BookmarkTreeNode implements Serializable {
     public String getTitle() {
         return title;
     }
-    private void setTitle(String title) {
+    private void setTitle(final String title) {
         this.title = title;
     }
 
     public List<BookmarkTreeNode> getChildren() {
         return children;
     }
-    public BookmarkTreeNode addChild(BookmarkableModel childModel) {
+    public BookmarkTreeNode addChild(final BookmarkableModel childModel) {
         final BookmarkTreeNode childNode = new BookmarkTreeNode(childModel, depth+1);
         children.add(childNode);
         return childNode;
@@ -107,7 +106,7 @@ public class BookmarkTreeNode implements Serializable {
      *
      * @return - whether the provided candidate is found or was added to this node's tree.
      */
-    public boolean matches(BookmarkableModel candidateBookmarkableModel) {
+    public boolean matches(final BookmarkableModel candidateBookmarkableModel) {
         if(candidateBookmarkableModel instanceof EntityModel) {
             return matchAndUpdateTitleFor((EntityModel) candidateBookmarkableModel);
         }
@@ -133,7 +132,7 @@ public class BookmarkTreeNode implements Serializable {
             this.setTitle(candidateEntityModel.getTitle());
         }
 
-        // and also match recursively down to all children and grandchildren.
+        // and also match recursively down to all children and grand-children.
         if(candidateEntityModel.hasAsChildPolicy()) {
             for(BookmarkTreeNode childNode: this.getChildren()) {
                 inGraph = childNode.matches(candidateEntityModel) || inGraph; // evaluate each
@@ -176,7 +175,7 @@ public class BookmarkTreeNode implements Serializable {
         return true;
     }
 
-    private boolean addToGraphIfParented(BookmarkableModel candidateBookmarkableModel) {
+    private boolean addToGraphIfParented(final BookmarkableModel candidateBookmarkableModel) {
 
         val whetherAdded = _Refs.booleanRef(false);
 
@@ -189,7 +188,7 @@ public class BookmarkTreeNode implements Serializable {
             .streamAssociations(MixedIn.EXCLUDED)
             .filter(ObjectAssociation.Predicates.REFERENCE_PROPERTIES) // properties only
             .map(objectAssoc->{
-                val parentAdapter =
+                final var parentAdapter =
                         objectAssoc.get(candidateAdapter, InteractionInitiatedBy.USER);
                 return parentAdapter;
             })
@@ -213,7 +212,7 @@ public class BookmarkTreeNode implements Serializable {
         return whetherAdded.isTrue();
     }
 
-    public void appendGraphTo(List<BookmarkTreeNode> list) {
+    public void appendGraphTo(final List<BookmarkTreeNode> list) {
         list.add(this);
         for (BookmarkTreeNode childNode : children) {
             childNode.appendGraphTo(list);
@@ -242,7 +241,7 @@ public class BookmarkTreeNode implements Serializable {
         }
     }
 
-    public static String oidStrFrom(BookmarkableModel candidateBookmarkableModel) {
+    public static String oidStrFrom(final BookmarkableModel candidateBookmarkableModel) {
         final Bookmark bookmark = bookmarkFrom(candidateBookmarkableModel.getPageParametersWithoutUiHints());
         return bookmark != null
                 ? bookmark.stringify()
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index a76ef96..26928ac 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -23,11 +23,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.stream.Collectors;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.wicket.Session;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.string.Strings;
+import org.springframework.lang.Nullable;
 import org.wicketstuff.select2.ChoiceProvider;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
@@ -57,7 +56,7 @@ extends ChoiceProvider<ObjectMemento> {
     private transient IsisAppCommonContext commonContext;
     private transient WicketViewerSettings wicketViewerSettings;
 
-    public ObjectAdapterMementoProviderAbstract(ScalarModel scalarModel) {
+    public ObjectAdapterMementoProviderAbstract(final ScalarModel scalarModel) {
         this.scalarModel = scalarModel;
     }
 
@@ -128,8 +127,8 @@ extends ChoiceProvider<ObjectMemento> {
      * @return A list of all matching choices
      */
     protected final Can<ObjectMemento> obtainMementos(
-            String term,
-            Can<ObjectMemento> choicesMementos) {
+            final String term,
+            final Can<ObjectMemento> choicesMementos) {
 
         if (Strings.isEmpty(term)) {
             return choicesMementos;
@@ -137,9 +136,9 @@ extends ChoiceProvider<ObjectMemento> {
 
         val commonContext = getCommonContext();
 
-        return choicesMementos.filter((ObjectMemento candidate)->{
-            val objectAdapter = commonContext.reconstructObject(candidate);
-            val title = objectAdapter.titleString();
+        return choicesMementos.filter((final ObjectMemento candidate)->{
+            final var objectAdapter = commonContext.reconstructObject(candidate);
+            final var title = objectAdapter.titleString();
             return title.toLowerCase().contains(term.toLowerCase());
         });
 
@@ -158,7 +157,7 @@ extends ChoiceProvider<ObjectMemento> {
         return true;
     }
 
-    // -- DEPS
+    // -- DEPENDENCIES
 
     protected IsisAppCommonContext getCommonContext() {
         if(commonContext==null) {
@@ -176,7 +175,7 @@ extends ChoiceProvider<ObjectMemento> {
 
     // -- HELPER
 
-    private @Nullable ObjectMemento idToMemento(String id) {
+    private @Nullable ObjectMemento idToMemento(final String id) {
         if(NULL_PLACEHOLDER.equals(id)) {
             return null;
         }