You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/07/02 14:57:53 UTC
[freemarker-generator] 01/01: FREEMARKER-148 Make usage of
"DataSources" more "Freemarker" like
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 <si...@gmail.com>
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