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 {
+
+    }
+
 }