You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/06/02 05:37:55 UTC

[isis] 02/02: ISIS-2712: metamodel XML downloads now filter on namespace rather than package

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2712
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 159448d661bbbb3a0068ec56dbe39f3de5fd044b
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jun 2 06:36:24 2021 +0100

    ISIS-2712: metamodel XML downloads now filter on namespace rather than package
---
 .../metamodel/Object_downloadMetamodelXml.java     | 15 ++++++++---
 .../isis/applib/services/metamodel/Config.java     | 30 +++++++++-------------
 .../applib/services/metamodel/DomainMember.java    |  1 +
 .../services/metamodel/MetaModelService.java       |  2 +-
 .../services/metamodel/MetaModelServiceMenu.java   | 18 ++++++-------
 .../metamodel/MetaModelService_Config_Test.java    | 18 ++++++-------
 .../metamodel/inspect/Object_inspectMetamodel.java | 17 +++++++++---
 .../services/metamodel/DomainMemberDefault.java    |  5 ++++
 .../services/metamodel/MetaModelExporter.java      | 27 ++++++++++---------
 .../metamodel/MetaModelServiceDefault.java         |  3 +--
 10 files changed, 76 insertions(+), 60 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
index 1d6da64..e556dc3 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/mixins/metamodel/Object_downloadMetamodelXml.java
@@ -19,6 +19,7 @@
 package org.apache.isis.applib.mixins.metamodel;
 
 import java.util.Objects;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
@@ -29,9 +30,11 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.mixins.dto.DtoMixinConstants;
 import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
 import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.applib.services.metamodel.MetaModelServiceMenu;
@@ -75,7 +78,13 @@ public class Object_downloadMetamodelXml {
                     describedAs = DtoMixinConstants.FILENAME_PROPERTY_DESCRIPTION)
             final String fileName) {
 
-        val pkg = holder.getClass().getPackage().getName();
+
+        final Optional<LogicalType> logicalTypeIfAny = metaModelService.lookupLogicalTypeByClass(holder.getClass());
+        if(!logicalTypeIfAny.isPresent()) {
+            messageService.warnUser("Unknown class, unable to export");
+            return null;
+        }
+        final String namespace = logicalTypeIfAny.get().getNamespace();
 
         val config =
                 new Config()
@@ -83,7 +92,7 @@ public class Object_downloadMetamodelXml {
                 .withIgnoreAbstractClasses()
                 .withIgnoreInterfaces()
                 .withIgnoreBuiltInValueTypes()
-                .withPackagePrefix(pkg);
+                .withNamespacePrefix(namespace);
 
         val metamodelDto = metaModelService.exportMetaModel(config);
 
@@ -108,8 +117,8 @@ public class Object_downloadMetamodelXml {
 
 
     @Inject MetaModelService metaModelService;
+    @Inject MessageService messageService;
     @Inject JaxbService jaxbService;
-    @Inject MetaModelServiceMenu metaModelServiceMenu;
 
 
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/Config.java b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/Config.java
index b6e7c0c..75528c0 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/Config.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/Config.java
@@ -44,19 +44,19 @@ public class Config {
 
     private final int mask;
 
-    private final Set<String> packagePrefixes = _Sets.newHashSet();
+    private final Set<String> namespacePrefixes = _Sets.newHashSet();
 
     public Config() {
         this(0, Collections.emptyList());
     }
 
-    private Config(final int mask, final Collection<String> packagePrefixes) {
+    private Config(final int mask, final Collection<String> namespacePrefixes) {
         this.mask = mask;
-        this.packagePrefixes.addAll(packagePrefixes);
+        this.namespacePrefixes.addAll(namespacePrefixes);
     }
 
-    public Set<String> getPackagePrefixes() {
-        return Collections.unmodifiableSet(packagePrefixes);
+    public Set<String> getNamespacePrefixes() {
+        return Collections.unmodifiableSet(namespacePrefixes);
     }
 
     public Config withIgnoreNoop() {
@@ -80,28 +80,22 @@ public class Config {
     }
 
     private Config newConfigWith(final int x) {
-        return new Config(mask | x, packagePrefixes);
+        return new Config(mask | x, namespacePrefixes);
     }
 
-    public Config withPackagePrefixAny() {
-        val newPrefixes = _Sets.<String>newHashSet();
-        newPrefixes.add(WILDCARD);
-        return new Config(mask, newPrefixes);
-    }
-
-    public boolean isPackagePrefixAny() {
-        return packagePrefixes.contains(WILDCARD);
+    public boolean isNamespacePrefixAny() {
+        return namespacePrefixes.contains(WILDCARD);
     }
 
     /**
      * Returns a new {@code Config} with given {@code packagePrefix} added to the set of
      * this {@code Config}'s packagePrefixes.
      *
-     * @param packagePrefix - prefix to be added
+     * @param namespacePrefix - prefix to be added
      */
-    public Config withPackagePrefix(final String packagePrefix) {
-        val newPrefixes = _Sets.newHashSet(this.packagePrefixes);
-        newPrefixes.add(packagePrefix);
+    public Config withNamespacePrefix(final String namespacePrefix) {
+        val newPrefixes = _Sets.newHashSet(this.namespacePrefixes);
+        newPrefixes.add(namespacePrefix);
         return new Config(mask, newPrefixes);
     }
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/DomainMember.java b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/DomainMember.java
index 2738114..bd1c938 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/DomainMember.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/DomainMember.java
@@ -27,6 +27,7 @@ public interface DomainMember extends Comparable<DomainMember> {
     String getClassType();
 
     String getLogicalTypeName();
+    String getNamespace();
     String getClassName();
     String getPackageName();
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
index 1cf783b..bf60e83 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelService.java
@@ -128,7 +128,7 @@ public interface MetaModelService {
      * <p>
      *     The {@link Config} parameter can be used to restrict/filter the
      *     export to some subset of the metamodel; in particular to specific
-     *     {@link Config#getPackagePrefixes() package prefixes}.
+     *     {@link Config#getNamespacePrefixes() namespace prefixes}.
      * </p>
      *
      * @param config - restricts/filters to a subsets of the metamodel.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
index 63e81e7..3c8b597 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServiceMenu.java
@@ -122,8 +122,8 @@ public class MetaModelServiceMenu {
             @ParameterLayout(named = ".xml file name")
             final String fileName,
             @ParameterLayout(named = "Packages",
-            describedAs="Subset of the complete meta model, only including packages starting with given prefix.")
-            final List<String> packages,
+            describedAs="Subset of the complete meta model, only including namespaces starting with given prefix")
+            final List<String> namespaces,
             @ParameterLayout(named = "Ignore Interfaces")
             @Parameter(optionality=Optionality.MANDATORY)
             final boolean ignoreInterfaces
@@ -135,8 +135,8 @@ public class MetaModelServiceMenu {
                 .withIgnoreAbstractClasses()
                 .withIgnoreInterfaces()
                 .withIgnoreBuiltInValueTypes();
-        for (final String pkg : packages) {
-            config = config.withPackagePrefix(pkg);
+        for (final String namespace : namespaces) {
+            config = config.withNamespacePrefix(namespace);
         }
         if(ignoreInterfaces) {
             config = config.withIgnoreInterfaces();
@@ -166,20 +166,20 @@ public class MetaModelServiceMenu {
     public List<String> choices1DownloadMetaModelXml() {
         final DomainModel domainModel = metaModelService.getDomainModel();
         final List<DomainMember> export = domainModel.getDomainMembers();
-        final SortedSet<String> packages = _Sets.newTreeSet();
+        final SortedSet<String> namespaces = _Sets.newTreeSet();
         for (final DomainMember domainMember : export) {
-            final String packageName = domainMember.getPackageName();
-            final String[] split = packageName.split("[.]");
+            final String namespace = domainMember.getNamespace();
+            final String[] split = namespace.split("[.]");
             final StringBuilder buf = new StringBuilder();
             for (final String part : split) {
                 if(buf.length() > 0) {
                     buf.append(".");
                 }
                 buf.append(part);
-                packages.add(buf.toString());
+                namespaces.add(buf.toString());
             }
         }
-        return new ArrayList<>(packages);
+        return new ArrayList<>(namespaces);
     }
 
     public boolean default2DownloadMetaModelXml() {
diff --git a/api/applib/src/test/java/org/apache/isis/applib/services/metamodel/MetaModelService_Config_Test.java b/api/applib/src/test/java/org/apache/isis/applib/services/metamodel/MetaModelService_Config_Test.java
index 9719004..956f203 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/services/metamodel/MetaModelService_Config_Test.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/services/metamodel/MetaModelService_Config_Test.java
@@ -47,29 +47,29 @@ public class MetaModelService_Config_Test {
     }
 
     @Test
-    public void packages_prefixes() throws Exception {
+    public void namespace_prefixes() throws Exception {
 
         // when
         Config config = new Config();
         // then
-        assertThat(config.getPackagePrefixes(), is(emptyCollectionOf(String.class)));
+        assertThat(config.getNamespacePrefixes(), is(emptyCollectionOf(String.class)));
 
         // and when
-        Config config2 = config.withPackagePrefix("org.foo");
+        Config config2 = config.withNamespacePrefix("org.foo");
 
         // then
         assertNotSame(config, config2);
-        assertThat(config2.getPackagePrefixes().size(), is(equalTo(1)));
-        assertThat(config2.getPackagePrefixes().iterator().next(), is(equalTo("org.foo")));
+        assertThat(config2.getNamespacePrefixes().size(), is(equalTo(1)));
+        assertThat(config2.getNamespacePrefixes().iterator().next(), is(equalTo("org.foo")));
 
         // and when
-        Config config3 = config2.withPackagePrefix("org.bar");
+        Config config3 = config2.withNamespacePrefix("org.bar");
 
         // then
         assertNotSame(config, config3);
         assertNotSame(config2, config3);
-        assertThat(config3.getPackagePrefixes().size(), is(equalTo(2)));
-        assertTrue(config3.getPackagePrefixes().contains("org.foo"));
-        assertTrue(config3.getPackagePrefixes().contains("org.bar"));
+        assertThat(config3.getNamespacePrefixes().size(), is(equalTo(2)));
+        assertTrue(config3.getNamespacePrefixes().contains("org.foo"));
+        assertTrue(config3.getNamespacePrefixes().contains("org.bar"));
     }
 }
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 d060481..e8bf35f 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
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.inspect;
 
 import java.util.Objects;
+import java.util.Optional;
 
 import javax.inject.Inject;
 
@@ -29,7 +30,10 @@ import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.graph.tree.TreePath;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
+import org.apache.isis.applib.services.jaxb.JaxbService;
+import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.metamodel.Config;
 import org.apache.isis.applib.services.metamodel.MetaModelService;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
@@ -55,8 +59,6 @@ import lombok.val;
 @RequiredArgsConstructor
 public class Object_inspectMetamodel {
 
-    @Inject private MetaModelService metaModelService;
-    //@Inject private SpecificationLoader specificationLoader;
 
     private final Object holder;
 
@@ -65,7 +67,12 @@ public class Object_inspectMetamodel {
 
     public Object act() {
 
-        val pkg = holder.getClass().getPackage().getName();
+        final Optional<LogicalType> logicalTypeIfAny = metaModelService.lookupLogicalTypeByClass(holder.getClass());
+        if(!logicalTypeIfAny.isPresent()) {
+            messageService.warnUser("Unknown class, unable to export");
+            return null;
+        }
+        final String namespace = logicalTypeIfAny.get().getNamespace();
 
         val config =
                 new Config()
@@ -73,7 +80,7 @@ public class Object_inspectMetamodel {
                 .withIgnoreAbstractClasses()
                 .withIgnoreInterfaces()
                 .withIgnoreBuiltInValueTypes()
-                .withPackagePrefix(pkg);
+                .withNamespacePrefix(namespace);
 
         val metamodelDto = metaModelService.exportMetaModel(config);
 
@@ -99,5 +106,7 @@ public class Object_inspectMetamodel {
         return tree;
     }
 
+    @Inject private MetaModelService metaModelService;
+    @Inject MessageService messageService;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
index 03dc543..aa07dea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/DomainMemberDefault.java
@@ -114,6 +114,11 @@ public class DomainMemberDefault implements DomainMember {
         return spec.getLogicalTypeName();
     }
 
+    @Override
+    public String getNamespace() {
+        return spec.getLogicalType().getNamespace();
+    }
+
     @XmlElement @Override
     public String getClassName() {
         final String fullIdentifier = spec.getFullIdentifier();
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 7521da4..b10e475 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
@@ -82,7 +82,7 @@ class MetaModelExporter {
         // these are added into a map for lookups in phase 2
         final Map<ObjectSpecification, DomainClassDto> domainClassByObjectSpec = _Maps.newHashMap();
         for (final ObjectSpecification specification : specificationLookup.snapshotSpecifications()) {
-            DomainClassDto domainClassType = asXsdType(specification, config);
+            DomainClassDto domainClassType = asXsdType(specification);
             domainClassByObjectSpec.put(specification, domainClassType);
         }
 
@@ -135,7 +135,7 @@ class MetaModelExporter {
     }
 
     private boolean shouldIgnore(final Config config, final ObjectSpecification specification) {
-        return notInPackagePrefixes(specification, config) ||
+        return notInNamespacePrefixes(specification, config) ||
                 config.isIgnoreMixins() && specification.isMixin() ||
                 config.isIgnoreInterfaces() && specification.getCorrespondingClass().isInterface() ||
                 config.isIgnoreAbstractClasses() && Modifier.isAbstract(specification.getCorrespondingClass().getModifiers()) ||
@@ -148,27 +148,27 @@ class MetaModelExporter {
         return x;
     }
 
-    private boolean notInPackagePrefixes(
+    private boolean notInNamespacePrefixes(
             final ObjectSpecification specification, final Config config) {
-        return !inPackagePrefixes(specification, config);
+        return !inNamespacePrefixes(specification, config);
     }
 
-    private boolean inPackagePrefixes(
+    private boolean inNamespacePrefixes(
             final ObjectSpecification specification,
             final Config config) {
 
-        val prefixes = config.getPackagePrefixes();
-        if(prefixes.isEmpty()) {
+        val namespacePrefixes = config.getNamespacePrefixes();
+        if(namespacePrefixes.isEmpty()) {
             return false; // export none
         }
 
-        if(config.isPackagePrefixAny()) {
+        if(config.isNamespacePrefixAny()) {
             return true; // export all
         }
 
-        val canonicalName = specification.getCorrespondingClass().getCanonicalName();
-        for (val prefix : prefixes) {
-            if(canonicalName.startsWith(prefix)) {
+        val logicalTypeName = specification.getLogicalTypeName();
+        for (val prefix : namespacePrefixes) {
+            if(logicalTypeName.startsWith(prefix)) {
                 return true;
             }
         }
@@ -176,8 +176,7 @@ class MetaModelExporter {
     }
 
     private DomainClassDto asXsdType(
-            final ObjectSpecification specification,
-            final Config config) {
+            final ObjectSpecification specification) {
 
         final DomainClassDto domainClass = new DomainClassDto();
 
@@ -334,7 +333,7 @@ class MetaModelExporter {
             final Config config) {
         DomainClassDto value = domainClassByObjectSpec.get(specification);
         if(value == null) {
-            final DomainClassDto domainClass = asXsdType(specification, config);
+            final DomainClassDto domainClass = asXsdType(specification);
             domainClassByObjectSpec.put(specification, domainClass);
             value = domainClass;
         }
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 34a20c6..401cb6a 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
@@ -87,7 +87,6 @@ public class MetaModelServiceDefault implements MetaModelService {
         specificationLoader.reloadSpecification(domainType);
     }
 
-    // //////////////////////////////////////
 
 
 
@@ -143,7 +142,7 @@ public class MetaModelServiceDefault implements MetaModelService {
         return className.startsWith("java") || className.startsWith("org.joda");
     }
 
-    // //////////////////////////////////////
+
 
     @Override
     public BeanSort sortOf(