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/24 12:24:27 UTC

[isis] branch master updated: ISIS-3063: purge logical naming facets

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 c675a0676d ISIS-3063: purge logical naming facets
c675a0676d is described below

commit c675a0676d00d6031a099780ade26eca8e3e22b9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue May 24 14:24:20 2022 +0200

    ISIS-3063: purge logical naming facets
---
 .../org/apache/isis/applib/annotation/Aliased.java |  54 ----------
 .../isis/applib/annotation/DomainObject.java       |   7 +-
 .../isis/applib/annotation/DomainService.java      |   7 ++
 .../org/apache/isis/applib/id/LogicalType.java     |  27 ++++-
 .../beans/IsisBeanTypeClassifierDefault.java       |  63 ++---------
 .../progmodel/ProgrammingModelConstants.java       |   4 +-
 ... => AliasedFacetForDomainObjectAnnotation.java} |  31 +++---
 .../DomainObjectAnnotationFacetFactory.java        |  25 +++--
 .../LogicalTypeFacetForAnnotationFacetFactory.java |  67 ------------
 ...gicalTypeFacetForLogicalTypeNameAnnotation.java |  53 ---------
 .../LogicalTypeFacetForNamedAnnotation.java        |  52 ---------
 .../{LogicalTypeFacet.java => AliasedFacet.java}   |   9 +-
 ...acetAbstract.java => AliasedFacetAbstract.java} |  28 ++---
 .../logicaltype/LogicalTypeMalformedValidator.java |   8 +-
 .../classname/LogicalTypeFacetFromClassName.java   |  37 -------
 .../LogicalTypeFacetFromClassNameFactory.java      |  49 ++-------
 .../LogicalTypeFacetFromIoCNamingStrategy.java     |  36 -------
 .../LogicalTypeFacetOnStandaloneList.java          |  30 ------
 ...ionOrAnyMatchingValueSemanticsFacetFactory.java |  10 +-
 .../LogicalTypeFacetForValueAnnotation.java        |  52 ---------
 .../annotation/ValueAnnotationFacetFactory.java    |  54 ----------
 .../dflt/ProgrammingModelFacetsJava11.java         |   3 -
 .../specloader/LogicalTypeResolverDefault.java     |   9 +-
 .../specloader/specimpl/IntrospectionState.java    |   2 +-
 .../DomainObjectAnnotationFacetFactoryTest.java    |  26 ++---
 .../NamedAnnotationFacetFactoryTest.java           |  32 ++++--
 .../ObjectTypeAnnotationFacetFactoryTest.java      |  69 ------------
 .../LogicalTypeFacetFromClassNameFactoryTest.java  | 113 --------------------
 .../logicaltype/LogicalTypeInferenceTest.java      |  66 ++++++++++++
 .../facets/param/name/ParameterNameFacetTest.java  |   4 +-
 .../testspec/ObjectSpecificationStub.java          |  13 +--
 .../dom/CustomerAsProxiedByDataNucleus.java        |   4 +-
 .../jdo/metamodel/beans/JdoBeanTypeClassifier.java |  41 +++----
 .../JdoDiscriminatorAnnotationFacetFactory.java    | 111 -------------------
 .../JdoDiscriminatorFacetDefault.java              |  31 ------
 .../facets/object/discriminator/package-info.java  |  17 ---
 ...calTypeFacetFromJdoPersistenceCapableFacet.java |  58 ----------
 .../JdoPersistenceCapableFacetFactory.java         |   9 --
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java | 118 ---------------------
 .../discriminator/JdoDiscriminatorFacet.java       |  25 -----
 .../LogicalTypeFacetForTableAnnotation.java        |  57 ----------
 .../table/JpaTableAnnotationFacetFactory.java      |   8 --
 42 files changed, 230 insertions(+), 1289 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java
deleted file mode 100644
index 8768f26294..0000000000
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/Aliased.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.applib.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.inject.Named;
-
-import org.apache.isis.applib.services.bookmark.Bookmark;
-
-/**
- * Introduced to allow for historic bookmarks to be resolved to
- * their corresponding new types.
- * @see Bookmark
- * @see Named
- *
- * @since 2.0 {@index}
- */
-@Inherited
-@Target({
-        ElementType.TYPE,
-        ElementType.ANNOTATION_TYPE
-})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Aliased {
-
-    /**
-     * Alternative logical type name(s) for the annotated type.
-     * @see Bookmark
-     * @see Named
-     */
-    String[] value() default {};
-
-}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
index 7d10da9d6f..b2b5e751e1 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainObject.java
@@ -66,7 +66,12 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 @Component @Scope("prototype")
 public @interface DomainObject {
 
-    // ...
+    /**
+     * Alternative logical type name(s) for the annotated type.
+     * @see Bookmark
+     * @see Named
+     */
+    String[] aliased() default {};
 
     /**
      * The class of the domain service that provides an <code>autoComplete(String)</code> method.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
index 1106ad67b1..343a91fa52 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/DomainService.java
@@ -57,6 +57,13 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 @Service @Singleton
 public @interface DomainService {
 
+    /**
+     * Alternative logical type name(s) for the annotated type.
+     * @see Bookmark
+     * @see Named
+     */
+    String[] aliased() default {};
+
     /**
      * The nature of this service, either in the UI or REST only
      *
diff --git a/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java b/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java
index fe40ab9113..e5a52fe773 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/id/LogicalType.java
@@ -21,10 +21,13 @@ package org.apache.isis.applib.id;
 import java.io.InvalidObjectException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
+import java.util.Locale;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.function.Supplier;
 
 import javax.inject.Named;
+import javax.persistence.Table;
 
 import org.springframework.lang.Nullable;
 
@@ -111,6 +114,7 @@ implements
     /**
      * Infer from annotations.
      */
+    @SuppressWarnings("removal")
     public static LogicalType infer(
             final @NonNull Class<?> correspondingClass) {
 
@@ -154,8 +158,29 @@ implements
                 return eager(correspondingClass, logicalTypeName);
             }
         }
+
+        // fallback to @Table annotations
+        {
+            val logicalTypeName =
+                    _Annotations.synthesize(correspondingClass, Table.class)
+                    .map(table->
+                        _Strings.nullToEmpty(table.schema())
+                            .toLowerCase(Locale.ROOT)
+                        + "."
+                        + _Strings.nullToEmpty(table.name()))
+                    .orElse(null);
+            if(logicalTypeName!=null
+                    && !logicalTypeName.startsWith(".")
+                    && !logicalTypeName.endsWith(".")) {
+                return eager(correspondingClass, logicalTypeName);
+            }
+        }
+
         // fallback to fqcn
-        return eager(correspondingClass, correspondingClass.getName());
+        return eager(correspondingClass,
+                Optional
+                    .ofNullable(correspondingClass.getCanonicalName())
+                    .orElseGet(correspondingClass::getName));
     }
 
     // -- HIDDEN CONSTRUTORS
diff --git a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
index 13afb846e1..00b2c4254b 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/beans/IsisBeanTypeClassifierDefault.java
@@ -21,20 +21,17 @@ package org.apache.isis.core.config.beans;
 import java.io.Serializable;
 import java.lang.reflect.Modifier;
 import java.util.Collection;
-import java.util.Locale;
 
-import javax.inject.Named;
 import javax.persistence.Entity;
-import javax.persistence.Table;
 
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.reflection._Annotations;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.TypeVetoMarker;
 
@@ -105,12 +102,11 @@ implements IsisBeanTypeClassifier {
 
         val aDomainService = _Annotations.synthesize(type, DomainService.class);
         if(aDomainService.isPresent()) {
-            return _Strings.isNotEmpty(aDomainService.get().logicalTypeName())
-                    ? BeanClassification
+            val logicalType = LogicalType.infer(type);
+            // overrides Spring naming strategy
+            return BeanClassification
                         .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING,
-                                aDomainService.get().logicalTypeName())
-                    : BeanClassification
-                        .delegated(BeanSort.MANAGED_BEAN_CONTRIBUTING);
+                                logicalType.getLogicalTypeName());
         }
 
         // allow ServiceLoader plugins to have a say, eg. when classifying entity types
@@ -127,58 +123,19 @@ implements IsisBeanTypeClassifier {
 
         val entityAnnotation = _Annotations.synthesize(type, Entity.class).orElse(null);
         if(entityAnnotation!=null) {
-
-            String logicalTypeName = null;
-
-            // deprecated @DomainObject(logicalTypeName=...)
-            val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null);
-            if(aDomainObject!=null) {
-                logicalTypeName = aDomainObject.logicalTypeName();
-            }
-
-            val named = _Annotations.synthesize(type, Named.class).orElse(null);
-            if(named!=null) {
-                logicalTypeName = named.value();
-            }
-
-            // don't trample over the @Named/@DomainObject(logicalTypeName=..) if present
-            if(_Strings.isEmpty(logicalTypeName)) {
-                val aTable = _Annotations.synthesize(type, Table.class).orElse(null);
-                if(aTable!=null) {
-                    val schema = aTable.schema();
-                    if(_Strings.isNotEmpty(schema)) {
-                        val table = aTable.name();
-                        logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT),
-                                _Strings.isNotEmpty(table)
-                                    ? table
-                                    : type.getSimpleName());
-                    }
-                }
-            }
-
-            if(_Strings.isNotEmpty(logicalTypeName)) {
-                BeanClassification.selfManaged(
-                        BeanSort.ENTITY, logicalTypeName);
-            }
-            return BeanClassification.selfManaged(BeanSort.ENTITY);
+            val logicalType = LogicalType.infer(type);
+            return BeanClassification.selfManaged(
+                        BeanSort.ENTITY, logicalType.getLogicalTypeName());
         }
 
         val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null);
         if(aDomainObject!=null) {
             switch (aDomainObject.nature()) {
             case BEAN:
-
-                // deprecated @DomainObject(logicalTypeName=...)
-                String logicalTypeName = aDomainObject.logicalTypeName();
-
-                val named = _Annotations.synthesize(type, Named.class).orElse(null);
-                if(named!=null) {
-                    logicalTypeName = named.value();
-                }
-
+                val logicalTypeName = LogicalType.infer(type).getLogicalTypeName();
                 return BeanClassification.delegated(
                         BeanSort.MANAGED_BEAN_CONTRIBUTING,
-                        _Strings.emptyToNull(logicalTypeName));
+                        logicalTypeName);
             case MIXIN:
                 return BeanClassification.selfManaged(BeanSort.MIXIN);
             case ENTITY:
diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index 8dc2ca1b07..b79084ddea 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -447,8 +447,8 @@ public final class ProgrammingModelConstants {
                 + "(for de-serialization from memento string)."),
         DOMAIN_OBJECT_MISSING_A_NAMESPACE("${type}: the object type must declare a namespace, "
                 + "yet there was none found in '${logicalTypeName}'; "
-                + "eg. @DomainObject(logicalTypeName=\"Customer\") is considered invalid, "
-                + "whereas @DomainObject(logicalTypeName=\"sales.Customer\") is valid."),
+                + "eg. @Named(\"Customer\") is considered invalid, "
+                + "whereas @Named(\"sales.Customer\") is valid."),
         DOMAIN_SERVICE_MISSING_A_NAMESPACE("${type}: the service type must declare a namespace, "
                 + "yet there was none found in '${logicalTypeName}'; "
                 + "Spring supports various naming strategies @Named(...) being one of them, "
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java
similarity index 67%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java
index 0ffe337c1b..8cfd760020 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForDomainObjectAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/AliasedFacetForDomainObjectAnnotation.java
@@ -16,37 +16,38 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype;
+package org.apache.isis.core.metamodel.facets.object.domainobject;
 
 import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
+import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet;
+import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacetAbstract;
 
-@Deprecated //@DomainObject(logicalTypeName=...) is deprecated
-public class LogicalTypeFacetForDomainObjectAnnotation
-extends LogicalTypeFacetAbstract {
+public class AliasedFacetForDomainObjectAnnotation
+extends AliasedFacetAbstract {
 
-    public static Optional<LogicalTypeFacet> create(
+    public static Optional<AliasedFacet> create(
             final Optional<DomainObject> domainObjectIfAny,
             final Class<?> correspondingClass,
             final FacetHolder holder) {
 
         return domainObjectIfAny
-                .map(annot->annot.logicalTypeName())
-                .filter(_Strings::isNotEmpty)
-                .map(logicalTypeName -> new LogicalTypeFacetForDomainObjectAnnotation(
-                        LogicalType.eager(correspondingClass, logicalTypeName),
+                .map(annot->annot.aliased())
+                .map(Can::ofArray)
+                .filter(Can::isNotEmpty)
+                .map(aliasNames -> new AliasedFacetForDomainObjectAnnotation(
+                        aliasNames
+                            .map(aliasName->LogicalType.eager(correspondingClass, aliasName)),
                         holder));
     }
 
-    private LogicalTypeFacetForDomainObjectAnnotation(
-            final LogicalType logicalType,
+    private AliasedFacetForDomainObjectAnnotation(
+            final Can<LogicalType> aliases,
             final FacetHolder holder) {
-        super(logicalType, holder);
+        super(aliases, holder);
     }
 }
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 64267f8ce6..959c9aeac4 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
@@ -25,6 +25,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Action;
@@ -71,7 +72,6 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.editing.Editing
 import org.apache.isis.core.metamodel.facets.object.domainobject.editing.ImmutableFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.introspection.IntrospectionPolicyFacetForDomainObjectAnnotation;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.mixin.MetaModelValidatorForMixinTypes;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation;
@@ -112,7 +112,8 @@ implements
     public void process(final ProcessObjectTypeContext processClassContext) {
 
         val domainObjectIfAny = processClassContext.synthesizeOnType(DomainObject.class);
-        processLogicalTypeName(domainObjectIfAny, processClassContext);
+        processAliased(domainObjectIfAny, processClassContext);
+        processIntrospecion(domainObjectIfAny, processClassContext);
 
         // conflicting type semantics validation ...
         validateConflictingTypeSemantics(domainObjectIfAny, processClassContext);
@@ -166,7 +167,8 @@ implements
         }
 
         if(domainObject.nature().isMixin()
-                && _Strings.isNotEmpty(domainObject.logicalTypeName())) {
+                && (_Strings.isNotEmpty(domainObject.logicalTypeName())
+                        || processClassContext.synthesizeOnType(Named.class).isPresent())) {
             // 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());
         }
@@ -311,8 +313,8 @@ implements
                 .create(domainObjectIfAny, getConfiguration(), facetHolder));
     }
 
-    // check from @DomainObject(logicalTypeName=..., introspection=...)
-    void processLogicalTypeName(
+    // check from @DomainObject(aliased=...)
+    void processAliased(
             final Optional<DomainObject> domainObjectIfAny,
             final ProcessObjectTypeContext processClassContext) {
 
@@ -320,16 +322,25 @@ implements
         val facetHolder = processClassContext.getFacetHolder();
 
         FacetUtil.addFacetIfPresent(
-                LogicalTypeFacetForDomainObjectAnnotation
+                AliasedFacetForDomainObjectAnnotation
                 .create(domainObjectIfAny, cls, facetHolder));
+    }
+
+    // check from @DomainObject(introspection=...)
+    void processIntrospecion(
+            final Optional<DomainObject> domainObjectIfAny,
+            final ProcessObjectTypeContext processClassContext) {
+
+        val cls = processClassContext.getCls();
+        val facetHolder = processClassContext.getFacetHolder();
 
         FacetUtil.addFacetIfPresent(
                 IntrospectionPolicyFacetForDomainObjectAnnotation
                 .create(domainObjectIfAny, cls, facetHolder));
-
     }
 
 
+
     void processNature(
             final Optional<DomainObject> domainObjectIfAny,
             final ProcessClassContext processClassContext) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java
deleted file mode 100644
index 150f630006..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForAnnotationFacetFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.apache.isis.applib.annotation.LogicalTypeName;
-import org.apache.isis.core.metamodel.commons.ClassExtensions;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-
-import lombok.val;
-
-public class LogicalTypeFacetForAnnotationFacetFactory
-extends FacetFactoryAbstract {
-
-    @Inject
-    public LogicalTypeFacetForAnnotationFacetFactory(
-            final MetaModelContext mmc,
-            final MethodByClassMap postConstructMethodsCache) {
-        super(mmc, FeatureType.OBJECTS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-
-        // deprecated annotation @LogicalTypeName
-        if(cls.isInterface()
-                || ClassExtensions.isAbstract(cls)) {
-            val logicalTypeNameIfAny = processClassContext.synthesizeOnType(LogicalTypeName.class);
-            FacetUtil.addFacetIfPresent(
-                    LogicalTypeFacetForLogicalTypeNameAnnotation
-                    .create(logicalTypeNameIfAny, cls, facetHolder));
-        }
-
-        val namedIfAny = processClassContext.synthesizeOnType(Named.class);
-
-        FacetUtil.addFacetIfPresent(
-                LogicalTypeFacetForNamedAnnotation
-                .create(namedIfAny, cls, facetHolder));
-
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java
deleted file mode 100644
index e75746e631..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForLogicalTypeNameAnnotation.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype;
-
-import java.util.Optional;
-
-import org.apache.isis.applib.annotation.LogicalTypeName;
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-@Deprecated //@LogicalTypeName(...) is deprecated
-public class LogicalTypeFacetForLogicalTypeNameAnnotation
-extends LogicalTypeFacetAbstract {
-
-    public static Optional<LogicalTypeFacet> create(
-            final Optional<LogicalTypeName> logicalTypeIfAny,
-            final Class<?> correspondingClass,
-            final FacetHolder holder) {
-
-        return logicalTypeIfAny
-                .map(annot->annot.value())
-                .filter(_Strings::isNotEmpty)
-                .map(logicalTypeName -> new LogicalTypeFacetForLogicalTypeNameAnnotation(
-                        LogicalType.eager(correspondingClass, logicalTypeName),
-                        holder));
-    }
-
-    private LogicalTypeFacetForLogicalTypeNameAnnotation(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        // Precedence.LOW ensures, to get overruled by @DomainObject(logicalTypeName=...)
-        super(logicalType, holder, Precedence.LOW);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java
deleted file mode 100644
index 29ac9968fe..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/logicaltype/LogicalTypeFacetForNamedAnnotation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype;
-
-import java.util.Optional;
-
-import javax.inject.Named;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-public class LogicalTypeFacetForNamedAnnotation
-extends LogicalTypeFacetAbstract {
-
-    public static Optional<LogicalTypeFacet> create(
-            final Optional<Named> namedIfAny,
-            final Class<?> correspondingClass,
-            final FacetHolder holder) {
-
-        return namedIfAny
-                .map(annot->annot.value())
-                .filter(_Strings::isNotEmpty)
-                .map(logicalTypeName -> new LogicalTypeFacetForNamedAnnotation(
-                        LogicalType.eager(correspondingClass, logicalTypeName),
-                        holder));
-    }
-
-    private LogicalTypeFacetForNamedAnnotation(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        super(logicalType, holder, Precedence.HIGH);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java
similarity index 91%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java
index e5b7f0827b..1ec8aa8baa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacet.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.logicaltype;
 import javax.inject.Named;
 
 import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
@@ -44,12 +45,8 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  * in principle allowed to share the same logical type-name. In which case reverse
  * lookup from logical-type-name to type must always resolve the most specific one (B).
  */
-public interface LogicalTypeFacet extends Facet {
+public interface AliasedFacet extends Facet {
 
-    LogicalType getLogicalType();
-
-    default String value() {
-        return getLogicalType().getLogicalTypeName();
-    }
+    Can<LogicalType> getAliases();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java
similarity index 69%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java
index 29ab26e3b5..a79bcf4a00 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/AliasedFacetAbstract.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.logicaltype;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -28,36 +29,35 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import lombok.Getter;
 import lombok.NonNull;
 
-public abstract class LogicalTypeFacetAbstract
+public abstract class AliasedFacetAbstract
 extends FacetAbstract
-implements LogicalTypeFacet {
+implements AliasedFacet {
 
     private static final Class<? extends Facet> type() {
-        return LogicalTypeFacet.class;
+        return AliasedFacet.class;
     }
 
     @Getter(onMethod_ = {@Override})
-    private final @NonNull LogicalType logicalType;
+    private final @NonNull Can<LogicalType> aliases;
 
-    protected LogicalTypeFacetAbstract(
-            final LogicalType logicalType,
+    protected AliasedFacetAbstract(
+            final Can<LogicalType> aliases,
             final FacetHolder holder) {
-        super(LogicalTypeFacetAbstract.type(), holder);
-        this.logicalType = logicalType;
+        super(AliasedFacetAbstract.type(), holder);
+        this.aliases = aliases;
     }
 
-    protected LogicalTypeFacetAbstract(
-            final LogicalType logicalType,
+    protected AliasedFacetAbstract(
+            final Can<LogicalType> aliases,
             final FacetHolder holder,
             final Facet.Precedence precedence) {
-        super(LogicalTypeFacetAbstract.type(), holder, precedence);
-        this.logicalType = logicalType;
+        super(AliasedFacetAbstract.type(), holder, precedence);
+        this.aliases = aliases;
     }
 
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("logicalTypeName", logicalType.getLogicalTypeName());
-        visitor.accept("logicalTypeCorrespondingClass", logicalType.getCorrespondingClass().getName());
+        visitor.accept("aliases", aliases);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java
index e33fb6c7f5..cea0dc5abe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeMalformedValidator.java
@@ -49,12 +49,8 @@ implements MetaModelRefiner {
                 return;
             }
 
-            val logicalTypeFacet = spec.getFacet(LogicalTypeFacet.class);
-            if(logicalTypeFacet == null) {
-                return;
-            }
-
-            val logicalTypeName = logicalTypeFacet.value();
+            val logicalType = spec.getLogicalType();
+            val logicalTypeName = logicalType.getLogicalTypeName();
 
             val nameParts = _Strings.splitThenStream(logicalTypeName, ".")
                     .collect(Can.toCan());
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java
deleted file mode 100644
index 030d913fda..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassName.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.logicaltype.classname;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.core.metamodel.commons.ClassUtil;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-public class LogicalTypeFacetFromClassName
-extends LogicalTypeFacetAbstract {
-
-    public LogicalTypeFacetFromClassName(final Class<?> cls, final FacetHolder holder) {
-        this(LogicalType.eager(cls, ClassUtil.getCanonicalName_friendlyToInnerClasses(cls)), holder);
-    }
-
-    public LogicalTypeFacetFromClassName(final LogicalType logicalType, final FacetHolder holder) {
-        super(logicalType, holder, Precedence.INFERRED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
index bc20506466..09514d3f5d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromClassNameFactory.java
@@ -23,16 +23,12 @@ import java.util.Collections;
 import javax.inject.Inject;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.isis.applib.id.LogicalType;
 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.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorDefault;
 import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry;
@@ -69,49 +65,14 @@ implements
 
     @Override
     public void process(final ProcessObjectTypeContext processClassContext) {
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-        // don't trash existing facet
-        if(facetHolder.containsNonFallbackFacet(LogicalTypeFacet.class)) {
-            return;
-        }
-        val cls = processClassContext.getCls();
-        val substitute = classSubstitutorRegistry.getSubstitution(cls);
-        if(substitute.isNeverIntrospect()) {
-            return;
-        }
-        FacetUtil.addFacet(
-                createLogicalTypeFacet(facetHolder, substitute.apply(cls)));
+        // no-op.
     }
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        // now a no-op.
-    }
-
-    private static LogicalTypeFacet createLogicalTypeFacet(
-            final FacetHolder facetHolder,
-            final Class<?> substitutedClass) {
-
-        val serviceId = getServiceId(facetHolder);
-        val isService = serviceId!=null;
-
-       return isService
-               ? new LogicalTypeFacetFromIoCNamingStrategy(
-                        LogicalType
-                        .eager(substitutedClass, serviceId),
-                        facetHolder)
-               : new LogicalTypeFacetFromClassName(substitutedClass, facetHolder);
+        // no-op.
     }
 
-    private static String getServiceId(final FacetHolder facetHolder) {
-        if(facetHolder instanceof ObjectSpecification) {
-            ObjectSpecification objectSpecification = (ObjectSpecification) facetHolder;
-            if(objectSpecification.isManagedBean()) {
-                return objectSpecification.getManagedBeanName();
-            }
-        }
-        return null;
-    }
 
     @Override
     public void refineProgrammingModel(final ProgrammingModel programmingModel) {
@@ -127,8 +88,10 @@ implements
                 return;
             }
 
-            val logicalTypeFacet = objectSpec.getFacet(LogicalTypeFacet.class);
-            if(logicalTypeFacet instanceof LogicalTypeFacetFromClassName) {
+            val logicalType = objectSpec.getLogicalType();
+
+            //XXX has a slight chance to be a false positive; would need to check whether annotated with @Named
+            if(logicalType.getClassName().equals(logicalType.getLogicalTypeName())) {
                 ValidationFailure.raiseFormatted(
                         objectSpec,
                         "%s: the object type must be specified explicitly ('%s' config property). "
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java
deleted file mode 100644
index 8e43e636de..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetFromIoCNamingStrategy.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.logicaltype.classname;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-/**
- * @since 2.0
- */
-public class LogicalTypeFacetFromIoCNamingStrategy
-extends LogicalTypeFacetAbstract {
-
-    LogicalTypeFacetFromIoCNamingStrategy(
-            final LogicalType logicalType, final FacetHolder holder) {
-        super(logicalType, holder, Precedence.INFERRED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java
deleted file mode 100644
index bbf822df1c..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/logicaltype/classname/LogicalTypeFacetOnStandaloneList.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.logicaltype.classname;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-public class LogicalTypeFacetOnStandaloneList extends LogicalTypeFacetAbstract {
-
-    public LogicalTypeFacetOnStandaloneList(final LogicalType logicalType, final FacetHolder holder) {
-        super(logicalType, holder);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
index e54a230f80..90492a9dc9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
@@ -42,7 +42,6 @@ import org.apache.isis.core.metamodel.facets.object.value.MaxLengthFacetFromValu
 import org.apache.isis.core.metamodel.facets.object.value.TypicalLengthFacetFromValueFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProvider;
-import org.apache.isis.core.metamodel.facets.value.annotation.LogicalTypeFacetForValueAnnotation;
 import org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 
 import lombok.AccessLevel;
@@ -87,14 +86,7 @@ extends FacetFactoryAbstract {
         val facetHolder = processClassContext.getFacetHolder();
         val valueIfAny = processClassContext.synthesizeOnType(Value.class);
 
-        val logicalTypeFacetIfAny = addFacetIfPresent(
-                LogicalTypeFacetForValueAnnotation
-                .create(valueIfAny, valueClass, facetHolder));
-
-        val logicalType = logicalTypeFacetIfAny
-                .map(logicalTypeFacet->logicalTypeFacet.getLogicalType())
-                .orElseGet(()->LogicalType.fqcn(valueClass));
-
+        val logicalType = LogicalType.infer(valueClass);
         val identifier = Identifier.classIdentifier(logicalType);
 
         val valueFacetIfAny = addAllFacetsForValueSemantics(identifier, valueClass, facetHolder, valueIfAny);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java
deleted file mode 100644
index 4c75e61ba4..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/LogicalTypeFacetForValueAnnotation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.value.annotation;
-
-import java.util.Optional;
-
-import org.apache.isis.applib.annotation.Value;
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-
-@Deprecated // @Value(logicalTypeName=...) is deprecated
-public class LogicalTypeFacetForValueAnnotation
-extends LogicalTypeFacetAbstract {
-
-    public static Optional<LogicalTypeFacetForValueAnnotation> create(
-            final Optional<Value> valueIfAny,
-            final Class<?> correspondingClass,
-            final FacetHolder holder) {
-
-        return valueIfAny
-                .map(annot->annot.logicalTypeName())
-                .filter(_Strings::isNotEmpty)
-                .map(logicalTypeName -> new LogicalTypeFacetForValueAnnotation(
-                        LogicalType.eager(correspondingClass, logicalTypeName),
-                        holder));
-    }
-
-    private LogicalTypeFacetForValueAnnotation(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        super(logicalType, holder);
-    }
-
-}
\ No newline at end of file
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
deleted file mode 100644
index 538e59b328..0000000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/annotation/ValueAnnotationFacetFactory.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.value.annotation;
-
-import javax.inject.Inject;
-
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-
-import lombok.val;
-
-@Deprecated // @Value(logicalTypeName=...) is deprecated
-public class ValueAnnotationFacetFactory
-extends FacetFactoryAbstract
-implements
-    ObjectTypeFacetFactory {
-
-    @Inject
-    public ValueAnnotationFacetFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.OBJECTS_ONLY);
-    }
-
-    @Override
-    public void process(final ProcessObjectTypeContext processClassContext) {
-        val cls = processClassContext.getCls();
-        val facetHolder = processClassContext.getFacetHolder();
-
-        // deprecated
-        // @Value(logicalTypeName=...)
-        val valueIfAny = processClassContext.synthesizeOnType(org.apache.isis.applib.annotation.Value.class);
-        addFacetIfPresent(LogicalTypeFacetForValueAnnotation.create(valueIfAny, cls, facetHolder));
-
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index e0fb1088af..ae0a2e4b51 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -45,7 +45,6 @@ import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.
 import org.apache.isis.core.metamodel.facets.object.callbacks.CallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.choices.enums.ChoicesFacetFromEnumFactory;
 import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.DomainObjectLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.domainservice.annotation.DomainServiceFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacetFactory;
@@ -191,8 +190,6 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new ViewModelFacetFactory(mmc, postConstructMethodsCache));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new JaxbFacetFactory(mmc));
 
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new LogicalTypeFacetForAnnotationFacetFactory(mmc, postConstructMethodsCache));
-
         // must come after RecreatableObjectFacetFactory
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DomainObjectAnnotationFacetFactory(mmc, postConstructMethodsCache));
 
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 ce7a271a8b..8f92d4d553 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
@@ -23,7 +23,6 @@ import java.util.Optional;
 
 import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.NonNull;
@@ -50,7 +49,7 @@ class LogicalTypeResolverDefault implements LogicalTypeResolver {
 
         // collect concrete classes (do not collect abstract or anonymous types or interfaces)
         if(!spec.isAbstract()
-                && hasUsableObjectTypeFacet(spec)) {
+                && hasTypeIdentity(spec)) {
 
             val key = spec.getLogicalTypeName();
 
@@ -74,10 +73,10 @@ class LogicalTypeResolverDefault implements LogicalTypeResolver {
 
     // -- HELPER
 
-    private boolean hasUsableObjectTypeFacet(ObjectSpecification spec) {
+    private boolean hasTypeIdentity(final ObjectSpecification spec) {
         // anonymous inner classes (eg org.estatio.dom.WithTitleGetter$ToString$1)
-        // don't have an ObjectType; hence the guard.
-        return spec.containsNonFallbackFacet(LogicalTypeFacet.class);
+        // don't have type identity; hence the guard.
+        return spec.getCorrespondingClass().getCanonicalName()!=null;
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java
index add420ac7b..9163ef62dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/IntrospectionState.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
+import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet;
 
 public enum IntrospectionState implements Comparable<IntrospectionState> {
     /**
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 5441f32a4f..f6c649657a 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
@@ -35,6 +35,7 @@ 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.id.LogicalType;
 import org.apache.isis.applib.mixins.system.HasInteractionId;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.metamodel.facets.EditingObjectsConfiguration;
@@ -51,10 +52,8 @@ import org.apache.isis.core.metamodel.facets.object.domainobject.editing.Immutab
 import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotation;
 import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetForDomainObjectAnnotationAsConfigured;
 import org.apache.isis.core.metamodel.facets.object.domainobject.entitychangepublishing.EntityChangePublishingFacetFromConfiguration;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
+import org.apache.isis.core.metamodel.facets.object.logicaltype.AliasedFacet;
 import org.apache.isis.core.metamodel.facets.object.publish.entitychange.EntityChangePublishingFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacetForDomainObjectAnnotation;
@@ -67,12 +66,10 @@ public class DomainObjectAnnotationFacetFactoryTest
 extends AbstractFacetFactoryJUnit4TestCase {
 
     DomainObjectAnnotationFacetFactory facetFactory;
-    LogicalTypeFacetForAnnotationFacetFactory facetFactory2;
 
     @Before
     public void setUp() throws Exception {
         facetFactory = new DomainObjectAnnotationFacetFactory(metaModelContext, new MethodByClassMap());
-        facetFactory2 = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap());
     }
 
     @Override
@@ -578,19 +575,8 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
         @Test
         public void whenDomainObjectAndObjectTypeSetToTrue() {
-
-            facetFactory2.process(ProcessClassContext
-                    .forTesting(CustomerWithDomainObjectAndObjectTypeSet.class, mockMethodRemover, facetHolder));
-
-            final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-            Assert.assertNotNull(facet);
-
-            Assert.assertTrue(facet instanceof LogicalTypeFacetForNamedAnnotation);
-            final LogicalTypeFacetForNamedAnnotation facetForDomainObjectAnnotation =
-                    (LogicalTypeFacetForNamedAnnotation) facet;
-
-            assertThat(facetForDomainObjectAnnotation.value(), is("CUS"));
-
+            assertThat(LogicalType.infer(CustomerWithDomainObjectAndObjectTypeSet.class).getLogicalTypeName(),
+                    is("CUS"));
             expectNoMethodsRemoved();
         }
 
@@ -600,7 +586,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
             facetFactory.process(ProcessClassContext
                     .forTesting(CustomerWithDomainObjectButNoObjectType.class, mockMethodRemover, facetHolder));
 
-            final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class);
+            final Facet facet = facetHolder.getFacet(AliasedFacet.class);
             Assert.assertNull(facet);
 
             expectNoMethodsRemoved();
@@ -612,7 +598,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
             facetFactory.process(ProcessClassContext
                     .forTesting(DomainObjectAnnotationFacetFactoryTest.Customer.class, mockMethodRemover, facetHolder));
 
-            final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class);
+            final Facet facet = facetHolder.getFacet(AliasedFacet.class);
             Assert.assertNull(facet);
 
             expectNoMethodsRemoved();
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java
similarity index 56%
rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java
rename to core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java
index bc5942e3b3..a5f2592ee0 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/LogicalTypeFacetFromJdoDiscriminatorValueAnnotation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/NamedAnnotationFacetFactoryTest.java
@@ -16,20 +16,32 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator;
+package org.apache.isis.core.metamodel.facets.object.domainobject;
 
+import javax.inject.Named;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
+
+public class NamedAnnotationFacetFactoryTest
+extends AbstractFacetFactoryJUnit4TestCase {
 
-public class LogicalTypeFacetFromJdoDiscriminatorValueAnnotation
-extends LogicalTypeFacetAbstract {
+    @Test
+    public void logicalTypeNameAnnotationPickedUpOnClass() {
+
+        @Named("CUS")
+        @DomainObject
+        class Customer {
+        }
+
+        assertThat(LogicalType.infer(Customer.class).getLogicalTypeName(), is("CUS"));
 
-    public LogicalTypeFacetFromJdoDiscriminatorValueAnnotation(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        super(logicalType, holder);
     }
 
 }
-
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
deleted file mode 100644
index 08b43506e6..0000000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobject/ObjectTypeAnnotationFacetFactoryTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.domainobject;
-
-import javax.inject.Named;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import org.apache.isis.applib.annotation.DomainObject;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-
-public class ObjectTypeAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4TestCase {
-
-    private LogicalTypeFacetForAnnotationFacetFactory facetFactory;
-
-    @Before
-    public void setUp() throws Exception {
-        facetFactory = new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap());
-    }
-
-    @Test
-    public void logicalTypeNameAnnotationPickedUpOnClass() {
-
-        @Named("CUS")
-        @DomainObject
-        class Customer {
-        }
-
-        expectNoMethodsRemoved();
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, mockMethodRemover, facetHolder));
-
-        final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-
-        assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, is(true));
-        assertThat(facet.value(), is("CUS"));
-
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java
deleted file mode 100644
index b33cd622c5..0000000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeFacetFromClassNameFactoryTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.object.logicaltype;
-
-import javax.inject.Named;
-
-import org.datanucleus.testing.dom.CustomerAsProxiedByDataNucleus;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import org.apache.isis.applib.annotation.Value;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.logicaltype.LogicalTypeFacetForNamedAnnotation;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassName;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassNameFactory;
-import org.apache.isis.core.metamodel.methods.MethodByClassMap;
-
-import lombok.val;
-
-public class LogicalTypeFacetFromClassNameFactoryTest
-extends AbstractFacetFactoryJUnit4TestCase {
-
-    private ObjectTypeFacetFactory facetFactory;
-
-    public static class Customer {
-    }
-
-    @Test
-    public void installsFacet_passedThroughClassSubstitutor() {
-
-        facetFactory = LogicalTypeFacetFromClassNameFactory.forTesting(metaModelContext);
-
-        expectNoMethodsRemoved();
-
-        facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(CustomerAsProxiedByDataNucleus.class, facetHolder));
-
-        final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-
-        assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof LogicalTypeFacetFromClassName, is(true));
-        assertThat(facet.value(), is(Customer.class.getCanonicalName()));
-    }
-
-    @Value
-    public static class ValueExample1 {
-    }
-
-    @Test
-    public void installsFacet_onValues() {
-
-        facetFactory = LogicalTypeFacetFromClassNameFactory.forTesting(metaModelContext);
-
-        expectNoMethodsRemoved();
-
-        facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(ValueExample1.class, facetHolder));
-
-        final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-
-        assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof LogicalTypeFacetFromClassName, is(true));
-        assertThat(facet.value(), is(ValueExample1.class.getCanonicalName()));
-    }
-
-    @Named("xxx.ValueExample")
-    @Value
-    public static class ValueExample2 {
-    }
-
-    @Test
-    public void installsFacet_onValuesUsingLogicalTypeName() {
-
-        val facetFactory =
-                new LogicalTypeFacetForAnnotationFacetFactory(metaModelContext, new MethodByClassMap());
-
-        expectNoMethodsRemoved();
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(ValueExample2.class, mockMethodRemover, facetHolder));
-
-        final LogicalTypeFacet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-
-        assertThat(facet, is(not(nullValue())));
-        assertThat(facet instanceof LogicalTypeFacetForNamedAnnotation, is(true));
-        assertThat(facet.value(), is("xxx.ValueExample"));
-    }
-
-
-
-}
-
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java
new file mode 100644
index 0000000000..dabd9d8af4
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/logicaltype/LogicalTypeInferenceTest.java
@@ -0,0 +1,66 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.object.logicaltype;
+
+import javax.inject.Named;
+
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.id.LogicalType;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
+
+public class LogicalTypeInferenceTest
+extends AbstractFacetFactoryJUnit4TestCase {
+
+    public static class Customer {
+    }
+
+    @Test
+    public void installsFacet_passedThroughClassSubstitutor() {
+        assertThat(LogicalType.infer(Customer.class).getLogicalTypeName(),
+                is(Customer.class.getCanonicalName()));
+    }
+
+    @Value
+    public static class ValueExample1 {
+    }
+
+    @Test
+    public void installsFacet_onValues() {
+        assertThat(LogicalType.infer(ValueExample1.class).getLogicalTypeName(),
+                is(ValueExample1.class.getCanonicalName()));
+    }
+
+    @Named("xxx.ValueExample")
+    @Value
+    public static class ValueExample2 {
+    }
+
+    @Test
+    public void installsFacet_onValuesUsingLogicalTypeName() {
+        assertThat(LogicalType.infer(ValueExample2.class).getLogicalTypeName(),
+                is("xxx.ValueExample"));
+    }
+
+}
+
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index 4b84f805c3..c24dc764f2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -27,8 +27,8 @@ import org.junit.Test;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
+import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(63, programmingModel.streamFactories().count());
+        assertEquals(62, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index 0de46cd282..49b3ea5b9a 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -43,7 +43,6 @@ import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFactory;
 import org.apache.isis.core.metamodel.facets.object.icon.ObjectIcon;
 import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleRenderRequest;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
@@ -58,7 +57,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.specimpl.IntrospectionState;
 
-import lombok.Synchronized;
 import lombok.val;
 
 public class ObjectSpecificationStub
@@ -71,7 +69,7 @@ implements ObjectSpecification {
     /**
      * lazily derived, see {@link #getLogicalType()}
      */
-    private LogicalType logicalType;
+    private final LogicalType logicalType;
 
     private ObjectSpecification elementSpecification;
     private final Class<?> correspondingClass;
@@ -98,8 +96,9 @@ implements ObjectSpecification {
     public ObjectSpecificationStub(final MetaModelContext mmc, final Class<?> correspondingClass) {
         super(mmc);
         this.correspondingClass = correspondingClass;
-        title = "";
-        name = correspondingClass.getCanonicalName();
+        this.logicalType = LogicalType.infer(correspondingClass);
+        this.title = "";
+        this.name = correspondingClass.getCanonicalName();
     }
 
     @Override
@@ -137,12 +136,8 @@ implements ObjectSpecification {
         return name;
     }
 
-    @Synchronized
     @Override
     public LogicalType getLogicalType() {
-        if(logicalType == null) {
-            logicalType = getFacet(LogicalTypeFacet.class).getLogicalType();
-        }
         return logicalType;
     }
 
diff --git a/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java b/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java
index a0143368c6..b86727d797 100644
--- a/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java
+++ b/core/metamodel/src/test/java/org/datanucleus/testing/dom/CustomerAsProxiedByDataNucleus.java
@@ -18,8 +18,8 @@
  */
 package org.datanucleus.testing.dom;
 
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetFromClassNameFactoryTest;
+import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeInferenceTest;
 
 public class CustomerAsProxiedByDataNucleus
-extends LogicalTypeFacetFromClassNameFactoryTest.Customer {
+extends LogicalTypeInferenceTest.Customer {
 }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java
index dc3fdc46aa..8da281bcf9 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/beans/JdoBeanTypeClassifier.java
@@ -18,12 +18,9 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.beans;
 
-import java.util.Locale;
-
-import javax.inject.Named;
 import javax.jdo.annotations.EmbeddedOnly;
 
-import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.services.metamodel.BeanSort;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.reflection._Annotations;
@@ -41,7 +38,8 @@ public class JdoBeanTypeClassifier implements IsisBeanTypeClassifier {
     public BeanClassification classify(
             final Class<?> type) {
 
-        val persistenceCapableAnnot = _Annotations.synthesize(type, javax.jdo.annotations.PersistenceCapable.class);
+        val persistenceCapableAnnot = _Annotations
+                .synthesize(type, javax.jdo.annotations.PersistenceCapable.class);
         if(persistenceCapableAnnot.isPresent()) {
 
             val embeddedOnlyAttribute = persistenceCapableAnnot.get().embeddedOnly();
@@ -53,39 +51,24 @@ public class JdoBeanTypeClassifier implements IsisBeanTypeClassifier {
                 return null; // don't categorize as entity ... fall through in the caller's logic
             }
 
-            String logicalTypeName = null;
-
-            // deprecated @DomainObject(logicalTypeName=...)
-            val aDomainObject = _Annotations.synthesize(type, DomainObject.class).orElse(null);
-            if(aDomainObject!=null) {
-                logicalTypeName = aDomainObject.logicalTypeName();
-            }
+            String logicalTypeName = LogicalType.infer(type).getLogicalTypeName();
 
-            val named = _Annotations.synthesize(type, Named.class).orElse(null);
-            if(named!=null) {
-                logicalTypeName = named.value();
-            }
-
-            // don't trample over the @DomainObject(logicalTypeName=..) if present
-            if(_Strings.isEmpty(logicalTypeName)) {
+            // don't trample over the @Named(=...) if present
+            if(logicalTypeName.equals(type.getName())) {
                 val schema = persistenceCapableAnnot.get().schema();
                 if(_Strings.isNotEmpty(schema)) {
 
                     val table = persistenceCapableAnnot.get().table();
 
-                    logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT),
-                            _Strings.isNotEmpty(table)
-                                ? table
-                                : type.getSimpleName());
+                    //FIXME - this custom name is never honored
+//                    logicalTypeName = String.format("%s.%s", schema.toLowerCase(Locale.ROOT),
+//                            _Strings.isNotEmpty(table)
+//                                ? table
+//                                : type.getSimpleName());
                 }
             }
 
-
-            if(_Strings.isNotEmpty(logicalTypeName)) {
-                BeanClassification.selfManaged(
-                        BeanSort.ENTITY, logicalTypeName);
-            }
-            return BeanClassification.selfManaged(BeanSort.ENTITY);
+            return BeanClassification.selfManaged(BeanSort.ENTITY, logicalTypeName);
         }
 
         return null; // we don't feel responsible to classify given type
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
deleted file mode 100644
index 25799cef8b..0000000000
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorAnnotationFacetFactory.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator;
-
-import javax.inject.Inject;
-import javax.jdo.annotations.Discriminator;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-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.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.classname.LogicalTypeFacetFromClassName;
-import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry;
-import org.apache.isis.persistence.jdo.provider.entities.JdoFacetContext;
-
-import lombok.val;
-
-public class JdoDiscriminatorAnnotationFacetFactory
-extends FacetFactoryAbstract
-implements ObjectTypeFacetFactory {
-
-    private final ClassSubstitutorRegistry classSubstitutorRegistry;
-    private final JdoFacetContext jdoFacetContext;
-
-    @Inject
-    public JdoDiscriminatorAnnotationFacetFactory(
-            final MetaModelContext mmc,
-            final JdoFacetContext jdoFacetContext,
-            final ClassSubstitutorRegistry classSubstitutorRegistry) {
-        super(mmc, FeatureType.OBJECTS_ONLY);
-        this.jdoFacetContext = jdoFacetContext;
-        this.classSubstitutorRegistry = classSubstitutorRegistry;
-    }
-
-    @Override
-    public void process(final ProcessObjectTypeContext processClassContext) {
-
-        // only applies to JDO entities; ignore any view models
-        final Class<?> cls = processClassContext.getCls();
-        if(!jdoFacetContext.isPersistenceEnhanced(cls)) {
-            return;
-        }
-
-        final Discriminator annotation = processClassContext.synthesizeOnType(Discriminator.class).orElse(null);
-        if (annotation == null) {
-            return;
-        }
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-
-        final String annotationValue = annotation.value();
-        final LogicalTypeFacet logicalTypeFacet; // non-null
-        if (!_Strings.isNullOrEmpty(annotationValue)) {
-            logicalTypeFacet = new LogicalTypeFacetFromJdoDiscriminatorValueAnnotation(
-                        LogicalType.eager(cls, annotationValue),
-                        facetHolder);
-        } else {
-            val substitute = classSubstitutorRegistry.getSubstitution(cls);
-            if(substitute.isNeverIntrospect()) {
-                return;
-            }
-
-            val substituted = substitute.apply(cls);
-            logicalTypeFacet = new LogicalTypeFacetFromClassName(
-                            LogicalType.eager(substituted, substituted.getCanonicalName()),
-                            facetHolder);
-
-        }
-        FacetUtil.addFacet(logicalTypeFacet);
-    }
-
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-
-        // only applies to JDO entities; ignore any view models
-        final Class<?> cls = processClassContext.getCls();
-        if(!jdoFacetContext.isPersistenceEnhanced(cls)) {
-            return;
-        }
-
-        final Discriminator annotation = processClassContext.synthesizeOnType(Discriminator.class).orElse(null);
-        if (annotation == null) {
-            return;
-        }
-        String annotationValueAttribute = annotation.value();
-        final FacetHolder facetHolder = processClassContext.getFacetHolder();
-        FacetUtil.addFacet(new JdoDiscriminatorFacetDefault(annotationValueAttribute, facetHolder));
-    }
-
-}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java
deleted file mode 100644
index 0fb5eb6cef..0000000000
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/JdoDiscriminatorFacetDefault.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.SingleValueFacetAbstract;
-import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator.JdoDiscriminatorFacet;
-
-public class JdoDiscriminatorFacetDefault extends SingleValueFacetAbstract<String> implements JdoDiscriminatorFacet {
-
-    public JdoDiscriminatorFacetDefault(String value, FacetHolder holder) {
-        super(JdoDiscriminatorFacet.class, value, holder);
-    }
-
-}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java
deleted file mode 100644
index 4533006f17..0000000000
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/package-info.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator;
\ No newline at end of file
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java
deleted file mode 100644
index 9348df7713..0000000000
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/domainobject/objectspecid/LogicalTypeFacetFromJdoPersistenceCapableFacet.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.domainobject.objectspecid;
-
-import java.util.Locale;
-import java.util.Optional;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
-
-public class LogicalTypeFacetFromJdoPersistenceCapableFacet
-extends LogicalTypeFacetAbstract {
-
-    public static Optional<LogicalTypeFacet> create(
-            final JdoPersistenceCapableFacet persistenceCapableFacet,
-            final Class<?> correspondingClass,
-            final FacetHolder holder) {
-
-        if(persistenceCapableFacet.getPrecedence().isFallback()) {
-            return Optional.empty();
-        }
-        final String schema = persistenceCapableFacet.getSchema();
-        if(_Strings.isNullOrEmpty(schema)) {
-            return Optional.empty();
-        }
-        final String logicalTypeName =
-                schema.toLowerCase(Locale.ROOT) + "." + persistenceCapableFacet.getTable();
-        return Optional.of(new LogicalTypeFacetFromJdoPersistenceCapableFacet(
-                LogicalType.eager(correspondingClass, logicalTypeName),
-                holder));
-    }
-
-    private LogicalTypeFacetFromJdoPersistenceCapableFacet(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        super(logicalType, holder, Precedence.INFERRED);
-    }
-}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java
index e3904db5ff..70b0254c4e 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetFactory.java
@@ -31,7 +31,6 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
-import org.apache.isis.persistence.jdo.metamodel.facets.object.domainobject.objectspecid.LogicalTypeFacetFromJdoPersistenceCapableFacet;
 import org.apache.isis.persistence.jdo.provider.entities.JdoFacetContext;
 
 import lombok.val;
@@ -86,10 +85,6 @@ implements ObjectTypeFacetFactory {
                 .createUsingJdo(persistenceCapableIfAny, embeddedOnlyIfAny, cls, facetHolder))
         .map(jdoPersistenceCapableFacet->{
 
-            FacetUtil.addFacetIfPresent(
-                    LogicalTypeFacetFromJdoPersistenceCapableFacet
-                    .create(jdoPersistenceCapableFacet, cls, facetHolder));
-
             FacetUtil.addFacet(
                     jdoFacetContext.createEntityFacet(facetHolder));
 
@@ -115,10 +110,6 @@ implements ObjectTypeFacetFactory {
                 .createUsingJpa(entityIfAny, tableIfAny, cls, facetHolder))
         .ifPresent(jdoPersistenceCapableFacet->{
 
-            FacetUtil.addFacetIfPresent(
-                    LogicalTypeFacetFromJdoPersistenceCapableFacet
-                    .create(jdoPersistenceCapableFacet, cls, facetHolder));
-
             FacetUtil.addFacet(
                     jdoFacetContext.createEntityFacet(facetHolder));
 
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
deleted file mode 100644
index f9cda31e99..0000000000
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/object/discriminator/GivenJdoDiscriminatorAnnotationFacetFactoryTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.metamodel.facets.object.discriminator;
-
-import javax.jdo.annotations.Discriminator;
-import javax.jdo.annotations.PersistenceCapable;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.persistence.jdo.metamodel.testing.AbstractFacetFactoryTest;
-import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator.JdoDiscriminatorFacet;
-
-import lombok.val;
-
-public class GivenJdoDiscriminatorAnnotationFacetFactoryTest extends AbstractFacetFactoryTest {
-
-    private JdoDiscriminatorAnnotationFacetFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new JdoDiscriminatorAnnotationFacetFactory(metaModelContext, jdoFacetContext, null);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public void testFeatureTypes() {
-        val featureTypes = facetFactory.getFeatureTypes();
-        assertTrue(contains(featureTypes, FeatureType.OBJECT));
-        assertFalse(contains(featureTypes, FeatureType.PROPERTY));
-        assertFalse(contains(featureTypes, FeatureType.COLLECTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION));
-        assertFalse(contains(featureTypes, FeatureType.ACTION_PARAMETER_SCALAR));
-    }
-
-    public void testDiscriminatorValueAnnotationPickedUpOnClass() {
-        @Discriminator("CUS")
-        abstract class Customer {
-        }
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetHolder));
-
-        final Facet facet = facetHolder.getFacet(JdoDiscriminatorFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof JdoDiscriminatorFacetDefault);
-    }
-
-    public void testObjectTypeAnnotationPickedUpOnClass() {
-        @Discriminator("CUS")
-        abstract class Customer {
-        }
-
-        facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(Customer.class, facetHolder));
-
-        final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof LogicalTypeFacetFromJdoDiscriminatorValueAnnotation);
-    }
-
-    public void testIfNoEntityAnnotationThenNoFacet() {
-
-        abstract class Customer {
-        }
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetHolder));
-
-        final Facet facet = facetHolder.getFacet(LogicalTypeFacet.class);
-        assertNull(facet);
-    }
-
-    public void testAnnotationValue() {
-        @Discriminator("CUS")
-        abstract class Customer {
-        }
-
-        facetFactory.process(new ObjectTypeFacetFactory.ProcessObjectTypeContext(Customer.class, facetHolder));
-
-        final LogicalTypeFacet discriminatorValueFacet = facetHolder.getFacet(LogicalTypeFacet.class);
-        assertEquals("CUS", discriminatorValueFacet.value());
-    }
-
-    public void testNoMethodsRemoved() {
-        @PersistenceCapable
-        abstract class Customer {
-        }
-
-        facetFactory.process(ProcessClassContext
-                .forTesting(Customer.class, methodRemover, facetHolder));
-
-        assertNoMethodsRemoved();
-    }
-}
diff --git a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java b/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java
deleted file mode 100644
index 92899efb6a..0000000000
--- a/persistence/jdo/provider/src/main/java/org/apache/isis/persistence/jdo/provider/metamodel/facets/object/discriminator/JdoDiscriminatorFacet.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jdo.provider.metamodel.facets.object.discriminator;
-
-import org.apache.isis.core.metamodel.facets.SingleValueFacet;
-
-public interface JdoDiscriminatorFacet extends SingleValueFacet<String> {
-
-}
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java
deleted file mode 100644
index 03646a696e..0000000000
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/domainobject/objectspecid/LogicalTypeFacetForTableAnnotation.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.persistence.jpa.metamodel.object.domainobject.objectspecid;
-
-import java.util.Locale;
-import java.util.Optional;
-
-import org.apache.isis.applib.id.LogicalType;
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacet;
-import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeFacetAbstract;
-import org.apache.isis.persistence.jpa.metamodel.object.table.JpaTableFacetAnnotation;
-
-public class LogicalTypeFacetForTableAnnotation
-extends LogicalTypeFacetAbstract {
-
-    public static Optional<LogicalTypeFacet> create(
-            final JpaTableFacetAnnotation tableFacet,
-            final Class<?> correspondingClass,
-            final FacetHolder holder) {
-
-        if(tableFacet.getPrecedence().isFallback()) {
-            return Optional.empty();
-        }
-        final String schema = tableFacet.getSchema();
-        if(_Strings.isNullOrEmpty(schema)) {
-            return Optional.empty();
-        }
-        final String logicalTypeName = schema.toLowerCase(Locale.ROOT) + "." + tableFacet.getTable();
-        return Optional.of(
-                new LogicalTypeFacetForTableAnnotation(
-                        LogicalType.eager(correspondingClass, logicalTypeName), holder));
-    }
-
-    private LogicalTypeFacetForTableAnnotation(
-            final LogicalType logicalType,
-            final FacetHolder holder) {
-        super(logicalType, holder);
-    }
-}
diff --git a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java
index e591c15114..31693dbe4c 100644
--- a/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java
+++ b/persistence/jpa/metamodel/src/main/java/org/apache/isis/persistence/jpa/metamodel/object/table/JpaTableAnnotationFacetFactory.java
@@ -29,7 +29,6 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ObjectTypeFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
-import org.apache.isis.persistence.jpa.metamodel.object.domainobject.objectspecid.LogicalTypeFacetForTableAnnotation;
 
 import lombok.val;
 
@@ -64,18 +63,11 @@ implements ObjectTypeFacetFactory {
 
         val facetHolder = processClassContext.getFacetHolder();
 
-        val jdoPersistenceCapableFacet =
         FacetUtil.addFacet(
                 new JpaTableFacetAnnotationImpl(
                     annotationSchemaAttribute,
                     annotationTableAttribute,
                     facetHolder));
-
-        FacetUtil.addFacetIfPresent(
-                LogicalTypeFacetForTableAnnotation
-                .create(jdoPersistenceCapableFacet, cls, facetHolder));
-
-        return;
     }