From 261d6a15e68866fbd217d3ba22248df254a8f794 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 2 Jul 2020 16:57:35 +0200 Subject: [PATCH 01/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../cli/config/ConfigurationSupplier.java | 4 ++ .../generator/cli/model/DataSourcesModel.java | 38 ++++++++++++++ .../cli/model/GeneratorObjectWrapper.java | 23 +++++++++ .../freemarker/generator/cli/ManualTest.java | 3 +- .../cli/config/ConfigurationSupplierTest.java | 2 +- .../src/test/templates/manual.ftl | 50 ++++++++++++++++++- 6 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java create mode 100644 freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java index c7d4ea73..bf77a693 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java @@ -19,6 +19,7 @@ import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Version; +import org.apache.freemarker.generator.cli.model.GeneratorObjectWrapper; import java.util.Properties; import java.util.function.Supplier; @@ -58,6 +59,9 @@ public Configuration get() { // apply all "freemarker.configuration.setting" values configuration.setSettings(freeMarkerConfigurationSettings()); + // provide custom models for "DataSources" + configuration.setObjectWrapper(new GeneratorObjectWrapper(FREEMARKER_VERSION)); + // override current configuration with caller-provided settings configuration.setDefaultEncoding(settings.getTemplateEncoding().name()); configuration.setLocale(settings.getLocale()); diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java new file mode 100644 index 00000000..7b2713eb --- /dev/null +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java @@ -0,0 +1,38 @@ +package org.apache.freemarker.generator.cli.model; + +import freemarker.ext.beans.ArrayModel; +import freemarker.ext.beans.BeanModel; +import freemarker.ext.beans.BeansWrapper; +import freemarker.template.TemplateCollectionModel; +import freemarker.template.TemplateHashModel; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.TemplateSequenceModel; +import org.apache.freemarker.generator.base.datasource.DataSources; + +public class DataSourcesModel extends BeanModel implements TemplateSequenceModel, TemplateHashModel { + + private final DataSources dataSources; + private final BeansWrapper objectWrapper; + + public DataSourcesModel(DataSources dataSources, BeansWrapper objectWrapper) { + super(dataSources, objectWrapper); + this.dataSources = dataSources; + this.objectWrapper = objectWrapper; + } + + @Override + public TemplateModel get(int index) throws TemplateModelException { + return wrap(dataSources.get(index)); + } + + @Override + public TemplateCollectionModel keys() { + return new ArrayModel(dataSources.getNames().toArray(), objectWrapper); + } + + @Override + public int size() { + return dataSources.size(); + } +} diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java new file mode 100644 index 00000000..32af3ca4 --- /dev/null +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java @@ -0,0 +1,23 @@ +package org.apache.freemarker.generator.cli.model; + +import freemarker.template.DefaultObjectWrapper; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.Version; +import org.apache.freemarker.generator.base.datasource.DataSources; + +public class GeneratorObjectWrapper extends DefaultObjectWrapper { + + public GeneratorObjectWrapper(Version incompatibleImprovements) { + super(incompatibleImprovements); + } + + @Override + protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException { + if (obj instanceof DataSources) { + return new DataSourcesModel((DataSources) obj, this); + } + + return super.handleUnknownType(obj); + } +} diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index 2b7f456d..2a2d3a2b 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -24,10 +24,11 @@ public class ManualTest { private static final String SPACE = " "; - private static final String CMD = "-V"; + // private static final String CMD = "-V"; // private static final String CMD = "-PCSV_SOURCE_FORMAT=DATAFRAME -t examples/templates/dataframe/example.ftl https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv"; // private static final String CMD = "-PCSV_SOURCE_WITH_HEADER=false -PCSV_SOURCE_FORMAT=DEFAULT -PCSV_TARGET_FORMAT=EXCEL -PCSV_TARGET_WITH_HEADER=true -t templates/csv/csv/transform.ftl examples/data/csv/contract.csv"; // private static final String CMD = "-t examples/templates/json/dataframe/github-users.ftl examples/data/json/github-users.json"; + private static final String CMD = "-t src/test/templates/manual.ftl examples/data/json/github-users.json examples/data/csv/contract.csv"; public static void main(String[] args) { diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java index baae4516..93ddfa2f 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java @@ -43,7 +43,7 @@ public void shouldProvideDefaultConfiguration() { assertTrue(configuration.isOutputEncodingSet()); assertFalse(configuration.isCacheStorageExplicitlySet()); - assertFalse(configuration.isObjectWrapperExplicitlySet()); + assertTrue(configuration.isObjectWrapperExplicitlySet()); assertFalse(configuration.isOutputFormatExplicitlySet()); assertFalse(configuration.isTemplateExceptionHandlerExplicitlySet()); assertFalse(configuration.isTimeZoneExplicitlySet()); diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl index b381b05a..34a913f3 100644 --- a/freemarker-generator-cli/src/test/templates/manual.ftl +++ b/freemarker-generator-cli/src/test/templates/manual.ftl @@ -15,6 +15,52 @@ specific language governing permissions and limitations under the License. --> -Manual Test +Support FreeMarker Directives --------------------------------------------------------------------------- -<#assign df=DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0)))>${DataFrameTool.print(df)} \ No newline at end of file +Has Content: ${DataSources?has_content?c} +Nr. of Documents: ${DataSources?size} + +Use FTL Array-style Access +--------------------------------------------------------------------------- +${DataSources[0].toString()} + +Use FTL Map-style access +--------------------------------------------------------------------------- +${DataSources["github-users.json"].toString()} +${DataSources["github-users.json"].name} + +Get Document Names As Keys +--------------------------------------------------------------------------- +<#list DataSources?keys as name> + ${name}<#lt> + + +Iterate Over Names & DataSources +--------------------------------------------------------------------------- +<#list DataSources as name, dataSource> + ${name} => ${dataSource}<#lt> + + +Find DataSources By Group +--------------------------------------------------------------------------- +<#list DataSources.findByGroup("default") as dataSource> + ${dataSource}<#lt> + + +Find DataSources By Wildcard +--------------------------------------------------------------------------- +<#list DataSources.find("*.csv") as dataSource> + ${dataSource}<#lt> + + +Java Array-style access +--------------------------------------------------------------------------- +${DataSources.first.toString()} +${DataSources.get(0).toString()} + +Invoke Arbitrary Methods On DataSources +--------------------------------------------------------------------------- +empty : ${DataSources.empty?c} +isEmpty() : ${DataSources.isEmpty()?c} +size() : ${DataSources.size()} +close() : ${DataSources.close()}worx From d85b7230f16eb7026e80edd34abbef0ed942258a Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sun, 5 Jul 2020 08:36:10 +0200 Subject: [PATCH 02/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../freemarker/generator/tools/dataframe/DataFrameToolTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java index 6965064f..0e1d3956 100644 --- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java +++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java @@ -126,7 +126,7 @@ public void shouldParseExcelSheet() { assertNotNull(dataFrame.getColumn("Time")); assertNotNull(dataFrame.getColumn("Percentage")); assertNotNull(dataFrame.getColumn("Forumula")); - assertEquals("Row 1", dataFrame.getValue(0,0)); + assertEquals("Row 1", dataFrame.getValue(0, 0)); assertEquals("C3*F3", dataFrame.getColumn("Forumula").get(1)); } From fc5e1172f302714ed116f17cde6f667d892baf2e Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sun, 5 Jul 2020 09:45:47 +0200 Subject: [PATCH 03/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 45cb7945..05fa9567 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,12 @@ Siegfried Goeschl ASF - https://github.com/sgoeschl + https://www.apache.org + + + Daniel Dekany + ASF + https://www.apache.org From 8f498f52a8c47a6ef3bb4dc6e73aecf046fa5a7d Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sun, 5 Jul 2020 10:34:43 +0200 Subject: [PATCH 04/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- freemarker-generator-cli/CHANGELOG.md | 2 ++ .../generator/cli/ExamplesTest.java | 24 +++++++++++++++++++ freemarker-generator-maven-plugin/pom.xml | 1 + .../impl/CommonsCSVPrinterFacade.java | 16 +++++++++++++ pom.xml | 18 ++++++++++++-- 5 files changed, 59 insertions(+), 2 deletions(-) diff --git a/freemarker-generator-cli/CHANGELOG.md b/freemarker-generator-cli/CHANGELOG.md index 70d43a1c..6b03fc4c 100644 --- a/freemarker-generator-cli/CHANGELOG.md +++ b/freemarker-generator-cli/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. We try to a ## 0.1.0-SNAPSHOT ### Added +* [FREEMARKER-148] Make usage of "DataSources" more "Freemarker" like * [FREEMARKER-149] Support multiple template transformations on the command line * [FREEMARKER-144] Proof Of Concept for providing DataFrames * [FREEMARKER-142] Support Transformation Of Directories @@ -41,4 +42,5 @@ All notable changes to this project will be documented in this file. We try to a [FREEMARKER-144]: https://issues.apache.org/jira/browse/FREEMARKER-144 [FREEMARKER-146]: https://issues.apache.org/jira/browse/FREEMARKER-146 [FREEMARKER-147]: https://issues.apache.org/jira/browse/FREEMARKER-147 +[FREEMARKER-148]: https://issues.apache.org/jira/browse/FREEMARKER-148 [FREEMARKER-149]: https://issues.apache.org/jira/browse/FREEMARKER-149 \ No newline at end of file diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index e66d457b..308d0df3 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -21,6 +21,7 @@ import java.io.IOException; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -138,6 +139,29 @@ public void shouldTransformMultipleTemplates() throws IOException { assertValid(execute("-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl -o target/contract.html examples/data/csv/contract.csv")); } + @Test + public void shouldSupportDataSourcesAccessInFTL() throws IOException { + final String args = "examples/data/json/github-users.json examples/data/csv/contract.csv"; + + // check FreeMarker directives + assertEquals("true", execute(args + " -i ${DataSources?has_content?c}")); + assertEquals("2", execute(args + " -i ${DataSources?size}")); + + // check FTL array-style access + assertEquals("github-users.json", execute(args + " -i ${DataSources[0].name}")); + assertEquals("github-users.json", execute(args + " -i ${DataSources.get(0).name}")); + + // check FTL map-style access + assertEquals("github-users.json", execute(args + " -i ${DataSources[\"github-users.json\"].name}")); + assertEquals("github-users.json", execute(args + " -i ${DataSources.get(\"github-users.json\").name}")); + + // check arbitrary methods + assertEquals("false", execute(args + " -i ${DataSources.empty?c}")); + assertEquals("false", execute(args + " -i ${DataSources.isEmpty()?c}")); + assertEquals("2", execute(args + " -i ${DataSources.size()}")); + assertEquals("worx", execute(args + " -i ${DataSources.close()}worx")); + } + @Test @Ignore("Manual test to check memory consumption and resource handling") public void shouldCloseAllResources() throws IOException { diff --git a/freemarker-generator-maven-plugin/pom.xml b/freemarker-generator-maven-plugin/pom.xml index be360eca..30442ecf 100644 --- a/freemarker-generator-maven-plugin/pom.xml +++ b/freemarker-generator-maven-plugin/pom.xml @@ -167,6 +167,7 @@ apache-rat-plugin + CHANGELOG.md README.md src/site/markdown/**/*.md **/*.json diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/impl/CommonsCSVPrinterFacade.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/impl/CommonsCSVPrinterFacade.java index c8e8ac59..9909d17b 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/impl/CommonsCSVPrinterFacade.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/commonscsv/impl/CommonsCSVPrinterFacade.java @@ -1,3 +1,19 @@ +/* + * 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. + */ package org.apache.freemarker.generator.tools.commonscsv.impl; import org.apache.commons.csv.CSVFormat; diff --git a/pom.xml b/pom.xml index 05fa9567..4e132e80 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,9 @@ ASF https://www.apache.org + + Benjamin Jackson + @@ -149,7 +152,7 @@ maven-assembly-plugin - 3.2.0 + 3.2.0 maven-clean-plugin @@ -169,7 +172,7 @@ maven-javadoc-plugin - 3.1.1 + 3.2.0 maven-jxr-plugin @@ -273,6 +276,17 @@ false + + maven-javadoc-plugin + + + default + + javadoc + + + + \ No newline at end of file From 981c3af180603ddb9b68a332f389447282e22f84 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sun, 5 Jul 2020 10:51:38 +0200 Subject: [PATCH 05/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/cli/model/DataSourcesModel.java | 21 ++++++++++++++++++- .../generator/cli/ExamplesTest.java | 1 + .../freemarker/generator/cli/ManualTest.java | 3 ++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java index 7b2713eb..2eac3d16 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java @@ -10,13 +10,22 @@ import freemarker.template.TemplateSequenceModel; import org.apache.freemarker.generator.base.datasource.DataSources; +import java.util.LinkedHashSet; +import java.util.Set; + +import static java.util.Objects.requireNonNull; + +/** + * Wraps an instance of DataSources into a more user-friendly BeanModel + * so the user can use FreeMarker directives and features instead of using the exposed methods. + */ public class DataSourcesModel extends BeanModel implements TemplateSequenceModel, TemplateHashModel { private final DataSources dataSources; private final BeansWrapper objectWrapper; public DataSourcesModel(DataSources dataSources, BeansWrapper objectWrapper) { - super(dataSources, objectWrapper); + super(requireNonNull(dataSources), requireNonNull(objectWrapper)); this.dataSources = dataSources; this.objectWrapper = objectWrapper; } @@ -35,4 +44,14 @@ public TemplateCollectionModel keys() { public int size() { return dataSources.size(); } + + @Override + public boolean isEmpty() { + return dataSources.isEmpty(); + } + + @Override + protected Set keySet() { + return new LinkedHashSet(dataSources.getNames()); + } } diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 308d0df3..ed92da5d 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -160,6 +160,7 @@ public void shouldSupportDataSourcesAccessInFTL() throws IOException { assertEquals("false", execute(args + " -i ${DataSources.isEmpty()?c}")); assertEquals("2", execute(args + " -i ${DataSources.size()}")); assertEquals("worx", execute(args + " -i ${DataSources.close()}worx")); + assertEquals("text/csv", execute(args + " -i ${DataSources[1].contentType}")); } @Test diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index ab101012..dbce7c4d 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -28,7 +28,8 @@ public class ManualTest { // private static final String CMD = "-PCSV_SOURCE_FORMAT=DATAFRAME -t examples/templates/dataframe/example.ftl https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv"; // private static final String CMD = "-PCSV_SOURCE_WITH_HEADER=false -PCSV_SOURCE_FORMAT=DEFAULT -PCSV_TARGET_FORMAT=EXCEL -PCSV_TARGET_WITH_HEADER=true -t templates/csv/csv/transform.ftl examples/data/csv/contract.csv"; // private static final String CMD = "-t examples/templates/json/dataframe/github-users.ftl examples/data/json/github-users.json"; - private static final String CMD = "-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl examples/data/csv/contract.csv"; + // private static final String CMD = "-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl examples/data/csv/contract.csv"; + private static final String CMD = "-t src/test/templates/manual.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo=examples/data/csv/contract.csv"; public static void main(String[] args) { From 5660a9dd138d37db8182fe03bc6765c9d5207d57 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 17:48:19 +0200 Subject: [PATCH 06/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 109 ++++++++++++++---- .../base/datasource/DataSourceFactory.java | 2 +- .../base/datasource/DataSources.java | 9 +- .../generator/datasource/DataSourceTest.java | 45 +++++--- .../generator/datasource/DataSourcesTest.java | 17 +-- .../generator/cli/model/DataSourcesModel.java | 2 +- .../generator/cli/ExamplesTest.java | 15 +++ freemarker-generator-cli/templates/info.ftl | 2 +- 8 files changed, 145 insertions(+), 56 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 3a94c7bb..f0d772f5 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 @@ -28,6 +28,7 @@ import java.io.Closeable; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.StringWriter; import java.net.URI; import java.nio.charset.Charset; @@ -37,7 +38,9 @@ import static java.util.Objects.requireNonNull; import static org.apache.commons.io.IOUtils.lineIterator; import static org.apache.freemarker.generator.base.FreeMarkerConstants.DATASOURCE_UNKNOWN_LENGTH; +import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_OCTET_STREAM; import static org.apache.freemarker.generator.base.util.StringUtils.emptyToNull; +import static org.apache.freemarker.generator.base.util.StringUtils.firstNonEmpty; import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty; /** @@ -49,7 +52,7 @@ * the content type & charset might be determined using a network * call. */ -public class DataSource implements Closeable { +public class DataSource implements Closeable, javax.activation.DataSource { /** Human-readable name of the data source */ private final String name; @@ -63,7 +66,7 @@ public class DataSource implements Closeable { /** The underlying "javax.activation.DataSource" */ private final javax.activation.DataSource dataSource; - /** Optional user-supplied content type */ + /** Optional content type */ private final String contentType; /** Optional charset for directly accessing text-based content */ @@ -88,10 +91,41 @@ public DataSource( this.closables = new CloseableReaper(); } + @Override public String getName() { return name; } + /** + * Get the content type. + * + * @return content type + */ + @Override + public String getContentType() { + return contentType(); + } + + /** + * Get an input stream which is closed together with this data source. + * + * @return InputStream + */ + @Override + public InputStream getInputStream() { + return closables.add(getUnsafeInputStream()); + } + + @Override + public OutputStream getOutputStream() { + throw new RuntimeException("No output stream supported"); + } + + @Override + public void close() { + closables.close(); + } + public String getGroup() { return group; } @@ -109,11 +143,11 @@ public Charset getCharset() { } /** - * Get the content type without additional parameters, e.g. "charset". + * Get the mimetype , i.e. content type without additional charset parameter. * - * @return content type + * @return mimetype */ - public String getContentType() { + public String getMimetype() { return MimetypeParser.getMimetype(contentType()); } @@ -138,15 +172,6 @@ public long getLength() { } } - /** - * Get an input stream which is closed together with this data source. - * - * @return InputStream - */ - public InputStream getInputStream() { - return closables.add(getUnsafeInputStream()); - } - /** * Get an input stream which needs to be closed by the caller. * @@ -233,6 +258,18 @@ public byte[] getBytes() { } } + /** + * Matches a metadata entry with a wildcard expression. + * + * @param part part, e.g. "name", "basename", "extension", "uri", "group" + * @param wildcard wildcard expression + * @return true if the wildcard expression matches + */ + public boolean match(String part, String wildcard) { + final String value = getPart(part); + return FilenameUtils.wildcardMatch(value, wildcard); + } + /** * Some tools create a {@link java.io.Closeable} which can bound to the * lifecycle of the data source. When the data source is closed all the @@ -246,11 +283,6 @@ public T addClosable(T closeable) { return closables.add(closeable); } - @Override - public void close() { - closables.close(); - } - @Override public String toString() { return "DataSource{" + @@ -260,7 +292,42 @@ public String toString() { '}'; } + /** + * If there is no content type we ask the underlying data source. E.g. for + * an URL data source this information is fetched from the server. + * + * @return content type + */ private String contentType() { - return isNotEmpty(contentType) ? contentType : dataSource.getContentType(); + if (isNotEmpty(contentType)) { + return contentType; + } else { + return firstNonEmpty(dataSource.getContentType(), MIME_APPLICATION_OCTET_STREAM); + } + } + + private String getPart(String part) { + switch (part) { + case "basename": + return getBaseName(); + case "contenttype": + return getContentType(); + case "extension": + return getExtension(); + case "group": + return getGroup(); + case "mimetype": + return getContentType(); + case "name": + return getName(); + case "path": + return uri.getPath(); + case "scheme": + return uri.getScheme(); + case "uri": + return uri.toASCIIString(); + default: + throw new IllegalArgumentException("Unknown part: " + part); + } } -} +} \ No newline at end of file diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index df333515..694d3e3e 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -120,7 +120,7 @@ public static DataSource fromString(String content, String contentType) { public static DataSource fromString(String name, String group, String content, String contentType) { final StringDataSource dataSource = new StringDataSource(name, content, contentType, UTF_8); - final URI uri = UriUtils.toURI(Location.STRING, Integer.toString(content.hashCode())); + final URI uri = UriUtils.toURI(Location.STRING, "string"); return create(name, group, uri, dataSource, contentType, UTF_8); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java index 62838a1f..daf5e405 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java @@ -16,7 +16,6 @@ */ package org.apache.freemarker.generator.base.datasource; -import org.apache.commons.io.FilenameUtils; import org.apache.freemarker.generator.base.util.ClosableUtils; import org.apache.freemarker.generator.base.util.StringUtils; import org.apache.freemarker.generator.base.util.Validate; @@ -116,19 +115,19 @@ public DataSource get(String name) { */ public List find(String wildcard) { return dataSources.stream() - .filter(d -> FilenameUtils.wildcardMatch(d.getName(), wildcard)) + .filter(dataSource -> dataSource.match("name", wildcard)) .collect(toList()); } /** - * Find data sources based on their group and and globbing pattern. + * Find data sources based on their metadata part and and globbing pattern. * * @param wildcard the wildcard string to match against * @return list of matching data sources */ - public List findByGroup(String wildcard) { + public List find(String part, String wildcard) { return dataSources.stream() - .filter(d -> FilenameUtils.wildcardMatch(d.getGroup(), wildcard)) + .filter(dataSource -> dataSource.match(part, wildcard)) .collect(toList()); } 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 cff981b5..b3200db4 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 @@ -20,7 +20,6 @@ import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSourceFactory; import org.apache.freemarker.generator.base.mime.Mimetypes; -import org.junit.Ignore; import org.junit.Test; import java.io.Closeable; @@ -28,10 +27,11 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Iterator; +import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP; -import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_OCTET_STREAM; +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.assertTrue; @@ -40,12 +40,12 @@ public class DataSourceTest { private static final String ANY_GROUP = "group"; private static final String ANY_TEXT = "Hello World"; - private static final String ANY_XML_FILE_NAME = "pom.xml"; + private static final String ANY_FILE_NAME = "pom.xml"; private static final Charset ANY_CHAR_SET = UTF_8; - private static final File ANY_FILE = new File(ANY_XML_FILE_NAME); + private static final File ANY_FILE = new File(ANY_FILE_NAME); @Test - public void shouldSupportTextDataSource() throws IOException { + public void shouldSupportTextDataSource() { try (DataSource dataSource = DataSourceFactory.fromString("stdin", ANY_GROUP, ANY_TEXT, Mimetypes.MIME_TEXT_PLAIN)) { assertEquals("stdin", dataSource.getName()); assertEquals(ANY_GROUP, dataSource.getGroup()); @@ -56,13 +56,15 @@ public void shouldSupportTextDataSource() throws IOException { assertEquals("text/plain", dataSource.getContentType()); assertTrue(dataSource.getLength() > 0); assertEquals(ANY_TEXT, dataSource.getText()); + assertTrue(dataSource.match("name", "stdin")); + assertTrue(dataSource.match("uri", "string:///*")); } } @Test - public void shouldSupportFileDataSource() throws IOException { + public void shouldSupportFileDataSource() { try (DataSource dataSource = DataSourceFactory.fromFile(ANY_FILE, ANY_CHAR_SET)) { - assertEquals(ANY_XML_FILE_NAME, dataSource.getName()); + assertEquals(ANY_FILE_NAME, dataSource.getName()); assertEquals(DEFAULT_GROUP, dataSource.getGroup()); assertEquals("pom", dataSource.getBaseName()); assertEquals("xml", dataSource.getExtension()); @@ -71,20 +73,25 @@ public void shouldSupportFileDataSource() throws IOException { assertEquals("application/xml", dataSource.getContentType()); assertTrue(dataSource.getLength() > 0); assertFalse(dataSource.getText().isEmpty()); + assertTrue(dataSource.match("name", ANY_FILE_NAME)); + assertTrue(dataSource.match("uri", "file:/*/pom.xml")); + assertTrue(dataSource.match("extension", "xml")); + assertTrue(dataSource.match("basename", "pom")); + assertTrue(dataSource.match("path", "*/pom.xml")); } } - @Ignore("Requires internet conenection") + // @Ignore("Requires internet connection") @Test - public void shouldSupportUrlDataSource() throws IOException { - try (DataSource dataSource = DataSourceFactory.create("https://google.com?foo=bar")) { - assertEquals("google.com", dataSource.getName()); + public void shouldSupportUrlDataSource() { + try (DataSource dataSource = DataSourceFactory.create("https://www.google.com/?foo=bar")) { + assertEquals("www.google.com", dataSource.getName()); assertEquals(DEFAULT_GROUP, dataSource.getGroup()); - assertEquals("google", dataSource.getBaseName()); + assertEquals("www.google", dataSource.getBaseName()); assertEquals("com", dataSource.getExtension()); - assertEquals("https://google.com?foo=bar", dataSource.getUri().toString()); - assertEquals(MIME_APPLICATION_OCTET_STREAM, dataSource.getContentType()); - assertEquals(UTF_8, dataSource.getCharset()); + assertEquals("https://www.google.com/?foo=bar", dataSource.getUri().toString()); + assertEquals(MIME_TEXT_HTML, dataSource.getMimetype()); + assertEquals("ISO-8859-1", dataSource.getCharset().name()); assertEquals(-1, dataSource.getLength()); assertFalse(dataSource.getText().isEmpty()); } @@ -93,14 +100,14 @@ public void shouldSupportUrlDataSource() throws IOException { @Test public void shouldSupportLineIterator() throws IOException { try (DataSource dataSource = textDataSource()) { - try (LineIterator iterator = dataSource.getLineIterator(ANY_CHAR_SET.name())) { + try (LineIterator iterator = dataSource.getLineIterator()) { assertEquals(1, count(iterator)); } } } @Test - public void shouldReadLines() throws IOException { + public void shouldReadLines() { try (DataSource dataSource = textDataSource()) { assertEquals(1, dataSource.getLines().size()); assertEquals(ANY_TEXT, dataSource.getLines().get(0)); @@ -108,7 +115,7 @@ public void shouldReadLines() throws IOException { } @Test - public void shouldGetBytes() throws IOException { + public void shouldGetBytes() { try (DataSource dataSource = textDataSource()) { assertEquals(11, dataSource.getBytes().length); } @@ -144,7 +151,7 @@ private static final class TestClosable implements Closeable { private boolean closed = false; @Override - public void close() throws IOException { + public void close() { closed = true; } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java index c97de8f7..5639adf8 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java @@ -39,6 +39,7 @@ public class DataSourcesTest { private static final String ANY_FILE_EXTENSION = "xml"; private static final File ANY_FILE = new File(ANY_FILE_NAME); private static final String ANY_URL = "https://server.invalid?foo=bar"; + private static final String GROUP_PART = "group"; @Test public void shouldFindByName() { @@ -63,18 +64,18 @@ public void shouldFindByName() { } @Test - public void shouldFindByGroup() { + public void shouldFindByGroupPart() { final DataSources dataSources = dataSources(); - assertEquals(0, dataSources.findByGroup(null).size()); - assertEquals(0, dataSources.findByGroup("").size()); + assertEquals(0, dataSources.find(GROUP_PART, null).size()); + assertEquals(0, dataSources.find(GROUP_PART, "").size()); - assertEquals(0, dataSources.findByGroup("unknown").size()); + assertEquals(0, dataSources.find(GROUP_PART, "unknown").size()); - assertEquals(3, dataSources.findByGroup("*").size()); - assertEquals(3, dataSources.findByGroup("default").size()); - assertEquals(3, dataSources.findByGroup("d*").size()); - assertEquals(3, dataSources.findByGroup("d??????").size()); + assertEquals(3, dataSources.find(GROUP_PART, "*").size()); + assertEquals(3, dataSources.find(GROUP_PART, "default").size()); + assertEquals(3, dataSources.find(GROUP_PART, "d*").size()); + assertEquals(3, dataSources.find(GROUP_PART, "d??????").size()); } diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java index 2eac3d16..ec50c228 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java @@ -52,6 +52,6 @@ public boolean isEmpty() { @Override protected Set keySet() { - return new LinkedHashSet(dataSources.getNames()); + return new LinkedHashSet<>(dataSources.getNames()); } } diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index ed92da5d..20a3cee0 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -163,6 +163,21 @@ public void shouldSupportDataSourcesAccessInFTL() throws IOException { assertEquals("text/csv", execute(args + " -i ${DataSources[1].contentType}")); } + @Test + public void shouldNotShadowDataSourcesInFTL() throws IOException { + final String args = "empty=examples/data/json/github-users.json"; + + // check shadowing of "isEmpty" + assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources.empty?c}")); + // DataSources#isEmpty shadows the data source "empty" + // assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources[\"empty\"]}")); + assertEquals("empty", execute("empty=examples/data/json/github-users.json -i ${DataSources.get(\"empty\").name}")); + + // check shadowing of "find" + // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources.find.name}")); + // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources[\"find\"].name}")); + } + @Test @Ignore("Manual test to check memory consumption and resource handling") public void shouldCloseAllResources() throws IOException { diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index 11275b6a..d12e68de 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -49,7 +49,7 @@ FreeMarker CLI Data Model FreeMarker CLI DataSources ------------------------------------------------------------------------------ <#list DataSources.list as dataSource> -[#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, contentType=${dataSource.contentType}, charset=${dataSource.charset}, length=${dataSource.length} Bytes +[#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, mimeType=${dataSource.mimetype}, charset=${dataSource.charset}, length=${dataSource.length} Bytes URI : ${dataSource.uri} From e937aa4594764a729e2135df528df2cc6b215c76 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 18:39:25 +0200 Subject: [PATCH 07/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 23 +++++++++++-------- .../base/datasource/DataSourceFactory.java | 19 +++++++++++---- .../base/datasource/DataSources.java | 11 ++++----- .../base/file/RecursiveFileSupplier.java | 2 +- .../generator/base/util/StringUtils.java | 4 ---- freemarker-generator-cli/run-examples.bat | 6 ++--- freemarker-generator-cli/run-examples.sh | 6 ++--- .../src/main/scripts/run-examples.bat | 6 ++--- .../src/main/scripts/run-examples.sh | 6 ++--- .../markdown/cli/usage/running-examples.md | 8 +++---- .../generator/cli/ExamplesTest.java | 6 ++--- .../src/test/templates/manual.ftl | 1 - 12 files changed, 53 insertions(+), 45 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 f0d772f5..c02eee26 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 @@ -23,6 +23,8 @@ import org.apache.freemarker.generator.base.activation.StringDataSource; import org.apache.freemarker.generator.base.mime.MimetypeParser; import org.apache.freemarker.generator.base.util.CloseableReaper; +import org.apache.freemarker.generator.base.util.StringUtils; +import org.apache.freemarker.generator.base.util.Validate; import javax.activation.FileDataSource; import java.io.Closeable; @@ -36,12 +38,8 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Objects.requireNonNull; -import static org.apache.commons.io.IOUtils.lineIterator; import static org.apache.freemarker.generator.base.FreeMarkerConstants.DATASOURCE_UNKNOWN_LENGTH; import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_OCTET_STREAM; -import static org.apache.freemarker.generator.base.util.StringUtils.emptyToNull; -import static org.apache.freemarker.generator.base.util.StringUtils.firstNonEmpty; -import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty; /** * Data source which encapsulates data to be used for rendering @@ -83,7 +81,7 @@ public DataSource( String contentType, Charset charset) { this.name = requireNonNull(name); - this.group = emptyToNull(group); + this.group = StringUtils.emptyToNull(group); this.uri = requireNonNull(uri); this.dataSource = requireNonNull(dataSource); this.contentType = contentType; @@ -190,6 +188,7 @@ public String getText() { } public String getText(String charsetName) { + Validate.notEmpty(charsetName, "No charset name provided"); final StringWriter writer = new StringWriter(); try (InputStream is = getUnsafeInputStream()) { IOUtils.copy(is, writer, Charset.forName(charsetName)); @@ -217,6 +216,7 @@ public List getLines() { * @return the list of Strings, never null */ public List getLines(String charsetName) { + Validate.notEmpty(charsetName, "No charset name provided"); try (InputStream inputStream = getUnsafeInputStream()) { return IOUtils.readLines(inputStream, charsetName); } catch (IOException e) { @@ -243,8 +243,9 @@ public LineIterator getLineIterator() { * @return line iterator */ public LineIterator getLineIterator(String charsetName) { + Validate.notEmpty(charsetName, "No charset name provided"); try { - return closables.add(lineIterator(getUnsafeInputStream(), Charset.forName(charsetName))); + return closables.add(IOUtils.lineIterator(getUnsafeInputStream(), Charset.forName(charsetName))); } catch (IOException e) { throw new RuntimeException("Failed to create line iterator: " + toString(), e); } @@ -261,8 +262,9 @@ public byte[] getBytes() { /** * Matches a metadata entry with a wildcard expression. * + * @see Apache Commons IO * @param part part, e.g. "name", "basename", "extension", "uri", "group" - * @param wildcard wildcard expression + * @param wildcard the wildcard string to match against * @return true if the wildcard expression matches */ public boolean match(String part, String wildcard) { @@ -299,15 +301,16 @@ public String toString() { * @return content type */ private String contentType() { - if (isNotEmpty(contentType)) { + if (StringUtils.isNotEmpty(contentType)) { return contentType; } else { - return firstNonEmpty(dataSource.getContentType(), MIME_APPLICATION_OCTET_STREAM); + return StringUtils.firstNonEmpty(dataSource.getContentType(), MIME_APPLICATION_OCTET_STREAM); } } private String getPart(String part) { - switch (part) { + Validate.notEmpty(part, "No metadata part provided"); + switch (part.toLowerCase()) { case "basename": return getBaseName(); case "contenttype": diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index 694d3e3e..b65e4fd4 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -185,11 +185,22 @@ public static DataSource fromEnvironment(String name, String group, String key, // == General =========================================================== - public static DataSource create(String str) { - if (UriUtils.isUri(str)) { - return fromNamedUri(str); + /** + * Create a data source based on a + *
    + *
  • URI
  • + *
  • Named URI
  • + *
  • file name
  • + *
+ * + * @param source source of the data source + * @return DataSource + */ + public static DataSource create(String source) { + if (UriUtils.isUri(source)) { + return fromNamedUri(source); } else { - final File file = new File(str); + final File file = new File(source); return fromFile(file.getName(), DEFAULT_GROUP, file, UTF_8); } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java index daf5e405..0e1f1a07 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java @@ -33,6 +33,7 @@ */ public class DataSources implements Closeable { + /** The underlying list of data sources */ private final List dataSources; public DataSources(Collection dataSources) { @@ -74,10 +75,6 @@ public boolean isEmpty() { return dataSources.isEmpty(); } - public DataSource getFirst() { - return dataSources.get(0); - } - public List getList() { return new ArrayList<>(dataSources); } @@ -108,8 +105,9 @@ public DataSource get(String name) { } /** - * Find data sources based on their name and globbing pattern. + * Find data sources based on their name and a wildcard. * + * @see Apache Commons IO * @param wildcard the wildcard string to match against * @return list of matching data sources */ @@ -120,8 +118,9 @@ public List find(String wildcard) { } /** - * Find data sources based on their metadata part and and globbing pattern. + * Find data sources based on their metadata part and wildcard. * + * @see Apache Commons IO * @param wildcard the wildcard string to match against * @return list of matching data sources */ diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java index 9ffb03cc..b2498d8d 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/file/RecursiveFileSupplier.java @@ -83,7 +83,7 @@ private List resolve(String source) { if (file.isFile()) { return resolveFile(file); } else if (file.isDirectory()) { - return new ArrayList<>(resolveDirectory(file)); + return resolveDirectory(file); } else { throw new IllegalArgumentException("Unable to find source: " + source); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java index a36bf1ec..3e480fa6 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java @@ -30,10 +30,6 @@ public static String emptyToNull(String value) { return value != null && value.trim().isEmpty() ? null : value; } - public static String nullToEmpty(String value) { - return value == null ? "" : value; - } - public static String firstNonEmpty(final String... values) { if (values != null) { for (final String value : values) { diff --git a/freemarker-generator-cli/run-examples.bat b/freemarker-generator-cli/run-examples.bat index e7abc87e..c4864b11 100644 --- a/freemarker-generator-cli/run-examples.bat +++ b/freemarker-generator-cli/run-examples.bat @@ -41,9 +41,9 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.first).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.first)["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.first).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt %FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json %FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml %FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt diff --git a/freemarker-generator-cli/run-examples.sh b/freemarker-generator-cli/run-examples.sh index f1ad546d..2c3d152a 100755 --- a/freemarker-generator-cli/run-examples.sh +++ b/freemarker-generator-cli/run-examples.sh @@ -46,9 +46,9 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.first).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.first)["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.first).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.bat b/freemarker-generator-cli/src/main/scripts/run-examples.bat index 5b4ed449..c5e25bea 100644 --- a/freemarker-generator-cli/src/main/scripts/run-examples.bat +++ b/freemarker-generator-cli/src/main/scripts/run-examples.bat @@ -41,9 +41,9 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.first).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.first)["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.first).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt %FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json %FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml %FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.sh b/freemarker-generator-cli/src/main/scripts/run-examples.sh index 4bca33af..91f750ec 100755 --- a/freemarker-generator-cli/src/main/scripts/run-examples.sh +++ b/freemarker-generator-cli/src/main/scripts/run-examples.sh @@ -46,9 +46,9 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.first).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.first)["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.first).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } $FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md index 9b329a10..26b220c9 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md @@ -768,16 +768,16 @@ Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without i > bin/freemarker-cli -i 'Hello ${SystemTool.envs["USER"]}'; echo Hello sgoeschl -> bin/freemarker-cli -i '${JsonPathTool.parse(DataSources.first).read("$.info.title")}' examples/data/json/swagger-spec.json; echo +> bin/freemarker-cli -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo Swagger Petstore -> bin/freemarker-cli -i 'Post Title : ${JsonPathTool.parse(DataSources.first).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo +> bin/freemarker-cli -i 'Post Title : ${JsonPathTool.parse(DataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo Post Title : qui est esse -> bin/freemarker-cli -i '${XmlTool.parse(DataSources.first)["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo +> bin/freemarker-cli -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo John Smith -> bin/freemarker-cli -i '${JsoupTool.parse(DataSources.first).select("a")[0]}' examples/data/html/dependencies.html; echo +> bin/freemarker-cli -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo FreeMarker CLI > freemarker-cli -i '<#list SystemTool.envs as name,value>${name} ==> ${value}${"\n"}' diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 20a3cee0..96c9ab4d 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -111,9 +111,9 @@ public void shouldRunDataFrameExamples() throws IOException { @Test public void shouldRunInteractiveTemplateExamples() throws IOException { - assertValid(execute("-i ${JsonPathTool.parse(DataSources.first).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${XmlTool.parse(DataSources.first)[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); - assertValid(execute("-i ${JsoupTool.parse(DataSources.first).select(\"a\")[0]} examples/data/html/dependencies.html")); + assertValid(execute("-i ${JsonPathTool.parse(DataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${XmlTool.parse(DataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); + assertValid(execute("-i ${JsoupTool.parse(DataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); assertValid(execute("-i ${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); assertValid(execute("-i ${GsonTool.toJson(yaml)} -m yaml=examples/data/yaml/swagger-spec.yaml")); assertValid(execute("-i ${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))} examples/data/json/swagger-spec.json")); diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl index 34a913f3..e6811c43 100644 --- a/freemarker-generator-cli/src/test/templates/manual.ftl +++ b/freemarker-generator-cli/src/test/templates/manual.ftl @@ -55,7 +55,6 @@ Find DataSources By Wildcard Java Array-style access --------------------------------------------------------------------------- -${DataSources.first.toString()} ${DataSources.get(0).toString()} Invoke Arbitrary Methods On DataSources From f6a5cab5e991261894f68298dd3d12ca837cdeaf Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 21:16:44 +0200 Subject: [PATCH 08/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSourceFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index b65e4fd4..ed69fff7 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -40,6 +40,7 @@ import java.net.URL; import java.nio.charset.Charset; import java.util.Properties; +import java.util.UUID; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP; @@ -120,7 +121,7 @@ public static DataSource fromString(String content, String contentType) { public static DataSource fromString(String name, String group, String content, String contentType) { final StringDataSource dataSource = new StringDataSource(name, content, contentType, UTF_8); - final URI uri = UriUtils.toURI(Location.STRING, "string"); + final URI uri = UriUtils.toURI(Location.STRING, UUID.randomUUID().toString()); return create(name, group, uri, dataSource, contentType, UTF_8); } From b2d17734ee73ee553bc0e3de976a4dfc2b1a2061 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 21:35:30 +0200 Subject: [PATCH 09/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../freemarker/generator/datasource/DataSourceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b3200db4..1992c09d 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 @@ -20,6 +20,7 @@ import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSourceFactory; import org.apache.freemarker.generator.base.mime.Mimetypes; +import org.junit.Ignore; import org.junit.Test; import java.io.Closeable; @@ -27,7 +28,6 @@ import java.io.IOException; import java.nio.charset.Charset; import java.util.Iterator; -import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP; @@ -81,7 +81,7 @@ public void shouldSupportFileDataSource() { } } - // @Ignore("Requires internet connection") + @Ignore("Requires internet connection") @Test public void shouldSupportUrlDataSource() { try (DataSource dataSource = DataSourceFactory.create("https://www.google.com/?foo=bar")) { From d044b0f047d4aedd09b1a38d8df48ae3768c8ad7 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 22:38:54 +0200 Subject: [PATCH 10/23] FREEMARKER-148 Rename "DataSources" to "dataSources" in FTL code --- .../generator/base/FreeMarkerConstants.java | 2 +- freemarker-generator-cli/CHANGELOG.md | 2 +- .../examples/data/ftl/nginx/nginx.conf.ftl | 2 +- .../templates/accesslog/combined-access.ftl | 2 +- .../csv/csv/gatling-user-credentials.ftl | 2 +- .../templates/csv/fo/transactions.ftl | 2 +- .../examples/templates/csv/fo/transform.ftl | 2 +- .../templates/csv/html/transactions.ftl | 2 +- .../examples/templates/csv/md/filter.ftl | 2 +- .../examples/templates/csv/shell/curl.ftl | 2 +- .../examples/templates/dataframe/example.ftl | 2 +- .../templates/dataframe/html/print.ftl | 2 +- .../examples/templates/demo.ftl | 14 ++++---- .../examples/templates/excel/csv/custom.ftl | 2 +- .../templates/excel/dataframe/transform.ftl | 2 +- .../templates/html/csv/dependencies.ftl | 2 +- .../templates/json/csv/swagger-endpoints.ftl | 2 +- .../templates/json/dataframe/github-users.ftl | 2 +- .../templates/json/md/github-users.ftl | 2 +- .../properties/csv/locker-test-users.ftl | 2 +- .../templates/tsv/fo/transactions.ftl | 2 +- .../examples/templates/xml/txt/recipients.ftl | 2 +- .../examples/templates/yaml/txt/transform.ftl | 2 +- freemarker-generator-cli/run-examples.bat | 12 +++---- freemarker-generator-cli/run-examples.sh | 12 +++---- .../cli/config/ConfigurationSupplier.java | 4 --- .../src/main/scripts/run-examples.bat | 12 +++---- .../src/main/scripts/run-examples.sh | 12 +++---- .../markdown/cli/concepts/data-sources.md | 6 ++-- .../markdown/cli/usage/running-examples.md | 34 +++++++++---------- .../markdown/cli/usage/using-dataframes.md | 6 ++-- .../generator/cli/ExamplesTest.java | 34 +++++++++++-------- .../freemarker/generator/cli/ManualTest.java | 2 +- .../cli/config/ConfigurationSupplierTest.java | 2 +- .../src/test/templates/echo.ftl | 2 +- .../src/test/templates/manual.ftl | 20 +++++------ .../src/test/templates/tools/csv.ftl | 2 +- freemarker-generator-cli/templates/cat.ftl | 2 +- .../templates/csv/csv/transform.ftl | 2 +- .../templates/csv/html/transform.ftl | 2 +- .../templates/csv/md/transform.ftl | 2 +- .../templates/excel/csv/transform.ftl | 2 +- .../templates/excel/html/transform.ftl | 2 +- .../templates/excel/md/transform.ftl | 2 +- freemarker-generator-cli/templates/info.ftl | 4 +-- .../templates/json/yaml/transform.ftl | 2 +- .../templates/yaml/json/transform.ftl | 2 +- 47 files changed, 120 insertions(+), 120 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java index 584fcbde..3b5963e9 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java @@ -77,7 +77,7 @@ public static class Model { private Model() { } - public static final String DATASOURCES = "DataSources"; + public static final String DATASOURCES = "dataSources"; public static final String FREEMARKER_CLI_ARGS = "freemarker.cli.args"; public static final String FREEMARKER_LOCALE = "freemarker.locale"; diff --git a/freemarker-generator-cli/CHANGELOG.md b/freemarker-generator-cli/CHANGELOG.md index e7e42468..e0165ed4 100644 --- a/freemarker-generator-cli/CHANGELOG.md +++ b/freemarker-generator-cli/CHANGELOG.md @@ -17,7 +17,7 @@ All notable changes to this project will be documented in this file. We try to a * [FREEMARKER-129] Migrate `freemarker-cli` into `freemarker-generator` project (see [https://github.com/sgoeschl/freemarker-cli](https://github.com/sgoeschl/freemarker-cli)) ### Changed -* Removing `DataSources.first` and use `DataSources.get(0)` instead +* Removing `DataSources.first` and use `dataSources.get(0)` instead * [FREEMARKER-146] Cleanly separate example templates and data from user-supplied content * `DataSource` use `uri` instead of `location` * [FREEMARKER-138] freemarker-generator: Rename `Datasource` to `DataSource` diff --git a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl index 41105cb0..deab4508 100644 --- a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl +++ b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl @@ -1,4 +1,4 @@ -<#assign env = PropertiesTool.parse(DataSources.get(0))> +<#assign env = PropertiesTool.parse(dataSources.get(0))> server { listen 80; diff --git a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl index ea92b680..abe64782 100644 --- a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl +++ b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign lines = dataSource.getLineIterator()> <#compress> diff --git a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl index 6186b62d..ce691a87 100644 --- a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl +++ b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter(';')> <#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> <#assign csvRecords = csvParser.records> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl index 48a64169..8db0346d 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()> <#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl index 4efa5968..9fa11c85 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl @@ -17,7 +17,7 @@ --> <#assign csvFormatName = CVS_IN_FORMAT!"DEFAULT"> <#assign cvsFormat = CSVTool.formats[csvFormatName].withHeader()> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl index d9b32cab..b8793843 100644 --- a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter('\t').withHeader()> <#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> diff --git a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl index 57f990d8..40cc9439 100644 --- a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl +++ b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> <#assign column = SystemTool.getParameter("column")> diff --git a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl index b8fa1096..bfa65e87 100644 --- a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl +++ b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign records = csvParser.records> <#assign csvMap = CSVTool.toMap(records, "disposer")> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/dataframe/example.ftl b/freemarker-generator-cli/examples/templates/dataframe/example.ftl index 9929d215..5b051ca4 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/example.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/example.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign csvParser = CSVTool.parse(dataSource, CSVTool.formats["DATAFRAME"])> <#assign users = DataFrameTool.fromCSVParser(csvParser)> diff --git a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl index e17d3a94..aa46adac 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader().withDelimiter(';')> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign dataFrame = DataFrameTool.toDataFrame(csvParser)> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 0ed952ec..6e9facd2 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -48,7 +48,7 @@ java.math.RoundingMode#UP: ${FreeMarkerTool.enums["java.math.RoundingMode"].UP} 6) Display list of data sources --------------------------------------------------------------------------- List all data sources: -<#list DataSources.list as dataSource> +<#list dataSources.list as dataSource> - Document: name=${dataSource.name} uri=${dataSource.uri} length=${dataSource.length} encoding=${dataSource.encoding!""} @@ -86,21 +86,21 @@ user.home : ${SystemTool.systemProperties["user.home"]!""} 11) Access DataSources --------------------------------------------------------------------------- Get the number of documents: -- ${DataSources.size()} -<#if !DataSources.isEmpty()> +- ${dataSources.size()} +<#if !dataSources.isEmpty()> Get the first document -- ${DataSources.get(0)!"NA"} +- ${dataSources.get(0)!"NA"} List all files containing "README" in the name -<#list DataSources.find("*README*") as dataSource> +<#list dataSources.find("*README*") as dataSource> - ${dataSource.name} List all files having "md" extension -<#list DataSources.find("*.md") as dataSource> +<#list dataSources.find("*.md") as dataSource> - ${dataSource.name} Get all documents -<#list DataSources.list as dataSource> +<#list dataSources.list as dataSource> - ${dataSource.name} => ${dataSource.uri} diff --git a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl index ac4b4be1..f5c744e9 100644 --- a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl +++ b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl @@ -18,7 +18,7 @@ <#assign format = CSV_TARGET_FORMAT!"DEFAULT"> <#assign salt = SystemTool.parameters["salt"]!"salt"> <#-- Parse the first data source & sheet of the Excel document --> -<#assign workbook = ExcelTool.parse(DataSources.get(0))> +<#assign workbook = ExcelTool.parse(dataSources.get(0))> <#assign sheet = ExcelTool.getSheets(workbook)[0]> <#assign records = ExcelTool.toTable(sheet)> <#-- Setup CSVPrinter --> diff --git a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl index d172bec8..1b931b45 100644 --- a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl +++ b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign workbook = ExcelTool.parse(dataSource)> <#list ExcelTool.getSheets(workbook) as sheet> <#assign table = ExcelTool.toTable(sheet)> diff --git a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl index 8664eae2..3bfd8c85 100644 --- a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl +++ b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign html = JsoupTool.parse(dataSource)> diff --git a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl index 5f9d6a03..5ea0afaf 100644 --- a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl +++ b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = GsonTool.parse(DataSources.get(0))> +<#assign map = GsonTool.parse(dataSources.get(0))> <#assign basePath = map.basePath!"/"> <#assign paths = map.paths!{}> diff --git a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl index a6547fc8..564b8249 100644 --- a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl @@ -15,6 +15,6 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = GsonTool.parse(DataSources.get(0))> +<#assign json = GsonTool.parse(dataSources.get(0))> <#assign dataframe = DataFrameTool.fromMaps(json)> ${DataFrameTool.print(dataframe)} diff --git a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl index 29efbc39..7e48865a 100644 --- a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl @@ -15,7 +15,7 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = JsonPathTool.parse(DataSources.get(0))> +<#assign json = JsonPathTool.parse(dataSources.get(0))> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users diff --git a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl index 52ac65f3..b312c2ea 100644 --- a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl +++ b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl @@ -17,7 +17,7 @@ --> <#compress> TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION - <#list DataSources.list as dataSource> + <#list dataSources.list as dataSource> <#assign properties = PropertiesTool.parse(dataSource)> <#assign environments = properties["ENVIRONMENTS"]!""> <#assign tenant = extractTenant(environments)> diff --git a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl index e1840d17..eaa068fb 100644 --- a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = CSVTool.formats["TDF"].withHeader()> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl index 43b51b4d..aff1373f 100644 --- a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl +++ b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign xml = XmlTool.parse(DataSources.get(0))> +<#assign xml = XmlTool.parse(dataSources.get(0))> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} diff --git a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl index fdba743f..f69ebe2d 100644 --- a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl +++ b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = YamlTool.parse(DataSources.get(0))> +<#assign map = YamlTool.parse(dataSources.get(0))> <#---------------------------------------------------------------------------> <#compress> <@print map 1/> diff --git a/freemarker-generator-cli/run-examples.bat b/freemarker-generator-cli/run-examples.bat index c4864b11..f698a6d6 100644 --- a/freemarker-generator-cli/run-examples.bat +++ b/freemarker-generator-cli/run-examples.bat @@ -41,12 +41,12 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt -%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json -%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml -%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt +%FREEMARKER_CMD% -i '${JsonPathTool.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${XmlTool.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${JsoupTool.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json +%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml +%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt REM ========================================================================= REM CSV diff --git a/freemarker-generator-cli/run-examples.sh b/freemarker-generator-cli/run-examples.sh index 2c3d152a..0b045441 100755 --- a/freemarker-generator-cli/run-examples.sh +++ b/freemarker-generator-cli/run-examples.sh @@ -46,12 +46,12 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # CSV diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java index bf77a693..c7d4ea73 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java @@ -19,7 +19,6 @@ import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Version; -import org.apache.freemarker.generator.cli.model.GeneratorObjectWrapper; import java.util.Properties; import java.util.function.Supplier; @@ -59,9 +58,6 @@ public Configuration get() { // apply all "freemarker.configuration.setting" values configuration.setSettings(freeMarkerConfigurationSettings()); - // provide custom models for "DataSources" - configuration.setObjectWrapper(new GeneratorObjectWrapper(FREEMARKER_VERSION)); - // override current configuration with caller-provided settings configuration.setDefaultEncoding(settings.getTemplateEncoding().name()); configuration.setLocale(settings.getLocale()); diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.bat b/freemarker-generator-cli/src/main/scripts/run-examples.bat index c5e25bea..995853b3 100644 --- a/freemarker-generator-cli/src/main/scripts/run-examples.bat +++ b/freemarker-generator-cli/src/main/scripts/run-examples.bat @@ -41,12 +41,12 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(DataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(DataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(DataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt -%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json -%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml -%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt +%FREEMARKER_CMD% -i '${JsonPathTool.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${XmlTool.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${JsoupTool.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json +%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml +%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt REM ========================================================================= REM CSV diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.sh b/freemarker-generator-cli/src/main/scripts/run-examples.sh index 91f750ec..a9250104 100755 --- a/freemarker-generator-cli/src/main/scripts/run-examples.sh +++ b/freemarker-generator-cli/src/main/scripts/run-examples.sh @@ -46,12 +46,12 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # CSV diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md index 1a921fce..2a44c078 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md @@ -96,11 +96,11 @@ exposed in the data model provides A few FTL examples ``` -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> -<#assign dataSource = DataSources.get("user.csv)> +<#assign dataSource = dataSources.get("user.csv)> -<#list DataSources.find("*.md") as dataSource> +<#list dataSources.find("*.md") as dataSource> - ${dataSource.name} ``` diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md index 26b220c9..a73c4ff9 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md @@ -92,7 +92,7 @@ Below you see the Apache FreeMarker Template ```text <#ftl output_format="plainText" > -<#assign json = JsonPathTool.parse(DataSources.get(0))> +<#assign json = JsonPathTool.parse(dataSources.get(0))> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users @@ -130,7 +130,7 @@ The FreeMarker template is shown below ```text <#ftl output_format="plainText"> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> @@ -167,7 +167,7 @@ using the following template ```text <#ftl output_format="plainText" > -<#assign xml = XmlTool.parse(DataSources.get(0))> +<#assign xml = XmlTool.parse(dataSources.get(0))> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} @@ -214,7 +214,7 @@ One day I was asked a to prepare a CSV files containing REST endpoints described ```text <#ftl output_format="plainText" strip_text="true"> -<#assign json = JsonPathTool.parse(DataSources.get(0))> +<#assign json = JsonPathTool.parse(dataSources.get(0))> <#assign basePath = json.read("$.basePath")> <#assign paths = json.read("$.paths")> @@ -276,7 +276,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex ```text <#ftl output_format="HTML" > -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign workbook = ExcelTool.parse(dataSource)> <#assign date = .now?iso_utc> @@ -372,7 +372,7 @@ The FTL uses a couple of interesting features <#ftl output_format="plainText" strip_text="true"> <#compress> TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION - <#list DataSources.list as dataSource> + <#list dataSources.list as dataSource> <#assign properties = PropertiesTool.parse(dataSource)> <#assign environments = properties["ENVIRONMENTS"]!""> <#assign tenant = extractTenant(environments)> @@ -402,7 +402,7 @@ For a POC (proof of concept) I created a sample transformation from CSV to XML-F ```text <#ftl output_format="XML" > -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()> <#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> @@ -523,7 +523,7 @@ Recently I got the rather unusual question how to determine the list of dependen ```text <#ftl output_format="plainText" strip_text="true"> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign html = JsoupTool.parse(dataSource)> <#compress> @@ -598,7 +598,7 @@ and the final FTL is found below ```text <#ftl output_format="plainText"> <#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(DataSources.get(0), cvsFormat)> +<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> <#assign records = csvParser.records> <#assign csvMap = CSVTool.toMap(records, "disposer")> <#---------------------------------------------------------------------------> @@ -682,7 +682,7 @@ using the following FreeMarker template ```text <#ftl output_format="plainText" strip_whitespace=true> <#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign lines = dataSource.getLineIterator()> <#compress> @@ -768,16 +768,16 @@ Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without i > bin/freemarker-cli -i 'Hello ${SystemTool.envs["USER"]}'; echo Hello sgoeschl -> bin/freemarker-cli -i '${JsonPathTool.parse(DataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo +> bin/freemarker-cli -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo Swagger Petstore -> bin/freemarker-cli -i 'Post Title : ${JsonPathTool.parse(DataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo +> bin/freemarker-cli -i 'Post Title : ${JsonPathTool.parse(dataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo Post Title : qui est esse -> bin/freemarker-cli -i '${XmlTool.parse(DataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo +> bin/freemarker-cli -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo John Smith -> bin/freemarker-cli -i '${JsoupTool.parse(DataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo +> bin/freemarker-cli -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo FreeMarker CLI > freemarker-cli -i '<#list SystemTool.envs as name,value>${name} ==> ${value}${"\n"}' @@ -804,7 +804,7 @@ and Apache FreeMarker template ```text <#ftl output_format="plainText" strip_text="true"> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> <#assign column = SystemTool.getParameter("column")> @@ -890,11 +890,11 @@ Sometimes we simply need to transform a JSON into an equivalent YAML or the othe ``` > freemarker-cli -t templates/yaml/json/transform.ftl examples/data/yaml/swagger-spec.yaml -> freemarker-cli -i '${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml +> freemarker-cli -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > freemarker-cli -i '${GsonTool.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml > freemarker-cli -t templates/json/yaml/transform.ftl examples/data/json/swagger-spec.json -> freemarker-cli -i '${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))}' examples/data/json/swagger-spec.json +> freemarker-cli -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > freemarker-cli -i '${YamlTool.toYaml(json)}' -m json=examples/data/json/swagger-spec.json ``` diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md index 25c0c0e3..8047e346 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md @@ -30,7 +30,7 @@ Meier;30;Germany and create a `DateFrame` using the following code snippet ``` -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign csvParser = CSVTool.parse(dataSource, CSVTool.formats["DATAFRAME"])> <#assign users = DataFrameTool.fromCSVParser(csvParser)> ``` @@ -156,7 +156,7 @@ it is a list of maps hence we invoke `DataFrameTool.fromMaps() ``` freemarker-cli \ - -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))}' \ + -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' \ examples/data/json/github-users.json ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐ @@ -183,7 +183,7 @@ freemarker-cli \ Let's transform an Excel Sheet to a `DataFrame` being printed using the following template ``` -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign workbook = ExcelTool.parse(dataSource)> <#list ExcelTool.getSheets(workbook) as sheet> <#assign table = ExcelTool.toTable(sheet)> diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 96c9ab4d..5e3a4296 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -111,14 +111,14 @@ public void shouldRunDataFrameExamples() throws IOException { @Test public void shouldRunInteractiveTemplateExamples() throws IOException { - assertValid(execute("-i ${JsonPathTool.parse(DataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${XmlTool.parse(DataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); - assertValid(execute("-i ${JsoupTool.parse(DataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); - assertValid(execute("-i ${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); + assertValid(execute("-i ${JsonPathTool.parse(dataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${XmlTool.parse(dataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); + assertValid(execute("-i ${JsoupTool.parse(dataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); + assertValid(execute("-i ${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); assertValid(execute("-i ${GsonTool.toJson(yaml)} -m yaml=examples/data/yaml/swagger-spec.yaml")); - assertValid(execute("-i ${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))} examples/data/json/swagger-spec.json")); assertValid(execute("-i ${YamlTool.toYaml(json)} -m json=examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(DataSources.get(0))))} examples/data/json/github-users.json")); + assertValid(execute("-i ${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))} examples/data/json/github-users.json")); } @Test @@ -139,6 +139,7 @@ public void shouldTransformMultipleTemplates() throws IOException { assertValid(execute("-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl -o target/contract.html examples/data/csv/contract.csv")); } + /** @Test public void shouldSupportDataSourcesAccessInFTL() throws IOException { final String args = "examples/data/json/github-users.json examples/data/csv/contract.csv"; @@ -149,34 +150,37 @@ public void shouldSupportDataSourcesAccessInFTL() throws IOException { // check FTL array-style access assertEquals("github-users.json", execute(args + " -i ${DataSources[0].name}")); - assertEquals("github-users.json", execute(args + " -i ${DataSources.get(0).name}")); + assertEquals("github-users.json", execute(args + " -i ${dataSources.get(0).name}")); // check FTL map-style access assertEquals("github-users.json", execute(args + " -i ${DataSources[\"github-users.json\"].name}")); - assertEquals("github-users.json", execute(args + " -i ${DataSources.get(\"github-users.json\").name}")); + assertEquals("github-users.json", execute(args + " -i ${dataSources.get(\"github-users.json\").name}")); // check arbitrary methods - assertEquals("false", execute(args + " -i ${DataSources.empty?c}")); - assertEquals("false", execute(args + " -i ${DataSources.isEmpty()?c}")); - assertEquals("2", execute(args + " -i ${DataSources.size()}")); - assertEquals("worx", execute(args + " -i ${DataSources.close()}worx")); + assertEquals("false", execute(args + " -i ${dataSources.empty?c}")); + assertEquals("false", execute(args + " -i ${dataSources.isEmpty()?c}")); + assertEquals("2", execute(args + " -i ${dataSources.size()}")); + assertEquals("worx", execute(args + " -i ${dataSources.close()}worx")); assertEquals("text/csv", execute(args + " -i ${DataSources[1].contentType}")); } + */ + /** @Test public void shouldNotShadowDataSourcesInFTL() throws IOException { final String args = "empty=examples/data/json/github-users.json"; // check shadowing of "isEmpty" - assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources.empty?c}")); + assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${dataSources.empty?c}")); // DataSources#isEmpty shadows the data source "empty" // assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources[\"empty\"]}")); - assertEquals("empty", execute("empty=examples/data/json/github-users.json -i ${DataSources.get(\"empty\").name}")); + assertEquals("empty", execute("empty=examples/data/json/github-users.json -i ${dataSources.get(\"empty\").name}")); // check shadowing of "find" - // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources.find.name}")); + // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${dataSources.find.name}")); // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources[\"find\"].name}")); } + */ @Test @Ignore("Manual test to check memory consumption and resource handling") diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index dbce7c4d..f6b6b0a4 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -29,7 +29,7 @@ public class ManualTest { // private static final String CMD = "-PCSV_SOURCE_WITH_HEADER=false -PCSV_SOURCE_FORMAT=DEFAULT -PCSV_TARGET_FORMAT=EXCEL -PCSV_TARGET_WITH_HEADER=true -t templates/csv/csv/transform.ftl examples/data/csv/contract.csv"; // private static final String CMD = "-t examples/templates/json/dataframe/github-users.ftl examples/data/json/github-users.json"; // private static final String CMD = "-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl examples/data/csv/contract.csv"; - private static final String CMD = "-t src/test/templates/manual.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo=examples/data/csv/contract.csv"; + private static final String CMD = "-t templates/info.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo:bar=examples/data/csv/contract.csv"; public static void main(String[] args) { diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java index 93ddfa2f..baae4516 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java @@ -43,7 +43,7 @@ public void shouldProvideDefaultConfiguration() { assertTrue(configuration.isOutputEncodingSet()); assertFalse(configuration.isCacheStorageExplicitlySet()); - assertTrue(configuration.isObjectWrapperExplicitlySet()); + assertFalse(configuration.isObjectWrapperExplicitlySet()); assertFalse(configuration.isOutputFormatExplicitlySet()); assertFalse(configuration.isTemplateExceptionHandlerExplicitlySet()); assertFalse(configuration.isTimeZoneExplicitlySet()); diff --git a/freemarker-generator-cli/src/test/templates/echo.ftl b/freemarker-generator-cli/src/test/templates/echo.ftl index 2614f490..014fe1fe 100644 --- a/freemarker-generator-cli/src/test/templates/echo.ftl +++ b/freemarker-generator-cli/src/test/templates/echo.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#list DataSources.list as dataSource> +<#list dataSources.list as dataSource> ${dataSource.name}, ${dataSource.uri} ============================================================================= ${dataSource.text} diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl index e6811c43..3da78976 100644 --- a/freemarker-generator-cli/src/test/templates/manual.ftl +++ b/freemarker-generator-cli/src/test/templates/manual.ftl @@ -17,12 +17,12 @@ --> Support FreeMarker Directives --------------------------------------------------------------------------- -Has Content: ${DataSources?has_content?c} -Nr. of Documents: ${DataSources?size} +Has Content: ${dataSources?has_content?c} +Nr. of Documents: ${dataSources?size} Use FTL Array-style Access --------------------------------------------------------------------------- -${DataSources[0].toString()} +${dataSources[0].toString()} Use FTL Map-style access --------------------------------------------------------------------------- @@ -43,23 +43,23 @@ Iterate Over Names & DataSources Find DataSources By Group --------------------------------------------------------------------------- -<#list DataSources.findByGroup("default") as dataSource> +<#list dataSources.findByGroup("default") as dataSource> ${dataSource}<#lt> Find DataSources By Wildcard --------------------------------------------------------------------------- -<#list DataSources.find("*.csv") as dataSource> +<#list dataSources.find("*.csv") as dataSource> ${dataSource}<#lt> Java Array-style access --------------------------------------------------------------------------- -${DataSources.get(0).toString()} +${dataSources.get(0).toString()} Invoke Arbitrary Methods On DataSources --------------------------------------------------------------------------- -empty : ${DataSources.empty?c} -isEmpty() : ${DataSources.isEmpty()?c} -size() : ${DataSources.size()} -close() : ${DataSources.close()}worx +empty : ${dataSources.empty?c} +isEmpty() : ${dataSources.isEmpty()?c} +size() : ${dataSources.size()} +close() : ${dataSources.close()}worx diff --git a/freemarker-generator-cli/src/test/templates/tools/csv.ftl b/freemarker-generator-cli/src/test/templates/tools/csv.ftl index f34cb6a5..1a460b54 100644 --- a/freemarker-generator-cli/src/test/templates/tools/csv.ftl +++ b/freemarker-generator-cli/src/test/templates/tools/csv.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign records = CSVTool.parse(DataSources.get(0), CSVFormat.DEFAULT.withHeader()).records> +<#assign records = CSVTool.parse(dataSources.get(0), CSVFormat.DEFAULT.withHeader()).records> CSVTool.toMap(name) ============================================================================= diff --git a/freemarker-generator-cli/templates/cat.ftl b/freemarker-generator-cli/templates/cat.ftl index c912c124..0ca2ef4e 100644 --- a/freemarker-generator-cli/templates/cat.ftl +++ b/freemarker-generator-cli/templates/cat.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#list DataSources.list as dataSource> +<#list dataSources.list as dataSource> <#list dataSource.lineIterator as line> ${line} diff --git a/freemarker-generator-cli/templates/csv/csv/transform.ftl b/freemarker-generator-cli/templates/csv/csv/transform.ftl index ef8cf26c..12cbb740 100644 --- a/freemarker-generator-cli/templates/csv/csv/transform.ftl +++ b/freemarker-generator-cli/templates/csv/csv/transform.ftl @@ -16,7 +16,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> <#assign csvTargetFormat = csv.targetFormat()> <#assign csvPrinter = CSVTool.printer(csvTargetFormat)> diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl b/freemarker-generator-cli/templates/csv/html/transform.ftl index cda4cd6b..2c3cb961 100644 --- a/freemarker-generator-cli/templates/csv/html/transform.ftl +++ b/freemarker-generator-cli/templates/csv/html/transform.ftl @@ -16,7 +16,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> <#assign csvHeaders = csvParser.getHeaderNames()> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl b/freemarker-generator-cli/templates/csv/md/transform.ftl index 27661255..b9c935f7 100644 --- a/freemarker-generator-cli/templates/csv/md/transform.ftl +++ b/freemarker-generator-cli/templates/csv/md/transform.ftl @@ -15,7 +15,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> <#assign headers = (csvParser.getHeaderMap()!{})?keys> <#assign records = csvParser.records> diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl b/freemarker-generator-cli/templates/excel/csv/transform.ftl index 794e942f..291ddca7 100644 --- a/freemarker-generator-cli/templates/excel/csv/transform.ftl +++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl @@ -17,7 +17,7 @@ --> <#-- Parse the first data source & sheet of the Excel document --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign workbook = ExcelTool.parse(DataSources.get(0))> +<#assign workbook = ExcelTool.parse(dataSources.get(0))> <#assign sheet = ExcelTool.getSheets(workbook)[0]> <#assign records = ExcelTool.toTable(sheet)> <#-- Setup CSVPrinter --> diff --git a/freemarker-generator-cli/templates/excel/html/transform.ftl b/freemarker-generator-cli/templates/excel/html/transform.ftl index 58ace89e..29d0e305 100644 --- a/freemarker-generator-cli/templates/excel/html/transform.ftl +++ b/freemarker-generator-cli/templates/excel/html/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign workbook = ExcelTool.parse(dataSource)> <#assign date = .now?iso_utc> diff --git a/freemarker-generator-cli/templates/excel/md/transform.ftl b/freemarker-generator-cli/templates/excel/md/transform.ftl index 8f841659..c1c67e51 100644 --- a/freemarker-generator-cli/templates/excel/md/transform.ftl +++ b/freemarker-generator-cli/templates/excel/md/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = DataSources.get(0)> +<#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> <#assign workbook = ExcelTool.parse(dataSource)> <#assign date = .now?iso_utc> diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index d12e68de..f29a6c4b 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -45,10 +45,10 @@ FreeMarker CLI Data Model - ${key}<#lt> -<#if DataSources.list?has_content> +<#if dataSources.list?has_content> FreeMarker CLI DataSources ------------------------------------------------------------------------------ -<#list DataSources.list as dataSource> +<#list dataSources.list as dataSource> [#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, mimeType=${dataSource.mimetype}, charset=${dataSource.charset}, length=${dataSource.length} Bytes URI : ${dataSource.uri} diff --git a/freemarker-generator-cli/templates/json/yaml/transform.ftl b/freemarker-generator-cli/templates/json/yaml/transform.ftl index 80c8d2f4..3d911b60 100644 --- a/freemarker-generator-cli/templates/json/yaml/transform.ftl +++ b/freemarker-generator-cli/templates/json/yaml/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))} \ No newline at end of file +${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))} \ No newline at end of file diff --git a/freemarker-generator-cli/templates/yaml/json/transform.ftl b/freemarker-generator-cli/templates/yaml/json/transform.ftl index e5e4d90c..161c3304 100644 --- a/freemarker-generator-cli/templates/yaml/json/transform.ftl +++ b/freemarker-generator-cli/templates/yaml/json/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))} \ No newline at end of file +${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))} \ No newline at end of file From c329680af842121875b0fecdbb5f844f8bc7ea10 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Tue, 7 Jul 2020 23:53:40 +0200 Subject: [PATCH 11/23] FREEMARKER-148 Put the various tools into a "tools" map --- .../generator/base/FreeMarkerConstants.java | 1 + .../examples/data/ftl/nginx/nginx.conf.ftl | 2 +- .../templates/accesslog/combined-access.ftl | 2 +- .../csv/csv/gatling-user-credentials.ftl | 4 +- .../templates/csv/fo/transactions.ftl | 4 +- .../examples/templates/csv/fo/transform.ftl | 4 +- .../templates/csv/html/transactions.ftl | 4 +- .../examples/templates/csv/md/filter.ftl | 10 +- .../examples/templates/csv/shell/curl.ftl | 6 +- .../examples/templates/dataframe/example.ftl | 18 +-- .../templates/dataframe/html/print.ftl | 6 +- .../examples/templates/demo.ftl | 56 ++++---- .../examples/templates/excel/csv/custom.ftl | 16 +-- .../templates/excel/dataframe/transform.ftl | 10 +- .../templates/html/csv/dependencies.ftl | 2 +- .../templates/json/csv/swagger-endpoints.ftl | 2 +- .../templates/json/dataframe/github-users.ftl | 6 +- .../templates/json/md/github-users.ftl | 2 +- .../properties/csv/locker-test-users.ftl | 2 +- .../templates/tsv/fo/transactions.ftl | 4 +- .../examples/templates/xml/txt/recipients.ftl | 2 +- .../examples/templates/yaml/txt/transform.ftl | 2 +- freemarker-generator-cli/run-examples.bat | 12 +- freemarker-generator-cli/run-examples.sh | 12 +- .../src/main/config/freemarker-cli.properties | 28 ++-- .../generator/cli/config/ToolsSupplier.java | 14 ++ .../main/resources/freemarker-cli.properties | 28 ++-- .../src/main/scripts/run-examples.bat | 12 +- .../src/main/scripts/run-examples.sh | 12 +- .../cli/advanced/cli-configuration.md | 28 ++-- .../markdown/cli/concepts/template-loading.md | 2 +- .../markdown/cli/usage/running-examples.md | 121 ++++++++---------- .../markdown/cli/usage/using-dataframes.md | 28 ++-- .../generator/cli/ExamplesTest.java | 16 +-- .../freemarker/generator/cli/ManualTest.java | 2 +- .../src/test/templates/tools/csv.ftl | 18 +-- .../templates/csv/csv/transform.ftl | 4 +- .../templates/csv/html/transform.ftl | 2 +- .../templates/csv/md/transform.ftl | 2 +- .../templates/excel/csv/transform.ftl | 12 +- .../templates/excel/html/transform.ftl | 6 +- .../templates/excel/md/transform.ftl | 6 +- freemarker-generator-cli/templates/info.ftl | 20 ++- .../templates/json/yaml/transform.ftl | 2 +- .../templates/lib/commons-csv.ftl | 8 +- .../templates/yaml/json/transform.ftl | 2 +- 46 files changed, 280 insertions(+), 282 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java index 3b5963e9..aeb27b10 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java @@ -78,6 +78,7 @@ private Model() { } public static final String DATASOURCES = "dataSources"; + public static final String TOOLS = "tools"; public static final String FREEMARKER_CLI_ARGS = "freemarker.cli.args"; public static final String FREEMARKER_LOCALE = "freemarker.locale"; diff --git a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl index deab4508..85f55363 100644 --- a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl +++ b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl @@ -1,4 +1,4 @@ -<#assign env = PropertiesTool.parse(dataSources.get(0))> +<#assign env = tools.properties.parse(dataSources.get(0))> server { listen 80; diff --git a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl index abe64782..30ad8540 100644 --- a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl +++ b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")> +<#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")> <#assign dataSource = dataSources.get(0)> <#assign lines = dataSource.getLineIterator()> diff --git a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl index ce691a87..dde4c7d1 100644 --- a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl +++ b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl @@ -16,8 +16,8 @@ under the License. --> <#assign dataSource = dataSources.get(0)> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter(';')> -<#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withDelimiter(';')> +<#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> <#assign csvRecords = csvParser.records> <#compress> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl index 8db0346d..c55edab7 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl @@ -17,8 +17,8 @@ --> <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()> -<#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> +<#assign cvsFormat = tools.csv.formats.DEFAULT.withDelimiter('\t').withHeader()> +<#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl index 9fa11c85..1a1fd7bf 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl @@ -16,8 +16,8 @@ under the License. --> <#assign csvFormatName = CVS_IN_FORMAT!"DEFAULT"> -<#assign cvsFormat = CSVTool.formats[csvFormatName].withHeader()> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> +<#assign cvsFormat = tools.csv.formats[csvFormatName].withHeader()> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl index b8793843..1d1767fa 100644 --- a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl @@ -17,8 +17,8 @@ --> <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withDelimiter('\t').withHeader()> -<#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withDelimiter('\t').withHeader()> +<#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl index 40cc9439..6478cec1 100644 --- a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl +++ b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl @@ -18,8 +18,8 @@ <#assign dataSource = dataSources.get(0)> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> -<#assign column = SystemTool.getParameter("column")> -<#assign values = SystemTool.getParameter("values")?split(",")> +<#assign column = tools.system.getParameter("column")> +<#assign values = tools.system.getParameter("values")?split(",")> <#compress> <@writePageHeader dataSource/> @@ -32,9 +32,9 @@ <#function parser dataSource> - <#assign format = CSVTool.formats[SystemTool.getParameter("format", "DEFAULT")]> - <#assign delimiter = CSVTool.toDelimiter(SystemTool.getParameter("delimiter", format.getDelimiter()))> - <#return CSVTool.parse(dataSource, format.withFirstRecordAsHeader().withDelimiter(delimiter))> + <#assign format = tools.csv.formats[tools.system.getParameter("format", "DEFAULT")]> + <#assign delimiter = tools.csv.toDelimiter(tools.system.getParameter("delimiter", format.getDelimiter()))> + <#return tools.csv.parse(dataSource, format.withFirstRecordAsHeader().withDelimiter(delimiter))> <#function filter record> diff --git a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl index bfa65e87..8ffe9efb 100644 --- a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl +++ b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl @@ -15,10 +15,10 @@ specific language governing permissions and limitations under the License. --> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> <#assign records = csvParser.records> -<#assign csvMap = CSVTool.toMap(records, "disposer")> +<#assign csvMap = tools.csv.toMap(records, "disposer")> <#---------------------------------------------------------------------------> #!/bin/sh diff --git a/freemarker-generator-cli/examples/templates/dataframe/example.ftl b/freemarker-generator-cli/examples/templates/dataframe/example.ftl index 5b051ca4..88973139 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/example.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/example.ftl @@ -15,32 +15,32 @@ under the License. --> <#assign dataSource = dataSources.get(0)> -<#assign csvParser = CSVTool.parse(dataSource, CSVTool.formats["DATAFRAME"])> -<#assign users = DataFrameTool.fromCSVParser(csvParser)> +<#assign csvParser = tools.csv.parse(dataSource, tools.csv.formats["DATAFRAME"])> +<#assign users = tools.dataframe.fromCSVParser(csvParser)> Original Data ============================================================================= -${DataFrameTool.print(users)} +${tools.dataframe.print(users)} Select By Age ============================================================================= -${DataFrameTool.print(users.select("(age > 40)"))} +${tools.dataframe.print(users.select("(age > 40)"))} Select By Name & Country ============================================================================= <#assign country = "Germany"> -${DataFrameTool.print(users +${tools.dataframe.print(users .select("(name == 'Schmitt' || name == 'Meier') && country == '${country}'") -.sort("name", DataFrameTool.sortOrder["ASCENDING"]))} +.sort("name", tools.dataframe.sortOrder["ASCENDING"]))} Head of Users ============================================================================= -${DataFrameTool.print(users.head(2))} +${tools.dataframe.print(users.head(2))} Count Column Values ============================================================================= -${DataFrameTool.print(users.getColumn("country").transform(DataFrameTool.transformer["COUNT"]))} +${tools.dataframe.print(users.getColumn("country").transform(tools.dataframe.transformer["COUNT"]))} Group By Age & Country ============================================================================= -${DataFrameTool.print(users.groupBy("country", "age").sort("country"))} +${tools.dataframe.print(users.groupBy("country", "age").sort("country"))} diff --git a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl index aa46adac..65ce11cd 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl @@ -15,9 +15,9 @@ specific language governing permissions and limitations under the License. --> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader().withDelimiter(';')> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> -<#assign dataFrame = DataFrameTool.toDataFrame(csvParser)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader().withDelimiter(';')> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign dataFrame = tools.dataframe.toDataFrame(csvParser)> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 6e9facd2..0aae9a8a 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -27,21 +27,21 @@ Output format : ${.output_format} 2) Invoke a constructor of a Java class --------------------------------------------------------------------------- -<#assign date = FreeMarkerTool.objectConstructor("java.util.Date", 1000 * 3600 * 24)> +<#assign date = tools.freemarker.objectConstructor("java.util.Date", 1000 * 3600 * 24)> new java.utilDate(1000 * 3600 * 24): ${date?datetime} 3) Invoke a static method of an non-constructor class --------------------------------------------------------------------------- -Random UUID : ${FreeMarkerTool.statics["java.util.UUID"].randomUUID()} -System.currentTimeMillis : ${FreeMarkerTool.statics["java.lang.System"].currentTimeMillis()} +Random UUID : ${tools.freemarker.statics["java.util.UUID"].randomUUID()} +System.currentTimeMillis : ${tools.freemarker.statics["java.lang.System"].currentTimeMillis()} 4) Access an Enumeration --------------------------------------------------------------------------- -java.math.RoundingMode#UP: ${FreeMarkerTool.enums["java.math.RoundingMode"].UP} +java.math.RoundingMode#UP: ${tools.freemarker.enums["java.math.RoundingMode"].UP} 5) Loop Over The Values Of An Enumeration --------------------------------------------------------------------------- -<#list FreeMarkerTool.enums["java.math.RoundingMode"]?values as roundingMode> +<#list tools.freemarker.enums["java.math.RoundingMode"]?values as roundingMode> - java.math.RoundingMode.${roundingMode}<#lt> @@ -54,32 +54,32 @@ List all data sources: 7) SystemTool --------------------------------------------------------------------------- -Host name : ${SystemTool.getHostName()} -Command line : ${SystemTool.getCommandLineArgs()?join(", ")} -System property : ${SystemTool.getSystemProperty("user.name", "N.A.")} -Timestamp : ${SystemTool.currentTimeMillis?c} -Environment var : ${SystemTool.envs["USER"]!"N.A."} +Host name : ${tools.system.getHostName()} +Command line : ${tools.system.getCommandLineArgs()?join(", ")} +System property : ${tools.system.getSystemProperty("user.name", "N.A.")} +Timestamp : ${tools.system.currentTimeMillis?c} +Environment : ${tools.system.envs["USER"]!"N.A."} 8) Access System Properties --------------------------------------------------------------------------- -app.dir : ${SystemTool.systemProperties["app.dir"]!""} -app.home : ${SystemTool.systemProperties["app.home"]!""} -app.pid : ${SystemTool.systemProperties["app.pid"]!""} -basedir : ${SystemTool.systemProperties["basedir"]!""} -java.version : ${SystemTool.systemProperties["java.version"]!""} -user.name : ${SystemTool.systemProperties["user.name"]!""} -user.dir : ${SystemTool.systemProperties["user.dir"]!""} -user.home : ${SystemTool.systemProperties["user.home"]!""} +app.dir : ${tools.system.systemProperties["app.dir"]!""} +app.home : ${tools.system.systemProperties["app.home"]!""} +app.pid : ${tools.system.systemProperties["app.pid"]!""} +basedir : ${tools.system.systemProperties["basedir"]!""} +java.version : ${tools.system.systemProperties["java.version"]!""} +user.name : ${tools.system.systemProperties["user.name"]!""} +user.dir : ${tools.system.systemProperties["user.dir"]!""} +user.home : ${tools.system.systemProperties["user.home"]!""} 9) List Environment Variables --------------------------------------------------------------------------- -<#list SystemTool.envs as name,value> +<#list tools.system.envs as name,value> - ${name} ==> ${value}<#lt> 10) List System Properties --------------------------------------------------------------------------- -<#list SystemTool.systemProperties as name,value> +<#list tools.system.systemProperties as name,value> - ${name} ==> ${value}<#lt> @@ -104,24 +104,22 @@ Get all documents - ${dataSource.name} => ${dataSource.uri} -12) FreeMarker CLI Tools +12) Document Data Model --------------------------------------------------------------------------- <#list .data_model?keys?sort as key> -<#if key?ends_with("Tool")> -- ${key?right_pad(20)} : ${.data_model[key]} - +- ${key}<#lt> -13) Document Data Model +13) FreeMarker CLI Tools --------------------------------------------------------------------------- -<#list .data_model?keys?sort as key> -- ${key}<#lt> +<#list .data_model.tools?keys?sort as key> +- ${key?right_pad(20)} : ${.data_model.tools[key]} 14) Create a UUID --------------------------------------------------------------------------- -UUIDTool Random UUID : ${UUIDTool.randomUUID()} -UUIDTool Named UUID : ${UUIDTool.namedUUID("value and salt")} +UUIDTool Random UUID : ${tools.uuid.randomUUID()} +UUIDTool Named UUID : ${tools.uuid.namedUUID("value and salt")} 15) Printing Special Characters --------------------------------------------------------------------------- diff --git a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl index f5c744e9..8527e75e 100644 --- a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl +++ b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl @@ -16,14 +16,14 @@ under the License. --> <#assign format = CSV_TARGET_FORMAT!"DEFAULT"> -<#assign salt = SystemTool.parameters["salt"]!"salt"> +<#assign salt = tools.system.parameters["salt"]!"salt"> <#-- Parse the first data source & sheet of the Excel document --> -<#assign workbook = ExcelTool.parse(dataSources.get(0))> -<#assign sheet = ExcelTool.getSheets(workbook)[0]> -<#assign records = ExcelTool.toTable(sheet)> +<#assign workbook = tools.excel.parse(dataSources.get(0))> +<#assign sheet = tools.excel.getSheets(workbook)[0]> +<#assign records = tools.excel.toTable(sheet)> <#-- Setup CSVPrinter --> -<#assign cvsFormat = CSVTool.formats[format]> -<#assign csvPrinter = CSVTool.printer(cvsFormat)> +<#assign cvsFormat = tools.csv.formats[format]> +<#assign csvPrinter = tools.csv.printer(cvsFormat)> <#-- Transform an arbitrary Excel file and add addition columns using Commons CSV We are using an instance of CSVPrinter directly have proper quoting of the output @@ -50,7 +50,7 @@ <#---------------------------------------------------------------------------> <#function uuidFromValueAndSalt value salt> <#assign uuidSource = value + salt> - <#assign buffer = FreeMarkerTool.statics["java.nio.charset.Charset"].forName("UTF-8").encode(uuidSource).rewind()> + <#assign buffer = tools.freemarker.statics["java.nio.charset.Charset"].forName("UTF-8").encode(uuidSource).rewind()> <#assign bytes = buffer.array()[0.. - <#return FreeMarkerTool.statics["java.util.UUID"].nameUUIDFromBytes(bytes)> + <#return tools.freemarker.statics["java.util.UUID"].nameUUIDFromBytes(bytes)> \ No newline at end of file diff --git a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl index 1b931b45..0b97237d 100644 --- a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl +++ b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl @@ -15,9 +15,9 @@ under the License. --> <#assign dataSource = dataSources.get(0)> -<#assign workbook = ExcelTool.parse(dataSource)> -<#list ExcelTool.getSheets(workbook) as sheet> - <#assign table = ExcelTool.toTable(sheet)> - <#assign df = DataFrameTool.fromRows(table, true)> - ${DataFrameTool.print(df)}<#t> +<#assign workbook = tools.excel.parse(dataSource)> +<#list tools.excel.getSheets(workbook) as sheet> + <#assign table = tools.excel.toTable(sheet)> + <#assign df = tools.dataframe.fromRows(table, true)> + ${tools.dataframe.print(df)}<#t> diff --git a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl index 3bfd8c85..fc97bac0 100644 --- a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl +++ b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl @@ -17,7 +17,7 @@ --> <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign html = JsoupTool.parse(dataSource)> +<#assign html = tools.jsoup.parse(dataSource)> <#compress> <@writeHeader/> diff --git a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl index 5ea0afaf..635085a8 100644 --- a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl +++ b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = GsonTool.parse(dataSources.get(0))> +<#assign map = tools.gson.parse(dataSources.get(0))> <#assign basePath = map.basePath!"/"> <#assign paths = map.paths!{}> diff --git a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl index 564b8249..db18c9fd 100644 --- a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl @@ -15,6 +15,6 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = GsonTool.parse(dataSources.get(0))> -<#assign dataframe = DataFrameTool.fromMaps(json)> -${DataFrameTool.print(dataframe)} +<#assign json = tools.gson.parse(dataSources.get(0))> +<#assign dataframe = tools.dataframe.fromMaps(json)> +${tools.dataframe.print(dataframe)} diff --git a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl index 7e48865a..48f155d4 100644 --- a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl @@ -15,7 +15,7 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = JsonPathTool.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources.get(0))> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users diff --git a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl index b312c2ea..c832283a 100644 --- a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl +++ b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl @@ -18,7 +18,7 @@ <#compress> TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION <#list dataSources.list as dataSource> - <#assign properties = PropertiesTool.parse(dataSource)> + <#assign properties = tools.properties.parse(dataSource)> <#assign environments = properties["ENVIRONMENTS"]!""> <#assign tenant = extractTenant(environments)> <#assign site = extractSite(environments)> diff --git a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl index eaa068fb..1962ce75 100644 --- a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl @@ -15,8 +15,8 @@ specific language governing permissions and limitations under the License. --> -<#assign cvsFormat = CSVTool.formats["TDF"].withHeader()> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> +<#assign cvsFormat = tools.csv.formats["TDF"].withHeader()> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl index aff1373f..33f7b5b0 100644 --- a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl +++ b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign xml = XmlTool.parse(dataSources.get(0))> +<#assign xml = tools.xml.parse(dataSources.get(0))> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} diff --git a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl index f69ebe2d..6a183ef1 100644 --- a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl +++ b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = YamlTool.parse(dataSources.get(0))> +<#assign map = tools.yaml.parse(dataSources.get(0))> <#---------------------------------------------------------------------------> <#compress> <@print map 1/> diff --git a/freemarker-generator-cli/run-examples.bat b/freemarker-generator-cli/run-examples.bat index f698a6d6..e7d9e85c 100644 --- a/freemarker-generator-cli/run-examples.bat +++ b/freemarker-generator-cli/run-examples.bat @@ -41,12 +41,12 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt -%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json -%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml -%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt +%FREEMARKER_CMD% -i '${tools.jsonpath.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${tools.xml.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${tools.jsoup.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json +%FREEMARKER_CMD% -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml +%FREEMARKER_CMD% -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt REM ========================================================================= REM CSV diff --git a/freemarker-generator-cli/run-examples.sh b/freemarker-generator-cli/run-examples.sh index 0b045441..959ad18f 100755 --- a/freemarker-generator-cli/run-examples.sh +++ b/freemarker-generator-cli/run-examples.sh @@ -46,12 +46,12 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsonpath.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.xml.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsoup.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # CSV diff --git a/freemarker-generator-cli/src/main/config/freemarker-cli.properties b/freemarker-generator-cli/src/main/config/freemarker-cli.properties index bd9c917f..fd4a8f92 100644 --- a/freemarker-generator-cli/src/main/config/freemarker-cli.properties +++ b/freemarker-generator-cli/src/main/config/freemarker-cli.properties @@ -24,17 +24,17 @@ ############################################################################# # Configure FreeMarker Tools (name -> implementation class) ############################################################################# -freemarker.tools.CSVTool=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool -freemarker.tools.DataFrameTool=org.apache.freemarker.generator.tools.dataframe.DataFrameTool -freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool -freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool -freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool -freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool -freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.gson.GsonTool -freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool -freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool -freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool -freemarker.tools.SystemTool=org.apache.freemarker.generator.tools.system.SystemTool -freemarker.tools.UUIDTool=org.apache.freemarker.generator.tools.uuid.UUIDTool -freemarker.tools.XmlTool=org.apache.freemarker.generator.tools.xml.XmlTool -freemarker.tools.YamlTool=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool +freemarker.tools.csv=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool +freemarker.tools.dataframe=org.apache.freemarker.generator.tools.dataframe.DataFrameTool +freemarker.tools.excel=org.apache.freemarker.generator.tools.excel.ExcelTool +freemarker.tools.exec=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool +freemarker.tools.freemarker=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool +freemarker.tools.grok=org.apache.freemarker.generator.tools.grok.GrokTool +freemarker.tools.gson=org.apache.freemarker.generator.tools.gson.GsonTool +freemarker.tools.jsonpath=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool +freemarker.tools.jsoup=org.apache.freemarker.generator.tools.jsoup.JsoupTool +freemarker.tools.properties=org.apache.freemarker.generator.tools.properties.PropertiesTool +freemarker.tools.system=org.apache.freemarker.generator.tools.system.SystemTool +freemarker.tools.uuid=org.apache.freemarker.generator.tools.uuid.UUIDTool +freemarker.tools.xml=org.apache.freemarker.generator.tools.xml.XmlTool +freemarker.tools.yaml=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java index e775eb1a..d64ae795 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java @@ -16,8 +16,11 @@ */ package org.apache.freemarker.generator.cli.config; +import org.apache.freemarker.generator.base.FreeMarkerConstants.Model; import org.apache.freemarker.generator.base.tools.ToolsFactory; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import java.util.function.Supplier; @@ -50,6 +53,17 @@ public ToolsSupplier(Properties configuration, Map settings) { @Override public Map get() { + final Map result = new HashMap<>(); + result.put(Model.TOOLS, tools()); + return result; + } + + /** + * Create a map of tools. + * + * @return tools + */ + private Map tools() { final Properties properties = toolsProperties(); return properties.stringPropertyNames().stream() .filter(key -> toolExists(properties.getProperty(key))) diff --git a/freemarker-generator-cli/src/main/resources/freemarker-cli.properties b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties index bd9c917f..fd4a8f92 100644 --- a/freemarker-generator-cli/src/main/resources/freemarker-cli.properties +++ b/freemarker-generator-cli/src/main/resources/freemarker-cli.properties @@ -24,17 +24,17 @@ ############################################################################# # Configure FreeMarker Tools (name -> implementation class) ############################################################################# -freemarker.tools.CSVTool=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool -freemarker.tools.DataFrameTool=org.apache.freemarker.generator.tools.dataframe.DataFrameTool -freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool -freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool -freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool -freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool -freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.gson.GsonTool -freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool -freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool -freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool -freemarker.tools.SystemTool=org.apache.freemarker.generator.tools.system.SystemTool -freemarker.tools.UUIDTool=org.apache.freemarker.generator.tools.uuid.UUIDTool -freemarker.tools.XmlTool=org.apache.freemarker.generator.tools.xml.XmlTool -freemarker.tools.YamlTool=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool +freemarker.tools.csv=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool +freemarker.tools.dataframe=org.apache.freemarker.generator.tools.dataframe.DataFrameTool +freemarker.tools.excel=org.apache.freemarker.generator.tools.excel.ExcelTool +freemarker.tools.exec=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool +freemarker.tools.freemarker=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool +freemarker.tools.grok=org.apache.freemarker.generator.tools.grok.GrokTool +freemarker.tools.gson=org.apache.freemarker.generator.tools.gson.GsonTool +freemarker.tools.jsonpath=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool +freemarker.tools.jsoup=org.apache.freemarker.generator.tools.jsoup.JsoupTool +freemarker.tools.properties=org.apache.freemarker.generator.tools.properties.PropertiesTool +freemarker.tools.system=org.apache.freemarker.generator.tools.system.SystemTool +freemarker.tools.uuid=org.apache.freemarker.generator.tools.uuid.UUIDTool +freemarker.tools.xml=org.apache.freemarker.generator.tools.xml.XmlTool +freemarker.tools.yaml=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.bat b/freemarker-generator-cli/src/main/scripts/run-examples.bat index 995853b3..98d6654a 100644 --- a/freemarker-generator-cli/src/main/scripts/run-examples.bat +++ b/freemarker-generator-cli/src/main/scripts/run-examples.bat @@ -41,12 +41,12 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${JsonPathTool.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${XmlTool.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${JsoupTool.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt -%FREEMARKER_CMD% -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json -%FREEMARKER_CMD% -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml -%FREEMARKER_CMD% -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt +%FREEMARKER_CMD% -i '${tools.jsonpath.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${tools.xml.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${tools.jsoup.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json +%FREEMARKER_CMD% -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml +%FREEMARKER_CMD% -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt REM ========================================================================= REM CSV diff --git a/freemarker-generator-cli/src/main/scripts/run-examples.sh b/freemarker-generator-cli/src/main/scripts/run-examples.sh index a9250104..f18c9e2f 100755 --- a/freemarker-generator-cli/src/main/scripts/run-examples.sh +++ b/freemarker-generator-cli/src/main/scripts/run-examples.sh @@ -46,12 +46,12 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsonpath.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.xml.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsoup.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # CSV diff --git a/freemarker-generator-cli/src/site/markdown/cli/advanced/cli-configuration.md b/freemarker-generator-cli/src/site/markdown/cli/advanced/cli-configuration.md index 0c3e8425..96353fd0 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/advanced/cli-configuration.md +++ b/freemarker-generator-cli/src/site/markdown/cli/advanced/cli-configuration.md @@ -20,20 +20,20 @@ The `Apache FreeMarker CLI` configuration can be tweaked to ############################################################################# # Configure FreeMarker Tools (name -> implementation class) ############################################################################# -freemarker.tools.CSVTool=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool -freemarker.tools.DataFrameTool=org.apache.freemarker.generator.tools.dataframe.DataFrameTool -freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool -freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool -freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool -freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool -freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.gson.GsonTool -freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool -freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool -freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool -freemarker.tools.SystemTool=org.apache.freemarker.generator.tools.system.SystemTool -freemarker.tools.UUIDTool=org.apache.freemarker.generator.tools.uuid.UUIDTool -freemarker.tools.XmlTool=org.apache.freemarker.generator.tools.xml.XmlTool -freemarker.tools.YamlTool=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool +freemarker.tools.csv=org.apache.freemarker.generator.tools.commonscsv.CommonsCSVTool +freemarker.tools.dataframe=org.apache.freemarker.generator.tools.dataframe.DataFrameTool +freemarker.tools.excel=org.apache.freemarker.generator.tools.excel.ExcelTool +freemarker.tools.exec=org.apache.freemarker.generator.tools.commonsexec.CommonsExecTool +freemarker.tools.freemarker=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool +freemarker.tools.grok=org.apache.freemarker.generator.tools.grok.GrokTool +freemarker.tools.gson=org.apache.freemarker.generator.tools.gson.GsonTool +freemarker.tools.jsonpath=org.apache.freemarker.generator.tools.json.JsonPathTool +freemarker.tools.jsoup=org.apache.freemarker.generator.tools.jsoup.JsoupTool +freemarker.tools.properties=org.apache.freemarker.generator.tools.properties.PropertiesTool +freemarker.tools.system=org.apache.freemarker.generator.tools.system.SystemTool +freemarker.tools.uuid=org.apache.freemarker.generator.tools.uuid.UUIDTool +freemarker.tools.xml=org.apache.freemarker.generator.tools.xml.XmlTool +freemarker.tools.yaml=org.apache.freemarker.generator.tools.snakeyaml.SnakeYamlTool ``` Changing this file allows to tweak the underlying `Apache FreeMarker Configuration` and add custom tools. diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md index c512d5c2..54ac283d 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md @@ -55,6 +55,6 @@ freemarker-cli -t https://raw.githubusercontent.com/apache/freemarker-generator/ The template can be defined directly on the command line in case of trivial transformations ``` -freemarker-cli -i '${GsonTool.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml +freemarker-cli -i '${tools.gson.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml ``` diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md index a73c4ff9..4da01fbc 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md @@ -92,7 +92,7 @@ Below you see the Apache FreeMarker Template ```text <#ftl output_format="plainText" > -<#assign json = JsonPathTool.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources.get(0))> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users @@ -129,8 +129,8 @@ The FreeMarker template is shown below ```text <#ftl output_format="plainText"> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> @@ -167,7 +167,7 @@ using the following template ```text <#ftl output_format="plainText" > -<#assign xml = XmlTool.parse(dataSources.get(0))> +<#assign xml = tools.xml.parse(dataSources.get(0))> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} @@ -214,7 +214,7 @@ One day I was asked a to prepare a CSV files containing REST endpoints described ```text <#ftl output_format="plainText" strip_text="true"> -<#assign json = JsonPathTool.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources.get(0))> <#assign basePath = json.read("$.basePath")> <#assign paths = json.read("$.paths")> @@ -278,7 +278,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex <#ftl output_format="HTML" > <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign workbook = ExcelTool.parse(dataSource)> +<#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> <#---------------------------------------------------------------------------> @@ -303,7 +303,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex <#-- writeSheets --> <#---------------------------------------------------------------------------> <#macro writeSheets workbook> - <#assign sheets = ExcelTool.getSheets(workbook)> + <#assign sheets = tools.excel.getSheets(workbook)> <#list sheets as sheet> <@writeSheet sheet/> @@ -313,7 +313,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex <#-- writeSheet --> <#---------------------------------------------------------------------------> <#macro writeSheet sheet> - <#assign rows = ExcelTool.toTable(sheet)> + <#assign rows = tools.excel.toTable(sheet)>

${sheet.getSheetName()}

<@writeRows rows/> @@ -373,7 +373,7 @@ The FTL uses a couple of interesting features <#compress> TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION <#list dataSources.list as dataSource> - <#assign properties = PropertiesTool.parse(dataSource)> + <#assign properties = tools.properties.parse(dataSource)> <#assign environments = properties["ENVIRONMENTS"]!""> <#assign tenant = extractTenant(environments)> <#assign site = extractSite(environments)> @@ -404,8 +404,8 @@ For a POC (proof of concept) I created a sample transformation from CSV to XML-F <#ftl output_format="XML" > <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign cvsFormat = CSVTool.formats.DEFAULT.withDelimiter('\t').withHeader()> -<#assign csvParser = CSVTool.parse(dataSource, cvsFormat)> +<#assign cvsFormat = tools.csv.formats.DEFAULT.withDelimiter('\t').withHeader()> +<#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> @@ -524,7 +524,7 @@ Recently I got the rather unusual question how to determine the list of dependen ```text <#ftl output_format="plainText" strip_text="true"> <#assign dataSource = dataSources.get(0)> -<#assign html = JsoupTool.parse(dataSource)> +<#assign html = tools.jsoup.parse(dataSource)> <#compress> <@writeHeader/> @@ -597,10 +597,10 @@ and the final FTL is found below ```text <#ftl output_format="plainText"> -<#assign cvsFormat = CSVTool.formats["DEFAULT"].withHeader()> -<#assign csvParser = CSVTool.parse(dataSources.get(0), cvsFormat)> +<#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> +<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> <#assign records = csvParser.records> -<#assign csvMap = CSVTool.toMap(records, "disposer")> +<#assign csvMap = tools.csv.toMap(records, "disposer")> <#---------------------------------------------------------------------------> #!/bin/sh @@ -681,7 +681,7 @@ using the following FreeMarker template ```text <#ftl output_format="plainText" strip_whitespace=true> -<#assign grok = GrokTool.compile("%{COMBINEDAPACHELOG}")> +<#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")> <#assign dataSource = dataSources.get(0)> <#assign lines = dataSource.getLineIterator()> @@ -700,7 +700,7 @@ using the following FreeMarker template While this looks small and tidy there are some nifty features -* `GrokTool.compile("%{COMBINEDAPACHELOG}")` builds the `Grok` instance to parse access logs in `Combined Format` +* `tools.grok.compile("%{COMBINEDAPACHELOG}")` builds the `Grok` instance to parse access logs in `Combined Format` * The data source is streamed line by line and not loaded into memory in one piece * This also works for using `stdin` so are able to parse GB of access log or other files @@ -712,7 +712,7 @@ A few snippets to illustrate the points ```text <#ftl output_format="plainText" strip_whitespace="true"> -<#assign profile = SystemTool.getProperty("profile", "default")> +<#assign profile = tools.system.getProperty("profile", "default")> <#assign ec2Instances = ec2Instances()/> h3. AWS EC2 Instance @@ -725,8 +725,8 @@ h3. AWS EC2 Instance <#function awsCliToJson line> - <#local output = ExecTool.execute(line)> - <#return JsonPathTool.parse(output)> + <#local output = tools.exec.execute(line)> + <#return tools.jsonpath.parse(output)> <#function getAwsEc2InstanceTag tags name> @@ -765,22 +765,22 @@ h3. AWS EC2 Instance Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without installing `xmllint`, `jq` or `pup` - in this case you can pass a FreeMarker template in an interactive fashion ```text -> bin/freemarker-cli -i 'Hello ${SystemTool.envs["USER"]}'; echo +> bin/freemarker-cli -i 'Hello ${tools.system.envs["USER"]}'; echo Hello sgoeschl -> bin/freemarker-cli -i '${JsonPathTool.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo +> bin/freemarker-cli -i '${tools.jsonpath.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo Swagger Petstore -> bin/freemarker-cli -i 'Post Title : ${JsonPathTool.parse(dataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo +> bin/freemarker-cli -i 'Post Title : ${tools.jsonpath.parse(dataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo Post Title : qui est esse -> bin/freemarker-cli -i '${XmlTool.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo +> bin/freemarker-cli -i '${tools.xml.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo John Smith -> bin/freemarker-cli -i '${JsoupTool.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo +> bin/freemarker-cli -i '${tools.jsoup.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo FreeMarker CLI -> freemarker-cli -i '<#list SystemTool.envs as name,value>${name} ==> ${value}${"\n"}' +> freemarker-cli -i '<#list tools.system.envs as name,value>${name} ==> ${value}${"\n"}' TERM ==> xterm-256color LANG ==> en_US DISPLAY ==> :0.0 @@ -807,8 +807,8 @@ and Apache FreeMarker template <#assign dataSource = dataSources.get(0)> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> -<#assign column = SystemTool.getParameter("column")> -<#assign values = SystemTool.getParameter("values")?split(",")> +<#assign column = tools.system.getParameter("column")> +<#assign values = tools.system.getParameter("values")?split(",")> <#compress> <@writePageHeader dataSource/> @@ -821,9 +821,9 @@ and Apache FreeMarker template <#function parser dataSource> - <#assign format = CSVTool.formats[SystemTool.getParameter("format", "DEFAULT")]> - <#assign delimiter = CSVTool.toDelimiter(SystemTool.getParameter("delimiter", format.getDelimiter()))> - <#return CSVTool.parse(dataSource, format.withFirstRecordAsHeader().withDelimiter(delimiter))> + <#assign format = tools.csv.formats[tools.system.getParameter("format", "DEFAULT")]> + <#assign delimiter = tools.csv.toDelimiter(tools.system.getParameter("delimiter", format.getDelimiter()))> + <#return tools.csv.parse(dataSource, format.withFirstRecordAsHeader().withDelimiter(delimiter))> <#function filter record> @@ -890,12 +890,12 @@ Sometimes we simply need to transform a JSON into an equivalent YAML or the othe ``` > freemarker-cli -t templates/yaml/json/transform.ftl examples/data/yaml/swagger-spec.yaml -> freemarker-cli -i '${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml -> freemarker-cli -i '${GsonTool.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml +> freemarker-cli -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml +> freemarker-cli -i '${tools.gson.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml > freemarker-cli -t templates/json/yaml/transform.ftl examples/data/json/swagger-spec.json -> freemarker-cli -i '${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json -> freemarker-cli -i '${YamlTool.toYaml(json)}' -m json=examples/data/json/swagger-spec.json +> freemarker-cli -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json +> freemarker-cli -i '${tools.yaml.toYaml(json)}' -m json=examples/data/json/swagger-spec.json ``` ### 15. Using Advanced FreeMarker Features @@ -1033,40 +1033,27 @@ List all files containing "README" in the name List all files having "md" extension Get all documents -12) FreeMarker CLI Tools +12) Document Data Model --------------------------------------------------------------------------- -- CSVTool : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/) -- DataFrameTool : Bridge to nRo/DataFrame (see https://github.com/nRo/DataFrame) -- ExcelTool : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org) -- ExecTool : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/) -- FreeMarkerTool : Expose useful Apache FreeMarker classes -- GrokTool : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok) -- GsonTool : Process JSON files using GSON (see https://github.com/google/gson) -- JsonPathTool : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath) -- JsoupTool : Process HTML files using Jsoup (see https://jsoup.org) -- PropertiesTool : Process JDK properties files -- SystemTool : Expose System-related utility methods -- UUIDTool : Create UUIDs -- XmlTool : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html) -- YamlTool : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home) - -13) Document Data Model +- dataSources +- tools + +13) FreeMarker CLI Tools --------------------------------------------------------------------------- -- CSVTool -- DataFrameTool -- DataSources -- ExcelTool -- ExecTool -- FreeMarkerTool -- GrokTool -- GsonTool -- JsonPathTool -- JsoupTool -- PropertiesTool -- SystemTool -- UUIDTool -- XmlTool -- YamlTool +- csv : Process CSV files using Apache Commons CSV (see https://commons.apache.org/proper/commons-csv/) +- dataframe : Bridge to [nRo/DataFrame](https://github.com/nRo/DataFrame) +- excel : Process Excels files (XLS, XLSX) using Apache POI (see https://poi.apache.org) +- exec : Execute command line tools using Apache Commons Exec (see https://commons.apache.org/proper/commons-exec/) +- freemarker : Expose advanced Apache FreeMarker classes +- grok : Process text files using Grok expressions (see https://github.com/thekrakken/java-grok) +- gson : Process JSON files using GSON (see https://github.com/google/gson) +- jsonpath : Process JSON files using Java JSON Path (see https://github.com/json-path/JsonPath) +- jsoup : Process HTML files using Jsoup (see https://jsoup.org) +- properties : Process JDK properties files +- system : Expose System-related utility methods +- uuid : Create UUIDs +- xml : Process XML files using Apache FreeMarker (see https://freemarker.apache.org/docs/xgui.html) +- yaml : Process YAML files using SnakeYAML(see https://bitbucket.org/asomov/snakeyaml/wiki/Home) 14) Create a UUID --------------------------------------------------------------------------- diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md index 8047e346..0048f41f 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md @@ -31,8 +31,8 @@ and create a `DateFrame` using the following code snippet ``` <#assign dataSource = dataSources.get(0)> -<#assign csvParser = CSVTool.parse(dataSource, CSVTool.formats["DATAFRAME"])> -<#assign users = DataFrameTool.fromCSVParser(csvParser)> +<#assign csvParser = tools.csv.parse(dataSource, tools.csv.formats["DATAFRAME"])> +<#assign users = tools.dataframe.fromCSVParser(csvParser)> ``` The example can be executed by running @@ -50,7 +50,7 @@ bin/freemarker-cli -PCSV_SOURCE_FORMAT=DATAFRAME -t examples/templates/dataframe #### Select By Age ``` -${DataFrameTool.print(users.select("(age > 40)"))} +${tools.dataframe.print(users.select("(age > 40)"))} ``` which shows @@ -71,9 +71,9 @@ Now we want to create a new `DataFrame` by selecting `name` and `country` ``` <#assign country = "Germany"> -${DataFrameTool.print(users +${tools.dataframe.print(users .select("(name == 'Schmitt' || name == 'Meier') && country == '${country}'") - .sort("name", DataFrameTool.sortOrder["ASCENDING"]))} + .sort("name", tools.dataframe.sortOrder["ASCENDING"]))} ``` which shows @@ -99,7 +99,7 @@ which shows Let's assume we want to count the records for each `country` ``` -${DataFrameTool.print(users.getColumn("country").transform(DataFrameTool.transformer["COUNT"]))} +${tools.dataframe.print(users.getColumn("country").transform(tools.dataframe.transformer["COUNT"]))} ``` returns the following `DataFrame` @@ -123,7 +123,7 @@ returns the following `DataFrame` Let's assume that we want to group the `DataFrame` by `age` and `country` ``` -${DataFrameTool.print(users.groupBy("age", "country").sort("age"))} +${tools.dataframe.print(users.groupBy("age", "country").sort("age"))} ``` which results in @@ -152,11 +152,11 @@ which results in Here we load a `examples/data/json/github-users.json` which represents a tabular data being parsed as a list of maps and print the JSON as dataframe. Technically -it is a list of maps hence we invoke `DataFrameTool.fromMaps() +it is a list of maps hence we invoke `tools.dataframe.fromMaps() ``` freemarker-cli \ - -i '${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))}' \ + -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' \ examples/data/json/github-users.json ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐ @@ -184,11 +184,11 @@ Let's transform an Excel Sheet to a `DataFrame` being printed using the followin ``` <#assign dataSource = dataSources.get(0)> -<#assign workbook = ExcelTool.parse(dataSource)> -<#list ExcelTool.getSheets(workbook) as sheet> - <#assign table = ExcelTool.toTable(sheet)> - <#assign df = DataFrameTool.fromRows(table, true)> - ${DataFrameTool.print(df)}<#t> +<#assign workbook = tools.excel.parse(dataSource)> +<#list tools.excel.getSheets(workbook) as sheet> + <#assign table = tools.excel.toTable(sheet)> + <#assign df = tools.dataframe.fromRows(table, true)> + ${tools.dataframe.print(df)}<#t> ``` diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 5e3a4296..c8d4eed4 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -111,14 +111,14 @@ public void shouldRunDataFrameExamples() throws IOException { @Test public void shouldRunInteractiveTemplateExamples() throws IOException { - assertValid(execute("-i ${JsonPathTool.parse(dataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${XmlTool.parse(dataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); - assertValid(execute("-i ${JsoupTool.parse(dataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); - assertValid(execute("-i ${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); - assertValid(execute("-i ${GsonTool.toJson(yaml)} -m yaml=examples/data/yaml/swagger-spec.yaml")); - assertValid(execute("-i ${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))} examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${YamlTool.toYaml(json)} -m json=examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${DataFrameTool.print(DataFrameTool.fromMaps(GsonTool.parse(dataSources.get(0))))} examples/data/json/github-users.json")); + assertValid(execute("-i ${tools.jsonpath.parse(dataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${tools.xml.parse(dataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); + assertValid(execute("-i ${tools.jsoup.parse(dataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); + assertValid(execute("-i ${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); + assertValid(execute("-i ${tools.gson.toJson(yaml)} -m yaml=examples/data/yaml/swagger-spec.yaml")); + assertValid(execute("-i ${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${tools.yaml.toYaml(json)} -m json=examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))} examples/data/json/github-users.json")); } @Test diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index f6b6b0a4..774c4c55 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -29,7 +29,7 @@ public class ManualTest { // private static final String CMD = "-PCSV_SOURCE_WITH_HEADER=false -PCSV_SOURCE_FORMAT=DEFAULT -PCSV_TARGET_FORMAT=EXCEL -PCSV_TARGET_WITH_HEADER=true -t templates/csv/csv/transform.ftl examples/data/csv/contract.csv"; // private static final String CMD = "-t examples/templates/json/dataframe/github-users.ftl examples/data/json/github-users.json"; // private static final String CMD = "-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl examples/data/csv/contract.csv"; - private static final String CMD = "-t templates/info.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo:bar=examples/data/csv/contract.csv"; + private static final String CMD = "-t examples/templates/demo.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo:bar=examples/data/csv/contract.csv"; public static void main(String[] args) { diff --git a/freemarker-generator-cli/src/test/templates/tools/csv.ftl b/freemarker-generator-cli/src/test/templates/tools/csv.ftl index 1a460b54..50a76766 100644 --- a/freemarker-generator-cli/src/test/templates/tools/csv.ftl +++ b/freemarker-generator-cli/src/test/templates/tools/csv.ftl @@ -15,32 +15,32 @@ specific language governing permissions and limitations under the License. --> -<#assign records = CSVTool.parse(dataSources.get(0), CSVFormat.DEFAULT.withHeader()).records> +<#assign records = tools.csv.parse(dataSources.get(0), CSVFormat.DEFAULT.withHeader()).records> -CSVTool.toMap(name) +tools.csv.toMap(name) ============================================================================= -<#assign map = CSVTool.toMap(records, "contract_id")> +<#assign map = tools.csv.toMap(records, "contract_id")> <#list map as key, record> ${key} ==> ${record.get("customer_company_name")} -CSVTool.toMap(index) +tools.csv.toMap(index) ============================================================================= -<#assign map = CSVTool.toMap(records, 0)> +<#assign map = tools.csv.toMap(records, 0)> <#list map as key, record> ${key} ==> ${record.get("customer_company_name")} -CSVTool.toMultiMap(name) +tools.csv.toMultiMap(name) ============================================================================= -<#assign map = CSVTool.toMultiMap(records, "contract_id")> +<#assign map = tools.csv.toMultiMap(records, "contract_id")> <#list map as key, records> ${key} ==> Found ${records?size} records -CSVTool.toMultiMap(index) +tools.csv.toMultiMap(index) ============================================================================= -<#assign map = CSVTool.toMultiMap(records, 0)> +<#assign map = tools.csv.toMultiMap(records, 0)> <#list map as key, records> ${key} ==> Found ${records?size} records diff --git a/freemarker-generator-cli/templates/csv/csv/transform.ftl b/freemarker-generator-cli/templates/csv/csv/transform.ftl index 12cbb740..ca43ad5e 100644 --- a/freemarker-generator-cli/templates/csv/csv/transform.ftl +++ b/freemarker-generator-cli/templates/csv/csv/transform.ftl @@ -17,9 +17,9 @@ --> <#import "/templates/lib/commons-csv.ftl" as csv /> <#assign dataSource = dataSources.get(0)> -<#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> +<#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign csvTargetFormat = csv.targetFormat()> -<#assign csvPrinter = CSVTool.printer(csvTargetFormat)> +<#assign csvPrinter = tools.csv.printer(csvTargetFormat)> <#assign csvHeaders = (csvParser.getHeaderMap()!{})?keys> <#if csvHeaders?has_content && csvTargetFormat.getSkipHeaderRecord()> ${csvPrinter.printRecord(csvHeaders)}<#t> diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl b/freemarker-generator-cli/templates/csv/html/transform.ftl index 2c3cb961..5053bd42 100644 --- a/freemarker-generator-cli/templates/csv/html/transform.ftl +++ b/freemarker-generator-cli/templates/csv/html/transform.ftl @@ -17,7 +17,7 @@ --> <#import "/templates/lib/commons-csv.ftl" as csv /> <#assign dataSource = dataSources.get(0)> -<#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> +<#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign csvHeaders = csvParser.getHeaderNames()> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl b/freemarker-generator-cli/templates/csv/md/transform.ftl index b9c935f7..a3c7fe37 100644 --- a/freemarker-generator-cli/templates/csv/md/transform.ftl +++ b/freemarker-generator-cli/templates/csv/md/transform.ftl @@ -16,7 +16,7 @@ --> <#import "/templates/lib/commons-csv.ftl" as csv /> <#assign dataSource = dataSources.get(0)> -<#assign csvParser = CSVTool.parse(dataSource, csv.sourceFormat())> +<#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign headers = (csvParser.getHeaderMap()!{})?keys> <#assign records = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl b/freemarker-generator-cli/templates/excel/csv/transform.ftl index 291ddca7..686e21ce 100644 --- a/freemarker-generator-cli/templates/excel/csv/transform.ftl +++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl @@ -17,11 +17,11 @@ --> <#-- Parse the first data source & sheet of the Excel document --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign workbook = ExcelTool.parse(dataSources.get(0))> -<#assign sheet = ExcelTool.getSheets(workbook)[0]> -<#assign records = ExcelTool.toTable(sheet)> +<#assign workbook = tools.excel.parse(dataSources.get(0))> +<#assign sheet = tools.excel.getSheets(workbook)[0]> +<#assign records = tools.excel.toTable(sheet)> <#-- Setup CSVPrinter --> -<#assign csvPrinter = CSVTool.printer(csv.targetFormat())> +<#assign csvPrinter = tools.csv.printer(csv.targetFormat())> <#-- Print each line of the Excel as CSV record --> <#compress> <#list records as record> @@ -30,8 +30,8 @@ <#---------------------------------------------------------------------------> <#function csvOutFormat> - <#assign format = CSVTool.formats[CSV_TARGET_FORMAT!"DEFAULT"]> - <#assign delimiter = CSVTool.toDelimiter(CSV_TARGET_DELIMITER!format.getDelimiter())> + <#assign format = tools.csv.formats[CSV_TARGET_FORMAT!"DEFAULT"]> + <#assign delimiter = tools.csv.toDelimiter(CSV_TARGET_DELIMITER!format.getDelimiter())> <#assign withHeader = CSV_TARGET_WITH_HEADER!"false"> <#assign format = format.withDelimiter(delimiter)> <#if withHeader?boolean> diff --git a/freemarker-generator-cli/templates/excel/html/transform.ftl b/freemarker-generator-cli/templates/excel/html/transform.ftl index 29d0e305..9625e7dc 100644 --- a/freemarker-generator-cli/templates/excel/html/transform.ftl +++ b/freemarker-generator-cli/templates/excel/html/transform.ftl @@ -17,7 +17,7 @@ --> <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign workbook = ExcelTool.parse(dataSource)> +<#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> <#---------------------------------------------------------------------------> @@ -42,7 +42,7 @@ <#-- writeSheets --> <#---------------------------------------------------------------------------> <#macro writeSheets workbook> - <#assign sheets = ExcelTool.getSheets(workbook)> + <#assign sheets = tools.excel.getSheets(workbook)> <#list sheets as sheet> <@writeSheet sheet/> @@ -52,7 +52,7 @@ <#-- writeSheet --> <#---------------------------------------------------------------------------> <#macro writeSheet sheet> - <#assign rows = ExcelTool.toTable(sheet)> + <#assign rows = tools.excel.toTable(sheet)>

${sheet.getSheetName()}

<@writeRows rows/> diff --git a/freemarker-generator-cli/templates/excel/md/transform.ftl b/freemarker-generator-cli/templates/excel/md/transform.ftl index c1c67e51..8878df73 100644 --- a/freemarker-generator-cli/templates/excel/md/transform.ftl +++ b/freemarker-generator-cli/templates/excel/md/transform.ftl @@ -17,7 +17,7 @@ --> <#assign dataSource = dataSources.get(0)> <#assign name = dataSource.name> -<#assign workbook = ExcelTool.parse(dataSource)> +<#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> <#compress> @@ -30,7 +30,7 @@ ${'\n'} <#-- writeSheets --> <#---------------------------------------------------------------------------> <#macro writeSheets workbook> - <#assign sheets = ExcelTool.getSheets(workbook)> + <#assign sheets = tools.excel.getSheets(workbook)> <#list sheets as sheet> <@writeSheet sheet/> @@ -40,7 +40,7 @@ ${'\n'} <#-- writeSheet --> <#---------------------------------------------------------------------------> <#macro writeSheet sheet> - <#assign rows = ExcelTool.toTable(sheet)> + <#assign rows = tools.excel.toTable(sheet)> ## ${sheet.getSheetName()} ${'\n'} <@writeRows rows/> diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index f29a6c4b..80d424d0 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -27,24 +27,22 @@ Output format : ${.output_format} FreeMarker CLI Template Loader Directories ------------------------------------------------------------------------------ -<#list SystemTool.getTemplateDirectories() as directory> +<#list tools.system.getTemplateDirectories() as directory> [#${directory?counter}] ${directory} -FreeMarker CLI Tools ------------------------------------------------------------------------------- -<#list .data_model?keys?sort as key> -<#if key?ends_with("Tool")> -- ${key?right_pad(20)} : ${.data_model[key]} - - - FreeMarker CLI Data Model --------------------------------------------------------------------------- <#list .data_model?keys?sort as key> - ${key}<#lt> +FreeMarker CLI Tools +------------------------------------------------------------------------------ +<#list .data_model.tools?keys?sort as key> +- ${key?right_pad(20)} : ${.data_model.tools[key]} + + <#if dataSources.list?has_content> FreeMarker CLI DataSources ------------------------------------------------------------------------------ @@ -54,10 +52,10 @@ URI : ${dataSource.uri} -<#if SystemTool.parameters?has_content> +<#if tools.system.parameters?has_content> FreeMarker CLI Parameters ------------------------------------------------------------------------------ -<#list SystemTool.parameters as key,value> +<#list tools.system.parameters as key,value> <#if value?is_hash> - ${key} ==> { <#list value as name,value>${name}=${value} } <#else> diff --git a/freemarker-generator-cli/templates/json/yaml/transform.ftl b/freemarker-generator-cli/templates/json/yaml/transform.ftl index 3d911b60..0b8ee1b7 100644 --- a/freemarker-generator-cli/templates/json/yaml/transform.ftl +++ b/freemarker-generator-cli/templates/json/yaml/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${YamlTool.toYaml(GsonTool.parse(dataSources.get(0)))} \ No newline at end of file +${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))} \ No newline at end of file diff --git a/freemarker-generator-cli/templates/lib/commons-csv.ftl b/freemarker-generator-cli/templates/lib/commons-csv.ftl index 4e3c771d..e8b05389 100644 --- a/freemarker-generator-cli/templates/lib/commons-csv.ftl +++ b/freemarker-generator-cli/templates/lib/commons-csv.ftl @@ -25,8 +25,8 @@ * CSV_SOURCE_WITH_HEADER - whether the first rows are headers --> <#function sourceFormat> - <#assign format = CSVTool.formats[CSV_SOURCE_FORMAT!"DEFAULT"]> - <#assign delimiter = CSVTool.toDelimiter(CSV_SOURCE_DELIMITER!format.getDelimiter())> + <#assign format = tools.csv.formats[CSV_SOURCE_FORMAT!"DEFAULT"]> + <#assign delimiter = tools.csv.toDelimiter(CSV_SOURCE_DELIMITER!format.getDelimiter())> <#assign withHeader = CSV_SOURCE_WITH_HEADER!"true"> <#assign format = format.withDelimiter(delimiter)> <#if withHeader?boolean> @@ -44,8 +44,8 @@ * CSV_TARGET_WITH_HEADER - whether the first rows are headers --> <#function targetFormat> - <#assign format = CSVTool.formats[CSV_TARGET_FORMAT!"DEFAULT"]> - <#assign delimiter = CSVTool.toDelimiter(CSV_TARGET_DELIMITER!format.getDelimiter())> + <#assign format = tools.csv.formats[CSV_TARGET_FORMAT!"DEFAULT"]> + <#assign delimiter = tools.csv.toDelimiter(CSV_TARGET_DELIMITER!format.getDelimiter())> <#assign withHeader = CSV_TARGET_WITH_HEADER!"true"> <#assign format = format.withDelimiter(delimiter)> <#if withHeader?boolean> diff --git a/freemarker-generator-cli/templates/yaml/json/transform.ftl b/freemarker-generator-cli/templates/yaml/json/transform.ftl index 161c3304..05d1f963 100644 --- a/freemarker-generator-cli/templates/yaml/json/transform.ftl +++ b/freemarker-generator-cli/templates/yaml/json/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${GsonTool.toJson(YamlTool.parse(dataSources.get(0)))} \ No newline at end of file +${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))} \ No newline at end of file From 10721cab6fdcc12573338fbe153f2fe4ab893d85 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Wed, 8 Jul 2020 00:00:53 +0200 Subject: [PATCH 12/23] FREEMARKER-148 Fix a couple of typos --- README.md | 2 +- freemarker-generator-base/README.md | 2 +- .../apache/freemarker/generator/base/parameter/Parameter.java | 2 +- .../src/site/markdown/cli/concepts/data-models.md | 4 ++-- .../src/site/markdown/cli/concepts/template-loading.md | 2 +- .../src/site/markdown/cli/usage/running-examples.md | 2 +- freemarker-generator-maven-plugin/README.md | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1db80279..d0c6e3d2 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Currently it can be invoked as a Building Apache FreeMarker Generator ----------------------------------------------------------------------------- -To create the artefacts locally run +To create the artifacts locally run > mvn clean install diff --git a/freemarker-generator-base/README.md b/freemarker-generator-base/README.md index 4a5c1192..1b8a0c4d 100644 --- a/freemarker-generator-base/README.md +++ b/freemarker-generator-base/README.md @@ -4,7 +4,7 @@ Apache FreeMarker Generator Base This module provides common functionality for `freemarker-generator-cli` and `freemarker-generator-maven-plugin` such as * Various implementation of `javax.activation.DataSources` -* Implementation of `DataSource` and utitity methods +* Implementation of `DataSource` and utility methods * Creating `DataSources` The code actually does not depend on Apache FreeMarker since it useful for other command line tools as well. \ No newline at end of file diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java index 707a038b..da3e1d8f 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/parameter/Parameter.java @@ -21,7 +21,7 @@ import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty; /** - * Caputeres the information of a user-supplied parameter. + * Captures the information of a user-supplied parameter. */ public class Parameter { diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md index 25bb3f93..118029b7 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md @@ -4,7 +4,7 @@ A `DataModel` is an eagerly loaded `DataSource` available in Apache FreeMarker's * The content of the `DataSource` is parsed and a `Map` generated * The `Map` is either stored as variable in the model or all entries are copied into the FreeMarker model -* The parsing is supported for `JSON`, `YAML`, `Properties` and enviroment variables +* The parsing is supported for `JSON`, `YAML`, `Properties` and environment variables Expose the fields of the JSON data source in FreeMarker's model @@ -51,7 +51,7 @@ HOME=/Users/sgoeschl USER=sgoeschl ``` -Expose a single envionment variable in theFreeMarker model +Expose a single environment variable in theFreeMarker model ``` > freemarker-cli --data-model NAME=env:///USER -i 'Hello ${NAME}'; echo diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md index 54ac283d..30e9404d 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/template-loading.md @@ -40,7 +40,7 @@ and [Template Includes](https://freemarker.apache.org/docs/ref_directive_include ### Free-Style Template Loading -The previosly described `Template Loaders` do not support absolute template files or arbitrary URLS - this behaviour +The previously described `Template Loaders` do not support absolute template files or arbitrary URLS - this behaviour stems from security aspects when running `Apache FreeMarker` on the server side. For a command-line tool this is mostly irrelevant therefore any template file outside of the template loader directories can be loaded diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md index 4da01fbc..0d6e692d 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md @@ -657,7 +657,7 @@ Think of `Grok` as modular regular expressions with a pre-defined functionality QUOTEDSTRING (?>(?"(?>\\.|[^\\"]+)+"|""|(?>'(?>\\.|[^\\']+)+')|''|(?>`(?>\\.|[^\\`]+)+`)|``)) ``` -And with `Grok` the `QUOTEDSTRING` is just a building block for an even more complex regular expession such as `COMBINEDAPACHELOG` +And with `Grok` the `QUOTEDSTRING` is just a building block for an even more complex regular expression such as `COMBINEDAPACHELOG` > bin/freemarker-cli -t examples/templates/accesslog/combined-access.ftl examples/data/accesslog/combined-access.log diff --git a/freemarker-generator-maven-plugin/README.md b/freemarker-generator-maven-plugin/README.md index f6e186d3..631f02ba 100644 --- a/freemarker-generator-maven-plugin/README.md +++ b/freemarker-generator-maven-plugin/README.md @@ -53,9 +53,9 @@ Add the following snippet within the `` tag of your pom.xml: src/main/freemarker/generator - + src/main/freemarker/generator/template - + src/main/freemarker/generator/generator target/generated-sources/freemarker/generator From 793fb269a6314e46631f887373e0e740e94b34b4 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Wed, 8 Jul 2020 15:37:26 +0200 Subject: [PATCH 13/23] FREEMARKER-148 Fix a couple of typos --- .../generator/base/datasource/DataSource.java | 2 +- .../generator/uri/NamedUriStringParserTest.java | 2 +- freemarker-generator-cli/examples/templates/demo.ftl | 2 +- freemarker-generator-cli/templates/info.ftl | 10 +++++----- 4 files changed, 8 insertions(+), 8 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 0b82014f..d83a4d39 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 @@ -320,7 +320,7 @@ private String getPart(String part) { case "group": return getGroup(); case "mimetype": - return getContentType(); + return getMimetype(); case "name": return getName(); case "path": diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java index 2d0bb4a1..1f5cdf4c 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java @@ -74,7 +74,7 @@ public void shouldParseAbsoluteUnixFileName() { } @Test - public void shouldParseAbsoluteWindosFileName() { + public void shouldParseAbsoluteWindowsFileName() { final NamedUri namedURI = parse("\\data\\users.csv"); assertNull(namedURI.getName()); diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 0aae9a8a..3de21268 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -49,7 +49,7 @@ java.math.RoundingMode#UP: ${tools.freemarker.enums["java.math.RoundingMode"].UP --------------------------------------------------------------------------- List all data sources: <#list dataSources.list as dataSource> -- Document: name=${dataSource.name} uri=${dataSource.uri} length=${dataSource.length} encoding=${dataSource.encoding!""} +- Document: name=${dataSource.name} uri=${dataSource.uri} length=${dataSource.length} charset=${dataSource.charset} 7) SystemTool diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index 80d424d0..bc54e0b6 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -39,16 +39,16 @@ FreeMarker CLI Data Model FreeMarker CLI Tools ------------------------------------------------------------------------------ -<#list .data_model.tools?keys?sort as key> -- ${key?right_pad(20)} : ${.data_model.tools[key]} +<#list tools?keys?sort as name> +- ${name?right_pad(20)} : ${tools[name]} <#if dataSources.list?has_content> FreeMarker CLI DataSources ------------------------------------------------------------------------------ -<#list dataSources.list as dataSource> -[#${dataSource?counter}], name=${dataSource.name}, group=${dataSource.group}, mimeType=${dataSource.mimetype}, charset=${dataSource.charset}, length=${dataSource.length} Bytes -URI : ${dataSource.uri} +<#list dataSources.list as ds> +[#${ds?counter}]: name=${ds.name}, group=${ds.group}, mimeType=${ds.mimetype}, charset=${ds.charset}, length=${ds.length} Bytes +URI : ${ds.uri} From 4a106bd5ca11053f0731d2440c12afc1b08d0852 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Wed, 8 Jul 2020 19:29:25 +0200 Subject: [PATCH 14/23] FREEMARKER-148 Align camel-case naming --- .../generator/base/datasource/DataSource.java | 14 ++++---- ...imetypeParser.java => MimeTypeParser.java} | 6 ++-- .../generator/base/uri/NamedUri.java | 2 +- .../base/uri/NamedUriStringParser.java | 2 +- .../generator/datasource/DataSourceTest.java | 2 +- .../datasource/DataSourcesSupplierTest.java | 4 +-- .../generator/mime/MimetypeParserTest.java | 32 +++++++++---------- .../uri/NamedUriStringParserTest.java | 6 ++-- .../site/markdown/cli/concepts/data-models.md | 4 +-- .../markdown/cli/concepts/data-sources.md | 2 +- .../site/markdown/cli/concepts/named-uris.md | 2 +- .../cli/usage/transforming-directories.md | 6 ++-- freemarker-generator-cli/templates/info.ftl | 2 +- 13 files changed, 42 insertions(+), 42 deletions(-) rename freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/{MimetypeParser.java => MimeTypeParser.java} (94%) 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 d83a4d39..f289827b 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 @@ -21,7 +21,7 @@ import org.apache.commons.io.LineIterator; import org.apache.freemarker.generator.base.activation.ByteArrayDataSource; import org.apache.freemarker.generator.base.activation.StringDataSource; -import org.apache.freemarker.generator.base.mime.MimetypeParser; +import org.apache.freemarker.generator.base.mime.MimeTypeParser; import org.apache.freemarker.generator.base.util.CloseableReaper; import org.apache.freemarker.generator.base.util.StringUtils; import org.apache.freemarker.generator.base.util.Validate; @@ -137,16 +137,16 @@ public String getExtension() { } public Charset getCharset() { - return charset != null ? charset : MimetypeParser.getCharset(contentType(), UTF_8); + return charset != null ? charset : MimeTypeParser.getCharset(contentType(), UTF_8); } /** - * Get the mimetype , i.e. content type without additional charset parameter. + * Get the mime type , i.e. content type without additional charset parameter. * - * @return mimetype + * @return mime type */ - public String getMimetype() { - return MimetypeParser.getMimetype(contentType()); + public String getMimeType() { + return MimeTypeParser.getMimeType(contentType()); } public URI getUri() { @@ -320,7 +320,7 @@ private String getPart(String part) { case "group": return getGroup(); case "mimetype": - return getMimetype(); + return getMimeType(); case "name": return getName(); case "path": diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimetypeParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimeTypeParser.java similarity index 94% rename from freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimetypeParser.java rename to freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimeTypeParser.java index 46b82a6a..5d41cd08 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimetypeParser.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/MimeTypeParser.java @@ -21,7 +21,7 @@ import static org.apache.freemarker.generator.base.util.StringUtils.isEmpty; /** - * Parse a mimetype. + * Parse a mime type. *

* Some examples *

    @@ -29,9 +29,9 @@ *
  • text/html;charset=windows-1252
  • *
*/ -public class MimetypeParser { +public class MimeTypeParser { - public static String getMimetype(String raw) { + public static String getMimeType(String raw) { if (isEmpty(raw)) { return null; } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java index 1b1c63e2..08b72533 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java @@ -30,7 +30,7 @@ public class NamedUri { public static final String CHARSET = "charset"; - public static final String MIMETYPE = "mimetype"; + public static final String MIMETYPE = "mimeType"; /** User-supplied name */ private final String name; diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java index 6aabbd01..fc519fdc 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java @@ -33,7 +33,7 @@ *
  • file:///users.csv
  • *
  • users=file:///users.csv
  • *
  • users:admin=file:///users.csv
  • - *
  • users=file:///users.csv#charset=UTF-16&mimetype=text/csv
  • + *
  • users=file:///users.csv#charset=UTF-16&mimeType=text/csv
  • * */ public class NamedUriStringParser { 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 1992c09d..382cf468 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 @@ -90,7 +90,7 @@ public void shouldSupportUrlDataSource() { assertEquals("www.google", dataSource.getBaseName()); assertEquals("com", dataSource.getExtension()); assertEquals("https://www.google.com/?foo=bar", dataSource.getUri().toString()); - assertEquals(MIME_TEXT_HTML, dataSource.getMimetype()); + assertEquals(MIME_TEXT_HTML, dataSource.getMimeType()); assertEquals("ISO-8859-1", dataSource.getCharset().name()); assertEquals(-1, dataSource.getLength()); assertFalse(dataSource.getText().isEmpty()); diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java index 9944681a..0978b884 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java @@ -43,9 +43,9 @@ public void shouldResolveSingleFile() { assertEquals(1, supplier("./pom.xml", "*", NO_EXCLUDE).get().size()); assertEquals(1, supplier("pom=pom.xml", "*", NO_EXCLUDE).get().size()); assertEquals(1, supplier("pom=./pom.xml", "*", NO_EXCLUDE).get().size()); - assertEquals(1, supplier("pom=./pom.xml#mimetype=application/xml", "*", NO_EXCLUDE).get().size()); + assertEquals(1, supplier("pom=./pom.xml#mimeType=application/xml", "*", NO_EXCLUDE).get().size()); assertEquals(1, supplier("pom=" + PWD + "/pom.xml", "*", NO_EXCLUDE).get().size()); - assertEquals(1, supplier("pom=file:///" + PWD + "/pom.xml#mimetype=application/xml", "*", NO_EXCLUDE).get() + assertEquals(1, supplier("pom=file:///" + PWD + "/pom.xml#mimeType=application/xml", "*", NO_EXCLUDE).get() .size()); } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/mime/MimetypeParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/mime/MimetypeParserTest.java index f682e138..a05a6366 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/mime/MimetypeParserTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/mime/MimetypeParserTest.java @@ -16,7 +16,7 @@ */ package org.apache.freemarker.generator.mime; -import org.apache.freemarker.generator.base.mime.MimetypeParser; +import org.apache.freemarker.generator.base.mime.MimeTypeParser; import org.junit.Test; import java.nio.charset.StandardCharsets; @@ -28,32 +28,32 @@ public class MimetypeParserTest { @Test public void shouldHandleMissingMimeType() { - assertNull(MimetypeParser.getMimetype(null)); - assertNull(MimetypeParser.getMimetype("")); - assertNull(MimetypeParser.getMimetype(" ")); + assertNull(MimeTypeParser.getMimeType(null)); + assertNull(MimeTypeParser.getMimeType("")); + assertNull(MimeTypeParser.getMimeType(" ")); } @Test public void shouldGetMimetype() { - assertEquals("text/html", MimetypeParser.getMimetype("text/html")); - assertEquals("text/html", MimetypeParser.getMimetype("text/html;charset=utf-8")); + assertEquals("text/html", MimeTypeParser.getMimeType("text/html")); + assertEquals("text/html", MimeTypeParser.getMimeType("text/html;charset=utf-8")); } @Test public void shouldHandleMissingContentType() { - assertNull(MimetypeParser.getCharset(null)); - assertNull(MimetypeParser.getCharset("")); - assertNull(MimetypeParser.getCharset(" ")); - assertNull(MimetypeParser.getCharset("text/html")); - assertNull(MimetypeParser.getCharset("text/html;something=utf-8")); + assertNull(MimeTypeParser.getCharset(null)); + assertNull(MimeTypeParser.getCharset("")); + assertNull(MimeTypeParser.getCharset(" ")); + assertNull(MimeTypeParser.getCharset("text/html")); + assertNull(MimeTypeParser.getCharset("text/html;something=utf-8")); } @Test public void shouldGetCharset() { - assertEquals(StandardCharsets.UTF_8, MimetypeParser.getCharset("text/html;charset=utf-8")); - assertEquals(StandardCharsets.UTF_8, MimetypeParser.getCharset("text/html;charset=UTF-8")); - assertEquals(StandardCharsets.UTF_8, MimetypeParser.getCharset("text/html; charset=utf-8")); - assertEquals(StandardCharsets.UTF_8, MimetypeParser.getCharset("text/html; charset=UTF-8")); - assertEquals(StandardCharsets.UTF_8, MimetypeParser.getCharset("text/html;Charset=UTF-8")); + assertEquals(StandardCharsets.UTF_8, MimeTypeParser.getCharset("text/html;charset=utf-8")); + assertEquals(StandardCharsets.UTF_8, MimeTypeParser.getCharset("text/html;charset=UTF-8")); + assertEquals(StandardCharsets.UTF_8, MimeTypeParser.getCharset("text/html; charset=utf-8")); + assertEquals(StandardCharsets.UTF_8, MimeTypeParser.getCharset("text/html; charset=UTF-8")); + assertEquals(StandardCharsets.UTF_8, MimeTypeParser.getCharset("text/html;Charset=UTF-8")); } } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java index 1f5cdf4c..7954f504 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/uri/NamedUriStringParserTest.java @@ -178,14 +178,14 @@ public void shouldParseEmptyNamedWithGroupFileUri() { @Test public void shouldParseNamedFileUriWithFragment() { - final NamedUri namedURI = parse("users=file:///users.csv#charset=UTF-16&mimetype=text/csv"); + final NamedUri namedURI = parse("users=file:///users.csv#charset=UTF-16&mimeType=text/csv"); assertEquals("users", namedURI.getName()); assertNull(namedURI.getGroup()); - assertEquals("file:///users.csv#charset=UTF-16&mimetype=text/csv", namedURI.getUri().toString()); + assertEquals("file:///users.csv#charset=UTF-16&mimeType=text/csv", namedURI.getUri().toString()); assertEquals(2, namedURI.getParameters().size()); assertEquals("UTF-16", namedURI.getParameters().get("charset")); - assertEquals("text/csv", namedURI.getParameters().get("mimetype")); + assertEquals("text/csv", namedURI.getParameters().get("mimeType")); } @Test diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md index 118029b7..65aac2a5 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-models.md @@ -68,13 +68,13 @@ Hello sgoeschl! The following snippet shows a more advanced example * The environment variable `DB_CONFIG` holds JSON data -* Use the `config=env:///DB_CONFIG#mimetype=application/json` to parse JSON payload from `DB_CONFIG` into the data model `config` +* Use the `config=env:///DB_CONFIG#mimetType=application/json` to parse JSON payload from `DB_CONFIG` into the data model `config` ``` > export DB_CONFIG='{"db_default_user":"scott","db_default_password":"tiger"}' > echo $DB_CONFIG {"db_default_user":"scott","db_default_password":"tiger"} -> freemarker-cli -m config=env:///DB_CONFIG#mimetype=application/json -i '<#list config as name,value>${name}=${value}${"\n"}' +> freemarker-cli -m config=env:///DB_CONFIG#mimeType=application/json -i '<#list config as name,value>${name}=${value}${"\n"}' db_default_user=scott db_default_password=tiger ``` \ No newline at end of file diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md index 2a44c078..9f88d2cd 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md @@ -36,7 +36,7 @@ or from an environment variable, e.g. `NGINX_CONF` having a JSON payload ``` export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}' -freemarker-cli -t templates/info.ftl -s conf=env:///NGINX_CONF#mimetype=application/json +freemarker-cli -t templates/info.ftl -s conf=env:///NGINX_CONF#mimeType=application/json FreeMarker CLI DataSources ------------------------------------------------------------------------------ diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md index 58f9faa6..1679a504 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md @@ -24,7 +24,7 @@ For our purposes, the scheme and the path components are especially important, t | authority | Used only by remote datasources, and can be omitted in some of those cases. | | path | Can be omitted, but usually used as the basis of the locator for the datasource. | | query | Used mainly for HTTP and HTTPS URLs | -| fragment | Used rarely for providing additional attributes, e.g. `mimetype` of `charset` | +| fragment | Used rarely for providing additional attributes, e.g. `mimeType` of `charset` | The following Named URI loads a "user.csv" and the data source is available as `my_users` diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md index ad694fbd..7f9b4754 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md @@ -176,11 +176,11 @@ server { In the cloud it is common to pass JSON configuration as environment variable * `env:///NGINX_CONF` selects the `NGINX_CONF` environment variable -* `#mimetype=application/json` defines that JSON content is parsed +* `#mimeType=application/json` defines that JSON content is parsed ``` export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}' -freemarker-cli -t examples/data/template/ -m env:///NGINX_CONF#mimetype=application/json +freemarker-cli -t examples/data/template/ -m env:///NGINX_CONF#mimeType=application/json # == application.properties ================================================== server.name=localhost server.logs=/var/log/nginx @@ -200,7 +200,7 @@ For testing purpose it is useful to override certain settings ``` export NGINX_CONF='{"NGINX_PORT":"8443","NGINX_HOSTNAME":"localhost"}' -freemarker-cli -t examples/data/template/ -PNGINX_HOSTNAME=www.mydomain.com -m env:///NGINX_CONF#mimetype=application/json +freemarker-cli -t examples/data/template/ -PNGINX_HOSTNAME=www.mydomain.com -m env:///NGINX_CONF#mimeType=application/json # == application.properties ================================================== server.name=www.mydomain.com server.logs=/var/log/nginx diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index bc54e0b6..703b1763 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -47,7 +47,7 @@ FreeMarker CLI Tools FreeMarker CLI DataSources ------------------------------------------------------------------------------ <#list dataSources.list as ds> -[#${ds?counter}]: name=${ds.name}, group=${ds.group}, mimeType=${ds.mimetype}, charset=${ds.charset}, length=${ds.length} Bytes +[#${ds?counter}]: name=${ds.name}, group=${ds.group}, mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes URI : ${ds.uri} From f42e3ac4001adc1a1e555d0a732852661f2ce8e6 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 9 Jul 2020 14:00:25 +0200 Subject: [PATCH 15/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSourcesSupplier.java | 2 ++ .../src/site/markdown/cli/concepts/data-sources.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) 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 6e741e3e..8907330d 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 @@ -16,9 +16,11 @@ */ package org.apache.freemarker.generator.base.datasource; +import jdk.nashorn.internal.runtime.URIUtils; import org.apache.freemarker.generator.base.file.RecursiveFileSupplier; import org.apache.freemarker.generator.base.uri.NamedUri; import org.apache.freemarker.generator.base.uri.NamedUriStringParser; +import org.apache.freemarker.generator.base.util.UriUtils; import org.apache.freemarker.generator.base.util.Validate; import java.io.File; diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md index 9f88d2cd..4144fcb9 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md @@ -98,7 +98,7 @@ A few FTL examples ``` <#assign dataSource = dataSources.get(0)> -<#assign dataSource = dataSources.get("user.csv)> +<#assign dataSource = dataSources["user.csv"]> <#list dataSources.find("*.md") as dataSource> - ${dataSource.name} From 9cea3f1f161c0da93b971629b78e457f10a63661 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 9 Jul 2020 14:00:37 +0200 Subject: [PATCH 16/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 64 +++++++++++-------- .../base/datasource/DataSourceFactory.java | 16 ++--- .../base/datasource/DataSources.java | 26 +++++++- .../base/datasource/DataSourcesSupplier.java | 2 +- .../generator/base/util/StringUtils.java | 5 ++ .../generator/base/util/UriUtils.java | 11 ++-- .../datasource/DataSourceFactoryTest.java | 8 +-- .../generator/datasource/DataSourceTest.java | 4 +- .../datasource/DataSourcesSupplierTest.java | 8 +-- .../generator/datasource/DataSourcesTest.java | 21 +++--- .../examples/data/ftl/nginx/nginx.conf.ftl | 2 +- .../templates/accesslog/combined-access.ftl | 2 +- .../csv/csv/gatling-user-credentials.ftl | 2 +- .../templates/csv/fo/transactions.ftl | 2 +- .../examples/templates/csv/fo/transform.ftl | 2 +- .../templates/csv/html/transactions.ftl | 2 +- .../examples/templates/csv/md/filter.ftl | 2 +- .../examples/templates/csv/shell/curl.ftl | 2 +- .../examples/templates/dataframe/example.ftl | 2 +- .../templates/dataframe/html/print.ftl | 2 +- .../examples/templates/demo.ftl | 20 ++---- .../examples/templates/excel/csv/custom.ftl | 2 +- .../templates/excel/dataframe/transform.ftl | 2 +- .../templates/html/csv/dependencies.ftl | 2 +- .../templates/json/csv/swagger-endpoints.ftl | 2 +- .../templates/json/dataframe/github-users.ftl | 2 +- .../templates/json/md/github-users.ftl | 2 +- .../properties/csv/locker-test-users.ftl | 2 +- .../templates/tsv/fo/transactions.ftl | 2 +- .../examples/templates/xml/txt/recipients.ftl | 2 +- .../examples/templates/yaml/txt/transform.ftl | 2 +- .../cli/config/ConfigurationSupplier.java | 4 ++ .../generator/cli/model/DataSourcesModel.java | 52 ++++++--------- .../cli/model/GeneratorObjectWrapper.java | 3 +- .../markdown/cli/concepts/data-sources.md | 2 +- .../markdown/cli/usage/running-examples.md | 32 +++++----- .../markdown/cli/usage/using-dataframes.md | 6 +- .../generator/cli/ExamplesTest.java | 36 ++++------- .../freemarker/generator/cli/ManualTest.java | 2 +- .../src/test/templates/manual.ftl | 2 +- .../src/test/templates/tools/csv.ftl | 2 +- freemarker-generator-cli/templates/cat.ftl | 2 +- .../templates/csv/csv/transform.ftl | 2 +- .../templates/csv/html/transform.ftl | 2 +- .../templates/csv/md/transform.ftl | 2 +- .../templates/excel/csv/transform.ftl | 2 +- .../templates/excel/html/transform.ftl | 2 +- .../templates/excel/md/transform.ftl | 2 +- freemarker-generator-cli/templates/info.ftl | 6 +- .../templates/json/yaml/transform.ftl | 2 +- .../templates/yaml/json/transform.ftl | 2 +- 51 files changed, 199 insertions(+), 191 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 f289827b..d83d35c6 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 @@ -132,6 +132,10 @@ public String getBaseName() { return FilenameUtils.getBaseName(name); } + public String getFileName() { + return FilenameUtils.getName(name); + } + public String getExtension() { return FilenameUtils.getExtension(name); } @@ -259,6 +263,40 @@ public byte[] getBytes() { } } + /** + * Expose various parts of the metadata as simple strings to cater for filtering in a script. + * + * @param name name part name + * @return value + */ + public String getPart(String name) { + Validate.notEmpty(name, "No part name provided"); + switch (name.toLowerCase()) { + case "basename": + return getBaseName(); + case "charset": + return getCharset().name(); + case "extension": + return getExtension(); + case "filename": + return getFileName(); + case "group": + return getGroup(); + case "mimetype": + return getMimeType(); + case "name": + return getName(); + case "path": + return uri.getPath(); + case "scheme": + return uri.getScheme(); + case "uri": + return uri.toString(); + default: + throw new IllegalArgumentException("Unknown name: " + name); + } + } + /** * Matches a metadata entry with a wildcard expression. * @@ -307,30 +345,4 @@ private String contentType() { return StringUtils.firstNonEmpty(dataSource.getContentType(), MIME_APPLICATION_OCTET_STREAM); } } - - private String getPart(String part) { - Validate.notEmpty(part, "No metadata part provided"); - switch (part.toLowerCase()) { - case "basename": - return getBaseName(); - case "contenttype": - return getContentType(); - case "extension": - return getExtension(); - case "group": - return getGroup(); - case "mimetype": - return getMimeType(); - case "name": - return getName(); - case "path": - return uri.getPath(); - case "scheme": - return uri.getScheme(); - case "uri": - return uri.toASCIIString(); - default: - throw new IllegalArgumentException("Unknown part: " + part); - } - } } \ No newline at end of file diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index ed69fff7..e654b451 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -77,11 +77,11 @@ public static DataSource fromNamedUri(NamedUri namedUri) { if (UriUtils.isHttpURI(uri)) { final URL url = toURL(uri); - final String name = namedUri.getNameOrElse(url.getHost()); + final String name = namedUri.getNameOrElse(UriUtils.toName(uri)); return fromUrl(name, group, url, mimeType, charset); } else if (UriUtils.isFileUri(uri)) { final File file = namedUri.getFile(); - final String name = namedUri.getNameOrElse(file.getName()); + final String name = namedUri.getNameOrElse(UriUtils.toName(file.toURI())); return fromFile(name, group, file, charset); } else if (UriUtils.isEnvUri(uri)) { // environment variables come with a leading "/" to be removed @@ -96,17 +96,13 @@ public static DataSource fromNamedUri(NamedUri namedUri) { } else { // handle things such as "foo=some.file" final File file = namedUri.getFile(); - final String name = namedUri.getNameOrElse(file.getName()); + final String name = namedUri.getNameOrElse(UriUtils.toName(file.toURI())); return fromFile(name, group, file, charset); } } // == URL =============================================================== - public static DataSource fromUrl(String name, String group, URL url, Charset charset) { - return fromUrl(name, group, url, NO_MIME_TYPE, charset); - } - public static DataSource fromUrl(String name, String group, URL url, String contentType, Charset charset) { final URLDataSource dataSource = new CachingUrlDataSource(url); final URI uri = UriUtils.toURI(url); @@ -115,10 +111,6 @@ public static DataSource fromUrl(String name, String group, URL url, String cont // == String ============================================================ - public static DataSource fromString(String content, String contentType) { - return fromString(Location.STRING, DEFAULT_GROUP, content, contentType); - } - public static DataSource fromString(String name, String group, String content, String contentType) { final StringDataSource dataSource = new StringDataSource(name, content, contentType, UTF_8); final URI uri = UriUtils.toURI(Location.STRING, UUID.randomUUID().toString()); @@ -128,7 +120,7 @@ public static DataSource fromString(String name, String group, String content, S // == File ============================================================== public static DataSource fromFile(File file, Charset charset) { - return fromFile(file.getName(), DEFAULT_GROUP, file, charset); + return fromFile(UriUtils.toName(file.toURI()), DEFAULT_GROUP, file, charset); } public static DataSource fromFile(String name, String group, File file, Charset charset) { diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java index 1981b74f..ac34d46a 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java @@ -23,8 +23,12 @@ import java.io.Closeable; import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import static java.util.function.Function.identity; import static java.util.stream.Collectors.toList; /** @@ -49,7 +53,18 @@ public DataSources(Collection dataSources) { public List getNames() { return dataSources.stream() .map(DataSource::getName) - .filter(StringUtils::isNotEmpty) + .collect(toList()); + } + + /** + * Get the file names of all data sources. + * + * @param partName name of the metadata part + * @return data source names + */ + public List getParts(String partName) { + return dataSources.stream() + .map(ds -> ds.getPart(partName)) .collect(toList()); } @@ -75,6 +90,13 @@ public boolean isEmpty() { return dataSources.isEmpty(); } + public Map getMap() { + return dataSources.stream().collect(Collectors.toMap(DataSource::getName, + identity(), + (v1, v2) -> v1, + LinkedHashMap::new)); + } + public List getList() { return new ArrayList<>(dataSources); } @@ -120,7 +142,7 @@ public List find(String wildcard) { /** * Find data sources based on their metadata part and wildcard. * - * @param part part of metadata to match + * @param part part of metadata to match * @param wildcard the wildcard string to match against * @return list of matching data sources * @see Apache Commons IO 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 8907330d..33b715bb 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 @@ -137,7 +137,7 @@ private static String getDataSourceName(NamedUri namedUri, File file) { if (namedUri.hasName()) { return namedUri.getName(); } else { - return file.getName(); + return UriUtils.toName(file.toURI()); } } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java index 3e480fa6..7b7091f2 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java @@ -16,6 +16,8 @@ */ package org.apache.freemarker.generator.base.util; +import org.apache.commons.io.FilenameUtils; + public class StringUtils { public static boolean isEmpty(String value) { @@ -52,4 +54,7 @@ public static int count(final String s, final char c) { return count; } + private static String separatorsToUnix(String str) { + return FilenameUtils.separatorsToUnix(str); + } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java index 679f299d..a42f5290 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.net.URL; +import static org.apache.commons.io.FilenameUtils.separatorsToUnix; import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty; public class UriUtils { @@ -42,6 +43,12 @@ public static URI toURI(URL url) { return toURI(url.toString()); } + public static String toName(URI uri) { + final String scheme = uri.getScheme(); + final String schemeSpecificPart = uri.getSchemeSpecificPart(); + return scheme + schemeSpecificPart; + } + public static boolean isUri(String str) { return isNotEmpty(str) && str.contains("://"); } @@ -66,8 +73,4 @@ public static boolean isEnvUri(URI uri) { } return "env".equalsIgnoreCase(uri.getScheme()); } - - private static String separatorsToUnix(String str) { - return FilenameUtils.separatorsToUnix(str); - } } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java index ce1ed61f..0610e2dd 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java @@ -53,7 +53,7 @@ public class DataSourceFactoryTest { public void shouldCreateDataSourceFromFile() { final DataSource dataSource = DataSourceFactory.fromFile(ANY_FILE, ANY_CHAR_SET); - assertEquals(ANY_FILE_NAME, dataSource.getName()); + assertEquals(ANY_FILE_NAME, dataSource.getFileName()); assertEquals(UTF_8, dataSource.getCharset()); assertEquals(MIME_APPLICATION_XML, dataSource.getContentType()); assertEquals(ANY_FILE.toURI(), dataSource.getUri()); @@ -64,7 +64,7 @@ public void shouldCreateDataSourceFromFile() { public void shouldCreateDataSourceFromFileUri() { final DataSource dataSource = DataSourceFactory.create(ANY_FILE_URI); - assertEquals(ANY_FILE_NAME, dataSource.getName()); + assertEquals(ANY_FILE_NAME, dataSource.getFileName()); assertEquals(UTF_8, dataSource.getCharset()); assertEquals(MIME_APPLICATION_XML, dataSource.getContentType()); assertEquals(ANY_FILE.toURI(), dataSource.getUri()); @@ -133,7 +133,7 @@ public void shouldCreateDataSourceFromNamedURL() { } @Test - public void shouldCreateDataSourceFromEnviroment() { + public void shouldCreateDataSourceFromEnvironment() { final NamedUri namedUri = NamedUriStringParser.parse("env:///"); final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri); @@ -145,7 +145,7 @@ public void shouldCreateDataSourceFromEnviroment() { } @Test - public void shouldCreateDataSourceFromNamedEnviroment() { + public void shouldCreateDataSourceFromNamedEnvironment() { final NamedUri namedUri = NamedUriStringParser.parse("config=env:///"); final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri); 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 382cf468..7c8ef0c8 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 @@ -64,7 +64,7 @@ public void shouldSupportTextDataSource() { @Test public void shouldSupportFileDataSource() { try (DataSource dataSource = DataSourceFactory.fromFile(ANY_FILE, ANY_CHAR_SET)) { - assertEquals(ANY_FILE_NAME, dataSource.getName()); + assertEquals(ANY_FILE_NAME, dataSource.getFileName()); assertEquals(DEFAULT_GROUP, dataSource.getGroup()); assertEquals("pom", dataSource.getBaseName()); assertEquals("xml", dataSource.getExtension()); @@ -73,7 +73,7 @@ public void shouldSupportFileDataSource() { assertEquals("application/xml", dataSource.getContentType()); assertTrue(dataSource.getLength() > 0); assertFalse(dataSource.getText().isEmpty()); - assertTrue(dataSource.match("name", ANY_FILE_NAME)); + assertTrue(dataSource.match("name", "*" + ANY_FILE_NAME)); assertTrue(dataSource.match("uri", "file:/*/pom.xml")); assertTrue(dataSource.match("extension", "xml")); assertTrue(dataSource.match("basename", "pom")); diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java index 0978b884..fddc5970 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesSupplierTest.java @@ -101,7 +101,7 @@ public void shouldUseFileNameForDataSourceWhenResolvingDirectory() { final DataSource dataSource = dataSources.get(0); assertEquals(1, dataSources.size()); - assertEquals("test.properties", dataSource.getName()); + assertEquals("test.properties", dataSource.getFileName()); assertTrue(dataSource.getUri().getPath().contains("src/test/data/properties/test.properties")); } @@ -130,9 +130,9 @@ public void shouldAllowDuplicateFiles() { @Test public void shouldNormalizeDataSourceNameBasedOnFilePath() { - assertEquals("pom.xml", supplier("pom.xml", "*", NO_EXCLUDE).get().get(0).getName()); - assertEquals("pom.xml", supplier("./pom.xml", "*", NO_EXCLUDE).get().get(0).getName()); - assertEquals("pom.xml", supplier("file:///" + PWD + "/pom.xml", "*", NO_EXCLUDE).get().get(0).getName()); + assertEquals("pom.xml", supplier("pom.xml", "*", NO_EXCLUDE).get().get(0).getFileName()); + assertEquals("pom.xml", supplier("./pom.xml", "*", NO_EXCLUDE).get().get(0).getFileName()); + assertEquals("pom.xml", supplier("file:///" + PWD + "/pom.xml", "*", NO_EXCLUDE).get().get(0).getFileName()); } private static DataSourcesSupplier supplier(String directory, String include, String exclude) { diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java index 5639adf8..6187ff14 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java @@ -53,13 +53,11 @@ public void shouldFindByName() { assertEquals(2, dataSources.find("*.*").size()); assertEquals(1, dataSources.find("*." + ANY_FILE_EXTENSION).size()); + assertEquals(1, dataSources.find("*/*." + ANY_FILE_EXTENSION).size()); assertEquals(1, dataSources.find("*.???").size()); assertEquals(1, dataSources.find("*om*").size()); assertEquals(1, dataSources.find("*o*.xml").size()); - assertEquals(1, dataSources.find(ANY_FILE_NAME).size()); - assertEquals(1, dataSources.find(ANY_FILE_NAME.charAt(0) + "*").size()); - assertEquals(3, dataSources.find("*").size()); } @@ -81,24 +79,29 @@ public void shouldFindByGroupPart() { @Test public void shouldGetDataSource() { - assertNotNull(dataSources().get(ANY_FILE_NAME)); + assertNotNull(dataSources().get("*/" + ANY_FILE_NAME)); } @Test public void shouldGetAllDataSource() { final DataSources dataSources = dataSources(); - assertEquals("unknown", dataSources().get(0).getName()); - assertEquals("pom.xml", dataSources().get(1).getName()); - assertEquals("server.invalid", dataSources().get(2).getName()); + assertEquals("unknown", dataSources.get(0).getFileName()); + assertEquals("pom.xml", dataSources.get(1).getFileName()); + assertEquals("server.invalid?foo=bar", dataSources.get(2).getFileName()); assertEquals(3, dataSources.getList().size()); assertEquals(3, dataSources.size()); assertFalse(dataSources.isEmpty()); } @Test - public void shouldGetNames() { - assertEquals(asList("unknown", "pom.xml", "server.invalid"), dataSources().getNames()); + public void shouldGetParts() { + assertEquals(3, dataSources().getParts("name").size()); + } + + @Test + public void shouldGetFileNamePart() { + assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getParts("filename")); } @Test diff --git a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl index 85f55363..3cbf3101 100644 --- a/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl +++ b/freemarker-generator-cli/examples/data/ftl/nginx/nginx.conf.ftl @@ -1,4 +1,4 @@ -<#assign env = tools.properties.parse(dataSources.get(0))> +<#assign env = tools.properties.parse(dataSources?values[0])> server { listen 80; diff --git a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl index 30ad8540..56d7f218 100644 --- a/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl +++ b/freemarker-generator-cli/examples/templates/accesslog/combined-access.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign lines = dataSource.getLineIterator()> <#compress> diff --git a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl index dde4c7d1..3bf2f680 100644 --- a/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl +++ b/freemarker-generator-cli/examples/templates/csv/csv/gatling-user-credentials.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withDelimiter(';')> <#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> <#assign csvRecords = csvParser.records> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl index c55edab7..9a513ca8 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transactions.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign cvsFormat = tools.csv.formats.DEFAULT.withDelimiter('\t').withHeader()> <#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> diff --git a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl index 1a1fd7bf..7e77af26 100644 --- a/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl +++ b/freemarker-generator-cli/examples/templates/csv/fo/transform.ftl @@ -17,7 +17,7 @@ --> <#assign csvFormatName = CVS_IN_FORMAT!"DEFAULT"> <#assign cvsFormat = tools.csv.formats[csvFormatName].withHeader()> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl index 1d1767fa..ef2dc5c8 100644 --- a/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/csv/html/transactions.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withDelimiter('\t').withHeader()> <#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> diff --git a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl index 6478cec1..49beb57b 100644 --- a/freemarker-generator-cli/examples/templates/csv/md/filter.ftl +++ b/freemarker-generator-cli/examples/templates/csv/md/filter.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> <#assign column = tools.system.getParameter("column")> diff --git a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl index 8ffe9efb..aaae7a60 100644 --- a/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl +++ b/freemarker-generator-cli/examples/templates/csv/shell/curl.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign records = csvParser.records> <#assign csvMap = tools.csv.toMap(records, "disposer")> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/dataframe/example.ftl b/freemarker-generator-cli/examples/templates/dataframe/example.ftl index 88973139..da260045 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/example.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/example.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign csvParser = tools.csv.parse(dataSource, tools.csv.formats["DATAFRAME"])> <#assign users = tools.dataframe.fromCSVParser(csvParser)> diff --git a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl index 65ce11cd..e542b1ca 100644 --- a/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl +++ b/freemarker-generator-cli/examples/templates/dataframe/html/print.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader().withDelimiter(';')> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign dataFrame = tools.dataframe.toDataFrame(csvParser)> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 3de21268..428d28fe 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -48,7 +48,7 @@ java.math.RoundingMode#UP: ${tools.freemarker.enums["java.math.RoundingMode"].UP 6) Display list of data sources --------------------------------------------------------------------------- List all data sources: -<#list dataSources.list as dataSource> +<#list dataSources?values as dataSource> - Document: name=${dataSource.name} uri=${dataSource.uri} length=${dataSource.length} charset=${dataSource.charset} @@ -86,22 +86,14 @@ user.home : ${tools.system.systemProperties["user.home"]!""} 11) Access DataSources --------------------------------------------------------------------------- Get the number of documents: -- ${dataSources.size()} -<#if !dataSources.isEmpty()> +- ${dataSources?size} +<#if dataSources?has_content> Get the first document -- ${dataSources.get(0)!"NA"} +- ${dataSources?values[0]!"NA"} -List all files containing "README" in the name -<#list dataSources.find("*README*") as dataSource> -- ${dataSource.name} - -List all files having "md" extension -<#list dataSources.find("*.md") as dataSource> -- ${dataSource.name} - Get all documents -<#list dataSources.list as dataSource> -- ${dataSource.name} => ${dataSource.uri} +<#list dataSources as name, ds> +- ${name} => ${ds.uri} 12) Document Data Model diff --git a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl index 8527e75e..feda79a0 100644 --- a/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl +++ b/freemarker-generator-cli/examples/templates/excel/csv/custom.ftl @@ -18,7 +18,7 @@ <#assign format = CSV_TARGET_FORMAT!"DEFAULT"> <#assign salt = tools.system.parameters["salt"]!"salt"> <#-- Parse the first data source & sheet of the Excel document --> -<#assign workbook = tools.excel.parse(dataSources.get(0))> +<#assign workbook = tools.excel.parse(dataSources?values[0])> <#assign sheet = tools.excel.getSheets(workbook)[0]> <#assign records = tools.excel.toTable(sheet)> <#-- Setup CSVPrinter --> diff --git a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl index 0b97237d..5b24903b 100644 --- a/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl +++ b/freemarker-generator-cli/examples/templates/excel/dataframe/transform.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign workbook = tools.excel.parse(dataSource)> <#list tools.excel.getSheets(workbook) as sheet> <#assign table = tools.excel.toTable(sheet)> diff --git a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl index fc97bac0..51fe17ee 100644 --- a/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl +++ b/freemarker-generator-cli/examples/templates/html/csv/dependencies.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign html = tools.jsoup.parse(dataSource)> diff --git a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl index 635085a8..474fd5a6 100644 --- a/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl +++ b/freemarker-generator-cli/examples/templates/json/csv/swagger-endpoints.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = tools.gson.parse(dataSources.get(0))> +<#assign map = tools.gson.parse(dataSources?values[0])> <#assign basePath = map.basePath!"/"> <#assign paths = map.paths!{}> diff --git a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl index db18c9fd..480f59af 100644 --- a/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/dataframe/github-users.ftl @@ -15,6 +15,6 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = tools.gson.parse(dataSources.get(0))> +<#assign json = tools.gson.parse(dataSources?values[0])> <#assign dataframe = tools.dataframe.fromMaps(json)> ${tools.dataframe.print(dataframe)} diff --git a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl index 48f155d4..a83d07b4 100644 --- a/freemarker-generator-cli/examples/templates/json/md/github-users.ftl +++ b/freemarker-generator-cli/examples/templates/json/md/github-users.ftl @@ -15,7 +15,7 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<#assign json = tools.jsonpath.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources?values[0])> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users diff --git a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl index c832283a..1d2d21f0 100644 --- a/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl +++ b/freemarker-generator-cli/examples/templates/properties/csv/locker-test-users.ftl @@ -17,7 +17,7 @@ --> <#compress> TENANT,SITE,USER_ID,DISPOSER_ID,PASSWORD,SMS_OTP,NAME,DESCRIPTION - <#list dataSources.list as dataSource> + <#list dataSources?values as dataSource> <#assign properties = tools.properties.parse(dataSource)> <#assign environments = properties["ENVIRONMENTS"]!""> <#assign tenant = extractTenant(environments)> diff --git a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl index 1962ce75..51c2be48 100644 --- a/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl +++ b/freemarker-generator-cli/examples/templates/tsv/fo/transactions.ftl @@ -16,7 +16,7 @@ under the License. --> <#assign cvsFormat = tools.csv.formats["TDF"].withHeader()> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl index 33f7b5b0..b67e8e7c 100644 --- a/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl +++ b/freemarker-generator-cli/examples/templates/xml/txt/recipients.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign xml = tools.xml.parse(dataSources.get(0))> +<#assign xml = tools.xml.parse(dataSources?values[0])> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} diff --git a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl index 6a183ef1..ebcf5250 100644 --- a/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl +++ b/freemarker-generator-cli/examples/templates/yaml/txt/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign map = tools.yaml.parse(dataSources.get(0))> +<#assign map = tools.yaml.parse(dataSources?values[0])> <#---------------------------------------------------------------------------> <#compress> <@print map 1/> diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java index c7d4ea73..bf77a693 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java @@ -19,6 +19,7 @@ import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; import freemarker.template.Version; +import org.apache.freemarker.generator.cli.model.GeneratorObjectWrapper; import java.util.Properties; import java.util.function.Supplier; @@ -58,6 +59,9 @@ public Configuration get() { // apply all "freemarker.configuration.setting" values configuration.setSettings(freeMarkerConfigurationSettings()); + // provide custom models for "DataSources" + configuration.setObjectWrapper(new GeneratorObjectWrapper(FREEMARKER_VERSION)); + // override current configuration with caller-provided settings configuration.setDefaultEncoding(settings.getTemplateEncoding().name()); configuration.setLocale(settings.getLocale()); diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java index ec50c228..509f917b 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java @@ -1,16 +1,11 @@ package org.apache.freemarker.generator.cli.model; -import freemarker.ext.beans.ArrayModel; import freemarker.ext.beans.BeanModel; import freemarker.ext.beans.BeansWrapper; -import freemarker.template.TemplateCollectionModel; -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.TemplateSequenceModel; +import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSources; -import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; import static java.util.Objects.requireNonNull; @@ -19,39 +14,30 @@ * Wraps an instance of DataSources into a more user-friendly BeanModel * so the user can use FreeMarker directives and features instead of using the exposed methods. */ -public class DataSourcesModel extends BeanModel implements TemplateSequenceModel, TemplateHashModel { - - private final DataSources dataSources; - private final BeansWrapper objectWrapper; +public class DataSourcesModel extends BeanModel { public DataSourcesModel(DataSources dataSources, BeansWrapper objectWrapper) { - super(requireNonNull(dataSources), requireNonNull(objectWrapper)); - this.dataSources = dataSources; - this.objectWrapper = objectWrapper; + super(new SimpleDataSourcesAdapter(dataSources), requireNonNull(objectWrapper)); } - @Override - public TemplateModel get(int index) throws TemplateModelException { - return wrap(dataSources.get(index)); - } + private static final class SimpleDataSourcesAdapter { - @Override - public TemplateCollectionModel keys() { - return new ArrayModel(dataSources.getNames().toArray(), objectWrapper); - } + private final DataSources dataSources; - @Override - public int size() { - return dataSources.size(); - } + public SimpleDataSourcesAdapter(DataSources dataSources) { + this.dataSources = dataSources; + } - @Override - public boolean isEmpty() { - return dataSources.isEmpty(); - } + public DataSource get(int index) { + return dataSources.get(index); + } + + public DataSource get(String name) { + return dataSources.get(name); + } - @Override - protected Set keySet() { - return new LinkedHashSet<>(dataSources.getNames()); + public int size() { + return dataSources.size(); + } } } diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java index 32af3ca4..db9d26fe 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java @@ -1,5 +1,6 @@ package org.apache.freemarker.generator.cli.model; +import freemarker.template.DefaultMapAdapter; import freemarker.template.DefaultObjectWrapper; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; @@ -15,7 +16,7 @@ public GeneratorObjectWrapper(Version incompatibleImprovements) { @Override protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException { if (obj instanceof DataSources) { - return new DataSourcesModel((DataSources) obj, this); + return DefaultMapAdapter.adapt(((DataSources) obj).getMap(), this); } return super.handleUnknownType(obj); diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md index 4144fcb9..184964e6 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md @@ -96,7 +96,7 @@ exposed in the data model provides A few FTL examples ``` -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign dataSource = dataSources["user.csv"]> diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md index 0d6e692d..ec19b064 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/running-examples.md @@ -92,7 +92,7 @@ Below you see the Apache FreeMarker Template ```text <#ftl output_format="plainText" > -<#assign json = tools.jsonpath.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources?values[0])> <#assign users = json.read("$[*]")> <#---------------------------------------------------------------------------> # GitHub Users @@ -130,7 +130,7 @@ The FreeMarker template is shown below ```text <#ftl output_format="plainText"> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign csvHeaders = csvParser.getHeaderMap()?keys> <#assign csvRecords = csvParser.records> <#---------------------------------------------------------------------------> @@ -167,7 +167,7 @@ using the following template ```text <#ftl output_format="plainText" > -<#assign xml = tools.xml.parse(dataSources.get(0))> +<#assign xml = tools.xml.parse(dataSources?values[0])> <#list xml.recipients.person as recipient> To: ${recipient.name} ${recipient.address} @@ -214,7 +214,7 @@ One day I was asked a to prepare a CSV files containing REST endpoints described ```text <#ftl output_format="plainText" strip_text="true"> -<#assign json = tools.jsonpath.parse(dataSources.get(0))> +<#assign json = tools.jsonpath.parse(dataSources?values[0])> <#assign basePath = json.read("$.basePath")> <#assign paths = json.read("$.paths")> @@ -276,7 +276,7 @@ The provided FTL transforms an Excel into a HTML document supporting multiple Ex ```text <#ftl output_format="HTML" > -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> @@ -402,7 +402,7 @@ For a POC (proof of concept) I created a sample transformation from CSV to XML-F ```text <#ftl output_format="XML" > -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign cvsFormat = tools.csv.formats.DEFAULT.withDelimiter('\t').withHeader()> <#assign csvParser = tools.csv.parse(dataSource, cvsFormat)> @@ -523,7 +523,7 @@ Recently I got the rather unusual question how to determine the list of dependen ```text <#ftl output_format="plainText" strip_text="true"> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign html = tools.jsoup.parse(dataSource)> <#compress> @@ -598,7 +598,7 @@ and the final FTL is found below ```text <#ftl output_format="plainText"> <#assign cvsFormat = tools.csv.formats["DEFAULT"].withHeader()> -<#assign csvParser = tools.csv.parse(dataSources.get(0), cvsFormat)> +<#assign csvParser = tools.csv.parse(dataSources?values[0], cvsFormat)> <#assign records = csvParser.records> <#assign csvMap = tools.csv.toMap(records, "disposer")> <#---------------------------------------------------------------------------> @@ -682,7 +682,7 @@ using the following FreeMarker template ```text <#ftl output_format="plainText" strip_whitespace=true> <#assign grok = tools.grok.compile("%{COMBINEDAPACHELOG}")> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign lines = dataSource.getLineIterator()> <#compress> @@ -768,16 +768,16 @@ Sometime you need to apply a CSS, JSON or XPath query in ad ad-hoc way without i > bin/freemarker-cli -i 'Hello ${tools.system.envs["USER"]}'; echo Hello sgoeschl -> bin/freemarker-cli -i '${tools.jsonpath.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json; echo +> bin/freemarker-cli -i '${tools.jsonpath.parse(dataSources?values[0]).read("$.info.title")}' examples/data/json/swagger-spec.json; echo Swagger Petstore -> bin/freemarker-cli -i 'Post Title : ${tools.jsonpath.parse(dataSources.get(0)).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo +> bin/freemarker-cli -i 'Post Title : ${tools.jsonpath.parse(dataSources?values[0]).read("$.title")}' https://jsonplaceholder.typicode.com/posts/2; echo Post Title : qui est esse -> bin/freemarker-cli -i '${tools.xml.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo +> bin/freemarker-cli -i '${tools.xml.parse(dataSources?values[0])["recipients/person[1]/name"]}' examples/data/xml/recipients.xml; echo John Smith -> bin/freemarker-cli -i '${tools.jsoup.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html; echo +> bin/freemarker-cli -i '${tools.jsoup.parse(dataSources?values[0]).select("a")[0]}' examples/data/html/dependencies.html; echo FreeMarker CLI > freemarker-cli -i '<#list tools.system.envs as name,value>${name} ==> ${value}${"\n"}' @@ -804,7 +804,7 @@ and Apache FreeMarker template ```text <#ftl output_format="plainText" strip_text="true"> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign parser = parser(dataSource)> <#assign headers = parser.getHeaderNames()> <#assign column = tools.system.getParameter("column")> @@ -890,11 +890,11 @@ Sometimes we simply need to transform a JSON into an equivalent YAML or the othe ``` > freemarker-cli -t templates/yaml/json/transform.ftl examples/data/yaml/swagger-spec.yaml -> freemarker-cli -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml +> freemarker-cli -i '${tools.gson.toJson(tools.yaml.parse(dataSources?values[0]))}' examples/data/yaml/swagger-spec.yaml > freemarker-cli -i '${tools.gson.toJson(yaml)}' -m yaml=examples/data/yaml/swagger-spec.yaml > freemarker-cli -t templates/json/yaml/transform.ftl examples/data/json/swagger-spec.json -> freemarker-cli -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json +> freemarker-cli -i '${tools.yaml.toYaml(tools.gson.parse(dataSources?values[0]))}' examples/data/json/swagger-spec.json > freemarker-cli -i '${tools.yaml.toYaml(json)}' -m json=examples/data/json/swagger-spec.json ``` diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md index 0048f41f..ff198787 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/using-dataframes.md @@ -30,7 +30,7 @@ Meier;30;Germany and create a `DateFrame` using the following code snippet ``` -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign csvParser = tools.csv.parse(dataSource, tools.csv.formats["DATAFRAME"])> <#assign users = tools.dataframe.fromCSVParser(csvParser)> ``` @@ -156,7 +156,7 @@ it is a list of maps hence we invoke `tools.dataframe.fromMaps() ``` freemarker-cli \ - -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' \ + -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources?values[0])))}' \ examples/data/json/github-users.json ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐ @@ -183,7 +183,7 @@ freemarker-cli \ Let's transform an Excel Sheet to a `DataFrame` being printed using the following template ``` -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign workbook = tools.excel.parse(dataSource)> <#list tools.excel.getSheets(workbook) as sheet> <#assign table = tools.excel.toTable(sheet)> diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index c8d4eed4..04230356 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -111,14 +111,14 @@ public void shouldRunDataFrameExamples() throws IOException { @Test public void shouldRunInteractiveTemplateExamples() throws IOException { - assertValid(execute("-i ${tools.jsonpath.parse(dataSources.get(0)).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${tools.xml.parse(dataSources.get(0))[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); - assertValid(execute("-i ${tools.jsoup.parse(dataSources.get(0)).select(\"a\")[0]} examples/data/html/dependencies.html")); - assertValid(execute("-i ${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))} examples/data/yaml/swagger-spec.yaml")); + assertValid(execute("-i ${tools.jsonpath.parse(dataSources?values[0]).read(\"$.info.title\")} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${tools.xml.parse(dataSources?values[0])[\"recipients/person[1]/name\"]} examples/data/xml/recipients.xml")); + assertValid(execute("-i ${tools.jsoup.parse(dataSources?values[0]).select(\"a\")[0]} examples/data/html/dependencies.html")); + assertValid(execute("-i ${tools.gson.toJson(tools.yaml.parse(dataSources?values[0]))} examples/data/yaml/swagger-spec.yaml")); assertValid(execute("-i ${tools.gson.toJson(yaml)} -m yaml=examples/data/yaml/swagger-spec.yaml")); - assertValid(execute("-i ${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))} examples/data/json/swagger-spec.json")); + assertValid(execute("-i ${tools.yaml.toYaml(tools.gson.parse(dataSources?values[0]))} examples/data/json/swagger-spec.json")); assertValid(execute("-i ${tools.yaml.toYaml(json)} -m json=examples/data/json/swagger-spec.json")); - assertValid(execute("-i ${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))} examples/data/json/github-users.json")); + assertValid(execute("-i ${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources?values[0])))} examples/data/json/github-users.json")); } @Test @@ -139,31 +139,19 @@ public void shouldTransformMultipleTemplates() throws IOException { assertValid(execute("-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl -o target/contract.html examples/data/csv/contract.csv")); } - /** @Test public void shouldSupportDataSourcesAccessInFTL() throws IOException { - final String args = "examples/data/json/github-users.json examples/data/csv/contract.csv"; + final String args = "users=examples/data/json/github-users.json contract=examples/data/csv/contract.csv"; // check FreeMarker directives - assertEquals("true", execute(args + " -i ${DataSources?has_content?c}")); - assertEquals("2", execute(args + " -i ${DataSources?size}")); - - // check FTL array-style access - assertEquals("github-users.json", execute(args + " -i ${DataSources[0].name}")); - assertEquals("github-users.json", execute(args + " -i ${dataSources.get(0).name}")); + assertEquals("true", execute(args + " -i ${dataSources?has_content?c}")); + assertEquals("2", execute(args + " -i ${dataSources?size}")); // check FTL map-style access - assertEquals("github-users.json", execute(args + " -i ${DataSources[\"github-users.json\"].name}")); - assertEquals("github-users.json", execute(args + " -i ${dataSources.get(\"github-users.json\").name}")); - - // check arbitrary methods - assertEquals("false", execute(args + " -i ${dataSources.empty?c}")); - assertEquals("false", execute(args + " -i ${dataSources.isEmpty()?c}")); - assertEquals("2", execute(args + " -i ${dataSources.size()}")); - assertEquals("worx", execute(args + " -i ${dataSources.close()}worx")); - assertEquals("text/csv", execute(args + " -i ${DataSources[1].contentType}")); + assertEquals("users", execute(args + " -i ${dataSources.users.name}")); + assertEquals("users", execute(args + " -i ${dataSources[\"users\"].name}")); + assertEquals("application/json", execute(args + " -i ${dataSources[\"users\"].mimeType}")); } - */ /** @Test diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index 774c4c55..e08f4646 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -29,7 +29,7 @@ public class ManualTest { // private static final String CMD = "-PCSV_SOURCE_WITH_HEADER=false -PCSV_SOURCE_FORMAT=DEFAULT -PCSV_TARGET_FORMAT=EXCEL -PCSV_TARGET_WITH_HEADER=true -t templates/csv/csv/transform.ftl examples/data/csv/contract.csv"; // private static final String CMD = "-t examples/templates/json/dataframe/github-users.ftl examples/data/json/github-users.json"; // private static final String CMD = "-t templates/csv/md/transform.ftl -o target/contract.md -t templates/csv/html/transform.ftl examples/data/csv/contract.csv"; - private static final String CMD = "-t examples/templates/demo.ftl examples/data/json/github-users.json examples/data/csv/contract.csv foo:bar=examples/data/csv/contract.csv"; + private static final String CMD = "-t templates/info.ftl examples/data/csv/contract.csv -s examples/data/json --data-source-include=*.csv"; public static void main(String[] args) { diff --git a/freemarker-generator-cli/src/test/templates/manual.ftl b/freemarker-generator-cli/src/test/templates/manual.ftl index 3da78976..128274e4 100644 --- a/freemarker-generator-cli/src/test/templates/manual.ftl +++ b/freemarker-generator-cli/src/test/templates/manual.ftl @@ -55,7 +55,7 @@ Find DataSources By Wildcard Java Array-style access --------------------------------------------------------------------------- -${dataSources.get(0).toString()} +${dataSources?values[0].toString()} Invoke Arbitrary Methods On DataSources --------------------------------------------------------------------------- diff --git a/freemarker-generator-cli/src/test/templates/tools/csv.ftl b/freemarker-generator-cli/src/test/templates/tools/csv.ftl index 50a76766..25dfb3b4 100644 --- a/freemarker-generator-cli/src/test/templates/tools/csv.ftl +++ b/freemarker-generator-cli/src/test/templates/tools/csv.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign records = tools.csv.parse(dataSources.get(0), CSVFormat.DEFAULT.withHeader()).records> +<#assign records = tools.csv.parse(dataSources?values[0], CSVFormat.DEFAULT.withHeader()).records> tools.csv.toMap(name) ============================================================================= diff --git a/freemarker-generator-cli/templates/cat.ftl b/freemarker-generator-cli/templates/cat.ftl index 0ca2ef4e..cdbe0fa2 100644 --- a/freemarker-generator-cli/templates/cat.ftl +++ b/freemarker-generator-cli/templates/cat.ftl @@ -14,7 +14,7 @@ specific language governing permissions and limitations under the License. --> -<#list dataSources.list as dataSource> +<#list dataSources?values as dataSource> <#list dataSource.lineIterator as line> ${line} diff --git a/freemarker-generator-cli/templates/csv/csv/transform.ftl b/freemarker-generator-cli/templates/csv/csv/transform.ftl index ca43ad5e..b02082d0 100644 --- a/freemarker-generator-cli/templates/csv/csv/transform.ftl +++ b/freemarker-generator-cli/templates/csv/csv/transform.ftl @@ -16,7 +16,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign csvTargetFormat = csv.targetFormat()> <#assign csvPrinter = tools.csv.printer(csvTargetFormat)> diff --git a/freemarker-generator-cli/templates/csv/html/transform.ftl b/freemarker-generator-cli/templates/csv/html/transform.ftl index 5053bd42..7c52f73f 100644 --- a/freemarker-generator-cli/templates/csv/html/transform.ftl +++ b/freemarker-generator-cli/templates/csv/html/transform.ftl @@ -16,7 +16,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign csvHeaders = csvParser.getHeaderNames()> <#---------------------------------------------------------------------------> diff --git a/freemarker-generator-cli/templates/csv/md/transform.ftl b/freemarker-generator-cli/templates/csv/md/transform.ftl index a3c7fe37..ec50a988 100644 --- a/freemarker-generator-cli/templates/csv/md/transform.ftl +++ b/freemarker-generator-cli/templates/csv/md/transform.ftl @@ -15,7 +15,7 @@ under the License. --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign csvParser = tools.csv.parse(dataSource, csv.sourceFormat())> <#assign headers = (csvParser.getHeaderMap()!{})?keys> <#assign records = csvParser.records> diff --git a/freemarker-generator-cli/templates/excel/csv/transform.ftl b/freemarker-generator-cli/templates/excel/csv/transform.ftl index 686e21ce..0138bf5a 100644 --- a/freemarker-generator-cli/templates/excel/csv/transform.ftl +++ b/freemarker-generator-cli/templates/excel/csv/transform.ftl @@ -17,7 +17,7 @@ --> <#-- Parse the first data source & sheet of the Excel document --> <#import "/templates/lib/commons-csv.ftl" as csv /> -<#assign workbook = tools.excel.parse(dataSources.get(0))> +<#assign workbook = tools.excel.parse(dataSources?values[0])> <#assign sheet = tools.excel.getSheets(workbook)[0]> <#assign records = tools.excel.toTable(sheet)> <#-- Setup CSVPrinter --> diff --git a/freemarker-generator-cli/templates/excel/html/transform.ftl b/freemarker-generator-cli/templates/excel/html/transform.ftl index 9625e7dc..75647519 100644 --- a/freemarker-generator-cli/templates/excel/html/transform.ftl +++ b/freemarker-generator-cli/templates/excel/html/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> diff --git a/freemarker-generator-cli/templates/excel/md/transform.ftl b/freemarker-generator-cli/templates/excel/md/transform.ftl index 8878df73..e3fb9707 100644 --- a/freemarker-generator-cli/templates/excel/md/transform.ftl +++ b/freemarker-generator-cli/templates/excel/md/transform.ftl @@ -15,7 +15,7 @@ specific language governing permissions and limitations under the License. --> -<#assign dataSource = dataSources.get(0)> +<#assign dataSource = dataSources?values[0]> <#assign name = dataSource.name> <#assign workbook = tools.excel.parse(dataSource)> <#assign date = .now?iso_utc> diff --git a/freemarker-generator-cli/templates/info.ftl b/freemarker-generator-cli/templates/info.ftl index 703b1763..10b692c0 100644 --- a/freemarker-generator-cli/templates/info.ftl +++ b/freemarker-generator-cli/templates/info.ftl @@ -43,11 +43,11 @@ FreeMarker CLI Tools - ${name?right_pad(20)} : ${tools[name]} -<#if dataSources.list?has_content> +<#if dataSources?has_content> FreeMarker CLI DataSources ------------------------------------------------------------------------------ -<#list dataSources.list as ds> -[#${ds?counter}]: name=${ds.name}, group=${ds.group}, mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes +<#list dataSources?values as ds> +[#${ds?counter}]: name=${ds.name}, group=${ds.group}, fileName=${ds.fileName} mimeType=${ds.mimeType}, charset=${ds.charset}, length=${ds.length} Bytes URI : ${ds.uri} diff --git a/freemarker-generator-cli/templates/json/yaml/transform.ftl b/freemarker-generator-cli/templates/json/yaml/transform.ftl index 0b8ee1b7..6e489456 100644 --- a/freemarker-generator-cli/templates/json/yaml/transform.ftl +++ b/freemarker-generator-cli/templates/json/yaml/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))} \ No newline at end of file +${tools.yaml.toYaml(tools.gson.parse(dataSources?values[0]))} \ No newline at end of file diff --git a/freemarker-generator-cli/templates/yaml/json/transform.ftl b/freemarker-generator-cli/templates/yaml/json/transform.ftl index 05d1f963..81a704a9 100644 --- a/freemarker-generator-cli/templates/yaml/json/transform.ftl +++ b/freemarker-generator-cli/templates/yaml/json/transform.ftl @@ -14,4 +14,4 @@ specific language governing permissions and limitations under the License. --> -${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))} \ No newline at end of file +${tools.gson.toJson(tools.yaml.parse(dataSources?values[0]))} \ No newline at end of file From f2ce808e25a8efa47488b8374664ec6f9fa30b3d Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 9 Jul 2020 14:11:21 +0200 Subject: [PATCH 17/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- freemarker-generator-cli/run-examples.bat | 12 ++++++------ freemarker-generator-cli/run-examples.sh | 12 ++++++------ .../cli/config/ConfigurationSupplierTest.java | 2 +- freemarker-generator-cli/src/test/templates/echo.ftl | 6 +++--- travis.sh | 2 +- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/freemarker-generator-cli/run-examples.bat b/freemarker-generator-cli/run-examples.bat index e7d9e85c..95bbfd9b 100644 --- a/freemarker-generator-cli/run-examples.bat +++ b/freemarker-generator-cli/run-examples.bat @@ -41,12 +41,12 @@ REM ========================================================================= REM Interactive Mode REM ========================================================================= -%FREEMARKER_CMD% -i '${tools.jsonpath.parse(dataSources.get(0)).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt -%FREEMARKER_CMD% -i '${tools.xml.parse(dataSources.get(0))["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt -%FREEMARKER_CMD% -i '${tools.jsoup.parse(dataSources.get(0)).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt -%FREEMARKER_CMD% -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json -%FREEMARKER_CMD% -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml -%FREEMARKER_CMD% -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt +%FREEMARKER_CMD% -i '${tools.jsonpath.parse(dataSources?values[0]).read("""$.info.title""")}' examples\data\json\swagger-spec.json > target\out\interactive-json.txt +%FREEMARKER_CMD% -i '${tools.xml.parse(dataSources?values[0])["""recipients/person[1]/name"""]}' examples\data\xml\recipients.xml > target\out\interactive-xml.txt +%FREEMARKER_CMD% -i '${tools.jsoup.parse(dataSources?values[0]).select("""a""")[0]}' examples\data\html\dependencies.html > target\out\interactive-html.txt +%FREEMARKER_CMD% -i '${tools.gson.toJson(tools.yaml.parse(dataSources?values[0]))}' examples\data\yaml\swagger-spec.yaml > target\out\interactive-swagger.json +%FREEMARKER_CMD% -i '${tools.yaml.toYaml(tools.gson.parse(dataSources?values[0]))}' examples\data\json\swagger-spec.json > target\out\interactive-swagger.yaml +%FREEMARKER_CMD% -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources?values[0])))}' examples\data\json\github-users.json > target\out\interactive-dataframe.txt REM ========================================================================= REM CSV diff --git a/freemarker-generator-cli/run-examples.sh b/freemarker-generator-cli/run-examples.sh index 959ad18f..719c1998 100755 --- a/freemarker-generator-cli/run-examples.sh +++ b/freemarker-generator-cli/run-examples.sh @@ -46,12 +46,12 @@ $FREEMARKER_CMD -t examples/templates/demo.ftl README.md > target/out/demo.txt | # Interactive Mode ############################################################################# -$FREEMARKER_CMD -i '${tools.jsonpath.parse(dataSources.get(0)).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${tools.xml.parse(dataSources.get(0))["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${tools.jsoup.parse(dataSources.get(0)).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${tools.gson.toJson(tools.yaml.parse(dataSources.get(0)))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${tools.yaml.toYaml(tools.gson.parse(dataSources.get(0)))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } -$FREEMARKER_CMD -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources.get(0))))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsonpath.parse(dataSources?values[0]).read("$.info.title")}' examples/data/json/swagger-spec.json > target/out/interactive-json.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.xml.parse(dataSources?values[0])["recipients/person[1]/name"]}' examples/data/xml/recipients.xml > target/out/interactive-xml.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.jsoup.parse(dataSources?values[0]).select("a")[0]}' examples/data/html/dependencies.html > target/out/interactive-html.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.gson.toJson(tools.yaml.parse(dataSources?values[0]))}' examples/data/yaml/swagger-spec.yaml > target/out/interactive-swagger.json || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.yaml.toYaml(tools.gson.parse(dataSources?values[0]))}' examples/data/json/swagger-spec.json > target/out/interactive-swagger.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -i '${tools.dataframe.print(tools.dataframe.fromMaps(tools.gson.parse(dataSources?values[0])))}' examples/data/json/github-users.json > target/out/interactive-dataframe.txt || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # CSV diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java index baae4516..93ddfa2f 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java @@ -43,7 +43,7 @@ public void shouldProvideDefaultConfiguration() { assertTrue(configuration.isOutputEncodingSet()); assertFalse(configuration.isCacheStorageExplicitlySet()); - assertFalse(configuration.isObjectWrapperExplicitlySet()); + assertTrue(configuration.isObjectWrapperExplicitlySet()); assertFalse(configuration.isOutputFormatExplicitlySet()); assertFalse(configuration.isTemplateExceptionHandlerExplicitlySet()); assertFalse(configuration.isTimeZoneExplicitlySet()); diff --git a/freemarker-generator-cli/src/test/templates/echo.ftl b/freemarker-generator-cli/src/test/templates/echo.ftl index 014fe1fe..38627f4d 100644 --- a/freemarker-generator-cli/src/test/templates/echo.ftl +++ b/freemarker-generator-cli/src/test/templates/echo.ftl @@ -15,8 +15,8 @@ specific language governing permissions and limitations under the License. --> -<#list dataSources.list as dataSource> -${dataSource.name}, ${dataSource.uri} +<#list dataSources?values as ds> +${ds.name}, ${ds.uri} ============================================================================= -${dataSource.text} +${ds.text} \ No newline at end of file diff --git a/travis.sh b/travis.sh index 42dbf88d..cba6671e 100755 --- a/travis.sh +++ b/travis.sh @@ -22,4 +22,4 @@ cd ./freemarker-generator-cli sh ./run-examples.sh cd ../freemarker-generator-maven-plugin-sample mvn clean package -cd .. \ No newline at end of file +cd .. From 17760b3619b2a82e74463d14c2571c6c92dfbd3b Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 9 Jul 2020 14:15:27 +0200 Subject: [PATCH 18/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/util/MapFlattener.java | 2 +- .../generator/cli/config/ToolsSupplier.java | 1 - .../generator/cli/model/DataSourcesModel.java | 3 --- .../cli/usage/transforming-directories.md | 2 +- .../generator/cli/ExamplesTest.java | 27 +++++++++---------- .../src/site/markdown/index.md | 4 +-- .../tools/dataframe/DataFrameTool.java | 1 + .../tools/dataframe/impl/ListConverter.java | 2 +- 8 files changed, 19 insertions(+), 23 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java index 80f5dd3b..c1ad75a4 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/MapFlattener.java @@ -108,7 +108,7 @@ private static void doFlatten(String propertyPrefix, } } - @SuppressWarnings("unchecked") + @SuppressWarnings({ "rawtypes", "unchecked" }) private static void flattenElement(String propertyPrefix, Object source, Map resultMap, Function valueTransformer) { diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java index d64ae795..34efb5f8 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ToolsSupplier.java @@ -20,7 +20,6 @@ import org.apache.freemarker.generator.base.tools.ToolsFactory; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import java.util.function.Supplier; diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java index 509f917b..45fa4797 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/DataSourcesModel.java @@ -5,9 +5,6 @@ import org.apache.freemarker.generator.base.datasource.DataSource; import org.apache.freemarker.generator.base.datasource.DataSources; -import java.util.Map; -import java.util.Set; - import static java.util.Objects.requireNonNull; /** diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md index 7f9b4754..073a7e9e 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-directories.md @@ -214,4 +214,4 @@ server { } ``` -Please note that this only works for "top-level" variables, i.e. mimicking enviroment variables or property files. \ No newline at end of file +Please note that this only works for "top-level" variables, i.e. mimicking environment variables or property files. \ No newline at end of file diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 04230356..3548b787 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -154,20 +154,19 @@ public void shouldSupportDataSourcesAccessInFTL() throws IOException { } /** - @Test - public void shouldNotShadowDataSourcesInFTL() throws IOException { - final String args = "empty=examples/data/json/github-users.json"; - - // check shadowing of "isEmpty" - assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${dataSources.empty?c}")); - // DataSources#isEmpty shadows the data source "empty" - // assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources[\"empty\"]}")); - assertEquals("empty", execute("empty=examples/data/json/github-users.json -i ${dataSources.get(\"empty\").name}")); - - // check shadowing of "find" - // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${dataSources.find.name}")); - // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources[\"find\"].name}")); - } + * @Test public void shouldNotShadowDataSourcesInFTL() throws IOException { + * final String args = "empty=examples/data/json/github-users.json"; + *

    + * // check shadowing of "isEmpty" + * assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${dataSources.empty?c}")); + * // DataSources#isEmpty shadows the data source "empty" + * // assertEquals("false", execute("empty=examples/data/json/github-users.json -i ${DataSources[\"empty\"]}")); + * assertEquals("empty", execute("empty=examples/data/json/github-users.json -i ${dataSources.get(\"empty\").name}")); + *

    + * // check shadowing of "find" + * // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${dataSources.find.name}")); + * // assertEquals("find", execute("find=examples/data/json/github-users.json -i ${DataSources[\"find\"].name}")); + * } */ @Test diff --git a/freemarker-generator-maven-plugin/src/site/markdown/index.md b/freemarker-generator-maven-plugin/src/site/markdown/index.md index ca8308fa..f79b2735 100644 --- a/freemarker-generator-maven-plugin/src/site/markdown/index.md +++ b/freemarker-generator-maven-plugin/src/site/markdown/index.md @@ -40,9 +40,9 @@ Add the following snippet within the `` tag of your pom.xml: src/main/freemarker/generator - + src/main/freemarker/generator/template - + src/main/freemarker/generator/generator target/generated-sources/freemarker/generator diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java index 640d798c..46b22204 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java @@ -99,6 +99,7 @@ public Map getSortOrder() { * * @return available transformers */ + @SuppressWarnings("rawtypes") public Map getTransformer() { final Map result = new HashMap<>(); result.put("COUNT", countTransformer(false)); diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/impl/ListConverter.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/impl/ListConverter.java index 4f83d047..bb9cfe00 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/impl/ListConverter.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/impl/ListConverter.java @@ -27,7 +27,7 @@ public class ListConverter { * Create a data frame from a list of rows. It is assumed * that the rows represent tabular data. * - * @param rows rows to build the data frame + * @param rows rows to build the data frame * @param withFirstRowAsColumnNames column names as first row? * @return DataFrame */ From 08310f26dfd9f6526a1f97a253015d8984f2d541 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Thu, 9 Jul 2020 16:11:02 +0200 Subject: [PATCH 19/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 6 +++-- .../base/datasource/DataSourceFactory.java | 14 +++++----- .../base/datasource/DataSources.java | 12 ++++----- .../base/uri/NamedUriStringParser.java | 4 +-- .../generator/base/util/StringUtils.java | 13 ++++++++-- .../generator/base/util/UriUtils.java | 25 ++++++++++-------- .../generator/datasource/DataSourcesTest.java | 4 +-- .../examples/templates/demo.ftl | 26 +++++++++++++++---- .../generator/cli/task/FreeMarkerTask.java | 2 +- .../freemarker/generator/cli/ManualTest.java | 2 +- 10 files changed, 69 insertions(+), 39 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 d83d35c6..70f951ba 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 @@ -269,7 +269,7 @@ public byte[] getBytes() { * @param name name part name * @return value */ - public String getPart(String name) { + public String getMetadata(String name) { Validate.notEmpty(name, "No part name provided"); switch (name.toLowerCase()) { case "basename": @@ -288,6 +288,8 @@ public String getPart(String name) { return getName(); case "path": return uri.getPath(); + case "parent": + return StringUtils.getParentPart(getName(), "/"); case "scheme": return uri.getScheme(); case "uri": @@ -306,7 +308,7 @@ public String getPart(String name) { * @see Apache Commons IO */ public boolean match(String part, String wildcard) { - final String value = getPart(part); + final String value = getMetadata(part); return FilenameUtils.wildcardMatch(value, wildcard); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index e654b451..d8d5702f 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -75,7 +75,7 @@ public static DataSource fromNamedUri(NamedUri namedUri) { final Charset charset = getCharsetOrElse(namedUri, NO_CHARSET); final String mimeType = getMimeTypeOrElse(namedUri, NO_MIME_TYPE); - if (UriUtils.isHttpURI(uri)) { + if (UriUtils.isHttpUri(uri)) { final URL url = toURL(uri); final String name = namedUri.getNameOrElse(UriUtils.toName(uri)); return fromUrl(name, group, url, mimeType, charset); @@ -105,7 +105,7 @@ public static DataSource fromNamedUri(NamedUri namedUri) { public static DataSource fromUrl(String name, String group, URL url, String contentType, Charset charset) { final URLDataSource dataSource = new CachingUrlDataSource(url); - final URI uri = UriUtils.toURI(url); + final URI uri = UriUtils.toUri(url); return create(name, group, uri, dataSource, contentType, charset); } @@ -113,7 +113,7 @@ public static DataSource fromUrl(String name, String group, URL url, String cont public static DataSource fromString(String name, String group, String content, String contentType) { final StringDataSource dataSource = new StringDataSource(name, content, contentType, UTF_8); - final URI uri = UriUtils.toURI(Location.STRING, UUID.randomUUID().toString()); + final URI uri = UriUtils.toUri(Location.STRING, UUID.randomUUID().toString()); return create(name, group, uri, dataSource, contentType, UTF_8); } @@ -136,7 +136,7 @@ public static DataSource fromFile(String name, String group, File file, Charset public static DataSource fromBytes(String name, String group, byte[] content, String contentType) { final ByteArrayDataSource dataSource = new ByteArrayDataSource(name, content); - final URI uri = UriUtils.toURI(Location.BYTES + ":///"); + final URI uri = UriUtils.toUri(Location.BYTES + ":///"); return create(name, group, uri, dataSource, contentType, UTF_8); } @@ -144,7 +144,7 @@ public static DataSource fromBytes(String name, String group, byte[] content, St public static DataSource fromInputStream(String name, String group, InputStream is, String contentType, Charset charset) { final InputStreamDataSource dataSource = new InputStreamDataSource(name, is); - final URI uri = UriUtils.toURI(Location.INPUTSTREAM + ":///"); + final URI uri = UriUtils.toUri(Location.INPUTSTREAM + ":///"); return create(name, group, uri, dataSource, contentType, charset); } @@ -161,7 +161,7 @@ public static DataSource fromEnvironment(String name, String group, String conte final StringWriter writer = new StringWriter(); properties.store(writer, null); final StringDataSource dataSource = new StringDataSource(name, writer.toString(), contentType, UTF_8); - final URI uri = UriUtils.toURI(Location.ENVIRONMENT, ""); + final URI uri = UriUtils.toUri(Location.ENVIRONMENT, ""); return create(name, group, uri, dataSource, contentType, UTF_8); } catch (IOException e) { throw new RuntimeException(e); @@ -172,7 +172,7 @@ public static DataSource fromEnvironment(String name, String group, String key, Validate.notEmpty(System.getenv(key), "Environment variable not found: " + key); final StringDataSource dataSource = new StringDataSource(name, System.getenv(key), contentType, UTF_8); - final URI uri = UriUtils.toURI(Location.ENVIRONMENT, key); + final URI uri = UriUtils.toUri(Location.ENVIRONMENT, key); return create(name, group, uri, dataSource, contentType, UTF_8); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java index ac34d46a..18d4286c 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java @@ -57,19 +57,19 @@ public List getNames() { } /** - * Get the file names of all data sources. + * Get the given metadata value for all data sources. * - * @param partName name of the metadata part - * @return data source names + * @param name name of the metadata part + * @return list of metadata values */ - public List getParts(String partName) { + public List getMetadata(String name) { return dataSources.stream() - .map(ds -> ds.getPart(partName)) + .map(ds -> ds.getMetadata(name)) .collect(toList()); } /** - * Get the groups of all data sources. + * Get the unique groups of all data sources. * * @return data source names */ diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java index fc519fdc..79e8a943 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUriStringParser.java @@ -52,10 +52,10 @@ public static NamedUri parse(String value) { if (matcher.matches()) { final String name = matcher.group(NAME); final String group = matcher.group(GROUP); - final URI uri = UriUtils.toURI(matcher.group(URI)); + final URI uri = UriUtils.toUri(matcher.group(URI)); return new NamedUri(name, group, uri, parameters(uri)); } else { - final URI uri = UriUtils.toURI(value); + final URI uri = UriUtils.toUri(value); return new NamedUri(uri, parameters(uri)); } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java index 7b7091f2..9620452b 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java @@ -54,7 +54,16 @@ public static int count(final String s, final char c) { return count; } - private static String separatorsToUnix(String str) { - return FilenameUtils.separatorsToUnix(str); + public static String getParentPart(String str, String separator) { + if (isEmpty(str) || !str.contains(separator)) { + return null; + } + final String[] parts = str.split(separator); + if(parts.length > 1) { + return parts[parts.length-2]; + } + else { + return null; + } } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java index a42f5290..92b968ca 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java @@ -16,8 +16,6 @@ */ package org.apache.freemarker.generator.base.util; -import org.apache.commons.io.FilenameUtils; - import java.net.URI; import java.net.URISyntaxException; import java.net.URL; @@ -27,7 +25,7 @@ public class UriUtils { - public static URI toURI(String str) { + public static URI toUri(String str) { try { return new URI(separatorsToUnix(str)); } catch (URISyntaxException e) { @@ -35,25 +33,30 @@ public static URI toURI(String str) { } } - public static URI toURI(String scheme, String path) { - return toURI(scheme + ":///" + path); + public static URI toUri(String scheme, String path) { + return toUri(scheme + ":///" + path); } - public static URI toURI(URL url) { - return toURI(url.toString()); + public static URI toUri(URL url) { + return toUri(url.toString()); } + /** + * Return the URI string representation without fragment part. + * @param uri uri + * @return name + */ public static String toName(URI uri) { - final String scheme = uri.getScheme(); - final String schemeSpecificPart = uri.getSchemeSpecificPart(); - return scheme + schemeSpecificPart; + final String str = uri.toString(); + final int index = str.indexOf('#'); + return (index > 0) ? str.substring(0, index) : str; } public static boolean isUri(String str) { return isNotEmpty(str) && str.contains("://"); } - public static boolean isHttpURI(URI uri) { + public static boolean isHttpUri(URI uri) { if (uri == null) { return false; } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java index 6187ff14..5a9f128c 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java @@ -96,12 +96,12 @@ public void shouldGetAllDataSource() { @Test public void shouldGetParts() { - assertEquals(3, dataSources().getParts("name").size()); + assertEquals(3, dataSources().getMetadata("name").size()); } @Test public void shouldGetFileNamePart() { - assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getParts("filename")); + assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getMetadata("filename")); } @Test diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 428d28fe..ce9d7b8e 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -85,15 +85,31 @@ user.home : ${tools.system.systemProperties["user.home"]!""} 11) Access DataSources --------------------------------------------------------------------------- -Get the number of documents: +Get the number of data sources: - ${dataSources?size} <#if dataSources?has_content> -Get the first document -- ${dataSources?values[0]!"NA"} +Get the first data source: +- ${dataSources?values[0].name!"No data sources provided"} -Get all documents +Get all documents as map: <#list dataSources as name, ds> -- ${name} => ${ds.uri} +- ${name} => ${ds.mimeType} + +List all data sources containing "test" in the name +<#list dataSources?values?filter(ds -> ds.match("name", "*test*")) as ds> +- ${ds.name} + +List all data sources having "json" extension +<#list dataSources?values?filter(ds -> ds.match("extension", "json")) as ds> +- ${ds.name} + +List all data sources having "list" base name +<#list dataSources?values?filter(ds -> ds.match("parent", "list")) as ds> +- ${ds.name} + +List all files having HTTP/HTTPS URLs +<#list dataSources?values?filter(ds -> ds.match("scheme", "http*")) as ds> +- ${ds.getMetadata("filename")} 12) Document Data Model 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 7813a4e6..3842508c 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 @@ -133,7 +133,7 @@ private static DataSources dataSources(Settings settings, Supplier Date: Sat, 11 Jul 2020 20:39:17 +0200 Subject: [PATCH 20/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 92 +++++++++++-------- .../generator/base/util/StringUtils.java | 15 --- .../generator/datasource/DataSourceTest.java | 3 +- .../generator/datasource/DataSourcesTest.java | 2 +- .../examples/templates/demo.ftl | 8 +- .../site/markdown/cli/concepts/named-uris.md | 6 +- .../markdown/cli/usage/transforming-csv.md | 6 +- src/site/markdown/index.md | 2 +- 8 files changed, 63 insertions(+), 71 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 70f951ba..183bc5b3 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 @@ -49,9 +49,21 @@ * There is also special support of UrlDataSource since * the content type & charset might be determined using a network * call. + *
    + * The implementation makes no assumption if the underlying input + * stream can be consumed more than once. */ public class DataSource implements Closeable, javax.activation.DataSource { + public static final String METADATA_BASE_NAME = "baseName"; + public static final String METADATA_EXTENSION = "extension"; + public static final String METADATA_FILE_NAME = "fileName"; + public static final String METADATA_FILE_PATH = "filePath"; + public static final String METADATA_GROUP = "group"; + public static final String METADATA_NAME = "name"; + public static final String METADATA_URI = "uri"; + public static final String METADATA_URI_PATH = "uriPath"; + /** Human-readable name of the data source */ private final String name; @@ -64,14 +76,14 @@ public class DataSource implements Closeable, javax.activation.DataSource { /** The underlying "javax.activation.DataSource" */ private final javax.activation.DataSource dataSource; - /** Optional content type */ + /** Content type of data source either provided by the user or fetched directly from the data source */ private final String contentType; - /** Optional charset for directly accessing text-based content */ + /** Charset for directly accessing text-based content */ private final Charset charset; - /** Collect all closables handed out to the caller to be closed when the data source is closed itself */ - private final CloseableReaper closables; + /** Collect all closeables handed out to the caller to be closed when the data source is closed itself */ + private final CloseableReaper closeables; public DataSource( String name, @@ -86,7 +98,7 @@ public DataSource( this.dataSource = requireNonNull(dataSource); this.contentType = contentType; this.charset = charset; - this.closables = new CloseableReaper(); + this.closeables = new CloseableReaper(); } @Override @@ -111,7 +123,7 @@ public String getContentType() { */ @Override public InputStream getInputStream() { - return closables.add(getUnsafeInputStream()); + return closeables.add(getUnsafeInputStream()); } @Override @@ -121,25 +133,30 @@ public OutputStream getOutputStream() { @Override public void close() { - closables.close(); + closeables.close(); } public String getGroup() { return group; } - public String getBaseName() { - return FilenameUtils.getBaseName(name); - } - public String getFileName() { return FilenameUtils.getName(name); } + public String getBaseName() { + return FilenameUtils.getBaseName(getFileName()); + } + public String getExtension() { - return FilenameUtils.getExtension(name); + return FilenameUtils.getExtension(getFileName()); } + /** + * Get the charset. If no charset can be detected UTF-8 is assumed. + * + * @return charset + */ public Charset getCharset() { return charset != null ? charset : MimeTypeParser.getCharset(contentType(), UTF_8); } @@ -230,8 +247,8 @@ public List getLines(String charsetName) { /** * Returns an Iterator for the lines in an InputStream, using - * the default character encoding specified. The caller is responsible to close - * the line iterator. + * the default character encoding specified. The exposed iterator is closed + * by the DataSource. * * @return line iterator */ @@ -241,7 +258,8 @@ public LineIterator getLineIterator() { /** * Returns an Iterator for the lines in an InputStream, using - * the character encoding specified. + * the character encoding specified. The exposed iterator is closed + * by the DataSource. * * @param charsetName The name of the requested charset * @return line iterator @@ -249,7 +267,7 @@ public LineIterator getLineIterator() { public LineIterator getLineIterator(String charsetName) { Validate.notEmpty(charsetName, "No charset name provided"); try { - return closables.add(IOUtils.lineIterator(getUnsafeInputStream(), Charset.forName(charsetName))); + return closeables.add(IOUtils.lineIterator(getUnsafeInputStream(), Charset.forName(charsetName))); } catch (IOException e) { throw new RuntimeException("Failed to create line iterator: " + toString(), e); } @@ -266,43 +284,37 @@ public byte[] getBytes() { /** * Expose various parts of the metadata as simple strings to cater for filtering in a script. * - * @param name name part name + * @param key key part key * @return value */ - public String getMetadata(String name) { - Validate.notEmpty(name, "No part name provided"); - switch (name.toLowerCase()) { - case "basename": + public String getMetadata(String key) { + Validate.notEmpty(key, "No key provided"); + switch (key) { + case METADATA_BASE_NAME: return getBaseName(); - case "charset": - return getCharset().name(); - case "extension": + case METADATA_EXTENSION: return getExtension(); - case "filename": + case METADATA_FILE_NAME: return getFileName(); - case "group": + case METADATA_FILE_PATH: + return FilenameUtils.getFullPathNoEndSeparator(uri.getPath()); + case METADATA_GROUP: return getGroup(); - case "mimetype": - return getMimeType(); - case "name": + case METADATA_NAME: return getName(); - case "path": + case METADATA_URI_PATH: return uri.getPath(); - case "parent": - return StringUtils.getParentPart(getName(), "/"); - case "scheme": - return uri.getScheme(); - case "uri": + case METADATA_URI: return uri.toString(); default: - throw new IllegalArgumentException("Unknown name: " + name); + throw new IllegalArgumentException("Unknown key: " + key); } } /** - * Matches a metadata entry with a wildcard expression. + * Matches a metadata part with a wildcard expression. * - * @param part part, e.g. "name", "basename", "extension", "uri", "group" + * @param part part, e.g. "name", "fileName", "baseName", "extension", "uri", "group" * @param wildcard the wildcard string to match against * @return true if the wildcard expression matches * @see Apache Commons IO @@ -322,7 +334,7 @@ public boolean match(String part, String wildcard) { * @return Closable */ public T addClosable(T closeable) { - return closables.add(closeable); + return closeables.add(closeable); } @Override @@ -336,7 +348,7 @@ public String toString() { /** * If there is no content type we ask the underlying data source. E.g. for - * an URL data source this information is fetched from the server. + * an URL data source this information is fetched from the remote server. * * @return content type */ diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java index 9620452b..c3eabf19 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/StringUtils.java @@ -16,8 +16,6 @@ */ package org.apache.freemarker.generator.base.util; -import org.apache.commons.io.FilenameUtils; - public class StringUtils { public static boolean isEmpty(String value) { @@ -53,17 +51,4 @@ public static int count(final String s, final char c) { } return count; } - - public static String getParentPart(String str, String separator) { - if (isEmpty(str) || !str.contains(separator)) { - return null; - } - final String[] parts = str.split(separator); - if(parts.length > 1) { - return parts[parts.length-2]; - } - else { - return null; - } - } } 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 7c8ef0c8..155b778c 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 @@ -76,8 +76,7 @@ public void shouldSupportFileDataSource() { assertTrue(dataSource.match("name", "*" + ANY_FILE_NAME)); assertTrue(dataSource.match("uri", "file:/*/pom.xml")); assertTrue(dataSource.match("extension", "xml")); - assertTrue(dataSource.match("basename", "pom")); - assertTrue(dataSource.match("path", "*/pom.xml")); + assertTrue(dataSource.match("baseName", "pom")); } } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java index 5a9f128c..74583d69 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java @@ -101,7 +101,7 @@ public void shouldGetParts() { @Test public void shouldGetFileNamePart() { - assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getMetadata("filename")); + assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getMetadata("fileName")); } @Test diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index ce9d7b8e..4c48c601 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -103,14 +103,10 @@ List all data sources having "json" extension <#list dataSources?values?filter(ds -> ds.match("extension", "json")) as ds> - ${ds.name} -List all data sources having "list" base name -<#list dataSources?values?filter(ds -> ds.match("parent", "list")) as ds> +List all data sources having "src/test/data/properties" in their directory name +<#list dataSources?values?filter(ds -> ds.match("filePath", "*/src/test/data/properties")) as ds> - ${ds.name} -List all files having HTTP/HTTPS URLs -<#list dataSources?values?filter(ds -> ds.match("scheme", "http*")) as ds> -- ${ds.getMetadata("filename")} - 12) Document Data Model --------------------------------------------------------------------------- diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md index 1679a504..0e833d10 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/named-uris.md @@ -16,12 +16,12 @@ As a refresher, a URI is made up of the following components (inspired by https: scheme authority path query fragment ``` -For our purposes, the scheme and the path components are especially important, though the other components are used by certain datasources for particular purposes. +For our purposes, the scheme and the path components are especially important, though the other components are used by certain data sources for particular purposes. | Component | Purpose | |-----------|-----------------------------------------------------------------------------------------------------------| -| scheme | All datasources require a scheme (except for file when using relative paths) | -| authority | Used only by remote datasources, and can be omitted in some of those cases. | +| scheme | All data sources require a scheme (except for file when using relative paths) | +| authority | Used only by remote data sources, and can be omitted in some of those cases. | | path | Can be omitted, but usually used as the basis of the locator for the datasource. | | query | Used mainly for HTTP and HTTPS URLs | | fragment | Used rarely for providing additional attributes, e.g. `mimeType` of `charset` | diff --git a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-csv.md b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-csv.md index e6c056d5..a891c38f 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-csv.md +++ b/freemarker-generator-cli/src/site/markdown/cli/usage/transforming-csv.md @@ -26,8 +26,8 @@ freemarker-cli \ The command line invocation seems a bit complex at first so let's look at it more closely * `CSV_SOURCE_FORMAT` defines the CSV source format for reading the CSV -* `CSV_TARGET_FORMAT` defines the CSV tagrte format for writing the CSV -* `CSV_TARGET_DELIMITER` explicitely sets the delimiter of the target CSV to a semicolon since this expected by Excel for my current locale +* `CSV_TARGET_FORMAT` defines the CSV target format for writing the CSV +* `CSV_TARGET_DELIMITER` explicitly sets the delimiter of the target CSV to a semicolon since this expected by Excel for my current locale ### Convert CSV To Markdown @@ -65,7 +65,7 @@ The following options can be passed to template (as user-supplied parameters) | CSV_SOURCE_FORMAT | DEFAULT | Source CSV format | | CSV_SOURCE_DELIMITER | COMMA | Symbolic name of delimiter, e.g. "COLON" or "SEMICOLON" | | CSV_SOURCE_WITH_HEADER | true | Whether the first rows are headers | -| CSV_TAGRGET_FORMAT | DEFAULT | Target CSV format | +| CSV_TARGET_FORMAT | DEFAULT | Target CSV format | | CSV_TARGET_DELIMITER | COMMA | Symbolic name of delimiter, e.g. "COLON" or "SEMICOLON" | | CSV_TARGET_WITH_HEADER | true | Whether the first rows are headers | diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md index bf0072c6..bae1e616 100644 --- a/src/site/markdown/index.md +++ b/src/site/markdown/index.md @@ -1,4 +1,4 @@ -The Apache FreeMarker Generator projects provides additional tools to generate textual ouptut using [Apache FreeMarker](https://freemarker.apache.org). +The Apache FreeMarker Generator projects provides additional tools to generate textual output using [Apache FreeMarker](https://freemarker.apache.org). | Name | Description | | ------------------------------------------------------------- | ----------------------------------------------------------------- | From e4df6397884882a257eafbee3f50b8b579576194 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sat, 11 Jul 2020 20:52:46 +0200 Subject: [PATCH 21/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../examples/templates/demo.ftl | 2 +- .../markdown/cli/concepts/data-sources.md | 33 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/freemarker-generator-cli/examples/templates/demo.ftl b/freemarker-generator-cli/examples/templates/demo.ftl index 4c48c601..da3a61d5 100644 --- a/freemarker-generator-cli/examples/templates/demo.ftl +++ b/freemarker-generator-cli/examples/templates/demo.ftl @@ -103,7 +103,7 @@ List all data sources having "json" extension <#list dataSources?values?filter(ds -> ds.match("extension", "json")) as ds> - ${ds.name} -List all data sources having "src/test/data/properties" in their directory name +List all data sources having "src/test/data/properties" in their file path <#list dataSources?values?filter(ds -> ds.match("filePath", "*/src/test/data/properties")) as ds> - ${ds.name} diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md index 184964e6..6d048ab8 100644 --- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md +++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md @@ -86,26 +86,27 @@ FreeMarker CLI DataSources ### Selecting A DataSource -After loading one or more `DataSource` it needs to be selected for template processing - the `DataSources` instance -exposed in the data model provides +After loading one or more `DataSource` they are accessible as `dataSource` map in the FreeMarker model -* Selecting by index -* Selecting by name -* Filter by the globbing pattern (see [Apache Commons IO](https://commons.apache.org/proper/commons-io/javadocs/api-release/org/apache/commons/io/filefilter/WildcardFileFilter.html)) +* `dataSources?values[0]` selects the first data source +* `dataSources["user.csv"]` selects the data source with the name "user.csv" -A few FTL examples +Combining FreeMarker's `filter` built-in with the `DataSource#match` methods allows more advanced +selection of data sources (using Apache Commons IO wildcard matching) ``` -<#assign dataSource = dataSources?values[0]> - -<#assign dataSource = dataSources["user.csv"]> - -<#list dataSources.find("*.md") as dataSource> -- ${dataSource.name} +<#-- List all data sources containing "test" in the name --> +<#list dataSources?values?filter(ds -> ds.match("name", "*test*")) as ds> +- ${ds.name} -``` - +<#-- List all data sources having "json" extension --> +<#list dataSources?values?filter(ds -> ds.match("extension", "json")) as ds> +- ${ds.name} + - - +<#-- List all data sources having "src/test/data/properties" in their file path --> +<#list dataSources?values?filter(ds -> ds.match("filePath", "*/src/test/data/properties")) as ds> +- ${ds.name} + +``` \ No newline at end of file From 5e6e0b83c158762937b0976b495478c11e0c6f22 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sat, 11 Jul 2020 21:38:13 +0200 Subject: [PATCH 22/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../generator/base/datasource/DataSource.java | 8 ++-- .../base/datasource/DataSourceFactory.java | 4 +- .../base/datasource/DataSources.java | 47 +++++++++++-------- .../generator/datasource/DataSourcesTest.java | 3 +- .../cli/model/GeneratorObjectWrapper.java | 3 +- 5 files changed, 38 insertions(+), 27 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 183bc5b3..be9934c6 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 @@ -312,15 +312,15 @@ public String getMetadata(String key) { } /** - * Matches a metadata part with a wildcard expression. + * Matches a metadata key with a wildcard expression. * - * @param part part, e.g. "name", "fileName", "baseName", "extension", "uri", "group" + * @param key metadata key, e.g. "name", "fileName", "baseName", "extension", "uri", "group" * @param wildcard the wildcard string to match against * @return true if the wildcard expression matches * @see Apache Commons IO */ - public boolean match(String part, String wildcard) { - final String value = getMetadata(part); + public boolean match(String key, String wildcard) { + final String value = getMetadata(key); return FilenameUtils.wildcardMatch(value, wildcard); } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index d8d5702f..1d3ce8bb 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -76,7 +76,7 @@ public static DataSource fromNamedUri(NamedUri namedUri) { final String mimeType = getMimeTypeOrElse(namedUri, NO_MIME_TYPE); if (UriUtils.isHttpUri(uri)) { - final URL url = toURL(uri); + final URL url = toUrl(uri); final String name = namedUri.getNameOrElse(UriUtils.toName(uri)); return fromUrl(name, group, url, mimeType, charset); } else if (UriUtils.isFileUri(uri)) { @@ -217,7 +217,7 @@ private static Charset getCharsetOrElse(NamedUri namedUri, Charset def) { return StringUtils.isEmpty(charsetName) ? def : Charset.forName(charsetName); } - private static URL toURL(URI uri) { + private static URL toUrl(URI uri) { try { return uri.toURL(); } catch (MalformedURLException e) { diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java index 18d4286c..5af23bfa 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java @@ -29,7 +29,6 @@ import java.util.stream.Collectors; import static java.util.function.Function.identity; -import static java.util.stream.Collectors.toList; /** * Container for data sources with a couple of convenience functions to select @@ -53,19 +52,19 @@ public DataSources(Collection dataSources) { public List getNames() { return dataSources.stream() .map(DataSource::getName) - .collect(toList()); + .collect(Collectors.toList()); } /** * Get the given metadata value for all data sources. * - * @param name name of the metadata part + * @param key key of the metadata part * @return list of metadata values */ - public List getMetadata(String name) { + public List getMetadata(String key) { return dataSources.stream() - .map(ds -> ds.getMetadata(name)) - .collect(toList()); + .map(ds -> ds.getMetadata(key)) + .collect(Collectors.toList()); } /** @@ -79,7 +78,7 @@ public List getGroups() { .filter(StringUtils::isNotEmpty) .sorted() .distinct() - .collect(toList()); + .collect(Collectors.toList()); } public int size() { @@ -90,17 +89,27 @@ public boolean isEmpty() { return dataSources.isEmpty(); } - public Map getMap() { + /** + * Get a list representation of the underlying data sources. + * + * @return list of data sources + */ + public List toList() { + return new ArrayList<>(dataSources); + } + + /** + * Get a map representation of the underlying data sources. + * + * @return map of data sources + */ + public Map toMap() { return dataSources.stream().collect(Collectors.toMap(DataSource::getName, identity(), (v1, v2) -> v1, LinkedHashMap::new)); } - public List getList() { - return new ArrayList<>(dataSources); - } - public DataSource get(int index) { return dataSources.get(index); } @@ -127,7 +136,7 @@ public DataSource get(String name) { } /** - * Find data sources based on their name and a wildcard. + * Find data sources based on their name using a wildcard string.. * * @param wildcard the wildcard string to match against * @return list of matching data sources @@ -136,21 +145,21 @@ public DataSource get(String name) { public List find(String wildcard) { return dataSources.stream() .filter(dataSource -> dataSource.match("name", wildcard)) - .collect(toList()); + .collect(Collectors.toList()); } /** - * Find data sources based on their metadata part and wildcard. + * Find data sources based on their metadata key and wildcard string. * - * @param part part of metadata to match + * @param key metadata key to match * @param wildcard the wildcard string to match against * @return list of matching data sources * @see Apache Commons IO */ - public List find(String part, String wildcard) { + public List find(String key, String wildcard) { return dataSources.stream() - .filter(dataSource -> dataSource.match(part, wildcard)) - .collect(toList()); + .filter(dataSource -> dataSource.match(key, wildcard)) + .collect(Collectors.toList()); } @Override diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java index 74583d69..d3cdf453 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java @@ -89,7 +89,8 @@ public void shouldGetAllDataSource() { assertEquals("unknown", dataSources.get(0).getFileName()); assertEquals("pom.xml", dataSources.get(1).getFileName()); assertEquals("server.invalid?foo=bar", dataSources.get(2).getFileName()); - assertEquals(3, dataSources.getList().size()); + assertEquals(3, dataSources.toList().size()); + assertEquals(3, dataSources.toMap().size()); assertEquals(3, dataSources.size()); assertFalse(dataSources.isEmpty()); } diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java index db9d26fe..57b98675 100644 --- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java +++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java @@ -16,7 +16,8 @@ public GeneratorObjectWrapper(Version incompatibleImprovements) { @Override protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException { if (obj instanceof DataSources) { - return DefaultMapAdapter.adapt(((DataSources) obj).getMap(), this); + final DataSources dataSources = (DataSources) obj; + return DefaultMapAdapter.adapt((dataSources).toMap(), this); } return super.handleUnknownType(obj); From 81e22a422bf5bd5b23cda7ef6c58c9fa8cd5fb70 Mon Sep 17 00:00:00 2001 From: Siegfried Goeschl Date: Sat, 11 Jul 2020 22:30:54 +0200 Subject: [PATCH 23/23] FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like --- .../freemarker/generator/base/FreeMarkerConstants.java | 2 +- .../generator/base/datasource/DataSourceFactory.java | 8 ++++---- .../generator/base/datasource/DataSourcesSupplier.java | 3 +-- .../generator/base/template/TemplateSource.java | 2 +- .../generator/base/template/TemplateTransformations.java | 2 +- .../apache/freemarker/generator/base/util/UriUtils.java | 5 +++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java index aeb27b10..239c80e7 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/FreeMarkerConstants.java @@ -41,7 +41,7 @@ private FreeMarkerConstants() { /* Default group name for data sources */ public static final String DEFAULT_GROUP = "default"; - + public static class Configuration { private Configuration() { diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java index 1d3ce8bb..0c9055c0 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java @@ -77,11 +77,11 @@ public static DataSource fromNamedUri(NamedUri namedUri) { if (UriUtils.isHttpUri(uri)) { final URL url = toUrl(uri); - final String name = namedUri.getNameOrElse(UriUtils.toName(uri)); + final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(uri)); return fromUrl(name, group, url, mimeType, charset); } else if (UriUtils.isFileUri(uri)) { final File file = namedUri.getFile(); - final String name = namedUri.getNameOrElse(UriUtils.toName(file.toURI())); + final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI())); return fromFile(name, group, file, charset); } else if (UriUtils.isEnvUri(uri)) { // environment variables come with a leading "/" to be removed @@ -96,7 +96,7 @@ public static DataSource fromNamedUri(NamedUri namedUri) { } else { // handle things such as "foo=some.file" final File file = namedUri.getFile(); - final String name = namedUri.getNameOrElse(UriUtils.toName(file.toURI())); + final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI())); return fromFile(name, group, file, charset); } } @@ -120,7 +120,7 @@ public static DataSource fromString(String name, String group, String content, S // == File ============================================================== public static DataSource fromFile(File file, Charset charset) { - return fromFile(UriUtils.toName(file.toURI()), DEFAULT_GROUP, file, charset); + return fromFile(UriUtils.toStringWithoutFragment(file.toURI()), DEFAULT_GROUP, file, charset); } public static DataSource fromFile(String name, String group, File file, Charset charset) { 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 33b715bb..cbf651b0 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 @@ -16,7 +16,6 @@ */ package org.apache.freemarker.generator.base.datasource; -import jdk.nashorn.internal.runtime.URIUtils; import org.apache.freemarker.generator.base.file.RecursiveFileSupplier; import org.apache.freemarker.generator.base.uri.NamedUri; import org.apache.freemarker.generator.base.uri.NamedUriStringParser; @@ -137,7 +136,7 @@ private static String getDataSourceName(NamedUri namedUri, File file) { if (namedUri.hasName()) { return namedUri.getName(); } else { - return UriUtils.toName(file.toURI()); + return UriUtils.toStringWithoutFragment(file.toURI()); } } } diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java index c12d35a0..fb50b2a6 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateSource.java @@ -78,7 +78,7 @@ public static TemplateSource fromPath(String path) { /** * Template will be loaded from path using a file-base template loader. * - * @param path template path + * @param path template path * @param encoding character encoding og template * @return file-based template source */ diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformations.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformations.java index 6c09b60d..e41162d6 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformations.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformations.java @@ -24,7 +24,7 @@ /** * Keeps track of all transformations being executed. - */ + */ public class TemplateTransformations { private final List templateTransformations; diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java index 92b968ca..fab27e0f 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java @@ -43,10 +43,11 @@ public static URI toUri(URL url) { /** * Return the URI string representation without fragment part. + * * @param uri uri - * @return name + * @return string representation of URI without fragment part */ - public static String toName(URI uri) { + public static String toStringWithoutFragment(URI uri) { final String str = uri.toString(); final int index = str.indexOf('#'); return (index > 0) ? str.substring(0, index) : str;