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 18ecc00c44 ISIS-2297: MM export menu to allow various formats to 
choose from
18ecc00c44 is described below

commit 18ecc00c446a7f7b570a1b19901b37a4050897b1
Author: Andi Huber <[email protected]>
AuthorDate: Mon Dec 5 13:42:55 2022 +0100

    ISIS-2297: MM export menu to allow various formats to choose from
---
 .../services/metamodel/MetaModelServiceMenu.java   | 128 ++++++++++-----------
 .../domainmodel/MetaModelRegressionTest.java       |  13 +--
 2 files changed, 65 insertions(+), 76 deletions(-)

diff --git 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
index 4cc0d804e3..40a0cc56bb 100644
--- 
a/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
+++ 
b/api/applib/src/main/java/org/apache/causeway/applib/services/metamodel/MetaModelServiceMenu.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.SortedSet;
+import java.util.function.BiFunction;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -44,8 +45,13 @@ import org.apache.causeway.applib.annotation.SemanticsOf;
 import org.apache.causeway.applib.services.jaxb.JaxbService;
 import org.apache.causeway.applib.value.Blob;
 import org.apache.causeway.applib.value.Clob;
+import org.apache.causeway.applib.value.NamedWithMimeType;
 import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.causeway.commons.internal.collections._Sets;
+import org.apache.causeway.commons.internal.resources._Json;
+import org.apache.causeway.commons.internal.resources._Xml;
+import org.apache.causeway.commons.internal.resources._Xml.WriteOptions;
+import org.apache.causeway.commons.internal.resources._Yaml;
 import org.apache.causeway.schema.metamodel.v2.MetamodelDto;
 
 import lombok.val;
@@ -102,111 +108,97 @@ public class MetaModelServiceMenu {
 
     }
 
-
-    @Action(
-            domainEvent = downloadMetaModelXml.ActionDomainEvent.class,
-            semantics = SemanticsOf.NON_IDEMPOTENT, //disable client-side 
caching
-            restrictTo = RestrictTo.PROTOTYPING
-            )
-    @ActionLayout(
-            cssClassFa = "fa-download",
-            named = "Download Meta Model (XML)",
-            sequence="500.500.2")
-    public class downloadMetaModelXml{
-
-        public class ActionDomainEvent extends 
MetaModelServiceMenu.ActionDomainEvent<downloadMetaModelXml> { }
-
-        @MemberSupport public Blob act(
-                @ParameterLayout(named = ".xml file name")
-                final String fileName,
-
-                @ParameterLayout(named = "Namespaces",
-                        describedAs="Subset of the complete meta model, only 
including namespaces starting with given prefix")
-                final List<String> namespaces,
-
-                @ParameterLayout()
-                @Parameter(optionality=Optionality.MANDATORY)
-                final boolean includeInterfaces
-        ) {
-
-            val config = defaultConfig(includeInterfaces, namespaces);
-
-            final MetamodelDto metamodelDto =  
metaModelService.exportMetaModel(config);
-
-            final String xml = jaxbService.toXml(metamodelDto);
-
-            return Clob.of(fileName, CommonMimeType.XML, xml)
-                    .toBlob(UTF_8)
-                    .zip();
-        }
-
-        @MemberSupport public String validateAct(
-                final String fileName, final List<String> namespacePrefixes, 
final boolean includeInterfaces) {
-            if(namespacePrefixes == null || namespacePrefixes.isEmpty()) {
-                return "At least one package must be selected";
+    public static enum ExportFormat implements BiFunction<String, 
MetamodelDto, Clob>  {
+        JSON{
+            @Override public Clob apply(final String fileName, final 
MetamodelDto dto) {
+                val content = _Json.toString(dto);
+                return Clob.of(fileName, CommonMimeType.JSON, content);
             }
-            return null;
-        }
-
-        @MemberSupport public String default0Act() { return "metamodel.xml"; }
-        @MemberSupport public List<String> choices1Act() { return 
namespaceChoices(); }
-        @MemberSupport public boolean default2Act() { return false; }
-
+        },
+        XML{
+            @Override public Clob apply(final String fileName, final 
MetamodelDto dto) {
+                val content = _Xml.writeXml(dto, 
WriteOptions.builder().formattedOutput(true).build())
+                        .ifFailureFail()
+                        .getValue()
+                        .orElse("");
+                return Clob.of(fileName, CommonMimeType.XML, content);
+            }
+        },
+        YAML{
+            @Override public Clob apply(final String fileName, final 
MetamodelDto dto) {
+                val content = 
_Yaml.toString(dto).ifFailureFail().getValue().orElse("");
+                return Clob.of(fileName, CommonMimeType.YAML, content);
+            }
+        },
+        ASCII{
+            @Override public Clob apply(final String fileName, final 
MetamodelDto dto) {
+                val content = _AsciiExport.toAscii(dto).toString();
+                return Clob.of(fileName, CommonMimeType.TXT, content);
+            }
+        },
     }
 
 
     @Action(
-            domainEvent = downloadMetaModelAscii.ActionDomainEvent.class,
+            domainEvent = downloadMetaModel.ActionDomainEvent.class,
             semantics = SemanticsOf.NON_IDEMPOTENT, //disable client-side 
caching
             restrictTo = RestrictTo.PROTOTYPING
             )
     @ActionLayout(
             cssClassFa = "fa-download",
-            named = "Download Meta Model (Ascii)",
+            named = "Download Meta Model",
             sequence="500.500.2")
-    public class downloadMetaModelAscii{
+    public class downloadMetaModel {
 
-        public class ActionDomainEvent extends 
MetaModelServiceMenu.ActionDomainEvent<downloadMetaModelAscii> { }
+        public class ActionDomainEvent extends 
MetaModelServiceMenu.ActionDomainEvent<downloadMetaModel> { }
 
-        @MemberSupport public Blob act(
-                @ParameterLayout(named = ".txt file name")
+        @MemberSupport public NamedWithMimeType act(
+                @ParameterLayout(named = ".xml file name")
                 final String fileName,
 
                 @ParameterLayout(named = "Namespaces",
                         describedAs="Subset of the complete meta model, only 
including namespaces starting with given prefix")
                 final List<String> namespaces,
 
-                @ParameterLayout()
-                @Parameter(optionality=Optionality.MANDATORY)
-                final boolean includeInterfaces
+                @Parameter
+                final boolean includeInterfaces,
+
+                @Parameter
+                final ExportFormat exportFormat,
+
+                @Parameter
+                final boolean zip
         ) {
 
             val config = defaultConfig(includeInterfaces, namespaces);
 
             final MetamodelDto metamodelDto =  
metaModelService.exportMetaModel(config);
 
-            final StringBuilder ascii = _AsciiExport.toAscii(metamodelDto);
-
-            return Clob.of(fileName, CommonMimeType.TXT, ascii)
-                    .toBlob(UTF_8)
-                    .zip();
+            val clob = exportFormat.apply(fileName, metamodelDto);
+            return zip
+                    ? clob
+                            .toBlob(UTF_8)
+                            .zip()
+                    : clob;
         }
 
         @MemberSupport public String validateAct(
-                final String fileName, final List<String> namespacePrefixes, 
final boolean includeInterfaces) {
+                final String fileName, final List<String> namespacePrefixes, 
final boolean includeInterfaces,
+                final ExportFormat exportFormat, final boolean zip) {
             if(namespacePrefixes == null || namespacePrefixes.isEmpty()) {
                 return "At least one package must be selected";
             }
             return null;
         }
 
-        @MemberSupport public String default0Act() { return "metamodel.txt"; }
-        @MemberSupport public List<String> choices1Act() { return 
namespaceChoices(); }
-        @MemberSupport public boolean default2Act() { return false; }
+        @MemberSupport public String defaultFileName() { return 
"metamodel.xml"; }
+        @MemberSupport public List<String> choicesNamespaces() { return 
namespaceChoices(); }
+        @MemberSupport public boolean defaultIncludeInterfaces() { return 
false; }
+        @MemberSupport public ExportFormat defaultExportFormat() { return 
ExportFormat.XML; }
+        @MemberSupport public boolean defaultZip() { return true; }
 
     }
 
-
     @Action(
             domainEvent = downloadMetaModelDiff.ActionDomainEvent.class,
             semantics = SemanticsOf.NON_IDEMPOTENT, //disable client-side 
caching
diff --git 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.java
 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.java
index 90a9ef0825..0c4923bde0 100644
--- 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.java
+++ 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/causeway/testdomain/domainmodel/MetaModelRegressionTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.causeway.testdomain.domainmodel;
 
-import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 import javax.inject.Inject;
@@ -36,8 +35,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import org.apache.causeway.applib.services.factory.FactoryService;
 import org.apache.causeway.applib.services.metamodel.MetaModelServiceMenu;
-import org.apache.causeway.applib.value.Blob;
-import org.apache.causeway.applib.value.NamedWithMimeType.CommonMimeType;
+import 
org.apache.causeway.applib.services.metamodel.MetaModelServiceMenu.ExportFormat;
+import org.apache.causeway.applib.value.Clob;
 import org.apache.causeway.core.config.presets.CausewayPresets;
 import org.apache.causeway.testdomain.conf.Configuration_headless;
 import 
org.apache.causeway.testdomain.model.good.Configuration_usingValidDomain;
@@ -79,12 +78,10 @@ class MetaModelRegressionTest {
         // disable if rename, as the .zip file needs to be updated.
         // Assumptions.assumeThat(getClass().getName()).contains("causeway");
 
-        final Blob metaModelZip = factoryService
-                .mixin(MetaModelServiceMenu.downloadMetaModelXml.class, 
metaModelServiceMenu)
-                .act("metamodel.xml", namespaces(), true);
+        final Clob metaModelZip = (Clob) factoryService
+                .mixin(MetaModelServiceMenu.downloadMetaModel.class, 
metaModelServiceMenu)
+                .act("metamodel", namespaces(), true, ExportFormat.XML, false);
         final String xml = metaModelZip
-                .unZip(CommonMimeType.XML)
-                .toClob(StandardCharsets.UTF_8)
                 .asString();
 
         Approvals.verify(xml, options());

Reply via email to