diff --git a/CHANGELOG.md b/CHANGELOG.md index 0705d0817..196f3964e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- type handlers for XML (DocTypeHandlerCoreXML and DocTypeHandlerCoreXMLUTF8) +- type handlers for JSON (DocTypeHandlerCoreJSON and DocTypeHandlerCoreJSONUTF8) +- type handlers for JSON (DocTypeHandlerCoreYAML and DocTypeHandlerCoreYAMLUTF8) + +### Fixed + +- org.fugerit.java.doc.base.config.DocTypeHandlerXML renders the source document in the source format (i.e. JSON or YAML) + ## [8.16.5] - 2025-09-29 ### Changed diff --git a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonToXml.java b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonToXml.java index 11be5ecda..e15bac66e 100644 --- a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonToXml.java +++ b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocJsonToXml.java @@ -8,6 +8,7 @@ import org.fugerit.java.core.xml.dom.DOMIO; import org.fugerit.java.doc.base.config.DocVersion; import org.fugerit.java.doc.base.facade.DocFacade; +import org.fugerit.java.doc.base.parser.DocConvert; import org.fugerit.java.doc.base.parser.DocParserContext; import org.fugerit.java.xml2json.XmlToJsonHandler; import org.w3c.dom.Element; @@ -15,12 +16,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -public class DocJsonToXml { +public class DocJsonToXml implements DocConvert { - private XmlToJsonHandler handler; + private final XmlToJsonHandler handler; public DocJsonToXml() { - this( new ObjectMapper() ); + this( JsonConstants.getDefaultMapper() ); } public DocJsonToXml(ObjectMapper mapper) { @@ -71,5 +72,10 @@ public Element convert( JsonNode json ) throws ConfigException { this.setIfNotFound(root, ATT_XSD_LOC, DocParserContext.createXsdVersionXmlns( xsdVersion )); return root; } - + + @Override + public void convert(Reader from, Writer to) throws ConfigException { + this.writerAsXml(from, to); + } + } diff --git a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocXmlToJson.java b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocXmlToJson.java index 8fdca16e7..2efc4716a 100644 --- a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocXmlToJson.java +++ b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/DocXmlToJson.java @@ -1,9 +1,11 @@ package org.fugerit.java.doc.json.parse; import java.io.Reader; +import java.io.Writer; import org.fugerit.java.core.cfg.ConfigException; import org.fugerit.java.core.xml.dom.DOMIO; +import org.fugerit.java.doc.base.parser.DocConvert; import org.fugerit.java.xml2json.XmlToJsonHandler; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -11,12 +13,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -public class DocXmlToJson { +public class DocXmlToJson implements DocConvert { - private XmlToJsonHandler hanlder; + private final XmlToJsonHandler handler; public DocXmlToJson() { - this( new ObjectMapper() ); + this( JsonConstants.getDefaultMapper() ); } public DocXmlToJson(ObjectMapper mapper) { @@ -25,7 +27,7 @@ public DocXmlToJson(ObjectMapper mapper) { public DocXmlToJson(XmlToJsonHandler handler) { super(); - this.hanlder = handler; + this.handler = handler; } public JsonNode convertToJsonNode( Reader xml ) throws ConfigException { @@ -37,7 +39,11 @@ public JsonNode convertToJsonNode( Reader xml ) throws ConfigException { } public JsonNode convert( Element root ) throws ConfigException { - return ConfigException.get( () -> this.hanlder.convert( root ) ); + return ConfigException.get( () -> this.handler.convert( root ) ); + } + + @Override + public void convert(Reader from, Writer to) throws ConfigException { + ConfigException.apply( () -> this.handler.getMapper().writerWithDefaultPrettyPrinter().writeValue( to, this.convertToJsonNode( from ) ) ); } - } diff --git a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/JsonConstants.java b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/JsonConstants.java new file mode 100644 index 000000000..e2e9ba8e7 --- /dev/null +++ b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/parse/JsonConstants.java @@ -0,0 +1,15 @@ +package org.fugerit.java.doc.json.parse; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonConstants { + + private JsonConstants() {} + + private static final ObjectMapper DEFAULT_MAPPER = new ObjectMapper(); + + public static ObjectMapper getDefaultMapper() { + return DEFAULT_MAPPER; + } + +} diff --git a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSON.java b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSON.java new file mode 100644 index 000000000..c67c3d592 --- /dev/null +++ b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSON.java @@ -0,0 +1,39 @@ +package org.fugerit.java.doc.json.typehandler; + +import org.fugerit.java.doc.base.config.*; +import org.fugerit.java.doc.base.facade.DocFacadeSource; + +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class DocTypeHandlerCoreJSON extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = -50249858785381015L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreJSON(); + + public static final DocTypeHandler HANDLER_UTF8 = new DocTypeHandlerCoreJSON( StandardCharsets.UTF_8 ); + + public static final String TYPE = DocConfig.TYPE_JSON; + + public static final String MODULE = "doc-core"; + + public DocTypeHandlerCoreJSON(Charset charset ) { + super( TYPE, MODULE, null, charset ); + } + + public DocTypeHandlerCoreJSON() { + super( TYPE, MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocFacadeSource.getInstance().convert( docInput.getReader(), + docInput.getSource(), new OutputStreamWriter( docOutput.getOs() ), DocFacadeSource.SOURCE_TYPE_JSON ); + } + +} diff --git a/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSONUTF8.java b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSONUTF8.java new file mode 100644 index 000000000..1bbf74f77 --- /dev/null +++ b/fj-doc-base-json/src/main/java/org/fugerit/java/doc/json/typehandler/DocTypeHandlerCoreJSONUTF8.java @@ -0,0 +1,16 @@ +package org.fugerit.java.doc.json.typehandler; + +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDecorator; + +public class DocTypeHandlerCoreJSONUTF8 extends DocTypeHandlerDecorator { + + private static final long serialVersionUID = -8512951518109L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreJSONUTF8(); + + public DocTypeHandlerCoreJSONUTF8() { + super( DocTypeHandlerCoreJSON.HANDLER_UTF8 ); + } + +} diff --git a/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/parse/TestDocJsonToXml.java b/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/parse/TestDocJsonToXml.java index 9c6609977..945421f34 100644 --- a/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/parse/TestDocJsonToXml.java +++ b/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/parse/TestDocJsonToXml.java @@ -46,7 +46,7 @@ void testConvert() { try ( InputStreamReader reader = new InputStreamReader( ClassHelper.loadFromDefaultClassLoader( "sample/doc_test_01.json" ) ); StringWriter writer = new StringWriter() ) { DocJsonToXml converter = new DocJsonToXml(); - converter.writerAsXml(reader, writer); + converter.convert(reader, writer); return writer.toString(); } } ) ); diff --git a/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/typehandler/TestJsonHandlers.java b/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/typehandler/TestJsonHandlers.java new file mode 100644 index 000000000..50ba0833e --- /dev/null +++ b/fj-doc-base-json/src/test/java/test/org/fugerit/java/doc/json/typehandler/TestJsonHandlers.java @@ -0,0 +1,32 @@ +package test.org.fugerit.java.doc.json.typehandler; + +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.json.typehandler.DocTypeHandlerCoreJSONUTF8; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.StringReader; + +class TestJsonHandlers { + + private static final String INPUT_DOC = ""; + + private static final String OUTPUT_DOC = "{\n" + + " \"_t\" : \"doc\"\n" + + "}"; + + @Test + void testHandler() throws Exception { + DocTypeHandler handler = DocTypeHandlerCoreJSONUTF8.HANDLER; + try (StringReader from = new StringReader(INPUT_DOC); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ) { + handler.handle(DocInput.newInput( handler.getType(), from ), DocOutput.newOutput(os)); + Assertions.assertEquals( OUTPUT_DOC, os.toString() ); + } + } + +} diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocJsonToYaml.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocJsonToYaml.java new file mode 100644 index 000000000..c014c846a --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocJsonToYaml.java @@ -0,0 +1,11 @@ +package org.fugerit.java.doc.yaml.parse; + +import org.fugerit.java.doc.json.parse.JsonConstants; + +public class DocJsonToYaml extends DocYamlToJson { + + public DocJsonToYaml() { + super(JsonConstants.getDefaultMapper(), YamlConstants.getDefaultMapper()); + } + +} diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocXmlToYaml.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocXmlToYaml.java new file mode 100644 index 000000000..995d47038 --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocXmlToYaml.java @@ -0,0 +1,11 @@ +package org.fugerit.java.doc.yaml.parse; + +import org.fugerit.java.doc.json.parse.DocXmlToJson; + +public class DocXmlToYaml extends DocXmlToJson { + + public DocXmlToYaml() { + super( YamlConstants.getDefaultMapper() ); + } + +} diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlParser.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlParser.java index 0c124af3e..1d7e4898b 100644 --- a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlParser.java +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlParser.java @@ -4,8 +4,6 @@ import org.fugerit.java.doc.json.parse.DocJsonParser; import org.fugerit.java.xml2json.XmlToJsonHandler; -import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; - public class DocYamlParser extends DocJsonParser { public DocYamlParser( XmlToJsonHandler handler ) { @@ -13,7 +11,7 @@ public DocYamlParser( XmlToJsonHandler handler ) { } public DocYamlParser() { - this( new XmlToJsonHandler( new YAMLMapper() ) ); + this( new XmlToJsonHandler( YamlConstants.getDefaultMapper() ) ); } } diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToJson.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToJson.java new file mode 100644 index 000000000..613d1241c --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToJson.java @@ -0,0 +1,35 @@ +package org.fugerit.java.doc.yaml.parse; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.doc.base.parser.DocConvert; +import org.fugerit.java.doc.json.parse.JsonConstants; + +import java.io.Reader; +import java.io.Writer; + +public class DocYamlToJson implements DocConvert { + + private ObjectMapper mapperFrom; + + private ObjectMapper mapperTo; + + public DocYamlToJson() { + this( YamlConstants.getDefaultMapper(), JsonConstants.getDefaultMapper() ); + } + + public DocYamlToJson(ObjectMapper mapperFrom, ObjectMapper mapperTo) { + this.mapperFrom = mapperFrom; + this.mapperTo = mapperTo; + } + + @Override + public void convert(Reader from, Writer to) throws ConfigException { + ConfigException.apply( () -> { + JsonNode node = this.mapperFrom.readTree( from ); + this.mapperTo.writerWithDefaultPrettyPrinter().writeValue(to, node); + } ); + } + +} diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToXml.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToXml.java index bc09e21d2..aca35bbfe 100644 --- a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToXml.java +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/DocYamlToXml.java @@ -3,12 +3,11 @@ import org.fugerit.java.doc.json.parse.DocJsonToXml; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; public class DocYamlToXml extends DocJsonToXml { public DocYamlToXml() { - super( new ObjectMapper( new YAMLFactory() ) ); + super( YamlConstants.getDefaultMapper() ); } public DocYamlToXml(ObjectMapper mapper) { diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/YamlConstants.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/YamlConstants.java new file mode 100644 index 000000000..5480941f6 --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/parse/YamlConstants.java @@ -0,0 +1,18 @@ +package org.fugerit.java.doc.yaml.parse; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; + +public class YamlConstants { + + private YamlConstants() {} + + private static final ObjectMapper DEFAULT_MAPPER = new YAMLMapper(); + + public static ObjectMapper getDefaultMapper() { + return DEFAULT_MAPPER; + } + +} + + diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAML.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAML.java new file mode 100644 index 000000000..c27eaeadf --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAML.java @@ -0,0 +1,39 @@ +package org.fugerit.java.doc.yaml.typehandler; + +import org.fugerit.java.doc.base.config.*; +import org.fugerit.java.doc.base.facade.DocFacadeSource; + +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class DocTypeHandlerCoreYAML extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = -50249858785381015L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreYAML(); + + public static final DocTypeHandler HANDLER_UTF8 = new DocTypeHandlerCoreYAML( StandardCharsets.UTF_8 ); + + public static final String TYPE = DocConfig.TYPE_YAML; + + public static final String MODULE = "doc-core"; + + public DocTypeHandlerCoreYAML(Charset charset ) { + super( TYPE, MODULE, null, charset ); + } + + public DocTypeHandlerCoreYAML() { + super( TYPE, MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocFacadeSource.getInstance().convert( docInput.getReader(), + docInput.getSource(), new OutputStreamWriter( docOutput.getOs() ), DocFacadeSource.SOURCE_TYPE_YAML ); + } + +} diff --git a/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAMLUTF8.java b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAMLUTF8.java new file mode 100644 index 000000000..0f90c58e7 --- /dev/null +++ b/fj-doc-base-yaml/src/main/java/org/fugerit/java/doc/yaml/typehandler/DocTypeHandlerCoreYAMLUTF8.java @@ -0,0 +1,16 @@ +package org.fugerit.java.doc.yaml.typehandler; + +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDecorator; + +public class DocTypeHandlerCoreYAMLUTF8 extends DocTypeHandlerDecorator { + + private static final long serialVersionUID = -8512962958109L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreYAMLUTF8(); + + public DocTypeHandlerCoreYAMLUTF8() { + super( DocTypeHandlerCoreYAML.HANDLER_UTF8 ); + } + +} diff --git a/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/DocFacadeSourceConvertTest.java b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/DocFacadeSourceConvertTest.java new file mode 100644 index 000000000..331ad208c --- /dev/null +++ b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/DocFacadeSourceConvertTest.java @@ -0,0 +1,59 @@ +package test.org.fugerit.java.doc; + +import lombok.extern.slf4j.Slf4j; +import org.fugerit.java.core.function.SafeFunction; +import org.fugerit.java.doc.base.facade.DocFacadeSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +class DocFacadeSourceConvertTest { + + private static final String TEST_XML_PATH = "src/test/resources/convert/doc_test_01.xml"; + private static final String TEST_JSON_PATH = "src/test/resources/convert/doc_test_01.json"; + private static final String TEST_YAML_PATH = "src/test/resources/convert/doc_test_01.yaml"; + + private static final Map MAP_SAMPLES = new HashMap<>(); + static { + MAP_SAMPLES.put( DocFacadeSource.SOURCE_TYPE_XML, TEST_XML_PATH ); + MAP_SAMPLES.put( DocFacadeSource.SOURCE_TYPE_JSON, TEST_JSON_PATH ); + MAP_SAMPLES.put( DocFacadeSource.SOURCE_TYPE_YAML, TEST_YAML_PATH ); + } + + @Test + void testConvertFormats() { + List sourceTypes = Arrays.asList( DocFacadeSource.SOURCE_TYPE_XML, DocFacadeSource.SOURCE_TYPE_JSON, DocFacadeSource.SOURCE_TYPE_YAML ); + int count = 0; + for ( Integer fromSourceType : sourceTypes ) { + for ( Integer toSourceType : sourceTypes ) { + if ( !fromSourceType.equals( toSourceType ) ) { + String testPath = MAP_SAMPLES.get( fromSourceType ); + SafeFunction.apply( () -> { + try (Reader from = new FileReader( new File( testPath ) ); + Writer to = new StringWriter() ) { + log.info( "Convert from {} to {}", fromSourceType, toSourceType ); + DocFacadeSource.getInstance().convert( from, fromSourceType, to, toSourceType ); + log.info( "Conversion result : \n{}", to ); + if ( toSourceType == DocFacadeSource.SOURCE_TYPE_XML ) { + Assertions.assertTrue( to.toString().startsWith( "<" ) ); + } else if ( toSourceType == DocFacadeSource.SOURCE_TYPE_JSON ) { + Assertions.assertTrue( to.toString().startsWith( "{" ) ); + } else if ( toSourceType == DocFacadeSource.SOURCE_TYPE_YAML ) { + Assertions.assertTrue( to.toString().startsWith( "---" ) ); + } + } + } ); + count++; + } + } + Assertions.assertTrue( count > 0 ); + } + } + +} diff --git a/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/parse/TestYamlDocumentProcessing.java b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/parse/TestYamlDocumentProcessing.java new file mode 100644 index 000000000..c4f70ded4 --- /dev/null +++ b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/parse/TestYamlDocumentProcessing.java @@ -0,0 +1,34 @@ +package test.org.fugerit.java.doc.yaml.parse; + +import org.fugerit.java.core.function.SafeFunction; +import org.fugerit.java.core.lang.helpers.ClassHelper; +import org.fugerit.java.doc.base.config.*; +import org.fugerit.java.doc.base.facade.DocFacadeSource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +class TestYamlDocumentProcessing { + + private static final Logger logger = LoggerFactory.getLogger( TestYamlDocumentProcessing.class ); + + @Test + void testGenerateXML() { + Assertions.assertNotNull( SafeFunction.get( () -> { + try ( InputStreamReader reader = new InputStreamReader( + ClassHelper.loadFromDefaultClassLoader( "sample/doc_test_01.yaml" ) ); + ByteArrayOutputStream buffer = new ByteArrayOutputStream() ) { + DocInput docInput = DocInput.newInput( DocConfig.TYPE_XML, reader, DocFacadeSource.SOURCE_TYPE_YAML ); + DocTypeHandlerXMLUTF8.HANDLER.handle( docInput, DocOutput.newOutput( buffer ) ); + logger.info( "xml output -> {}", new String( buffer.toByteArray(), StandardCharsets.UTF_8 ) ); + return buffer.toByteArray(); + } + } ) + ); + } + +} diff --git a/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/typehandler/TestYamlHandlers.java b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/typehandler/TestYamlHandlers.java new file mode 100644 index 000000000..0b3e1999d --- /dev/null +++ b/fj-doc-base-yaml/src/test/java/test/org/fugerit/java/doc/yaml/typehandler/TestYamlHandlers.java @@ -0,0 +1,31 @@ +package test.org.fugerit.java.doc.yaml.typehandler; + +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.yaml.typehandler.DocTypeHandlerCoreYAMLUTF8; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.StringReader; + +class TestYamlHandlers { + + private static final String INPUT_DOC = ""; + + private static final String OUTPUT_DOC = "---\n" + + "_t: \"doc\"\n"; + + @Test + void testHandler() throws Exception { + DocTypeHandler handler = DocTypeHandlerCoreYAMLUTF8.HANDLER; + try (StringReader from = new StringReader(INPUT_DOC); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ) { + handler.handle(DocInput.newInput( handler.getType(), from ), DocOutput.newOutput(os)); + Assertions.assertEquals( OUTPUT_DOC, os.toString() ); + } + } + +} diff --git a/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.json b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.json new file mode 100644 index 000000000..842f48d10 --- /dev/null +++ b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.json @@ -0,0 +1,132 @@ +{ + "xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance", + "xsi:schemaLocation" : "http://javacoredoc.fugerit.org https://www.fugerit.org/data/java/doc/xsd/doc-2-1.xsd", + "xmlns" : "http://javacoredoc.fugerit.org", + "_t" : "doc", + "_e" : [ { + "_t" : "metadata", + "_e" : [ { + "name" : "margins", + "_t" : "info", + "_v" : "10;10;10;30" + }, { + "name" : "excel-table-id", + "_t" : "info", + "_v" : "excel-table=print" + }, { + "name" : "excel-width-multiplier", + "_t" : "info", + "_v" : "450" + }, { + "_t" : "footer-ext", + "_e" : [ { + "align" : "center", + "_t" : "para", + "_v" : "Page ${currentPage}" + } ] + } ] + }, { + "_t" : "body", + "_e" : [ { + "_t" : "phrase", + "_v" : "Test phrase 01" + }, { + "_t" : "phrase", + "_v" : "Test phrase 02" + }, { + "_t" : "phrase", + "_v" : "Test phrase 03" + }, { + "_t" : "phrase", + "_v" : "Test phrase 04" + }, { + "url" : "cl://test/img_test_red.png", + "scaling" : "100", + "_t" : "image" + }, { + "url" : "cl://test/img_test_green.png", + "scaling" : "50", + "_t" : "image" + }, { + "url" : "cl://test/img_test_blue.png", + "scaling" : "25", + "_t" : "image" + }, { + "columns" : "3", + "width" : "100", + "colwidths" : "30;30;40", + "padding" : "2", + "id" : "excel-table", + "_t" : "table", + "_e" : [ { + "_t" : "row", + "_e" : [ { + "border-color" : "#000000", + "border-width" : "1", + "align" : "center", + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Name" + } ] + }, { + "align" : "center", + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Surname" + } ] + }, { + "align" : "center", + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Title" + } ] + } ] + }, { + "_t" : "row", + "_e" : [ { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Luthien" + } ] + }, { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Tinuviel" + } ] + }, { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Queen" + } ] + } ] + }, { + "_t" : "row", + "_e" : [ { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Thorin" + } ] + }, { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "Oakshield" + } ] + }, { + "_t" : "cell", + "_e" : [ { + "_t" : "para", + "_v" : "King" + } ] + } ] + } ] + } ] + } ] +} \ No newline at end of file diff --git a/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.xml b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.xml new file mode 100644 index 000000000..b24152442 --- /dev/null +++ b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.xml @@ -0,0 +1,56 @@ + + + 10;10;10;30 + excel-table=print + 450 + + Page ${currentPage} + + + + Test phrase 01 + Test phrase 02 + Test phrase 03 + Test phrase 04 + + + + + + + Name + + + Surname + + + Title + + + + + Luthien + + + Tinuviel + + + Queen + + + + + Thorin + + + Oakshield + + + King + + +
+ +
diff --git a/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.yaml b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.yaml new file mode 100644 index 000000000..fb1f13172 --- /dev/null +++ b/fj-doc-base-yaml/src/test/resources/convert/doc_test_01.yaml @@ -0,0 +1,95 @@ +--- +xmlns:xsi: "http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation: "http://javacoredoc.fugerit.org https://www.fugerit.org/data/java/doc/xsd/doc-2-1.xsd" +xmlns: "http://javacoredoc.fugerit.org" +_t: "doc" +_e: +- _t: "metadata" + _e: + - name: "margins" + _t: "info" + _v: "10;10;10;30" + - name: "excel-table-id" + _t: "info" + _v: "excel-table=print" + - name: "excel-width-multiplier" + _t: "info" + _v: "450" + - _t: "footer-ext" + _e: + - align: "center" + _t: "para" + _v: "Page ${currentPage}" +- _t: "body" + _e: + - _t: "phrase" + _v: "Test phrase 01" + - _t: "phrase" + _v: "Test phrase 02" + - _t: "phrase" + _v: "Test phrase 03" + - _t: "phrase" + _v: "Test phrase 04" + - url: "cl://test/img_test_red.png" + scaling: "100" + _t: "image" + - url: "cl://test/img_test_green.png" + scaling: "50" + _t: "image" + - url: "cl://test/img_test_blue.png" + scaling: "25" + _t: "image" + - columns: "3" + width: "100" + colwidths: "30;30;40" + padding: "2" + id: "excel-table" + _t: "table" + _e: + - _t: "row" + _e: + - border-color: "#000000" + border-width: "1" + align: "center" + _t: "cell" + _e: + - _t: "para" + _v: "Name" + - align: "center" + _t: "cell" + _e: + - _t: "para" + _v: "Surname" + - align: "center" + _t: "cell" + _e: + - _t: "para" + _v: "Title" + - _t: "row" + _e: + - _t: "cell" + _e: + - _t: "para" + _v: "Luthien" + - _t: "cell" + _e: + - _t: "para" + _v: "Tinuviel" + - _t: "cell" + _e: + - _t: "para" + _v: "Queen" + - _t: "row" + _e: + - _t: "cell" + _e: + - _t: "para" + _v: "Thorin" + - _t: "cell" + _e: + - _t: "para" + _v: "Oakshield" + - _t: "cell" + _e: + - _t: "para" + _v: "King" diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocConfig.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocConfig.java index 6f2dff74a..28392d0cf 100644 --- a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocConfig.java +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocConfig.java @@ -13,9 +13,15 @@ public DocConfig() { public static final String FUGERIT_VENUS_DOC = "Venus Fugerit Doc"; public static final String VERSION = " FUGERIT DOC Version 2.1 (2023-08-19) "; - + + public static final String TYPE_TXT = "txt"; + public static final String TYPE_XML = "xml"; - + + public static final String TYPE_JSON = "json"; + + public static final String TYPE_YAML = "yaml"; + public static final String TYPE_PDF = "pdf"; public static final String FORMAT_PDF_A_1A = "PDF/A-1a"; public static final String FORMAT_PDF_A_1B = "PDF/A-1b"; diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocTypeHandlerXML.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocTypeHandlerXML.java index a61b39918..b98807c48 100644 --- a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocTypeHandlerXML.java +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/config/DocTypeHandlerXML.java @@ -6,6 +6,11 @@ import org.fugerit.java.core.io.StreamIO; +/** + * This type handler will be substituted by DocTypeHandlerCoreSource. + * + * @see org.fugerit.java.doc.base.typehandler.core.DocTypeHandlerCoreSource + */ public class DocTypeHandlerXML extends DocTypeHandlerDefault { /** diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/DocFacadeSource.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/DocFacadeSource.java index f14404efe..ea676e1cf 100644 --- a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/DocFacadeSource.java +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/DocFacadeSource.java @@ -2,6 +2,7 @@ import java.io.Reader; import java.io.StringReader; +import java.io.Writer; import java.util.Properties; import org.fugerit.java.core.cfg.ConfigRuntimeException; @@ -12,6 +13,7 @@ import org.fugerit.java.doc.base.feature.DocFeatureRuntimeException; import org.fugerit.java.doc.base.feature.FeatureConfig; import org.fugerit.java.doc.base.model.DocBase; +import org.fugerit.java.doc.base.parser.DocConvert; import org.fugerit.java.doc.base.parser.DocParser; import org.fugerit.java.doc.base.xml.DocXMLUtils; import org.slf4j.Logger; @@ -70,6 +72,23 @@ public static DocFacadeSource getInstance() { PARSERS.setProperty( String.valueOf( SOURCE_TYPE_JSON_NG ) , TYPE_SOURCE_JSON_NG ); PARSERS.setProperty( String.valueOf( SOURCE_TYPE_KOTLIN ) , TYPE_SOURCE_KOTLIN ); } + + private static String toConvertStringKey( int fromSourceType, int toSourceType ) { + return String.format( "%s_to_%s", fromSourceType, toSourceType ); + } + + private static final Properties CONVERTERS = new Properties(); + static { + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_XML, DocFacadeSource.SOURCE_TYPE_JSON ) ) , "org.fugerit.java.doc.json.parse.DocXmlToJson" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_XML, DocFacadeSource.SOURCE_TYPE_YAML ) ) , "org.fugerit.java.doc.yaml.parse.DocXmlToYaml" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_JSON, DocFacadeSource.SOURCE_TYPE_XML ) ) , "org.fugerit.java.doc.json.parse.DocJsonToXml" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_JSON, DocFacadeSource.SOURCE_TYPE_YAML ) ) , "org.fugerit.java.doc.yaml.parse.DocJsonToYaml" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_YAML, DocFacadeSource.SOURCE_TYPE_XML ) ) , "org.fugerit.java.doc.yaml.parse.DocYamlToXml" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_YAML, DocFacadeSource.SOURCE_TYPE_JSON ) ) , "org.fugerit.java.doc.yaml.parse.DocYamlToJson" ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_XML, DocFacadeSource.SOURCE_TYPE_XML ) ) , ReflectiveDocConvert.class.getName() ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_JSON, DocFacadeSource.SOURCE_TYPE_JSON ) ) , ReflectiveDocConvert.class.getName() ); + CONVERTERS.setProperty( String.format( toConvertStringKey( DocFacadeSource.SOURCE_TYPE_YAML, DocFacadeSource.SOURCE_TYPE_YAML ) ) , ReflectiveDocConvert.class.getName() ); + } public DocParser getParserForSource( int sourceType ) { DocParser parser = null; @@ -124,6 +143,26 @@ public DocBase parse( Reader reader, int sourceType, FeatureConfig featureConfig return docBase; } + public static DocConvert findDocConvert( int fromSourceType, int toSourceType ) { + String docConvertType = CONVERTERS.getProperty( toConvertStringKey( fromSourceType, toSourceType ) ); + if ( docConvertType == null ) { + throw new ConfigRuntimeException( String.format( "Converter from %s to %s not found.", fromSourceType, toSourceType ) ); + } else { + logger.debug( "doc convert found : {}", docConvertType ); + return SafeFunction.get( () -> (DocConvert)ClassHelper.newInstance( docConvertType ) ); + } + } + + public void convert(Reader from, int fromSourceType, Writer to, int toSourceType ) { + if ( isSourceSupported( fromSourceType ) && isSourceSupported( toSourceType ) ) { + SafeFunction.apply( () -> findDocConvert( fromSourceType, toSourceType ).convert( from, to ) ); + } else if ( isSourceSupported( fromSourceType ) ) { + throw new ConfigRuntimeException( String.format( "Unsupported from source type: %s", toSourceType ) ); + } else { + throw new ConfigRuntimeException( String.format( "Unsupported to source type: %s", fromSourceType ) ); + } + } + public static Reader cleanSource( Reader source, int sourceType ) { if ( sourceType == DocFacadeSource.SOURCE_TYPE_XML ) { return new StringReader(DocXMLUtils.cleanXML(SafeFunction.get(()->StreamIO.readString(source)))); diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/ReflectiveDocConvert.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/ReflectiveDocConvert.java new file mode 100644 index 000000000..c44cddfde --- /dev/null +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/facade/ReflectiveDocConvert.java @@ -0,0 +1,17 @@ +package org.fugerit.java.doc.base.facade; + +import org.fugerit.java.core.cfg.ConfigException; +import org.fugerit.java.core.io.StreamIO; +import org.fugerit.java.doc.base.parser.DocConvert; + +import java.io.Reader; +import java.io.Writer; + +public class ReflectiveDocConvert implements DocConvert { + + @Override + public void convert(Reader from, Writer to) throws ConfigException { + ConfigException.apply( () -> StreamIO.pipeCharCloseBoth( from, to ) ); + } + +} diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/parser/DocConvert.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/parser/DocConvert.java new file mode 100644 index 000000000..1f055c023 --- /dev/null +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/parser/DocConvert.java @@ -0,0 +1,12 @@ +package org.fugerit.java.doc.base.parser; + +import org.fugerit.java.core.cfg.ConfigException; + +import java.io.Reader; +import java.io.Writer; + +public interface DocConvert { + + void convert(Reader from, Writer to) throws ConfigException; + +} diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreSource.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreSource.java new file mode 100644 index 000000000..a1f4344e1 --- /dev/null +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreSource.java @@ -0,0 +1,38 @@ +package org.fugerit.java.doc.base.typehandler.core; + +import org.fugerit.java.core.io.StreamIO; +import org.fugerit.java.doc.base.config.*; + +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class DocTypeHandlerCoreSource extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = -50249858785381015L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreSource(); + + public static final DocTypeHandler HANDLER_UTF8 = new DocTypeHandlerCoreSource( StandardCharsets.UTF_8 ); + + public static final String TYPE = DocConfig.TYPE_TXT; + + public static final String MODULE = "doc-core"; + + public DocTypeHandlerCoreSource(Charset charset ) { + super( TYPE, MODULE, null, charset ); + } + + public DocTypeHandlerCoreSource() { + super( TYPE, MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + StreamIO.pipeCharCloseBoth( docInput.getReader() , new OutputStreamWriter( docOutput.getOs(), this.getCharset() ) ); + } + +} diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXML.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXML.java new file mode 100644 index 000000000..184c4c95f --- /dev/null +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXML.java @@ -0,0 +1,39 @@ +package org.fugerit.java.doc.base.typehandler.core; + +import org.fugerit.java.doc.base.config.*; +import org.fugerit.java.doc.base.facade.DocFacadeSource; + +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +public class DocTypeHandlerCoreXML extends DocTypeHandlerDefault { + + /** + * + */ + private static final long serialVersionUID = -50249858785381015L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreXML(); + + public static final DocTypeHandler HANDLER_UTF8 = new DocTypeHandlerCoreXML( StandardCharsets.UTF_8 ); + + public static final String TYPE = DocConfig.TYPE_XML; + + public static final String MODULE = "doc-core"; + + public DocTypeHandlerCoreXML(Charset charset ) { + super( TYPE, MODULE, null, charset ); + } + + public DocTypeHandlerCoreXML() { + super( TYPE, MODULE ); + } + + @Override + public void handle(DocInput docInput, DocOutput docOutput) throws Exception { + DocFacadeSource.getInstance().convert( docInput.getReader(), + docInput.getSource(), new OutputStreamWriter( docOutput.getOs() ), DocFacadeSource.SOURCE_TYPE_XML ); + } + +} diff --git a/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXMLUTF8.java b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXMLUTF8.java new file mode 100644 index 000000000..cb4f0380f --- /dev/null +++ b/fj-doc-base/src/main/java/org/fugerit/java/doc/base/typehandler/core/DocTypeHandlerCoreXMLUTF8.java @@ -0,0 +1,16 @@ +package org.fugerit.java.doc.base.typehandler.core; + +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.config.DocTypeHandlerDecorator; + +public class DocTypeHandlerCoreXMLUTF8 extends DocTypeHandlerDecorator { + + private static final long serialVersionUID = -8512962951L; + + public static final DocTypeHandler HANDLER = new DocTypeHandlerCoreXMLUTF8(); + + public DocTypeHandlerCoreXMLUTF8() { + super( DocTypeHandlerCoreXML.HANDLER_UTF8 ); + } + +} diff --git a/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json b/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json index 09e2a6c91..47016e735 100644 --- a/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json +++ b/fj-doc-base/src/main/resources/META-INF/native-image/org.fugerit.java/fj-doc-base/reflect-config.json @@ -3133,6 +3133,15 @@ "name" : "wait", "parameterTypes" : [ "long", "int" ] } ] +}, { + "condition" : { + "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" + }, + "name" : "org.fugerit.java.doc.base.parser.DocConvert", + "methods" : [ { + "name" : "convert", + "parameterTypes" : [ "java.io.Reader", "java.io.Writer" ] + } ] }, { "condition" : { "typeReachable" : "org.fugerit.java.doc.base.facade.DocFacadeSource" diff --git a/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/facade/TestDocFacadeSource.java b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/facade/TestDocFacadeSource.java index 48f5106a6..9aef587a1 100644 --- a/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/facade/TestDocFacadeSource.java +++ b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/facade/TestDocFacadeSource.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import java.io.StringWriter; import org.fugerit.java.core.cfg.ConfigRuntimeException; import org.fugerit.java.core.function.SafeFunction; @@ -90,4 +91,40 @@ void textCleanInput() { assertEquals( input, DocFacadeSource.cleanSource( input, DocFacadeSource.SOURCE_TYPE_YAML ) ); } + private static final DocFacadeSource DOC_FACADE_SOURCE = DocFacadeSource.getInstance(); + + @Test + void testFromSourceNotSupported() throws IOException { + try ( StringReader from = new StringReader( "{}" ); + StringWriter to = new StringWriter() ) { + assertThrows( ConfigRuntimeException.class, + () -> DOC_FACADE_SOURCE.convert( from, DocFacadeSource.SOURCE_TYPE_JSON, to, DocFacadeSource.SOURCE_TYPE_XML ) ); + } + } + + @Test + void testToSourceNotSupported() throws IOException { + try ( StringReader from = new StringReader( "" ); + StringWriter to = new StringWriter() ) { + assertThrows( ConfigRuntimeException.class, + () -> DOC_FACADE_SOURCE.convert( from, DocFacadeSource.SOURCE_TYPE_XML, to, DocFacadeSource.SOURCE_TYPE_YAML ) ); + } + } + + @Test + void testDocConvertNotFound() { + assertThrows( ConfigRuntimeException.class, + () -> DocFacadeSource.findDocConvert( DocFacadeSource.SOURCE_TYPE_XML, Integer.MAX_VALUE ) ); + } + + @Test + void testReflectiveConversionXml() throws IOException { + String input = ""; + try ( StringReader from = new StringReader( input ); + StringWriter to = new StringWriter() ) { + DocFacadeSource.getInstance().convert( from, DocFacadeSource.SOURCE_TYPE_XML, to, DocFacadeSource.SOURCE_TYPE_XML ); + Assertions.assertEquals( input, to.toString() ); + } + } + } diff --git a/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/typehandler/core/TestCoreHandlers.java b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/typehandler/core/TestCoreHandlers.java new file mode 100644 index 000000000..78464342c --- /dev/null +++ b/fj-doc-base/src/test/java/test/org/fugerit/java/doc/base/typehandler/core/TestCoreHandlers.java @@ -0,0 +1,37 @@ +package test.org.fugerit.java.doc.base.typehandler.core; + +import org.fugerit.java.doc.base.config.DocInput; +import org.fugerit.java.doc.base.config.DocOutput; +import org.fugerit.java.doc.base.config.DocTypeHandler; +import org.fugerit.java.doc.base.typehandler.core.DocTypeHandlerCoreSource; +import org.fugerit.java.doc.base.typehandler.core.DocTypeHandlerCoreXMLUTF8; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.StringReader; + +class TestCoreHandlers { + + private static final String INPUT_DOC = ""; + + private String testWorker( DocTypeHandler handler ) throws Exception { + try (StringReader from = new StringReader(INPUT_DOC); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ) { + handler.handle(DocInput.newInput( handler.getType(), from ), DocOutput.newOutput(os)); + return os.toString(); + } + } + + @Test + void testCoreXml() throws Exception { + Assertions.assertEquals( INPUT_DOC, this.testWorker( DocTypeHandlerCoreXMLUTF8.HANDLER ) ); + } + + @Test + void testCoreSource() throws Exception { + Assertions.assertEquals( INPUT_DOC, this.testWorker( DocTypeHandlerCoreSource.HANDLER ) ); + } + +} diff --git a/fj-doc-guide/src/main/docs/asciidoc/chapters/00_2_release_notes.adoc b/fj-doc-guide/src/main/docs/asciidoc/chapters/00_2_release_notes.adoc index d4ec15cba..dfd7e6c81 100644 --- a/fj-doc-guide/src/main/docs/asciidoc/chapters/00_2_release_notes.adoc +++ b/fj-doc-guide/src/main/docs/asciidoc/chapters/00_2_release_notes.adoc @@ -6,6 +6,9 @@ Whereas the link:https://github.com/fugerit-org/fj-doc/blob/main/CHANGELOG.md[CH [#doc-release-notes-unreleased] ==== Unreleased +- fixed org.fugerit.java.doc.base.config.DocTypeHandlerXML renders the source document in the source format (i.e. JSON or YAML) link:https://github.com/fugerit-org/fj-doc/issues/519[#519] +- added core type handlers for XML, JSON and YAML formats link:https://github.com/fugerit-org/fj-doc/issues/519[#519] + [#doc-release-notes-8-16-5] ==== Version 8.16.5 [2025-09-29] diff --git a/fj-doc-guide/src/main/docs/asciidoc/chapters/06_doc_handlers.adoc b/fj-doc-guide/src/main/docs/asciidoc/chapters/06_doc_handlers.adoc index c9dbeb047..b57925641 100644 --- a/fj-doc-guide/src/main/docs/asciidoc/chapters/06_doc_handlers.adoc +++ b/fj-doc-guide/src/main/docs/asciidoc/chapters/06_doc_handlers.adoc @@ -118,4 +118,61 @@ Each section describing a specific doc handler will contain this quick reference - *compliance level* : _COMPLETE_, _HIGH_, _MEDIUM_, _LOW_, The level of support to xref:#doc-format-entry-point[Venus Doc Format]. - *compliance detail* : The limitations to the support of the xref:#doc-format-entry-point[Venus Doc Format] (for instance : unsupported elements or attributes). -- *native ready* : _YES_, _NO_ (If the doc handler is ready for native compilation with link:https://www.graalvm.org/[GraalVM]). \ No newline at end of file +- *native ready* : _YES_, _NO_ (If the doc handler is ready for native compilation with link:https://www.graalvm.org/[GraalVM]). + +=== Core Type Handlers + +Additionally some type handlers for source formats (i.e. XML, JSON) are available. + +They differ from other type handlers as they only handle the xref:#doc-format-entry-point[Doc Source Format] and converting it from one source type (i.e. XML) to another source type (i.e. JSON). + +[cols="4,2,1,3,3", options="header"] +|======================================================================================================================================== + +| doc-handler +| module +| type +| description +| notes + +| org.fugerit.java.doc.base.typehandler.core.​DocTypeHandlerCoreXML +| fj-doc-base +| XML +| Renders a XML document in the XML Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.base.typehandler.core.​DocTypeHandlerCoreXMLUTF8 +| fj-doc-base +| XML +| Renders a XML document in the XML Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.json.typehandler.​DocTypeHandlerCoreJSON +| fj-doc-base-json +| JSON +| Renders a JSON document in the JSON Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.json.typehandler.​DocTypeHandlerCoreJSONUTF8 +| fj-doc-base-json +| JSON +| Renders a JSON document in the JSON Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.json.typehandler.​DocTypeHandlerCoreYAML +| fj-doc-base-json +| YAML +| Renders a YAML document in the YAML Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.json.typehandler.​DocTypeHandlerCoreYAMLUTF8 +| fj-doc-base-json +| YAML +| Renders a YAML document in the YAML Doc Source Format +| native ready (1) + +| org.fugerit.java.doc.base.typehandler.core.​DocTypeHandlerCoreSource +| fj-doc-base +| txt +| Just output the current source with no modification. +| native ready (1) diff --git a/fj-doc-guide/src/main/docs/asciidoc/chapters/10_1_invalid-xml-character.adoc b/fj-doc-guide/src/main/docs/asciidoc/chapters/10_1_invalid-xml-character.adoc index 3c3f064f3..d2feb9478 100644 --- a/fj-doc-guide/src/main/docs/asciidoc/chapters/10_1_invalid-xml-character.adoc +++ b/fj-doc-guide/src/main/docs/asciidoc/chapters/10_1_invalid-xml-character.adoc @@ -1,7 +1,7 @@ <<< [#doc-troubleshooting-invalid-xml-character] -=== An invalid XML character +=== An invalid XML character (Unicode: ???) was found in the element content of the document Sometimes it can happen to get errors like : diff --git a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java index 0ea10fffb..1ecc49799 100644 --- a/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java +++ b/fj-doc-maven-plugin/src/main/java/org/fugerit/java/doc/project/facade/VenusContext.java @@ -41,6 +41,8 @@ public static String toResourcePathFmConfigXml( String artifactId ) { public static final String VERSION_NA_FREEMARKER_NATIVE = "8.11.8"; + public static final String VERSION_NA_CORE_HANDLERS = "8.16.5"; + private static final String VENUS_DIRECT_CONFIG_DEFAULT = "venus-direct-config"; @Getter @@ -161,6 +163,11 @@ public String getDocConfigClass() { return "DocHelper"; } + public boolean isCoreHandlersNotAvailable() { + return !VersionCheck.isMajorThan( this.getVersion(), VERSION_NA_CORE_HANDLERS ); + } + + public boolean isVerifyPluginNotAvailable() { return VersionCheck.isMajorThan( VERSION_NA_VERIFY_PLUGIN, this.getVersion() ); } @@ -180,7 +187,7 @@ public boolean isPreVersion862() { private File getAndCreateFolder( File file ) { if ( !file.exists() ) { boolean result = file.mkdirs(); - log.info( "folder doesn't exists: {}, mkdirs: ", file.getAbsolutePath(), result ); + log.info( "folder doesn't exists: {}, mkdirs: {}", file.getAbsolutePath(), result ); } return file; } diff --git a/fj-doc-maven-plugin/src/main/resources/config/template/fm-doc-process-config-template.ftl b/fj-doc-maven-plugin/src/main/resources/config/template/fm-doc-process-config-template.ftl index b6e9e56da..180eeef29 100644 --- a/fj-doc-maven-plugin/src/main/resources/config/template/fm-doc-process-config-template.ftl +++ b/fj-doc-maven-plugin/src/main/resources/config/template/fm-doc-process-config-template.ftl @@ -15,10 +15,24 @@ --> + - + <#if context.coreHandlersNotAvailable> + + <#else> + + + <#if context.modules?seq_contains("fj-doc-base-json")> + + + + <#if context.modules?seq_contains("fj-doc-base-yaml")> + + + + diff --git a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java index a22b9697c..149139f2f 100644 --- a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java +++ b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestAddVenusFacade.java @@ -204,6 +204,30 @@ public void execute() throws MojoExecutionException, MojoFailureException { } } + @Test + void testMojoCoreHandlers() throws IOException, MojoExecutionException, MojoFailureException { + for ( String currentConfig : Arrays.asList( "ok3-pom" ) ) { + File projectDir = this.initConfigWorker( currentConfig ); + MojoAdd mojoAdd = new MojoAdd() { + @Override + public void execute() throws MojoExecutionException, MojoFailureException { + this.version = "8.16.6"; + this.extensions = "fj-doc-base,fj-doc-base-json,fj-doc-base-yaml,fj-doc-freemarker,fj-doc-mod-fop,fj-doc-mod-poi,fj-doc-mod-opencsv"; + this.projectFolder = projectDir.getAbsolutePath(); + this.addDocFacade = true; + this.force = true; + this.excludeXmlApis = true; + this.addVerifyPlugin = true; + this.addJunit5 = true; + this.addLombok = true; + super.execute(); + } + }; + mojoAdd.execute(); + Assertions.assertTrue( projectDir.exists() ); + } + } + @Test void testFjVersionCheck() { Model model = new Model(); diff --git a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestVenusContext.java b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestVenusContext.java index fa11cc28b..f159159e9 100644 --- a/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestVenusContext.java +++ b/fj-doc-maven-plugin/src/test/java/test/org/fugerit/java/doc/project/facade/TestVenusContext.java @@ -18,6 +18,7 @@ void testVenusContext() { Assertions.assertNotNull( context.getTestResourcesFolder() ); Assertions.assertNotNull( context.getMainResourcesFolder() ); Assertions.assertFalse( context.isAsciidocFreemarkerHandlerAvailable() ); + Assertions.assertTrue( context.isCoreHandlersNotAvailable() ); } @Test @@ -26,4 +27,10 @@ void testAsciiDocCheck() { Assertions.assertTrue( context.isAsciidocFreemarkerHandlerAvailable() ); } + @Test + void testVenusContextCoreHandlers() { + VenusContext context = new VenusContext( TARGET, "8.17.0", "fj-doc-base" ); + Assertions.assertFalse( context.isCoreHandlersNotAvailable() ); + } + } diff --git a/fj-doc-playground-quarkus/src/main/docs/asciidoc/features/doc-config-convert.adoc b/fj-doc-playground-quarkus/src/main/docs/asciidoc/features/doc-config-convert.adoc index 27cd42ecc..e16efab2a 100644 --- a/fj-doc-playground-quarkus/src/main/docs/asciidoc/features/doc-config-convert.adoc +++ b/fj-doc-playground-quarkus/src/main/docs/asciidoc/features/doc-config-convert.adoc @@ -68,7 +68,7 @@ xsi:schemaLocation="https://freemarkerdocprocess.fugerit.org https://www.fugerit - + diff --git a/fj-doc-playground-quarkus/src/main/java/org/fugerit/java/doc/playground/doc/GenerateRest.java b/fj-doc-playground-quarkus/src/main/java/org/fugerit/java/doc/playground/doc/GenerateRest.java index 4f6e7b941..3177c92cd 100644 --- a/fj-doc-playground-quarkus/src/main/java/org/fugerit/java/doc/playground/doc/GenerateRest.java +++ b/fj-doc-playground-quarkus/src/main/java/org/fugerit/java/doc/playground/doc/GenerateRest.java @@ -49,9 +49,9 @@ public Response document(GenerateInput input) { output.setDocOutputBase64(Base64.getEncoder().encodeToString(data)); output.setGenerationTime(CheckpointUtils.formatTimeDiffMillis(time, System.currentTimeMillis())); } catch (DocFeatureRuntimeException e) { - this.setOutputMessage( output, e, e.getMessages() ); + this.setOutputMessage(output, e, e.getMessages()); } catch (Exception e) { - this.setOutputMessage( output, e, null ); + this.setOutputMessage(output, e, null); } return Response.ok().entity(output).build(); }); diff --git a/fj-doc-playground-quarkus/src/main/react/src/playground/DocXmlEditor.jsx b/fj-doc-playground-quarkus/src/main/react/src/playground/DocXmlEditor.jsx index 1a4585924..a44a82fc9 100644 --- a/fj-doc-playground-quarkus/src/main/react/src/playground/DocXmlEditor.jsx +++ b/fj-doc-playground-quarkus/src/main/react/src/playground/DocXmlEditor.jsx @@ -193,6 +193,32 @@ const DocXmlEditor = ({handleOpenDialog, setHelpContent}) => { value={decodedStringAtoB} width='100%' /> + } else if ( docFormat === 'JSON' ) { + let decodedStringAtoB = myAtob(docOutput); + outputData = + } else if ( docFormat === 'YAML' ) { + let decodedStringAtoB = myAtob(docOutput); + outputData = } else if ( docFormat === 'CSV' ) { let decodedStringAtoB = myAtob(docOutput); outputData = { XLSX Markdown (MD) Venus XML Doc + Venus JSON Doc + Venus YAML Doc XSL-FO CSV PDF (openpdf) diff --git a/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml b/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml index 2c44bdabb..169438a2a 100644 --- a/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml +++ b/fj-doc-playground-quarkus/src/main/resources/playground-config/fm-playground-doc-process.xml @@ -62,7 +62,9 @@ - + + +