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/08 08:20:55 UTC

[isis] branch master updated: ISIS-2724: add MM guard against wrong use of @DomainObject on mixins

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 954292c  ISIS-2724: add MM guard against wrong use of @DomainObject on mixins
954292c is described below

commit 954292c7ee9d84d28133e194e1ae07c00de5f6a7
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jun 8 10:20:41 2021 +0200

    ISIS-2724: add MM guard against wrong use of @DomainObject on mixins
    
    also adds some performance tweaks for @DomainObject processing
---
 .../org/apache/isis/applib/annotation/Nature.java  |   4 +
 .../DomainObjectAnnotationFacetFactory.java        | 184 +++++++++++++++------
 .../annotation/ValueAnnotationFacetFactory.java    |  10 --
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |   5 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  18 +-
 .../ObjectTypeAnnotationFacetFactoryTest.java      |   5 +-
 6 files changed, 158 insertions(+), 68 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
index a253c13..d3ace3d 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/Nature.java
@@ -84,4 +84,8 @@ public enum Nature {
     public boolean isEntity() {
         return this == Nature.ENTITY;
     }
+
+    public boolean isMixin() {
+        return this == Nature.MIXIN;
+    }
 }
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 50251df..3fe2740 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
@@ -27,8 +27,12 @@ import java.util.stream.Collectors;
 import javax.annotation.PostConstruct;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Nature;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.events.domain.CollectionDomainEvent;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
@@ -41,11 +45,13 @@ import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
@@ -82,7 +88,9 @@ import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
 import lombok.NonNull;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
+@Log4j2
 public class DomainObjectAnnotationFacetFactory
 extends FacetFactoryAbstract
 implements
@@ -106,25 +114,81 @@ implements
 
     @Override
     public void process(final ProcessObjectTypeContext processClassContext) {
-        processObjectType(processClassContext);
+
+        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
+        processLogicalTypeName(domainObjectIfAny, processClassContext);
+
+        // conflicting type semantics validation ...
+        validateConflictingTypeSemantics(domainObjectIfAny, processClassContext);
     }
 
+    /*
+     * on the fly validation ...
+     * yet only considers annotations and falls short on other means
+     * (eg. ValueTypeRegistry, configuration, ...)
+     * TODO instead properly validate by implementing a validator that looks into the facets that are created
+     */
+    private void validateConflictingTypeSemantics(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessObjectTypeContext processClassContext) {
+
+        if(!domainObjectIfAny.isPresent()) {
+            return;
+        }
+
+        val domainObject = domainObjectIfAny.get();
+
+        val facetHolder = (IdentifiedHolder)processClassContext.getFacetHolder();
+        val cls = processClassContext.getCls();
+
+        if(processClassContext.synthesizeOnType(Value.class).isPresent()) {
+            ValidationFailure.raiseFormatted(facetHolder,
+                    "Cannot use @DomainObject and @Value on the same type: %s", cls.getName());
+        }
+
+        if(!domainObject.nature().isMixin()) {
+            if(processClassContext.synthesizeOnType(Action.class).isPresent()) {
+                ValidationFailure.raiseFormatted(facetHolder,
+                        "Cannot use @DomainObject and @Action on the same type, "
+                        + "unless nature is MIXIN: %s", cls.getName());
+            }
+            if(processClassContext.synthesizeOnType(Property.class).isPresent()) {
+                ValidationFailure.raiseFormatted(facetHolder,
+                        "Cannot use @DomainObject and @Property on the same type, "
+                        + "unless nature is MIXIN: %s", cls.getName());
+            }
+            if(processClassContext.synthesizeOnType(Collection.class).isPresent()) {
+                ValidationFailure.raiseFormatted(facetHolder,
+                        "Cannot use @DomainObject and @Collection on the same type, "
+                        + "unless nature is MIXIN: %s", cls.getName());
+            }
+        }
+
+        if(domainObject.nature().isMixin()
+                && _Strings.isNotEmpty(domainObject.logicalTypeName())) {
+            // just a console warning, not decided yet whether we should be strict and fail MM validation
+            log.warn("Mixins don't need a logicalTypeName, as was declared with {}.", cls.getName());
+        }
+    }
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
 
-        processEntityChangePublishing(processClassContext);
-        processAutoComplete(processClassContext);
-        processBounded(processClassContext);
-        processEditing(processClassContext);
-        processNature(processClassContext);
-        processLifecycleEvents(processClassContext);
-        processDomainEvents(processClassContext);
+        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
 
+        processEntityChangePublishing(domainObjectIfAny, processClassContext);
+        processAutoComplete(domainObjectIfAny, processClassContext);
+        processBounded(domainObjectIfAny, processClassContext);
+        processEditing(domainObjectIfAny, processClassContext);
+        processNature(domainObjectIfAny, processClassContext);
+        processLifecycleEvents(domainObjectIfAny, processClassContext);
+        processDomainEvents(domainObjectIfAny, processClassContext);
     }
 
 
-    void processEntityChangePublishing(final ProcessClassContext processClassContext) {
+    void processEntityChangePublishing(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
 
@@ -139,7 +203,7 @@ implements
         }
 
         // check for @DomainObject(entityChangePublishing=....)
-        val entityChangePublishing = processClassContext.synthesizeOnType(DomainObject.class)
+        val entityChangePublishing = domainObjectIfAny
                 .map(DomainObject::entityChangePublishing);
         val entityChangePublishingFacet = EntityChangePublishingFacetForDomainObjectAnnotation
                 .create(entityChangePublishing, getConfiguration(), facetHolder);
@@ -150,7 +214,9 @@ implements
 
     // -- AUTO COMPLETE
 
-    void processAutoComplete(final ProcessClassContext processClassContext) {
+    void processAutoComplete(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
 
@@ -215,50 +281,50 @@ implements
 
     // -- BOUNDED
 
-    void processBounded(final ProcessClassContext processClassContext) {
+    // check from @DomainObject(bounded=...)
+    void processBounded(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         val facetHolder = processClassContext.getFacetHolder();
-
-        // check from @DomainObject(bounded=...)
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
-        val facet = ChoicesFacetForDomainObjectAnnotation.create(domainObjectIfAny, facetHolder);
-
-        // then add
-        super.addFacet(facet);
+        FacetUtil.addFacet(
+                ChoicesFacetForDomainObjectAnnotation
+                .create(domainObjectIfAny, facetHolder));
     }
 
-    void processEditing(final ProcessClassContext processClassContext) {
+    // check from @DomainObject(editing=...)
+    void processEditing(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         val facetHolder = processClassContext.getFacetHolder();
 
-        // check from @DomainObject(editing=...)
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
-
-        super.addFacet(
+        FacetUtil.addFacet(
                 EditingEnabledFacetForDomainObjectAnnotation
                 .create(domainObjectIfAny, facetHolder));
 
-        super.addFacet(
+        FacetUtil.addFacet(
                 ImmutableFacetForDomainObjectAnnotation
                 .create(domainObjectIfAny, getConfiguration(), facetHolder));
     }
 
-    void processObjectType(final ProcessObjectTypeContext processClassContext) {
+    // check from @DomainObject(logicalTypeName=...)
+    void processLogicalTypeName(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessObjectTypeContext processClassContext) {
 
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
 
-        // check from @DomainObject(logicalTypeName=...)
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
-        val facet = LogicalTypeFacetForDomainObjectAnnotation.create(domainObjectIfAny, cls, facetHolder);
-
-        // then add
-        super.addFacet(facet);
+        FacetUtil.addFacet(
+                LogicalTypeFacetForDomainObjectAnnotation
+                .create(domainObjectIfAny, cls, facetHolder));
     }
 
 
-    void processNature(final ProcessClassContext processClassContext) {
+    void processNature(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
 
         if(!domainObjectIfAny.isPresent()) {
             return;
@@ -300,9 +366,10 @@ implements
     }
 
 
-    private void processLifecycleEvents(final ProcessClassContext processClassContext) {
+    private void processLifecycleEvents(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
 
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
         if(!domainObjectIfAny.isPresent()) {
             return;
         }
@@ -318,8 +385,9 @@ implements
     }
 
 
-    private void processDomainEvents(final ProcessClassContext processClassContext) {
-        val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
+    private void processDomainEvents(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessClassContext processClassContext) {
         if(!domainObjectIfAny.isPresent()) {
             return;
         }
@@ -330,7 +398,9 @@ implements
         processDomainEventCollection(domainObjectIfAny, facetHolder);
     }
 
-    private void processLifecycleEventCreated(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventCreated(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::createdLifecycleEvent)
@@ -346,7 +416,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventLoaded(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventLoaded(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::loadedLifecycleEvent)
@@ -362,7 +434,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventPersisting(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventPersisting(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::persistingLifecycleEvent)
@@ -378,7 +452,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventPersisted(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventPersisted(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::persistedLifecycleEvent)
@@ -394,7 +470,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventRemoving(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventRemoving(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::removingLifecycleEvent)
@@ -410,7 +488,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventUpdated(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventUpdated(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::updatedLifecycleEvent)
@@ -426,7 +506,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processLifecycleEventUpdating(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processLifecycleEventUpdating(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::updatingLifecycleEvent)
@@ -442,7 +524,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processDomainEventAction(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processDomainEventAction(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::actionDomainEvent)
@@ -453,7 +537,9 @@ implements
 
     }
 
-    private void processDomainEventProperty(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processDomainEventProperty(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::propertyDomainEvent)
@@ -463,7 +549,9 @@ implements
         .ifPresent(super::addFacet);
     }
 
-    private void processDomainEventCollection(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
+    private void processDomainEventCollection(
+            final Optional<DomainObject> domainObjectIfAny,
+            final FacetHolder holder) {
 
         domainObjectIfAny
         .map(DomainObject::collectionDomainEvent)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java
index 5050380..7b3ddb4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java
@@ -18,13 +18,10 @@
  */
 package org.apache.isis.core.metamodel.facets.value.annotation;
 
-import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 
 import lombok.val;
 
@@ -46,13 +43,6 @@ implements
         val valueIfAny = processClassContext.synthesizeOnType(org.apache.isis.applib.annotation.Value.class);
         FacetUtil.addFacet(LogicalTypeFacetForValueAnnotation.create(valueIfAny, cls, facetHolder));
 
-        // conflicting type semantics validation
-        if(valueIfAny.isPresent()
-                && processClassContext.synthesizeOnType(DomainObject.class).isPresent()) {
-            ValidationFailure.raiseFormatted((IdentifiedHolder)facetHolder,
-                    "Cannot use @DomainObject and @Value on the same type: %s", cls.getName());
-        }
-
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
index d69019d..8cf242d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ChoicesFacetFromBoundedAnnotationFactoryTest.java
@@ -28,6 +28,8 @@ import org.apache.isis.core.metamodel.facets.object.choices.ChoicesFacetFromBoun
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
 
+import lombok.val;
+
 public class ChoicesFacetFromBoundedAnnotationFactoryTest extends AbstractFacetFactoryTest {
 
     private DomainObjectAnnotationFacetFactory facetFactory;
@@ -50,7 +52,8 @@ public class ChoicesFacetFromBoundedAnnotationFactoryTest extends AbstractFacetF
         class Customer {
         }
 
-        facetFactory.processBounded(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
+        val context = new ProcessClassContext(Customer.class, methodRemover, facetedMethod);
+        facetFactory.processBounded(context.synthesizeOnType(DomainObject.class), context);
 
         final Facet facet = facetedMethod.getFacet(ChoicesFacet.class);
         assertNotNull(facet);
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index 043aad1..9612a17 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -27,6 +27,11 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
@@ -55,11 +60,6 @@ import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertFalse;
-
 import lombok.val;
 
 public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
@@ -128,7 +128,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
             allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
 
-            facetFactory.processEntityChangePublishing(new ProcessClassContext(HasInteractionId.class, mockMethodRemover, facetHolder));
+            val context = new ProcessClassContext(HasInteractionId.class, mockMethodRemover, facetHolder);
+            facetFactory.processEntityChangePublishing(context.synthesizeOnType(DomainObject.class), context);
 
             final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class);
             Assert.assertNull(facet);
@@ -142,7 +143,8 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
             public void configured_value_set_to_all() {
                 allowingEntityChangePublishingToReturn(PublishingPolicies.EntityChangePublishingPolicy.ALL);
 
-                facetFactory.processEntityChangePublishing(new ProcessClassContext(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
+                val context = new ProcessClassContext(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder);
+                facetFactory.processEntityChangePublishing(context.synthesizeOnType(DomainObject.class), context);
 
                 final Facet facet = facetHolder.getFacet(EntityChangePublishingFacet.class);
                 assertThat(facet, is(notNullValue()));
@@ -531,7 +533,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
 
     }
 
-    public static class ObjectType extends DomainObjectAnnotationFacetFactoryTest {
+    public static class LogicalTypeName extends DomainObjectAnnotationFacetFactoryTest {
 
         @DomainObject(logicalTypeName = "CUS")
         class CustomerWithDomainObjectAndObjectTypeSet {
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java
index 181ee93..f927c55 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java
@@ -34,6 +34,8 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.objectspecid.Lo
 import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
 import org.apache.isis.core.metamodel.methods.MethodByClassMap;
 
+import lombok.val;
+
 public class ObjectTypeAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
 
     private DomainObjectAnnotationFacetFactory facetFactory;
@@ -52,7 +54,8 @@ public class ObjectTypeAnnotationFacetFactoryTest extends AbstractFacetFactoryJU
 
         expectNoMethodsRemoved();
 
-        facetFactory.processObjectType(new ProcessObjectTypeContext(Customer.class, facetHolder));
+        val context = new ProcessObjectTypeContext(Customer.class, facetHolder);
+        facetFactory.processLogicalTypeName(context.synthesizeOnType(DomainObject.class), context);
 
         final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class);