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());