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/09/08 10:40:07 UTC

[isis] branch master updated: ISIS-3206: [Metamodel] adds rendering for annotation nodes in Inspect MM View

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 fb517e867b ISIS-3206: [Metamodel] adds rendering for annotation nodes in Inspect MM View
fb517e867b is described below

commit fb517e867bc3acc245b260c16cfcad1c3ceb9909
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 8 12:39:59 2022 +0200

    ISIS-3206: [Metamodel] adds rendering for annotation nodes in Inspect MM
    View
---
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  2 +
 .../metamodel/inspect/Object_inspectMetamodel.java |  2 +-
 .../{FacetAttrNode.java => AnnotationNode.java}    | 14 ++--
 .../metamodel/inspect/model/AnnotationNode.svg     | 83 ++++++++++++++++++++++
 .../metamodel/inspect/model/FacetAttrNode.java     |  2 +-
 .../isis/core/metamodel/inspect/model/MMNode.java  | 35 +++++++--
 .../metamodel/inspect/model/MMNodeFactory.java     | 10 +++
 .../isis/core/metamodel/inspect/model/icons.html   |  2 +
 .../services/metamodel/MetaModelAnnotator.java     |  4 +-
 .../services/metamodel/MetaModelExporter.java      | 56 ++++++++++++---
 .../metamodel/MetaModelServiceDefault.java         |  1 -
 .../ShadowedFactetAttributeAnnotator.java          |  7 +-
 12 files changed, 192 insertions(+), 26 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 206365b285..7a23e132cb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -41,6 +41,7 @@ import org.apache.isis.core.metamodel.inspect.model.CollectionNode;
 import org.apache.isis.core.metamodel.inspect.model.FacetAttrNode;
 import org.apache.isis.core.metamodel.inspect.model.FacetGroupNode;
 import org.apache.isis.core.metamodel.inspect.model.FacetNode;
+import org.apache.isis.core.metamodel.inspect.model.MMTreeAdapter;
 import org.apache.isis.core.metamodel.inspect.model.MemberNode;
 import org.apache.isis.core.metamodel.inspect.model.ParameterNode;
 import org.apache.isis.core.metamodel.inspect.model.PropertyNode;
@@ -231,6 +232,7 @@ public class IsisModuleCoreMetamodel {
     @Bean
     public PreloadableTypes metamodelViewTypes() {
         return ()->Stream.of(
+                MMTreeAdapter.class,
                 MemberNode.class,
                 ActionNode.class,
                 CollectionNode.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
index e2d9dad4f2..745057f69c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/Object_inspectMetamodel.java
@@ -74,7 +74,7 @@ public class Object_inspectMetamodel {
             messageService.warnUser("Unknown class, unable to export");
             return null;
         }
-        final String namespace = logicalTypeIfAny.get().getNamespace();
+        final String namespace = logicalTypeIfAny.get().getLogicalTypeName();
 
         val config = Config.builder()
                 .ignoreFallbackFacets(true)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.java
similarity index 86%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.java
index 5cf9883b4a..e37d3ad413 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.java
@@ -32,14 +32,14 @@ import org.apache.isis.applib.annotation.Introspection;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.schema.metamodel.v2.FacetAttr;
+import org.apache.isis.schema.metamodel.v2.Annotation;
 import org.apache.isis.schema.metamodel.v2.MetamodelElement;
 
 import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 
-@Named(FacetAttrNode.LOGICAL_TYPE_NAME)
+@Named(AnnotationNode.LOGICAL_TYPE_NAME)
 @DomainObject(
         nature=Nature.VIEW_MODEL,
         introspection = Introspection.ANNOTATION_REQUIRED
@@ -47,16 +47,16 @@ import lombok.ToString;
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
 @ToString
-public class FacetAttrNode extends MMNode {
+public class AnnotationNode extends MMNode {
 
-    public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".FacetAttrNode";
+    public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".AnnotationNode";
 
     @Property(hidden = Where.EVERYWHERE)
-    @Getter @Setter private FacetAttr facetAttr;
+    @Getter @Setter private Annotation annotation;
 
     @Override
     public String createTitle() {
-        return String.format("%s: %s", facetAttr.getName(), facetAttr.getValue());
+        return String.format("%s: %s", annotation.getName(), annotation.getValue());
     }
 
     @Override
@@ -72,7 +72,7 @@ public class FacetAttrNode extends MMNode {
     // -- TREE NODE STUFF
 
     @Getter @Setter @XmlTransient
-    private FacetNode parentNode;
+    private MMNode parentNode;
 
     @Override
     public Stream<MMNode> streamChildNodes() {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.svg b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.svg
new file mode 100644
index 0000000000..2277aca9e1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/AnnotationNode.svg
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+  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.
+-->
+
+<svg
+   inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
+   sodipodi:docname="AnnotationNode.svg"
+   id="svg4"
+   version="1.1"
+   viewBox="0 0 448 512"
+   role="img"
+   class="svg-inline--fa fa-square fa-w-14"
+   data-icon="square"
+   data-prefix="far"
+   focusable="false"
+   aria-hidden="true"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     inkscape:current-layer="svg4"
+     inkscape:window-maximized="0"
+     inkscape:window-y="65"
+     inkscape:window-x="1022"
+     inkscape:cy="321.09382"
+     inkscape:cx="78.65721"
+     inkscape:zoom="1.3921165"
+     showgrid="false"
+     id="namedview6"
+     inkscape:window-height="1163"
+     inkscape:window-width="1706"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     guidetolerance="10"
+     gridtolerance="10"
+     objecttolerance="10"
+     borderopacity="1"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     inkscape:pagecheckerboard="0"
+     inkscape:showpageshadow="2"
+     inkscape:deskcolor="#d1d1d1" />
+  <path
+     style="fill:#7d7d7d;fill-opacity:1"
+     id="path2"
+     d="M400 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-6 400H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h340c3.3 0 6 2.7 6 6v340c0 3.3-2.7 6-6 6z"
+     fill="currentColor" />
+  <path
+     id="path869"
+     d="m 49.968008,429.6923 -1.561876,-1.66254 V 256.27418 c 0,-94.46556 0.200796,-172.278836 0.446213,-172.918384 1.313879,-3.423912 -7.23172,-3.264671 175.197195,-3.264671 128.3901,0 171.07525,0.207079 172.25546,0.835665 0.86295,0.459616 1.9628,1.34855 2.44409,1.975409 0.6821,0.888418 0.8801,39.015681 0.89791,172.903491 l 0.0228,171.76374 -1.48879,1.89271 -1.4888,1.8927 H 224.11106 51.529885 Z"
+     style="fill:#eaeaea;fill-opacity:1;stroke:none;stroke-width:3.59165;stroke-linejoin:round" />
+  <text
+     xml:space="preserve"
+     style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:275.027px;line-height:0.95;font-family:Bahnschrift;-inkscape-font-specification:Bahnschrift;letter-spacing:0px;word-spacing:0px;fill:#7e7e7e;fill-opacity:1;stroke:none;stroke-width:5.92588"
+     x="90.025757"
+     y="346.29944"
+     id="text857-3"
+     transform="scale(1.0423124,0.95940527)"><tspan
+       sodipodi:role="line"
+       x="90.025757"
+       y="346.29944"
+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:275.027px;font-family:Bahnschrift;-inkscape-font-specification:Bahnschrift;fill:#7e7e7e;fill-opacity:1;stroke-width:5.92588"
+       id="tspan859-3">@</tspan></text>
+</svg>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
index 5cf9883b4a..8fffbf3264 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/FacetAttrNode.java
@@ -66,7 +66,7 @@ public class FacetAttrNode extends MMNode {
 
     @Override
     protected MetamodelElement metamodelElement() {
-        return null;
+        return facetAttr;
     }
 
     // -- TREE NODE STUFF
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java
index 46ad8301bf..acdd6b646a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNode.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.inspect.model;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -42,6 +43,7 @@ import org.apache.isis.schema.metamodel.v2.MetamodelElement;
 import lombok.Setter;
 
 @XmlSeeAlso({
+    AnnotationNode.class,
     MemberNode.class,
     ActionNode.class,
     CollectionNode.class,
@@ -59,9 +61,13 @@ public abstract class MMNode {
 
     @Collection
     @Setter protected List<MMNode> childNodes;
-    public List<MMNode> getChildNodes() {
+    public final List<MMNode> getChildNodes() {
         if(childNodes==null) {
-            setChildNodes(streamChildNodes().collect(Collectors.toList()));
+            setChildNodes(
+                    Stream.concat(
+                            streamAnnotationNodes(),
+                            streamChildNodes())
+                    .collect(Collectors.toList()));
         }
         return childNodes;
     }
@@ -69,6 +75,12 @@ public abstract class MMNode {
     protected abstract MetamodelElement metamodelElement();
     protected abstract Stream<MMNode> streamChildNodes();
 
+    protected final Stream<MMNode> streamAnnotationNodes() {
+        return streamAnnotations()
+                .filter(notNameOf("@title"))
+                .map(a->MMNodeFactory.annotation(a, this));
+    }
+
     protected String title;
 
     //FIXME[ISIS-2774] should be picked up also when declared abstract, yet we work around that
@@ -96,14 +108,27 @@ public abstract class MMNode {
         return lookupAnnotationByName("@title");
     }
 
-    protected final Optional<Annotation> lookupAnnotationByName(final String annotationName) {
+    protected final Stream<Annotation> streamAnnotations() {
         return Optional.ofNullable(metamodelElement())
                 .map(MetamodelElement::getAnnotations)
                 .map(FacetHolder.Annotations::getAsList)
                 .<Stream<Annotation>>map(List::stream)
-                .orElseGet(Stream::empty)
-                .filter(annot->Objects.equals(annotationName, annot.getName()))
+                .orElseGet(Stream::empty);
+    }
+
+    protected final Optional<Annotation> lookupAnnotationByName(final String annotationName) {
+        return streamAnnotations()
+                .filter(nameOf(annotationName))
                 .findFirst();
     }
 
+    static Predicate<Annotation> nameOf(final String annotationName) {
+        return annot->Objects.equals(annotationName, annot.getName());
+    }
+
+    static Predicate<Annotation> notNameOf(final String annotationName) {
+        return nameOf(annotationName).negate();
+    }
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java
index 9ec98f0e10..4b41c863d4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/MMNodeFactory.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.inspect.model;
 
 import org.apache.isis.schema.metamodel.v2.Action;
+import org.apache.isis.schema.metamodel.v2.Annotation;
 import org.apache.isis.schema.metamodel.v2.Collection;
 import org.apache.isis.schema.metamodel.v2.DomainClassDto;
 import org.apache.isis.schema.metamodel.v2.Facet;
@@ -31,6 +32,14 @@ import lombok.val;
 
 public class MMNodeFactory {
 
+
+    public static MMNode annotation(final Annotation annotation, final MMNode parentNode) {
+        val node = new AnnotationNode();
+        node.setAnnotation(annotation);
+        node.setParentNode(parentNode);
+        return node;
+    }
+
     public static MMNode type(final DomainClassDto domainClassDto, final MMNode parentNode) {
         val node = new TypeNode();
         node.setDomainClassDto(domainClassDto);
@@ -90,4 +99,5 @@ public class MMNodeFactory {
         return node;
     }
 
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/icons.html b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/icons.html
index 531caa8a72..556f0f9f33 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/icons.html
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/inspect/model/icons.html
@@ -65,6 +65,7 @@
 
   	<h1>24x24</h1>
 	<ul>
+		<li><a href="AnnotationNode.svg" class="icon-and-label"><img src="AnnotationNode.svg" class="icon-image-sm"><span>Annotation.svg</span></a></li>
 		<li><a href="TypeNode.svg" class="icon-and-label"><img src="TypeNode.svg" class="icon-image-sm"><span>TypeNode.svg</span></a></li>
 		<li><a href="FacetGroupNode.svg" class="icon-and-label"><img src="FacetGroupNode.svg" class="icon-image-sm"><span>FacetGroupNode.svg</span></a></li>
 		<li><a href="FacetNode.svg" class="icon-and-label"><img src="FacetNode.svg" class="icon-image-sm"><span>FacetNode.svg</span></a></li>
@@ -80,6 +81,7 @@
 
 	<h1>32x32</h1>
 	<ul>
+		<li><a href="AnnotationNode.svg" class="icon-and-label"><img src="AnnotationNode.svg" class="icon-image"><span>Annotation.svg</span></a></li>
 		<li><a href="TypeNode.svg" class="icon-and-label"><img src="TypeNode.svg" class="icon-image"><span>TypeNode.svg</span></a></li>
 		<li><a href="FacetGroupNode.svg" class="icon-and-label"><img src="FacetGroupNode.svg" class="icon-image"><span>FacetGroupNode.svg</span></a></li>
 		<li><a href="FacetNode.svg" class="icon-and-label"><img src="FacetNode.svg" class="icon-image"><span>FacetNode.svg</span></a></li>
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelAnnotator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelAnnotator.java
index c134506299..dc64b12482 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelAnnotator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelAnnotator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.metamodel.services.metamodel;
 
+import java.util.Optional;
+
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.internal.base._Strings;
@@ -69,7 +71,7 @@ public interface MetaModelAnnotator {
         val titleAnnot = new org.apache.isis.schema.metamodel.v2.Annotation();
         titleAnnot.setName(name);
         titleAnnot.setValue(value);
-        val annots = new Annotations();
+        val annots = Optional.ofNullable(t.getAnnotations()).orElseGet(Annotations::new);
         t.setAnnotations(annots);
         annots.getAsList().add(titleAnnot);
         return t;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
index 62290553f7..09050ed5d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelExporter.java
@@ -23,9 +23,11 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 
 import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -74,6 +76,18 @@ class MetaModelExporter {
      * </p>
      */
     MetamodelDto exportMetaModel(final Config config) {
+
+        // single type(s) MM export support
+        val tinyDomain = _Lists.<ObjectSpecification>newArrayList();
+        val useTinyDomain = _NullSafe.stream(config.getNamespacePrefixes())
+        .map(namespace->specificationLookup.specForLogicalTypeName(namespace))
+        .peek(specIfAny->specIfAny.ifPresent(tinyDomain::add))
+        .allMatch(Optional::isPresent);
+
+        if(useTinyDomain) {
+            return exportTinyDomain(tinyDomain, config);
+        }
+
         MetamodelDto metamodelDto = new MetamodelDto();
 
         // phase 1: create a domainClassType for each ObjectSpecification
@@ -84,6 +98,11 @@ class MetaModelExporter {
             domainClassByObjectSpec.put(specification, domainClassType);
         }
 
+        if(useTinyDomain) {
+            metamodelDto.getDomainClassDto().addAll(domainClassByObjectSpec.values());
+            return metamodelDto;
+        }
+
         // phase 2: now flesh out the domain class types, passing the map for lookups of the domainClassTypes that
         // correspond to each object members types.
         //
@@ -132,12 +151,35 @@ class MetaModelExporter {
         return metamodelDto;
     }
 
+    private MetamodelDto exportTinyDomain(final List<ObjectSpecification> tinyDomain, final Config config) {
+        MetamodelDto metamodelDto = new MetamodelDto();
+
+        final Map<ObjectSpecification, DomainClassDto> domainClassByObjectSpec = _Maps.newHashMap();
+        for (final ObjectSpecification specification : tinyDomain) {
+            DomainClassDto domainClassType = asXsdType(specification, config);
+            domainClassByObjectSpec.put(specification, domainClassType);
+            addFacetsAndMembersTo(specification, domainClassByObjectSpec, config);
+        }
+
+        for (final ObjectSpecification objectSpecification : _Lists.newArrayList(domainClassByObjectSpec.keySet())) {
+            if(shouldIgnore(config, objectSpecification)) {
+                continue;
+            }
+            metamodelDto.getDomainClassDto().add(domainClassByObjectSpec.get(objectSpecification));
+        }
+
+        sortDomainClasses(metamodelDto.getDomainClassDto());
+        return metamodelDto;
+    }
+
     private boolean shouldIgnore(final Config config, final ObjectSpecification specification) {
-        return notInNamespacePrefixes(specification, config) ||
-                config.isIgnoreMixins() && specification.isMixin() ||
-                config.isIgnoreInterfaces() && specification.getCorrespondingClass().isInterface() ||
-                config.isIgnoreAbstractClasses() && Modifier.isAbstract(specification.getCorrespondingClass().getModifiers()) ||
-                config.isIgnoreBuiltInValueTypes() && isValueType(specification);
+        return notInNamespacePrefixes(specification, config)
+                || config.isIgnoreMixins() && specification.isMixin()
+                || config.isIgnoreInterfaces() && specification.getCorrespondingClass().isInterface()
+                || config.isIgnoreAbstractClasses()
+                    && Modifier.isAbstract(specification.getCorrespondingClass().getModifiers())
+                || config.isIgnoreBuiltInValueTypes()
+                    && isValueType(specification);
     }
 
     private static <T> List<T> remaining(final java.util.Collection<T> processed, final java.util.Collection<T> other) {
@@ -156,10 +198,6 @@ class MetaModelExporter {
             final Config config) {
 
         val namespacePrefixes = config.getNamespacePrefixes();
-        if(namespacePrefixes.isEmpty()) {
-            return false; // export none
-        }
-
         if(config.isNamespacePrefixAny()) {
             return true; // export all
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 8f94c18df8..d0cc5e3cea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -232,7 +232,6 @@ public class MetaModelServiceDefault implements MetaModelService {
         if(config.isIncludeShadowedFacets()) {
             metaModelAnnotators.add(new ShadowedFactetAttributeAnnotator(new ExporterConfig(){}));
         }
-
         return new MetaModelExporter(specificationLoader, metaModelAnnotators)
                 .exportMetaModel(config);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/ShadowedFactetAttributeAnnotator.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/ShadowedFactetAttributeAnnotator.java
index eeb987bb38..443a79b739 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/ShadowedFactetAttributeAnnotator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/ShadowedFactetAttributeAnnotator.java
@@ -18,8 +18,10 @@
  */
 package org.apache.isis.core.metamodel.services.metamodel;
 
+import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
@@ -82,11 +84,14 @@ public class ShadowedFactetAttributeAnnotator implements MetaModelAnnotator {
         lookupByName(facetType, attributeName)
         .ifPresent(facetAttr->{
             createAnnotation(facetAttr, "@shadowed", annotation);
+            //createAnnotation(facetAttr, "@title.prefixParentWithExclamation", "");
         });
     }
 
     private Optional<FacetAttr> lookupByName(final Facet facetType, final String attributeName) {
-        return Optional.empty();
+        return _NullSafe.stream(facetType.getAttr())
+        .filter(a->Objects.equals(attributeName, a.getName()))
+        .findFirst();
     }
 
 }