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/06/07 15:36:27 UTC
[isis] branch master updated: ISIS-2725: let @Value types be
discovered by Spring,
so we can collect them for MM introspection without further configuration
required
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 1273b85 ISIS-2725: let @Value types be discovered by Spring, so we can collect them for MM introspection without further configuration required
1273b85 is described below
commit 1273b85fab829c175b0f7a842c74319cfdeb7982
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Jun 7 17:35:40 2021 +0200
ISIS-2725: let @Value types be discovered by Spring, so we can collect
them for MM introspection without further configuration required
also add logical type name clash test involving a value type
---
.../org/apache/isis/applib/annotation/Value.java | 4 +++
.../DomainObjectAnnotationFacetFactory.java | 8 ++---
.../DomainModelTest_usingBadDomain.java | 36 +++++++++++++++-------
.../model/bad/InvalidLogicalTypeNameClash.java | 18 ++++++++++-
4 files changed, 50 insertions(+), 16 deletions(-)
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java
index 944d7ae..1956bf4 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Value.java
@@ -25,6 +25,9 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
import org.apache.isis.applib.adapters.EncoderDecoder;
import org.apache.isis.applib.adapters.ValueSemanticsProvider;
@@ -58,6 +61,7 @@ import org.apache.isis.applib.adapters.ValueSemanticsProvider;
@Inherited
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
+@Component @Scope("prototype")
public @interface Value {
/**
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 6dfd371..50251df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -50,7 +50,6 @@ import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
import org.apache.isis.core.metamodel.facets.PostConstructMethodCache;
-import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedLifecycleEventFacetForDomainObjectAnnotation;
import org.apache.isis.core.metamodel.facets.object.callbacks.LoadedLifecycleEventFacetForDomainObjectAnnotation;
import org.apache.isis.core.metamodel.facets.object.callbacks.PersistedLifecycleEventFacetForDomainObjectAnnotation;
@@ -514,8 +513,8 @@ implements
collidingSpecs.forEach(spec->{
ValidationFailure.raiseFormatted(
spec,
- "Logical-type-name (aka. object-type) '%s' mapped to multiple classes,"
- + " that do not all share the same type hierarchy:\n %s",
+ "Logical type name '%s' mapped to multiple non-abstract classes:\n"
+ + "%s",
logicalTypeName,
csv);
});
@@ -534,7 +533,8 @@ implements
private String asCsv(final List<ObjectSpecification> specList) {
return stream(specList)
.map(ObjectSpecification::getFullIdentifier)
- .collect(Collectors.joining(","));
+ .sorted()
+ .collect(Collectors.joining(", "));
}
};
diff --git a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
index 29c88ee..5dc2b9b 100644
--- a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
+++ b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingBadDomain.java
@@ -19,6 +19,7 @@
package org.apache.isis.testdomain.domainmodel;
import java.lang.annotation.Annotation;
+import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.inject.Inject;
@@ -32,6 +33,9 @@ import org.junit.jupiter.params.provider.MethodSource;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
@@ -41,6 +45,7 @@ import org.apache.isis.applib.annotation.Property;
import org.apache.isis.applib.annotation.PropertyLayout;
import org.apache.isis.applib.exceptions.unrecoverable.DomainModelException;
import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.commons.collections.Can;
import org.apache.isis.core.config.IsisConfiguration;
import org.apache.isis.core.config.environment.IsisSystemEnvironment;
import org.apache.isis.core.config.metamodel.specloader.IntrospectionMode;
@@ -58,8 +63,7 @@ import org.apache.isis.testdomain.model.bad.InvalidOrphanedPropertySupport;
import org.apache.isis.testdomain.model.bad.InvalidPropertyAnnotationOnAction;
import org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValidator;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import lombok.val;
@SpringBootTest(
classes = {
@@ -157,15 +161,25 @@ class DomainModelTest_usingBadDomain {
@Test
void logicalTypeNameClash_shouldFail() {
- assertTrue(
- validator.anyMatchesContaining(
- Identifier.classIdentifier(LogicalType.fqcn(InvalidLogicalTypeNameClash.VariantA.class)),
- "Logical-type-name (aka. object-type) 'isis.testdomain.InvalidLogicalTypeNameClash' "
- + "mapped to multiple classes")
- || validator.anyMatchesContaining(
- Identifier.classIdentifier(LogicalType.fqcn(InvalidLogicalTypeNameClash.VariantB.class)),
- "Logical-type-name (aka. object-type) 'isis.testdomain.InvalidLogicalTypeNameClash' "
- + "mapped to multiple classes"));
+ assertLogicalTypeNameClashesAmong(Can.of(
+ InvalidLogicalTypeNameClash.VariantA.class,
+ InvalidLogicalTypeNameClash.VariantB.class,
+ InvalidLogicalTypeNameClash.VariantC.class));
+ }
+
+ void assertLogicalTypeNameClashesAmong(Can<Class<?>> types) {
+
+ val typeLiteralList = types.stream()
+ .map(t->t.getName())
+ .collect(Collectors.joining(", "));
+
+ assertTrue(types.stream()
+ .anyMatch(t->
+ validator.anyMatchesContaining(
+ Identifier.classIdentifier(LogicalType.fqcn(t)),
+ "Logical type name 'isis.testdomain.InvalidLogicalTypeNameClash' "
+ + "mapped to multiple non-abstract classes:\n"
+ + typeLiteralList)));
}
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java
index eaf24e4..20c2e6f 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/bad/InvalidLogicalTypeNameClash.java
@@ -21,6 +21,7 @@ package org.apache.isis.testdomain.model.bad;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.DomainObject;
import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Value;
public class InvalidLogicalTypeNameClash {
@@ -39,7 +40,7 @@ public class InvalidLogicalTypeNameClash {
// logical type name clash: should fail validation
@DomainObject(nature = Nature.VIEW_MODEL,
logicalTypeName = "isis.testdomain.InvalidLogicalTypeNameClash")
- public static class VariantB {
+ public static class VariantB {
@Action
public boolean anAction() {
@@ -48,4 +49,19 @@ public class InvalidLogicalTypeNameClash {
}
+ // logical type name clash: should fail validation
+ @Value(
+ logicalTypeName = "isis.testdomain.InvalidLogicalTypeNameClash")
+ public static class VariantC {
+
+ }
+
+
+ // mix of semantics not allowed: should fail validation
+ @Value
+ @DomainObject
+ public static class VariantD {
+
+ }
+
}