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/05/19 09:10:58 UTC

[isis] branch master updated: ISIS-3054: minor generics refactoring

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 c549d6a745 ISIS-3054: minor generics refactoring
c549d6a745 is described below

commit c549d6a745e49d0f2a476d80c1ee23ee6ced8ffc
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 19 11:10:51 2022 +0200

    ISIS-3054: minor generics refactoring
---
 .../value/semantics/ValueSemanticsProvider.java    |  7 ++++
 .../valuesemantics/EnumValueSemanticsAbstract.java |  6 ++--
 .../valuetypes/ValueSemanticsResolverDefault.java  | 40 +++++++++++++---------
 3 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
index 12af572aa1..a7abf61686 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsProvider.java
@@ -24,6 +24,7 @@ import org.springframework.lang.Nullable;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.common.v2.TypedTupleDto;
@@ -112,6 +113,12 @@ public interface ValueSemanticsProvider<T> {
      */
     DefaultsProvider<T> getDefaultsProvider();
 
+    // -- UTILITY
+
+    default <X> ValueSemanticsProvider<X> castTo(final Class<X> cls) {
+        return _Casts.uncheckedCast(this);
+    }
+
     // -- CATEGORIZATION
 
     default boolean isEnumType() {
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 3146a96eaa..3cb01b8be8 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
@@ -65,11 +65,11 @@ implements
         return ValueType.ENUM;
     }
 
-    public static EnumValueSemanticsAbstract create(
+    public static <T extends Enum<T>> EnumValueSemanticsAbstract<T> create(
             final TranslationService translationService,
             final IntrospectionPolicy introspectionPolicy,
-            final Class<?> correspondingClass) {
-        return new EnumValueSemanticsAbstract(
+            final Class<T> correspondingClass) {
+        return new EnumValueSemanticsAbstract<>(
                 translationService,
                 introspectionPolicy,
                 correspondingClass){};
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
index 388fbf9e5e..8113f7763b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuetypes/ValueSemanticsResolverDefault.java
@@ -29,8 +29,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.ClassUtils;
 
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
 import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
@@ -60,22 +60,10 @@ implements ValueSemanticsResolver {
     }
 
     @Override
-    public <T> Stream<ValueSemanticsProvider<T>> streamValueSemantics(final Class<T> _valueType) {
-        final var valueType = ClassUtils.resolvePrimitiveIfNecessary(_valueType);
-//        val resolvableType = ResolvableType
-//                .forClassWithGenerics(ValueSemanticsProvider.class, valueType);
+    public <T> Stream<ValueSemanticsProvider<T>> streamValueSemantics(final Class<T> valueType) {
         return Stream.<ValueSemanticsProvider<T>>concat(
-
-                _NullSafe.stream(valueSemanticsProviders)
-                //.filter(resolvableType::isInstance) //does not work for eg. TreeNode<?> ... Spring believes there is a wildcard mismatch
-                .filter(vs->vs.getCorrespondingClass().isAssignableFrom(valueType))
-                .map(provider->_Casts.<ValueSemanticsProvider<T>>uncheckedCast(provider)),
-
-                // if we have an Enum, append default Enum semantics to the stream,
-                // as these are not yet managed by Spring
-                valueType.isEnum()
-                    ? Stream.of(getDefaultEnumSemantics(_valueType))
-                    : Stream.empty());
+                streamExplicitValueSemantics(valueType),
+                streamEnumValueSemantics(valueType));
     }
 
     @Override
@@ -95,12 +83,28 @@ implements ValueSemanticsResolver {
 
     // -- HELPER
 
+    private <T> Stream<ValueSemanticsProvider<T>> streamExplicitValueSemantics(final Class<T> valueType) {
+        final var nonPrimitiveValueType = ClassUtils.resolvePrimitiveIfNecessary(valueType);
+        return _NullSafe.stream(valueSemanticsProviders)
+        //.filter(resolvableType::isInstance) //does not work for eg. TreeNode<?> ... Spring believes there is a wildcard mismatch
+        .filter(vs->vs.getCorrespondingClass().isAssignableFrom(nonPrimitiveValueType))
+        .map(provider->provider.castTo(valueType));
+    }
+
+    private <T> Stream<ValueSemanticsProvider<T>> streamEnumValueSemantics(final Class<T> valueType) {
+        // if we have an Enum, append default Enum semantics to the stream,
+        // as these are not yet managed by Spring
+        return valueType.isEnum()
+            ? Stream.of(defaultEnumSemantics(_Casts.uncheckedCast(valueType)).castTo(valueType))
+            : Stream.empty();
+    }
+
     // managed by Isis
     @SuppressWarnings("rawtypes")
     private Map<Class<?>, ValueSemanticsProvider> enumSemantics = _Maps.newConcurrentHashMap();
 
     @SuppressWarnings("unchecked")
-    public <T> ValueSemanticsProvider<T> getDefaultEnumSemantics(final Class<T> enumType) {
+    private <T extends Enum<T>> ValueSemanticsProvider<T> defaultEnumSemantics(final Class<T> enumType) {
         return enumSemantics.computeIfAbsent(enumType, t->
                 EnumValueSemanticsAbstract
                   .create(
@@ -110,4 +114,6 @@ implements ValueSemanticsResolver {
                   enumType));
     }
 
+
+
 }
\ No newline at end of file