Hi all,

thanks Daniel for making the suggestion and PR.

BTW there already  is an extension in
http://commons.apache.org/proper/commons-configuration/userguide/howto_properties.html#Using_PropertiesConfiguration
including a syntax to include other properties files, to be considered
(though that one allows duplicate keys, apparently), also it uses the
${} syntax to load environment variables, also considered a useful
concept for property files by some people. See
https://www.javacodegeeks.com/2015/04/a-way-to-read-properties-with-variable-interpolation.html

I am also sceptical about adding this to groovy core to handle properties files.

First let's document the specification of the idea: What you suggest
is a solution that loads a property file using the JVM Properties
class, and then on lookup of keys, loads the value as usual, but then
applies some interpolations of marked substrings.

I feel as a specification this is not precise enough, and I am not
sure which behaviors of the PR are intended and which ones are
accidental (see my review comments below).

For usability my concern is that when wrapping value lookup by
GProperties, a human reader cannot see that in the properties file,
and so users are left confused as to what happens to any given
properties file. A program could use Properties for one x.properties
file, GProperties for y.properties file, and users of an application
or library can only find out by trial and error which one is used for
which.
If any application or library replaced Properties with GProperties, I
believe the results may be disastrous, because upgrading users would
face any number of runtime exceptions due to new semantics of their
values. It seems there is no backwards compatible upgrade path that
guarantees to users that whatever values they have in the properties
ile, switching to GProperties will maintain those values. Just as a
brainstroming example: if only properties written such as "foo ~= {x}"
would be interpolated, that would be a safe upgrade path (but I
realize the coding would not be as simple as the current PR).

There are also several edge and error cases currently not considered
in the PR, not sure if the PR is just meant as a prototype, but let me
list what I can think of so far:
* infinite cycles in the importing of other properties
* if a properties file imports another one, should the other one be
loaded as Properties file or as GProperties file? Can the user decide?
(the other file may come from a different jar outside the control of
the user).
* infinite cycles in the interpolation of variables
* multiple interpolation when the substitution of a substring contains
a pattern to be interpolated by itself: a=1; b={a}; c=${'{b}'}
* nested interpolations "{foo${key}}"
* unbalanced parentheses '{{key}'
* if we have
# parent.properties
other=parent-other
takeother={other}

# child.properties
import.properties=parent.properties
other=child-other
local={takeother}

Which value will get(takeOther) in child.properties produce, and which
should it produce? What if we involve more files with import
relationships? Suddenly invisible links start creeping up between all
imports.


Some of the problems with the PR may be solvable (such as by using a
single Regex instead of three consecutive ones), but a lot more
test-cases are required, and the semantics of the import statement
remain quite complicated to maintain, and for users to debug. Before
including, I feel much more edge and error case testing should be done
and a more precise specification should be written first.

I don't want to generally discourage the idea, I hope my comments can
help others come up with more concerns, ideas or alternatives.

Reply via email to