This is an automated email from the ASF dual-hosted git repository. sgoeschl pushed a commit to branch FREEMARKER-148 in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit 261d6a15e68866fbd217d3ba22248df254a8f794 Author: Siegfried Goeschl <[email protected]> AuthorDate: Thu Jul 2 16:57:35 2020 +0200 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(-) 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 c7d4ea7..bf77a69 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 @@ package org.apache.freemarker.generator.cli.config; 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 class ConfigurationSupplier implements Supplier<Configuration> { // 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 0000000..7b2713e --- /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 0000000..32af3ca --- /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 2b7f456..2a2d3a2 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 @@ import java.util.Arrays; 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 baae451..93ddfa2 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 class ConfigurationSupplierTest { 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 b381b05..34a913f 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> +</#list> + +Iterate Over Names & DataSources +--------------------------------------------------------------------------- +<#list DataSources as name, dataSource> + ${name} => ${dataSource}<#lt> +</#list> + +Find DataSources By Group +--------------------------------------------------------------------------- +<#list DataSources.findByGroup("default") as dataSource> + ${dataSource}<#lt> +</#list> + +Find DataSources By Wildcard +--------------------------------------------------------------------------- +<#list DataSources.find("*.csv") as dataSource> + ${dataSource}<#lt> +</#list> + +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
