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 1e652fb ISIS-2679: revert fail fast guard from prev. commit, instead
let MM validation handle it
1e652fb is described below
commit 1e652fb3c6b90dcecd2100855e440e21df5c4b56
Author: [email protected] <[email protected]@luna>
AuthorDate: Sat May 15 00:17:02 2021 +0200
ISIS-2679: revert fail fast guard from prev. commit, instead let MM
validation handle it
---
.../DomainObjectAnnotationFacetFactory.java | 3 +-
.../specloader/LogicalTypeResolverDefault.java | 6 +-
.../DomainModelTest_usingBadDomain.java | 86 +++++++++++-----------
3 files changed, 48 insertions(+), 47 deletions(-)
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 446098f..abcfa7f 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
@@ -495,7 +495,8 @@ implements
@Override
public void validate(ObjectSpecification objSpec) {
if(objSpec.isManagedBean()
- || objSpec.isAbstract()) {
+ // || objSpec.isAbstract() // we allow
abstract types now to have their own logical name
+ ) {
return;
}
collidingSpecsByLogicalTypeName.putElement(objSpec.getLogicalTypeName() ,
objSpec);
diff --git
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java
index 025bf55..6f10747 100644
---
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java
+++
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/LogicalTypeResolverDefault.java
@@ -24,13 +24,14 @@ import java.util.Optional;
import org.apache.isis.applib.id.LogicalType;
import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
import
org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import lombok.NonNull;
import lombok.val;
+import lombok.extern.log4j.Log4j2;
+@Log4j2
class LogicalTypeResolverDefault implements LogicalTypeResolver {
private final Map<String, LogicalType> logicalTypeByName =
_Maps.newConcurrentHashMap();
@@ -53,7 +54,6 @@ class LogicalTypeResolverDefault implements
LogicalTypeResolver {
val previousMapping = logicalTypeByName.put(key,
spec.getLogicalType());
- // fail fast
if(previousMapping!=null) {
val msg = String.format("failed to register mapping\n"
@@ -65,7 +65,7 @@ class LogicalTypeResolverDefault implements
LogicalTypeResolver {
key,
previousMapping.getCorrespondingClass());
- throw _Exceptions.unrecoverable(msg);
+ log.warn(msg);
}
}
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 59bb838..3a91f57 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
@@ -32,9 +32,6 @@ 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;
@@ -61,11 +58,14 @@ 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;
+
@SpringBootTest(
- classes = {
+ classes = {
Configuration_headless.class,
Configuration_usingInvalidDomain.class
- },
+ },
properties = {
"isis.core.meta-model.introspector.mode=FULL"
})
@@ -76,112 +76,112 @@ import
org.apache.isis.testing.integtestsupport.applib.validate.DomainModelValid
IsisPresets.SilenceProgrammingModel
})
class DomainModelTest_usingBadDomain {
-
+
@Inject private IsisConfiguration configuration;
@Inject private IsisSystemEnvironment isisSystemEnvironment;
@Inject private SpecificationLoader specificationLoader;
-
+
private DomainModelValidator validator;
-
+
@BeforeEach
void setup() {
validator = new DomainModelValidator(specificationLoader,
configuration, isisSystemEnvironment);
assertThrows(DomainModelException.class, validator::throwIfInvalid);
}
-
-
+
+
@Test
void fullIntrospection_shouldBeEnabledByThisTestClass() {
assertTrue(IntrospectionMode.isFullIntrospect(configuration,
isisSystemEnvironment));
}
-
+
@Test
void ambiguousTitle_shouldFail() {
assertTrue(validator.anyMatchesContaining(
Identifier.classIdentifier(LogicalType.fqcn(AmbiguousTitle.class)),
"conflict for determining a strategy for retrieval of title"));
}
-
+
@Test
void orphanedActionSupport_shouldFail() {
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedActionSupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedActionSupport.class)),
"InvalidOrphanedActionSupport#hideOrphaned: has annotation
@MemberSupport, "
+ "is assumed to support"));
-
+
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedActionSupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedActionSupport.class)),
"InvalidOrphanedActionSupport#hideMe: "
+ "is assumed to support a property, collection or action. "
+ "Unmet constraint(s): unsupported method signature or
orphaned "
+ "(not associated with a member)"));
}
-
+
@Test
void orphanedPropertySupport_shouldFail() {
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedPropertySupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedPropertySupport.class)),
"InvalidOrphanedPropertySupport#hideMyProperty: has annotation
@MemberSupport, "
+ "is assumed to support"));
-
+
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedPropertySupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedPropertySupport.class)),
"InvalidOrphanedPropertySupport#hideMe: "
+ "is assumed to support a property, collection or action. "
+ "Unmet constraint(s): unsupported method signature or
orphaned "
+ "(not associated with a member)"));
}
-
+
@Test
void orphanedCollectionSupport_shouldFail() {
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedCollectionSupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedCollectionSupport.class)),
"InvalidOrphanedCollectionSupport#hideMyCollection: has
annotation @MemberSupport, "
+ "is assumed to support"));
-
+
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedCollectionSupport.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidOrphanedCollectionSupport.class)),
"InvalidOrphanedCollectionSupport#hideMe: "
+ "is assumed to support a property, collection or action. "
+ "Unmet constraint(s): unsupported method signature or
orphaned "
+ "(not associated with a member)"));
}
-
+
@Test
void actionOverloading_shouldFail() {
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidActionOverloading.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidActionOverloading.class)),
"Action method overloading is not allowed"));
}
-
- @Test
+
+ @Test// @Disabled("there is a fail fast guard now in
LogicalTypeResolverDefault.register(...) that breaks this test")
void logicalTypeNameClash_shouldFail() {
assertTrue(
validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidLogicalTypeNameClash.VariantA.class)),
+
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)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidLogicalTypeNameClash.VariantB.class)),
"Logical-type-name (aka. object-type)
'isis.testdomain.InvalidLogicalTypeNameClash' "
+ "mapped to multiple classes:"));
}
-
-
+
+
@ParameterizedTest
@MethodSource("provideAmbiguousMixins")
void ambiguousMixinAnnotions_shouldFailValidation(
- final Class<?> mixinClass,
- final Class<? extends Annotation> annotationType,
+ final Class<?> mixinClass,
+ final Class<? extends Annotation> annotationType,
final String mixinMethodName) {
-
+
final String annotationLiteral = "@" + annotationType.getSimpleName();
assertTrue(validator.anyMatchesContaining(
-
Identifier.propertyOrCollectionIdentifier(LogicalType.fqcn(mixinClass),
mixinMethodName),
+
Identifier.propertyOrCollectionIdentifier(LogicalType.fqcn(mixinClass),
mixinMethodName),
String.format("Annotation %s on both method and type level is
not allowed", annotationLiteral)));
}
-
+
private static Stream<Arguments> provideAmbiguousMixins() {
return Stream.of(
Arguments.of(AmbiguousMixinAnnotations.InvalidMixinA.class,
Action.class, "act"),
@@ -192,24 +192,24 @@ class DomainModelTest_usingBadDomain {
Arguments.of(AmbiguousMixinAnnotations.InvalidMixinCL.class,
CollectionLayout.class, "coll")
);
}
-
+
// -- INCUBATING
-
+
@Test @Disabled("this case has no vaildation refiner yet")
void invalidPropertyAnnotationOnAction_shouldFail() {
assertTrue(validator.anyMatchesContaining(
-
Identifier.classIdentifier(LogicalType.fqcn(InvalidPropertyAnnotationOnAction.class)),
+
Identifier.classIdentifier(LogicalType.fqcn(InvalidPropertyAnnotationOnAction.class)),
"TODO"));
}
-
+
// @Test
// void orphanedActionSupportNotEnforced_shouldFail() {
-//
+//
// val validateDomainModel = new DomainModelValidator();
-//
+//
// assertThrows(DomainModelException.class, validateDomainModel::run);
// assertTrue(validateDomainModel.anyMatchesContaining(
-// OrphanedPrefixedAction.class,
+// OrphanedPrefixedAction.class,
// "is assumed to support"));
// }
}