[ 
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, 3:08 PM:
------------------------------------------------------------------------

This is currently working


{noformat}
Support Of FreeMarker Directives
==============================================================================
dataSources?has_content: ${dataSources?has_content?c}
dataSources?size: ${dataSources?size}

Iterate Over DataSources Using Array-style Access
==============================================================================
<#if dataSources?has_content>
<#list 0..dataSources?size-1 as i>
- dataSource[${i}] ==> ${dataSources[i].name}
</#list>
<#else>
No data sources provided ...
</#if>

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>

Iterate Over DataSources Using Lambda Expression
==============================================================================
<#list dataSources?filter(ds -> ds.match("group", "default")) as dataSource>
- Group "default" => ${dataSource.name}
<#else>
No data sources provided ...
</#list>

Iterate Over DataSources Using Wildcard Search
==============================================================================
<#list dataSources?api.find("*") as dataSource>
- ${dataSource.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}

<#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>
{noformat}

Invoking the template using

{code:java}
bin/freemarker-generator -t examples/templates/datasources.ftl 
readme:documentation=README.md bin
{code}

yields

{noformat}
Support Of FreeMarker Directives
==============================================================================
dataSources?has_content: true
dataSources?size: 3

Iterate Over DataSources Using Array-style Access
==============================================================================
- dataSource[0] ==> DataSource{name='readme', group='documentation', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/README.md}
- dataSource[1] ==> 
DataSource{name='/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator',
 group='default', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator}
- dataSource[2] ==> 
DataSource{name='/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat',
 group='default', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat}

Iterate Over DataSources Using Sequence
==============================================================================
- 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 Using Key & Values
==============================================================================
- 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 Using 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

Iterate Over DataSources Using Hash Map Keys
==============================================================================
- 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 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

Access Underlying DataSources API
==============================================================================
DataSources.getNames(): 3
DataSources.getGroups(): 2
DataSources.find("*"): 3
DataSources.find("uri", "*.md"): 1
DataSources.find("extension", "md"): 1

[#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


{noformat}
Support Of FreeMarker Directives
==============================================================================
dataSources?has_content: ${dataSources?has_content?c}
dataSources?size: ${dataSources?size}

Iterate Over DataSources Using Array-style Access
==============================================================================
<#if dataSources?has_content>
<#list 0..dataSources?size-1 as i>
- dataSource[${i}] ==> ${dataSources[i]}
</#list>
<#else>
No data sources provided ...
</#if>

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>

Iterate Over DataSources Using Wildcard Search
==============================================================================
<#list dataSources?api.find("*") as dataSource>
- ${dataSource.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}

<#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>
{noformat}

Invoking the template using

{code:java}
bin/freemarker-generator -t examples/templates/datasources.ftl 
readme:documentation=README.md bin
{code}

yields

{noformat}
Support Of FreeMarker Directives
==============================================================================
dataSources?has_content: true
dataSources?size: 3

Iterate Over DataSources Using Array-style Access
==============================================================================
- dataSource[0] ==> DataSource{name='readme', group='documentation', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/README.md}
- dataSource[1] ==> 
DataSource{name='/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator',
 group='default', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator}
- dataSource[2] ==> 
DataSource{name='/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat',
 group='default', 
uri=file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/bin/freemarker-generator.bat}

Iterate Over DataSources Using Sequence
==============================================================================
- 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 Using Key & Values
==============================================================================
- 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 Using 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

Iterate Over DataSources Using Hash Map Keys
==============================================================================
- 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 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

Access Underlying DataSources API
==============================================================================
DataSources.getNames(): 3
DataSources.getGroups(): 2
DataSources.find("*"): 3
DataSources.find("uri", "*.md"): 1
DataSources.find("extension", "md"): 1

[#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)

Reply via email to