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:52 UTC

[freemarker-generator] branch FREEMARKER-148 created (now 261d6a1)

This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a change to branch FREEMARKER-148
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git.


      at 261d6a1  FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like

This branch includes the following new commits:

     new 261d6a1  FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[freemarker-generator] 01/01: FREEMARKER-148 Make usage of "DataSources" more "Freemarker" like

Posted by sg...@apache.org.
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