This is an automated email from the ASF dual-hosted git repository. sgoeschl pushed a commit to branch FREEMARKER-188 in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit fac87b9bda44b3c83f17d41d095547f284e3b485 Author: Siegfried Goeschl <[email protected]> AuthorDate: Wed Sep 8 17:09:28 2021 +0200 FREEMARKER-188 First cut of implementation is working --- .../generator/base/datasource/DataSource.java | 2 +- .../base/datasource/DataSourcesSupplier.java | 13 ++-- .../generator/base/output/OutputGenerator.java | 16 ++++- .../freemarker/generator/base/util/FileUtils.java | 4 +- .../generator/datasource/DataSourceTest.java | 9 ++- .../freemarker/generator/util/FileUtilsTest.java | 1 + .../app/templates/freemarker-generator/info.ftl | 84 +++++++++++----------- .../config/output/AggregatingOutputGenerator.java | 4 +- .../config/output/GeneratingOutputGenerator.java | 9 ++- .../generator/cli/task/FreeMarkerTask.java | 12 ++-- 10 files changed, 88 insertions(+), 66 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java index 6383258..61c014c 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java @@ -133,7 +133,7 @@ public class DataSource implements Closeable, javax.activation.DataSource { this.group = StringUtils.emptyToNull(group); this.uri = requireNonNull(uri); this.dataSource = requireNonNull(dataSource); - this.relativeFilePath = relativeFilePath != null ? relativeFilePath : "."; + this.relativeFilePath = relativeFilePath != null ? relativeFilePath : ""; this.contentType = contentType; this.charset = charset; this.properties = properties != null ? new HashMap<>(properties) : new HashMap<>(); diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java index dbf94e2..8fc2e01 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java @@ -112,13 +112,13 @@ public class DataSourcesSupplier implements Supplier<List<DataSource>> { } private static List<DataSource> resolveFileOrDirectory(String source, String include, String exclude, Charset charset) { - final NamedUri namedUri = NamedUriStringParser.parse(source); - final String path = namedUri.getFile().getPath(); - final String group = namedUri.getGroupOrDefault(DEFAULT_GROUP); - final Charset currCharset = getCharsetOrDefault(namedUri, charset); - final Map<String, String> parameters = namedUri.getParameters(); + final NamedUri sourceUri = NamedUriStringParser.parse(source); + final String path = sourceUri.getFile().getPath(); + final String group = sourceUri.getGroupOrDefault(DEFAULT_GROUP); + final Charset currCharset = getCharsetOrDefault(sourceUri, charset); + final Map<String, String> parameters = sourceUri.getParameters(); return fileSupplier(path, include, exclude).get().stream() - .map(file -> fromFile(namedUri, getDataSourceName(namedUri, file), group, file, currCharset, parameters)) + .map(file -> fromFile(sourceUri, getDataSourceName(sourceUri, file), group, file, currCharset, parameters)) .collect(toList()); } @@ -149,7 +149,6 @@ public class DataSourcesSupplier implements Supplier<List<DataSource>> { .build(); } - private static RecursiveFileSupplier fileSupplier(String source, String include, String exclude) { return new RecursiveFileSupplier(singletonList(source), singletonList(include), singletonList(exclude)); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java index c701151..f2c4e6f 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java @@ -31,6 +31,11 @@ import static java.util.Objects.requireNonNull; */ public class OutputGenerator { + public enum SeedType { + DATASOURCE, + TEMPLATE + } + /** Source of template */ private final TemplateSource templateSource; @@ -43,15 +48,19 @@ public class OutputGenerator { /** Variables (as a map) used for the transformation */ private final Map<String, Object> variables; + private final SeedType seedType; + public OutputGenerator( TemplateSource templateSource, TemplateOutput templateOutput, List<DataSource> dataSources, - Map<String, Object> variables) { + Map<String, Object> variables, + SeedType seedType) { this.templateSource = requireNonNull(templateSource); this.templateOutput = requireNonNull(templateOutput); this.dataSources = requireNonNull(dataSources); this.variables = requireNonNull(variables); + this.seedType = requireNonNull(seedType); } public TemplateSource getTemplateSource() { @@ -70,6 +79,10 @@ public class OutputGenerator { return variables; } + public SeedType getSeedType() { + return seedType; + } + @Override public String toString() { return "OutputGenerator{" + @@ -77,6 +90,7 @@ public class OutputGenerator { ", templateOutput=" + templateOutput + ", dataSources=" + dataSources + ", variables=" + variables + + ", seedType=" + seedType + '}'; } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java index 8371454..b6a99bb 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java @@ -23,8 +23,8 @@ public class FileUtils { final String relativePath = directoryPath.relativize(filePath).normalize().toString(); // strip last path segment - if (relativePath.lastIndexOf('/') >= 0) { - return relativePath.substring(0, relativePath.lastIndexOf("/")); + if (relativePath.lastIndexOf(File.separatorChar) >= 0) { + return relativePath.substring(0, relativePath.lastIndexOf(File.separatorChar)); } else { return ""; } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java index 38617ba..d906e48 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java @@ -36,7 +36,6 @@ import static org.apache.freemarker.generator.base.datasource.DataSourceFactory. import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_HTML; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; public class DataSourceTest { @@ -55,7 +54,7 @@ public class DataSourceTest { assertEquals("", dataSource.getBaseName()); assertEquals("", dataSource.getExtension()); assertTrue(dataSource.getUri().toString().startsWith("string:///")); - assertEquals(".", dataSource.getRelativeFilePath()); + assertEquals("", dataSource.getRelativeFilePath()); assertEquals(UTF_8, dataSource.getCharset()); assertEquals("text/plain", dataSource.getContentType()); assertTrue(dataSource.getLength() > 0); @@ -74,7 +73,7 @@ public class DataSourceTest { assertEquals("xml", dataSource.getExtension()); assertEquals(ANY_FILE.toURI().toString(), dataSource.getUri().toString()); assertEquals(ANY_CHAR_SET.name(), dataSource.getCharset().name()); - assertEquals(".", dataSource.getRelativeFilePath()); + assertEquals("", dataSource.getRelativeFilePath()); assertEquals("application/xml", dataSource.getContentType()); assertTrue(dataSource.getLength() > 0); assertFalse(dataSource.getText().isEmpty()); @@ -94,7 +93,7 @@ public class DataSourceTest { assertEquals("", dataSource.getBaseName()); assertEquals("", dataSource.getExtension()); assertEquals("https://www.google.com/?foo=bar", dataSource.getUri().toString()); - assertNull(dataSource.getRelativeFilePath()); + assertEquals("", dataSource.getRelativeFilePath()); assertEquals("text/html; charset=ISO-8859-1", dataSource.getContentType()); assertEquals(MIME_TEXT_HTML, dataSource.getMimeType()); assertEquals("ISO-8859-1", dataSource.getCharset().name()); @@ -137,7 +136,7 @@ public class DataSourceTest { assertEquals("", metadata.get("extension")); assertEquals("", metadata.get("fileName")); assertEquals("/", metadata.get("filePath")); - assertEquals(".", metadata.get("relativeFilePath")); + assertEquals("", metadata.get("relativeFilePath")); assertEquals("default", metadata.get("group")); assertEquals("stdin", metadata.get("name")); diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java index f572c3b..8b3a509 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java @@ -11,6 +11,7 @@ public class FileUtilsTest { @Test public void shouldGetRelativePathForSameDirectory() { + assertEquals("", FileUtils.getRelativePath(new File("/"), new File("/pom.xml"))); assertEquals("", FileUtils.getRelativePath(new File("."), new File("pom.xml"))); assertEquals("", FileUtils.getRelativePath(new File("."), new File("./pom.xml"))); assertEquals("", FileUtils.getRelativePath(new File("."), new File("./pom.xml"))); diff --git a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl index 388bd85..8208074 100644 --- a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl +++ b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl @@ -1,19 +1,19 @@ <#ftl output_format="plainText" strip_whitespace=true> <#-- -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. --> FreeMarker Generator Information ============================================================================== @@ -30,65 +30,65 @@ FreeMarker Command-line Parameters ============================================================================== <#list tools.system.getCommandLineArgs() as arg> - [#${arg?counter}] ${arg} +[#${arg?counter}] ${arg} </#list> FreeMarker Generator Template Loader Directories ============================================================================== <#list tools.system.getTemplateDirectories() as directory> - [#${directory?counter}] ${directory} +[#${directory?counter}] ${directory} </#list> FreeMarker Generator Data Model ============================================================================== <#list .data_model?keys?sort as key> - - ${key}<#lt> +- ${key}<#lt> </#list> FreeMarker Generator Data Sources ============================================================================== <#if dataSources?has_content> - <#list dataSources?values as ds> +<#list dataSources?values as ds> - DataSource #${ds?counter} - ------------------------------------------------------------------------------ - name=${ds.name} - group=${ds.group} - contentType=${ds.contentType} - fileName=${ds.fileName} - baseName=${ds.baseName} - extension=${ds.extension} - relativeFilePath=${ds.relativeFilePath} - charset=${ds.charset} - mimeType=${ds.mimeType} - uri=${ds.uri} - length=${ds.length} Bytes - </#list> +DataSource #${ds?counter} +------------------------------------------------------------------------------ +name=${ds.name} +group=${ds.group} +contentType=${ds.contentType} +fileName=${ds.fileName} +baseName=${ds.baseName} +extension=${ds.extension} +relativeFilePath=${ds.relativeFilePath} +charset=${ds.charset} +mimeType=${ds.mimeType} +uri=${ds.uri} +length=${ds.length} Bytes +</#list> <#else> - No data sources found ... +No data sources found ... </#if> FreeMarker Generator Parameters ============================================================================== <#if tools.system.parameters?has_content> - <#list tools.system.parameters as key,value> - <#if value?is_hash> - - ${key} ==> { <#list value as name,value>${name}=${value} </#list>} - <#else> - - ${key} ==> ${value} - </#if> - </#list> +<#list tools.system.parameters as key,value> +<#if value?is_hash> +- ${key} ==> { <#list value as name,value>${name}=${value} </#list>} +<#else> +- ${key} ==> ${value} +</#if> +</#list> <#else> - No parameters found ... +No parameters found ... </#if> FreeMarker Generator Tools ============================================================================== <#list tools?keys?sort as name> - - ${name?right_pad(20)} : ${tools[name]} +- ${name?right_pad(20)} : ${tools[name]} </#list> diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java index 8959585..56fe9ea 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java @@ -21,6 +21,7 @@ import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSourceFactory; import org.apache.freemarker.generator.base.datasource.DataSourcesSupplier; import org.apache.freemarker.generator.base.output.OutputGenerator; +import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType; import org.apache.freemarker.generator.base.template.TemplateTransformation; import org.apache.freemarker.generator.base.template.TemplateTransformationsBuilder; import org.apache.freemarker.generator.base.util.UriUtils; @@ -95,7 +96,8 @@ public class AggregatingOutputGenerator implements Function<OutputGeneratorDefin templateTransformation.getTemplateSource(), templateTransformation.getTemplateOutput(), dataSources(settings, definition), - dataModels(definition) + dataModels(definition), + SeedType.TEMPLATE ); result.add(outputGenerator); } diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java index c90fd64..4f6eaf8 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java @@ -18,6 +18,7 @@ package org.apache.freemarker.generator.cli.config.output; import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.output.OutputGenerator; +import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType; import org.apache.freemarker.generator.base.template.TemplateOutput; import org.apache.freemarker.generator.base.template.TemplateSource; import org.apache.freemarker.generator.base.util.ListUtils; @@ -33,11 +34,12 @@ import org.apache.freemarker.generator.cli.util.TemplateSourceFactory; import java.io.File; import java.nio.charset.Charset; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; +import static java.util.Collections.singletonList; + public class GeneratingOutputGenerator extends AbstractOutputGenerator implements Function<OutputGeneratorDefinition, List<OutputGenerator>> { @@ -66,8 +68,9 @@ public class GeneratingOutputGenerator final OutputGenerator outputGenerator = new OutputGenerator( templateSource, templateOutput, - Collections.singletonList(dataSource), - dataModels + singletonList(dataSource), + dataModels, + SeedType.DATASOURCE ); result.add(outputGenerator); } diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java index ab04339..3e178bc 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java @@ -23,9 +23,11 @@ import org.apache.commons.io.FileUtils; import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSources; import org.apache.freemarker.generator.base.output.OutputGenerator; +import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType; import org.apache.freemarker.generator.base.template.TemplateOutput; import org.apache.freemarker.generator.base.template.TemplateSource; import org.apache.freemarker.generator.base.util.ListUtils; +import org.apache.freemarker.generator.base.util.Validate; import java.io.BufferedWriter; import java.io.File; @@ -106,11 +108,13 @@ public class FreeMarkerTask implements Callable<Integer> { } private static DataSources toDataSources(OutputGenerator outputGenerator, List<DataSource> sharedDataSources) { - // TODO FREEMARKER-188 06.09.2021 sgoeschl - make this more explicit - if (outputGenerator.getDataSources().isEmpty()) { - return new DataSources(ListUtils.concatenate(outputGenerator.getDataSources(), sharedDataSources)); + final List<DataSource> dataSources = outputGenerator.getDataSources(); + if (outputGenerator.getSeedType() == SeedType.TEMPLATE) { + return new DataSources(ListUtils.concatenate(dataSources, sharedDataSources)); } else { - return new DataSources(outputGenerator.getDataSources()); + // Since every data source shall generate an output there can be only 1 datasource supplied + Validate.isTrue(dataSources.size() == 1, "One data source expected for generation driven by data sources"); + return new DataSources(dataSources); } }
