[
https://issues.apache.org/jira/browse/FREEMARKER-195?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17424165#comment-17424165
]
Siegfried Goeschl edited comment on FREEMARKER-195 at 10/5/21, 6:39 AM:
------------------------------------------------------------------------
This is currently working
{code:java}
Support FreeMarker Directives
==============================================================================
dataSources?has_content: ${dataSources?has_content?c}
dataSources?size: ${dataSources?size}
Iterate Over DataSources Using Array-style Access
==============================================================================
<#list 0..dataSources?size-1 as i>
- dataSource[${i}] ==> ${dataSources[i]}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Sequence
==============================================================================
<#list dataSources as dataSource>
- dataSource[${dataSource?index}] => ${dataSource.name}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Key & Values
==============================================================================
<#list dataSources as name, dataSource>
- dataSource["${name}"] => ${dataSource.name}<#lt>
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Values
==============================================================================
<#list dataSources?values as dataSource>
- dataSource[${dataSource?index}] => ${dataSource.name}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Hash Map Keys
==============================================================================
<#list dataSources?keys as key>
- dataSource["${key}"] => ${dataSources[key].name}
<#else>
No data sources provided ...
</#list>
Access Underlying DataSources API
==============================================================================
DataSources.getNames(): ${dataSources?api.names?size}
DataSources.getGroups(): ${dataSources?api.getGroups()?size}
DataSources.find("*"): ${dataSources?api.find("*")?size}
DataSources.find("uri", "*.md"): ${dataSources?api.find("uri", "*.md")?size}
DataSources.find("extension", "md"): ${dataSources?api.find("extension",
"md")?size}
Iterate Over DataSources Using Wildcard Search
==============================================================================
<#list dataSources?api.find("*") as dataSource>
- ${dataSource.name}
<#else>
No data sources provided ...
</#list>
<#if dataSources?has_content>
<#list dataSources as dataSource>
[#${dataSource?counter}] - ${dataSource.name}
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
<#assign dataSource=dataSources?first>
Name : ${dataSource.name}
Nr of lines : ${dataSource.lines?size}
Content Type : ${dataSource.contentType}
Charset : ${dataSource.charset}
Extension : ${dataSource.extension}
Nr of chars : ${dataSource.text?length}
Nr of bytes : ${dataSource.bytes?size}
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
<#list dataSource.metadata as name, value>
${name?right_pad(19)} : ${value}
</#list>
</#list>
</#if>
{code}
Invoking the template using
{code:java}
bin/freemarker-generator -t examples/templates/datasources.ftl
readme:documentation=README.md bin
{code}
yields
{noformat}
Support FreeMarker Directives
==============================================================================
dataSources?has_content: true
dataSources?size: 3
Use FTL Array-style Access
==============================================================================
dataSources[0]: readme
Iterate Over DataSources as List
==============================================================================
- dataSource[0] => readme
- dataSource[1] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
- dataSource[2] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Iterate Over DataSources as Map
==============================================================================
- dataSource["readme"] => readme
-
dataSource["/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator"]
=>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
dataSource["/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat"]
=>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Iterate Over DataSources as Values
==============================================================================
- dataSource[0] => readme
- dataSource[1] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
- dataSource[2] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Get Document Names As Keys
==============================================================================
- readme
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Access Underlying DataSources API
==============================================================================
DataSources.getNames(): 3
DataSources.getGroups(): 2
DataSources.find(): 3
Iterate Over DataSources Using Wildcard Search
==============================================================================
- readme
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
[#1] - readme
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name : readme
Nr of lines : 137
Content Type : text/markdown
Charset : UTF-8
Extension : md
Nr of chars : 6,793
Nr of bytes : 6,793
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : README.md
extension : md
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
name : readme
mimeType : text/markdown
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/README.md
baseName : README
relativeFilePath :
group : documentation
[#2] -
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
Nr of lines : 128
Content Type : application/octet-stream
Charset : UTF-8
Extension :
Nr of chars : 3,748
Nr of bytes : 3,748
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : freemarker-generator
extension :
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin
name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
mimeType : application/octet-stream
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
baseName : freemarker-generator
relativeFilePath :
group : default
[#3] -
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Nr of lines : 113
Content Type : text/plain
Charset : UTF-8
Extension : bat
Nr of chars : 3,219
Nr of bytes : 3,219
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : freemarker-generator.bat
extension : bat
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin
name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
mimeType : text/plain
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
baseName : freemarker-generator
relativeFilePath :
group : default
{noformat}
was (Author: sgoeschl):
This is currently working
{code:java}
<#ftl output_format="plainText" strip_whitespace=true>
Support FreeMarker Directives
==============================================================================
dataSources?has_content: ${dataSources?has_content?c}
dataSources?size: ${dataSources?size}
Iterate Over DataSources Using Array-style Access
==============================================================================
<#list 0..dataSources?size-1 as i>
- dataSource[${i}] ==> ${dataSources[i]}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Sequence
==============================================================================
<#list dataSources as dataSource>
- dataSource[${dataSource?index}] => ${dataSource.name}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Key & Values
==============================================================================
<#list dataSources as name, dataSource>
- dataSource["${name}"] => ${dataSource.name}<#lt>
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Values
==============================================================================
<#list dataSources?values as dataSource>
- dataSource[${dataSource?index}] => ${dataSource.name}
<#else>
No data sources provided ...
</#list>
Iterate Over DataSources Using Hash Map Keys
==============================================================================
<#list dataSources?keys as key>
- dataSource["${key}"] => ${dataSources[key].name}
<#else>
No data sources provided ...
</#list>
Access Underlying DataSources API
==============================================================================
DataSources.getNames(): ${dataSources?api.names?size}
DataSources.getGroups(): ${dataSources?api.getGroups()?size}
DataSources.find("*"): ${dataSources?api.find("*")?size}
DataSources.find("uri", "*.md"): ${dataSources?api.find("uri", "*.md")?size}
DataSources.find("extension", "md"): ${dataSources?api.find("extension",
"md")?size}
Iterate Over DataSources Using Wildcard Search
==============================================================================
<#list dataSources?api.find("*") as dataSource>
- ${dataSource.name}
<#else>
No data sources provided ...
</#list>
<#if dataSources?has_content>
<#list dataSources as dataSource>
[#${dataSource?counter}] - ${dataSource.name}
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
<#assign dataSource=dataSources?first>
Name : ${dataSource.name}
Nr of lines : ${dataSource.lines?size}
Content Type : ${dataSource.contentType}
Charset : ${dataSource.charset}
Extension : ${dataSource.extension}
Nr of chars : ${dataSource.text?length}
Nr of bytes : ${dataSource.bytes?size}
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
<#list dataSource.metadata as name, value>
${name?right_pad(19)} : ${value}
</#list>
</#list>
</#if>
{code}
Invoking the template using
{code:java}
bin/freemarker-generator -t examples/templates/datasources.ftl
readme:documentation=README.md bin
{code}
yields
{noformat}
Support FreeMarker Directives
==============================================================================
dataSources?has_content: true
dataSources?size: 3
Use FTL Array-style Access
==============================================================================
dataSources[0]: readme
Iterate Over DataSources as List
==============================================================================
- dataSource[0] => readme
- dataSource[1] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
- dataSource[2] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Iterate Over DataSources as Map
==============================================================================
- dataSource["readme"] => readme
-
dataSource["/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator"]
=>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
dataSource["/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat"]
=>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Iterate Over DataSources as Values
==============================================================================
- dataSource[0] => readme
- dataSource[1] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
- dataSource[2] =>
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Get Document Names As Keys
==============================================================================
- readme
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Access Underlying DataSources API
==============================================================================
DataSources.getNames(): 3
DataSources.getGroups(): 2
DataSources.find(): 3
Iterate Over DataSources Using Wildcard Search
==============================================================================
- readme
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
-
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
[#1] - readme
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name : readme
Nr of lines : 137
Content Type : text/markdown
Charset : UTF-8
Extension : md
Nr of chars : 6,793
Nr of bytes : 6,793
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : README.md
extension : md
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler
name : readme
mimeType : text/markdown
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/README.md
baseName : README
relativeFilePath :
group : documentation
[#2] -
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
Nr of lines : 128
Content Type : application/octet-stream
Charset : UTF-8
Extension :
Nr of chars : 3,748
Nr of bytes : 3,748
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : freemarker-generator
extension :
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin
name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
mimeType : application/octet-stream
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator
baseName : freemarker-generator
relativeFilePath :
group : default
[#3] -
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
Name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
Nr of lines : 113
Content Type : text/plain
Charset : UTF-8
Extension : bat
Nr of chars : 3,219
Nr of bytes : 3,219
Iterating Over Metadata Of A Datasource
---------------------------------------------------------------------------
charset : UTF-8
fileName : freemarker-generator.bat
extension : bat
filePath :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin
name :
/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
mimeType : text/plain
uri :
file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat
baseName : freemarker-generator
relativeFilePath :
group : default
{noformat}
> [freemarker-generator] Improve exposure of DataSources using
> TemplateHashModelEx2
> ---------------------------------------------------------------------------------
>
> Key: FREEMARKER-195
> URL: https://issues.apache.org/jira/browse/FREEMARKER-195
> Project: Apache Freemarker
> Issue Type: Improvement
> Reporter: Siegfried Goeschl
> Assignee: Siegfried Goeschl
> Priority: Major
>
> Have another take on it since I failed at the first iteration
> {noformat}
> It is doable, like the XML DOM wrapped does that. you just need to
> implement both TemplateHashModel (TemplateHashModelEx2 preferably) and
> TemplateSequenceModel. I guess the problem was that you also wanted to
> expose the methods. That's not possible since in FTL (and unlike in
> Java, but like in many other languages) there's no separate namespace
> for method names. So, either you move those to somewhere, like under
> tools.dataSourceOperations, or you stupport the ?api built-in, so once
> can do dataSources?api.find(...).
> {noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)