Hi Daniel,

I'm an enterprise developer - bad habits die hard :-)

So I closed the following tickets and merged the branches

1) FREEMARKER-129 freemarker-generator: Merge "freemarker-cli" into 
"freemarker-generator"
2) FREEMARKER-134 freemarker-generator: Rename "Document" to "Datasource"
3) FREEMARKER-135 freemarker-generator-cli: Support user-supplied names for 
datasources

Thanks in advance, 

Siegfried Goeschl


> On 29.02.2020, at 12:19, Daniel Dekany <[email protected]> wrote:
> 
> Yeah, and of course, you can merge that branch. You can even work on the
> master directly after all.
> 
> On Sat, Feb 29, 2020 at 12:17 PM Daniel Dekany <[email protected]>
> wrote:
> 
>> But, I do recognize the cattle use case (several "faceless" files with
>> common format/schema). Only, my idea is to push that complexity on the data
>> source. The "data source" concept shields the rest of the application from
>> the details of how the data is stored or retrieved. So, a data source might
>> loads a bunch of log files from a directory, and present them as a single
>> big table, or like a list of tables, etc. So I want to deal with the cattle
>> use case, but the question is what part of the of architecture will deal
>> with this complication, with other words, how do you box things. Why my
>> initial bet is to stuff that complication into the "data source"
>> implementation(s) is that data sources are inherently varied. Some returns
>> a table-like thing, some have multiple named tables (worksheets in Excel),
>> some returns tree of nodes (XML), etc. So then, some might returns a
>> list-of-list-of log records, or just a single list of log-records (put
>> together from daily log files). That way cattles don't add to conceptual
>> complexity. Now, you might be aware of cases where the cattle concept must
>> be more exposed than this, and the we can't box things like this. But this
>> is what I tried to express.
>> 
>> Regarding "output generators", and how that applies on the command line. I
>> think it's important that the common core between Maven and command-line is
>> as fat as possible. Ideally, they are just two syntax to set up the same
>> thing. Mostly at least. So, if you specify a template file to the CLI
>> application, in a way so that it causes it to process that template to
>> generate a single output, then there you have just defined an "output
>> generator" (even if it wasn't explicitly called like that in the command
>> line). If you specify 3 csv files to the CLI application, in a way so that
>> it causes it to generate 3 output files, then you have just defined 3
>> "output generators" there (there's at least one template specified there
>> too, but that wasn't an "output generator" itself, it was just an attribute
>> of the 3 output generators). If you specify 1 template, and 3 csv files, in
>> a way so that it will yield 4 output files (1 for the template, 3 for the
>> csv-s), then you have defined 4 output generators there. If you have a data
>> source that loads a list of 3 entities (say, 3 csv files, so it's a list of
>> tables then), and you have 2 templates, and you tell the CLI to execute
>> each template for each item in said data source, then you have just defined
>> 6 "output generators".
>> 
>> On Fri, Feb 28, 2020 at 11:08 AM Siegfried Goeschl <
>> [email protected]> wrote:
>> 
>>> Hi Daniel,
>>> 
>>> That all depends on your mental model and work you do, expectations,
>>> experience :-)
>>> 
>>> 
>>> __Document Handling__
>>> 
>>> *"But I think actually we have no good use case for list of documents
>>> that's passed at once to a single template run, so, we can just ignore
>>> that complication"*
>>> 
>>> In my case that's not a complication but my daily business - I'm
>>> regularly wading through access logs - yesterday probably a couple of
>>> hundreds access logs across two staging sites to help tracking some
>>> strange API gateway issues :-)
>>> 
>>> My gut feeling is (borrowing from
>>> 
>>> https://medium.com/@Joachim8675309/devops-concepts-pets-vs-cattle-2380b5aab313
>>> )
>>> 
>>> 1. You have a few lovely named documents / templates - `pets`
>>> 2. You have tons of anonymous documents / templates to process -
>>> `cattle`
>>> 3. The "grey area" comes into play when mixing `pets & cattle`
>>> 
>>> `freemarker-cli` was built with 2) in mind and I want to cover 1) since
>>> it is equally important and common.
>>> 
>>> 
>>> __Template And Document Processing Modes__
>>> 
>>> IMHO it is important to answer the following question : "How many
>>> outputs do you get when rendering 2 template and 3 datasources? Two,
>>> Three or Six?"
>>> 
>>> Your answer is influenced by your mental model / experience
>>> 
>>> * When wading through tons of CSV files, access logs, etc. the answer is
>>> "2"
>>> * When doing source code generation the obvious answer is "6"
>>> * Can't image a use case which results in "3" but I'm pretty sure we
>>> will encounter one
>>> 
>>> __Template and document mode probably shouldn't exist__
>>> 
>>> That's hard for me to fully understand - I definitely lack your insights
>>> & experience writing such tools :-)
>>> 
>>> Defining the `Output Generator` is the underlying model for the Maven
>>> plugin (and probably FMPP).
>>> 
>>> I'm not sure if this applies for command lines at least not in the way I
>>> use them (or would like to use them)
>>> 
>>> 
>>> Thanks in advance,
>>> 
>>> Siegfried Goeschl
>>> 
>>> PS: Can/shall I merge the PR to bring in `freemarker-cli`?
>>> 
>>> 
>>> On 28 Feb 2020, at 9:14, Daniel Dekany wrote:
>>> 
>>>> Yeah, "data source" is surely a too popular name, but for reason.
>>>> Anyone
>>>> has other ideas?
>>>> 
>>>> As of naming data sources and such. One thing I was wondering about
>>>> back
>>>> then is how to deal with list of documents given to a template, versus
>>>> exactly 1 document given to a template. But I think actually we have
>>>> no
>>>> good use case for list of documents that's passed at once to a single
>>>> template run, so, we can just ignore that complication. A document has
>>>> a
>>>> name, and that's always just a single document, not a collection, as
>>>> far as
>>>> the template is concerned. (We can have multiple documents per run,
>>>> but
>>>> those normally yield separate output generators, so it's still only
>>>> one
>>>> document per template.) However, we can have data source types
>>>> (document
>>>> types with old terminology) that collect together multiple data files.
>>>> So
>>>> then that complexity is encapsulated into the data source type, and
>>>> doesn't
>>>> complicate the overall architecture. That's another case when a data
>>>> source
>>>> is not just a file. Like maybe there's a data source type that loads
>>>> all
>>>> the CSV-s from a directory, into a single big table (I had such case),
>>>> or
>>>> even into a list of tables. Or, as I mentioned already, a data source
>>>> is
>>>> maybe an SQL query on a JDBC data source (and we got the first term
>>>> clash... JDBC also call them data sources).
>>>> 
>>>> Template and document mode probably shouldn't exist from user
>>>> perspective
>>>> either, at least not as a global option that must apply to everything
>>>> in a
>>>> run. They could just give the files that define the "output
>>>> generators",
>>>> and some of them will be templates, some of them are data files, in
>>>> which
>>>> case a template need to be associated with them (and there can be a
>>>> couple
>>>> of ways of doing that). And then again, there are the cases where you
>>>> want
>>>> to create one output generator per entity from some data source.
>>>> 
>>>> On Fri, Feb 28, 2020 at 8:23 AM Siegfried Goeschl <
>>>> [email protected]> wrote:
>>>> 
>>>>> Hi Daniel,
>>>>> 
>>>>> See my comments below - and thanks for your patience and input :-)
>>>>> 
>>>>> *Renaming Document To DataSource*
>>>>> 
>>>>> Yes, makes sense. I tried to avoid since I'm using javax.activation
>>>>> and
>>>>> its DataSource.
>>>>> 
>>>>> *Template And Document Mode*
>>>>> 
>>>>> Agreed - I think it is a valuable abstraction for the user but it is
>>>>> not
>>>>> an implementation concept :-)
>>>>> 
>>>>> *Document Without Symbolic Names*
>>>>> 
>>>>> Also agreed and it is going to change but I have not settled my mind
>>>>> yet
>>>>> what exactly to implement.
>>>>> 
>>>>> Thanks in advance,
>>>>> 
>>>>> Siegfried Goeschl
>>>>> 
>>>>> On 28 Feb 2020, at 1:05, Daniel Dekany wrote:
>>>>> 
>>>>> A few quick thoughts on that:
>>>>> 
>>>>> - We should replace the "document" term with something more speaking.
>>>>> It
>>>>> doesn't tell that it's some kind of input. Also, most of these inputs
>>>>> aren't something that people typically call documents. Like a csv
>>>>> file, or
>>>>> a database table, which is not even a file (OK we don't support such
>>>>> thing
>>>>> at the moment). I think, maybe "data source" is a safe enough term.
>>>>> (It
>>>>> also rhymes with data model.)
>>>>> - You have separate "template" and "document" "mode", that applies to
>>>>> a
>>>>> whole run. I think such specialization won't be helpful. We could
>>>>> just say,
>>>>> on the conceptual level at lest, that we need a set of "outputs
>>>>> generators". An output generator is an object (in the API) that
>>>>> specifies a
>>>>> template, a data-model (where the data-model is possibly populated
>>>>> with
>>>>> "documents"), and an output "sink" (a file path, or stdout), and can
>>>>> generate the output itself. A practical way of defining the output
>>>>> generators in a CLI application is via a bunch of files, each
>>>>> defining an
>>>>> output generator. Some of those files is maybe a template (that you
>>>>> can
>>>>> even detect from the file extension), or a data file that we
>>>>> currently call
>>>>> a "document". They could freely mix inside the same run. I have also
>>>>> met
>>>>> use case when you have a single table (single "document"), and each
>>>>> record
>>>>> in it yields an output file. That can also be described in some file
>>>>> format, or really in any other way, like directly in command line
>>>>> argument,
>>>>> via API, etc.
>>>>> - You have multiple documents without associated symbolical name in
>>>>> some
>>>>> examples. Templates can't identify those then in a well maintainable
>>>>> way.
>>>>> The actual file name is often not a good identifier, can change over
>>>>> time,
>>>>> and you might don't even have good control over it, like you already
>>>>> receive it as a parameter from somewhere else, or someone
>>>>> moves/renames
>>>>> that files that you need to read. Index is also not very good, but I
>>>>> have
>>>>> written about that earlier.
>>>>> 
>>>>> 
>>>>> On Wed, Feb 26, 2020 at 9:33 AM Siegfried Goeschl <
>>>>> [email protected]> wrote:
>>>>> 
>>>>> Hi folks,
>>>>> 
>>>>> still wrapping my side around but assembled some thoughts here -
>>>>> https://gist.github.com/sgoeschl/b09b343a761b31a6c790d882167ff449
>>>>> 
>>>>> Thanks in advance,
>>>>> 
>>>>> Siegfried Goeschl
>>>>> 
>>>>> 
>>>>> On 23 Feb 2020, at 23:14, Daniel Dekany <[email protected]> wrote:
>>>>> 
>>>>> What you are describing is more like the angle that FMPP took
>>>>> initially,
>>>>> where templates drive things, they generate the output for themselves
>>>>> 
>>>>> (even
>>>>> 
>>>>> multiple output files if they wish). By default output files name
>>>>> (and
>>>>> relative path) is deduced from template name. There was also a global
>>>>> data-model, built in a configuration file (or equally, built via
>>>>> command
>>>>> line arguments, or both mixed), from which templates get whatever
>>>>> data
>>>>> 
>>>>> they
>>>>> 
>>>>> are interested in. Take a look at the figures here:
>>>>> http://fmpp.sourceforge.net/qtour.html. Later, this concept was
>>>>> 
>>>>> generalized
>>>>> 
>>>>> a bit more, because you could add XML files at the same place where
>>>>> you
>>>>> have the templates, and then you could associate transform templates
>>>>> to
>>>>> 
>>>>> the
>>>>> 
>>>>> XML files (based on path pattern and/or the XML document element).
>>>>> Now
>>>>> that's like what freemarker-generator had initially (data files drive
>>>>> output, and the template is there to transform it).
>>>>> 
>>>>> So I think the generic mental model would like this:
>>>>> 
>>>>> 1. You got files that drive the process, let's call them *generator
>>>>> files* for now. Usually, each generator file yields an output file
>>>>> (but
>>>>> maybe even multiple output files, as you might saw in the last
>>>>> figure).
>>>>> These generator files can be of many types, like XML, JSON, XLSX (as
>>>>> 
>>>>> in the
>>>>> 
>>>>> original freemarker-generator), and even templates (as is the norm in
>>>>> FMPP). If the file is not a template, then you got a set of
>>>>> transformer
>>>>> templates (-t CLI option) in a separate directory, which can be
>>>>> 
>>>>> associated
>>>>> 
>>>>> with the generator files base on name patterns, and even based on
>>>>> 
>>>>> content
>>>>> 
>>>>> (schema usually). If the generator file is a template (so that's a
>>>>> positional @Parameter CLI argument that happens to be an *.ftl, and
>>>>> is
>>>>> 
>>>>> not
>>>>> 
>>>>> a template file specified after the "-t" option), then you just
>>>>> Template.process(...) it, and it prints what the output will be.
>>>>> 2. You also have a set of variables, the global data-model, that
>>>>> contains commonly useful stuff, like what you now call parameters
>>>>> (CLI
>>>>> -Pname=value), but also maybe data loaded from JSON, XML, etc.. Those
>>>>> 
>>>>> data
>>>>> 
>>>>> files aren't "generator files". Templates just use them if they need
>>>>> 
>>>>> them.
>>>>> 
>>>>> An important thing here is to reuse the same mechanism to read and
>>>>> 
>>>>> parse
>>>>> 
>>>>> those data files, which was used in templates when transforming
>>>>> 
>>>>> generator
>>>>> 
>>>>> files. So we need a common format for specifying how to load data
>>>>> 
>>>>> files.
>>>>> 
>>>>> That's maybe just FTL that #assigns to the variables, or maybe more
>>>>> declarative format.
>>>>> 
>>>>> What I have described in the original post here was a less generic
>>>>> form
>>>>> 
>>>>> of
>>>>> 
>>>>> this, as I tried to be true with the original approach. I though the
>>>>> proposal will be drastic enough as it is... :) There, the "main"
>>>>> document
>>>>> is the "generator file" from point 1, the "-t" template is the
>>>>> transform
>>>>> template for the "main" document, and the other named documents
>>>>> ("users",
>>>>> "groups") is a poor man's shared data-model from point 2 (together
>>>>> with
>>>>> with -PName=value).
>>>>> 
>>>>> There's further somewhat confusing thing to get right with the
>>>>> list-of-documents (`DocuentList`, `NamedDocumentLists`) thing though.
>>>>> In
>>>>> the model above, as per point 1, if you list multiple data files,
>>>>> each
>>>>> 
>>>>> will
>>>>> 
>>>>> generate a separate output file. So, if you need take in a list of
>>>>> files
>>>>> 
>>>>> to
>>>>> 
>>>>> transform it to a single output file (or at least with a single
>>>>> transform
>>>>> template execution), then you have to be explicit about that, as
>>>>> that's
>>>>> 
>>>>> not
>>>>> 
>>>>> the default behavior anymore. But it's still absolutely possible.
>>>>> Imagine
>>>>> it as a "list of XLSX-es" is itself like a file format. You need some
>>>>> CLI
>>>>> (and Maven config, etc.) syntax to express that, but that shouldn't
>>>>> be a
>>>>> big deal.
>>>>> 
>>>>> 
>>>>> 
>>>>> On Sun, Feb 23, 2020 at 9:43 PM Siegfried Goeschl <
>>>>> [email protected]> wrote:
>>>>> 
>>>>> Hi Daniel,
>>>>> 
>>>>> Good timing - I was looking at a similar problem from different angle
>>>>> yesterday (see below)
>>>>> 
>>>>> Don't have enough time to answer your email in detail now - will do
>>>>> that
>>>>> tomorrow evening
>>>>> 
>>>>> Thanks in advance,
>>>>> 
>>>>> Siegfried Goeschl
>>>>> 
>>>>> 
>>>>> ===. START
>>>>> # FreeMarker CLI Improvement
>>>>> ## Support Of Multiple Template Files
>>>>> Currently we support the following combinations
>>>>> 
>>>>> * Single template and no data files
>>>>> * Single template and one or more data files
>>>>> 
>>>>> But we can not support the following use case which is quite typical
>>>>> in
>>>>> the cloud
>>>>> 
>>>>> __Convert multiple templates with a single data file, e.g copying a
>>>>> directory of configuration files using a JSON configuration file__
>>>>> 
>>>>> ## Implementation notes
>>>>> * When we copy a directory we can remove the `ftl`extension on the
>>>>> fly
>>>>> * We might need an `exclude` filter for the copy operation
>>>>> * Initially resolve to a list of template files and process one after
>>>>> another
>>>>> * Need to calculate the output file location and extension
>>>>> * We need to rename the existing command line parameters (see below)
>>>>> * Do we need multiple include and exclude filter?
>>>>> * Do we need file versus directory filters?
>>>>> 
>>>>> ### Command Line Options
>>>>> ```
>>>>> --input-encoding : Encoding of the documents
>>>>> --output-encoding : Encoding of the rendered template
>>>>> --template-encoding : Encoding of the template
>>>>> --output : Output file or directory
>>>>> --include-document : Include pattern for documents
>>>>> --exclude-document : Exclude pattern for documents
>>>>> --include-template: Include pattern for templates
>>>>> --exclude-template : Exclude pattern for templates
>>>>> ```
>>>>> 
>>>>> ### Command Line Examples
>>>>> ```text
>>>>> # Copy all FTL templates found in "ext/config" to the "/config"
>>>>> 
>>>>> directory
>>>>> 
>>>>> using the data from "config.json"
>>>>> 
>>>>> freemarker-cli -t ./ext/config --include-template *.ftl --o /config
>>>>> 
>>>>> config.json
>>>>> 
>>>>> freemarker-cli --template ./ext/config --include-template *.ftl
>>>>> 
>>>>> --output
>>>>> 
>>>>> /config config.json
>>>>> 
>>>>> # Bascically the same using a named document "configuration"
>>>>> # It might make sense to expose "conf" directly in the FreeMarker
>>>>> data
>>>>> model
>>>>> # It might make sens to allow URIs for loading documents
>>>>> 
>>>>> freemarker-cli -t ./ext/config/*.ftl -o /config -d
>>>>> 
>>>>> configuration=config.json
>>>>> 
>>>>> freemarker-cli --template ./ext/config --include-template *.ftl
>>>>> 
>>>>> --output
>>>>> 
>>>>> /config --document configuration=config.json
>>>>> 
>>>>> freemarker-cli --template ./ext/config --include-template *.ftl
>>>>> 
>>>>> --output
>>>>> 
>>>>> /config --document configuration=file:///config.json
>>>>> 
>>>>> # Bascically the same using an environment variable as named document
>>>>> 
>>>>> freemarker-cli -t ./ext/config --include-template *.ftl -o /config -d
>>>>> 
>>>>> configuration=env:///CONFIGURATION
>>>>> 
>>>>> freemarker-cli --template ./ext/config --include-template *.ftl
>>>>> 
>>>>> --output
>>>>> 
>>>>> /config --document configuration=env:///CONFIGURATION
>>>>> ```
>>>>> === END
>>>>> 
>>>>> On 23.02.2020, at 16:37, Daniel Dekany <[email protected]> wrote:
>>>>> 
>>>>> Input documents is a fundamental concept in freemarker-generator, so
>>>>> we
>>>>> should think about that more, and probably refine/rework how it's
>>>>> done.
>>>>> 
>>>>> Currently it works like this, with CLI at least.
>>>>> 
>>>>> freemarker-cli
>>>>> -t access-report.ftl
>>>>> somewhere/foo-access-log.csv
>>>>> 
>>>>> Then in access-report.ftl you have to do something like this:
>>>>> 
>>>>> <#assign doc = Documents.get(0)>
>>>>> ... process doc here
>>>>> 
>>>>> (The more idiomatic Documents[0] won't work. Actually, that lead to a
>>>>> 
>>>>> funny
>>>>> 
>>>>> chain of coincidences: It returned the string "D", then
>>>>> 
>>>>> CSVTool.parse(...)
>>>>> 
>>>>> happily parsed that to a table with the single column "D", and 0
>>>>> rows,
>>>>> 
>>>>> and
>>>>> 
>>>>> as there were 0 rows, the template didn't run into an error because
>>>>> row.myExpectedColumn refers to a missing column either, so the
>>>>> process
>>>>> finished with success. (: Pretty unlucky for sure. The root was
>>>>> unintentionally breaking a FreeMarker idiom though; eventually we
>>>>> will
>>>>> 
>>>>> have
>>>>> 
>>>>> to work on those too, but, different topic.)
>>>>> 
>>>>> However, actually multiple input documents can be passed in:
>>>>> 
>>>>> freemarker-cli
>>>>> -t access-report.ftl
>>>>> somewhere/foo-access-log.csv
>>>>> somewhere/bar-access-log.csv
>>>>> 
>>>>> Above template will still work, though then you ignored all but the
>>>>> 
>>>>> first
>>>>> 
>>>>> document. So if you expect any number of input documents, you
>>>>> probably
>>>>> 
>>>>> will
>>>>> 
>>>>> have to do this:
>>>>> 
>>>>> <#list Documents.list as doc>
>>>>> ... process doc here
>>>>> </#list>
>>>>> 
>>>>> (The more idiomatic <#list Documents as doc> won't work; but again,
>>>>> 
>>>>> those
>>>>> 
>>>>> we will work out in a different thread.)
>>>>> 
>>>>> 
>>>>> So, what would be better, in my opinion. I start out from what I
>>>>> think
>>>>> 
>>>>> are
>>>>> 
>>>>> the common uses cases, in decreasing order of frequency. Goal is to
>>>>> 
>>>>> make
>>>>> 
>>>>> those less error prone for the users, and simpler to express.
>>>>> 
>>>>> USE CASE 1
>>>>> 
>>>>> You have exactly 1 input documents, which is therefore simply "the"
>>>>> document in the mind of the user. This is probably the typical use
>>>>> 
>>>>> case,
>>>>> 
>>>>> but at least the use case users typically start out from when
>>>>> starting
>>>>> 
>>>>> the
>>>>> 
>>>>> work.
>>>>> 
>>>>> freemarker-cli
>>>>> -t access-report.ftl
>>>>> somewhere/foo-access-log.csv
>>>>> 
>>>>> Then `Documents.get(0)` is not very fitting. Most importantly it's
>>>>> 
>>>>> error
>>>>> 
>>>>> prone, because if the user passed in more than 1 documents (can even
>>>>> 
>>>>> happen
>>>>> 
>>>>> totally accidentally, like if the user was lazy and used a wildcard
>>>>> 
>>>>> that
>>>>> 
>>>>> the shell exploded), the template will silently ignore the rest of
>>>>> the
>>>>> documents, and the singe document processed will be practically
>>>>> picked
>>>>> randomly. The user might won't notice that and submits a bad report
>>>>> or
>>>>> 
>>>>> such.
>>>>> 
>>>>> I think that in this use case the document should be simply referred
>>>>> as
>>>>> `Document` in the template. When you have multiple documents there,
>>>>> referring to `Document` should be an error, saying that the template
>>>>> 
>>>>> was
>>>>> 
>>>>> made to process a single document only.
>>>>> 
>>>>> 
>>>>> USE CASE 2
>>>>> 
>>>>> You have multiple input documents, but each has different role
>>>>> 
>>>>> (different
>>>>> 
>>>>> schema, maybe different file type). Like, you pass in users.csv and
>>>>> groups.csv. Each has difference schema, and so you want to access
>>>>> them
>>>>> differently, but in the same template.
>>>>> 
>>>>> freemarker-cli
>>>>> [...]
>>>>> --named-document users somewhere/foo-users.csv
>>>>> --named-document groups somewhere/foo-groups.csv
>>>>> 
>>>>> Then in the template you could refer to them as:
>>>>> 
>>>>> `NamedDocuments.users`,
>>>>> 
>>>>> and `NamedDocuments.groups`.
>>>>> 
>>>>> Use Case 1, and 2 can be unified into a coherent concept, where
>>>>> 
>>>>> `Document`
>>>>> 
>>>>> is just a shorthand for `NamedDocuments.main`. It's called "main"
>>>>> 
>>>>> because
>>>>> 
>>>>> that's "the" document the template is about, but then you have to
>>>>> added
>>>>> some helper documents, with symbolic names representing their role.
>>>>> 
>>>>> freemarker-cli
>>>>> -t access-report.ftl
>>>>> --document-name=main somewhere/foo-access-log.csv
>>>>> --document-name=users somewhere/foo-users.csv
>>>>> --document-name=groups somewhere/foo-groups.csv
>>>>> 
>>>>> Here, `Document` still works in the template, and it refers to
>>>>> `somewhere/foo-access-log.csv`. (While omitting --document-name=main
>>>>> 
>>>>> above
>>>>> 
>>>>> would be cleaner, I couldn't figure out how to do that with Picocli.
>>>>> Anyway, for now the point is the concept, which is not specific to
>>>>> 
>>>>> CLI.)
>>>>> 
>>>>> USE CASE 3
>>>>> 
>>>>> Here you have several of the same kind of documents. That has a more
>>>>> generic sub-use-case, when you have explicitly named documents (like
>>>>> "users" above), and for some you expect multiple input files.
>>>>> 
>>>>> freemarker-cli
>>>>> -t access-report.ftl
>>>>> --document-name=main somewhere/foo-access-log.csv
>>>>> somewhere/bar-access-log.csv
>>>>> --document-name=users somewhere/foo-users.csv
>>>>> somewhere/bar-users.csv
>>>>> --document-name=groups somewhere/global-groups.csv
>>>>> 
>>>>> The template must to be written with this use case in mind, as now it
>>>>> 
>>>>> has
>>>>> 
>>>>> #list some of the documents. (I think in practice you hardly ever
>>>>> want
>>>>> 
>>>>> to
>>>>> 
>>>>> get a document by hard coded index. Either you don't know how many
>>>>> documents you have, so you can't use hard coded indexes, or you do,
>>>>> and
>>>>> each index has a specific meaning, but then you should name the
>>>>> 
>>>>> documents
>>>>> 
>>>>> instead, as using indexes is error prone, and hard to read.)
>>>>> Accessing that list of documents in the template, maybe could be done
>>>>> 
>>>>> like
>>>>> 
>>>>> this:
>>>>> - For the "main" documents: `DocumentList`
>>>>> - For explicitly named documents, like "users":
>>>>> 
>>>>> `NamedDocumentLists.users`
>>>>> 
>>>>> SUMMING UP
>>>>> 
>>>>> To unify all 3 use cases into a coherent concept:
>>>>> - `NamedDocumentLists.<name>` is the most generic form, and while you
>>>>> 
>>>>> can
>>>>> 
>>>>> achieve everything with it, using it requires your template to handle
>>>>> 
>>>>> the
>>>>> 
>>>>> most generic case too. So, I think it would be rarely used.
>>>>> - `DocumentList` is just a shorthand for `NamedDocumentLists.main`.
>>>>> 
>>>>> It's
>>>>> 
>>>>> used if you only have one kind of documents (single format and
>>>>> schema),
>>>>> 
>>>>> but
>>>>> 
>>>>> potentially multiple of them.
>>>>> - `NamedDocuments.<name>` expresses that you expect exactly 1
>>>>> document
>>>>> 
>>>>> of
>>>>> 
>>>>> the given name.
>>>>> - `Document` is just a shorthand for `NamedDocuments.main`. This is
>>>>> for
>>>>> 
>>>>> the
>>>>> 
>>>>> most natural/frequent use case.
>>>>> 
>>>>> That's 4 possible ways of accessing your documents, which is a
>>>>> 
>>>>> trade-off
>>>>> 
>>>>> for the sake of these:
>>>>> - Catching CLI (or Maven, etc.) input where the template output
>>>>> likely
>>>>> 
>>>>> will
>>>>> 
>>>>> be wrong. That's only possible if the user can communicate its intent
>>>>> 
>>>>> in
>>>>> 
>>>>> the template.
>>>>> - Users don't need to deal with concepts that are irrelevant in their
>>>>> concrete use case. Just start with the trivial, `Document`, and later
>>>>> 
>>>>> if
>>>>> 
>>>>> the need arises, generalize to named documents, document lists, or
>>>>> 
>>>>> both.
>>>>> 
>>>>> What do guys think?
>>>>> 
>>>>> 
>>> 
>> 
>> 
>> --
>> Best regards,
>> Daniel Dekany
>> 
> 
> 
> -- 
> Best regards,
> Daniel Dekany

Reply via email to