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