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