Great!
2013/12/9 Guillaume Nodet <[email protected]> > Yeah, I've been fixing a few additional issues in FileInstall in order to > be able to release it. > I'll do it asap. > > > 2013/12/9 Bengt Rodehav <[email protected]> > > > Guillaume, > > > > I've noticed that Karaf 3.0 is getting close. Wouldn't it be good if it > > could include a new FileInstall release? I think FileInstall has been > > greatly improved (at least for my purposes) thanks to the modifications > > you've done recently. > > > > /Bengt > > > > > > 2013/12/5 Bengt Rodehav <[email protected]> > > > > > Just tested - works perfectly! > > > > > > Thanks a lot. When do you think the next release of FileInstall will > take > > > place? > > > > > > /Bengt > > > > > > > > > 2013/12/5 Bengt Rodehav <[email protected]> > > > > > >> OK - I'll test it (possibly tomorrow). > > >> > > >> /Bengt > > >> > > >> > > >> 2013/12/5 Guillaume Nodet <[email protected]> > > >> > > >>> Great. I've just committed a fix for FELIX-4339 > > >>> > > >>> > > >>> 2013/12/5 Bengt Rodehav <[email protected]> > > >>> > > >>> > Yes Guillaume - I agree with the behaviour in your test. All the > > >>> properties > > >>> > should have the same number of backslashes. > > >>> > > > >>> > /Bengt > > >>> > > > >>> > > > >>> > 2013/12/5 Guillaume Nodet <[email protected]> > > >>> > > > >>> > > Yeah, that's clearly FELIX-4339. > > >>> > > I have a fix which makes the following test to succeed: > > >>> > > > > >>> > > public void testMultipleEscapes() > > >>> > > { > > >>> > > LinkedHashMap<String, String> map1 = new > > >>> LinkedHashMap<String, > > >>> > > String>(); > > >>> > > map1.put("a", "$\\\\{var}"); > > >>> > > map1.put("abc", "${ab}c"); > > >>> > > map1.put("ab", "${a}b"); > > >>> > > InterpolationHelper.performSubstitution(map1); > > >>> > > > > >>> > > assertEquals("$\\{var}", map1.get("a")); > > >>> > > assertEquals("$\\{var}b", map1.get("ab")); > > >>> > > assertEquals("$\\{var}bc", map1.get("abc")); > > >>> > > } > > >>> > > > > >>> > > Do we agree that's the behavior we should look for ? > > >>> > > > > >>> > > > > >>> > > > > >>> > > 2013/12/5 Bengt Rodehav <[email protected]> > > >>> > > > > >>> > > > I've now tested FileInstall (and Utils) from trunk. Most things > > >>> seem to > > >>> > > > have been fixed now. In particular: > > >>> > > > > > >>> > > > - I haven't seen any "false" write back of configuration > changes. > > >>> > > > - The variables are not evaluated more than once which makes > > things > > >>> > much > > >>> > > > more deterministic > > >>> > > > > > >>> > > > I've found one remaining issue though. The unescaping is still > > not > > >>> > > > deterministic. Every time the value of a variable is needed, it > > is > > >>> > > > unescaped. I've tested this in Karaf 2.3.3 by putting a file > > called > > >>> > > > test.cfg in the etc directory. I then issue the following > command > > >>> from > > >>> > > the > > >>> > > > Karaf console to see how my configuration is evaluated: > > >>> > > > > > >>> > > > config:list "(service.pid=test)" > > >>> > > > > > >>> > > > What I have found is that the following contents of test.cfg: > > >>> > > > > > >>> > > > a = $\\{var} > > >>> > > > ab = ${a}b > > >>> > > > abc = ${ab}c > > >>> > > > > > >>> > > > evaluates to: > > >>> > > > > > >>> > > > a = ${var} > > >>> > > > ab = ${var}b > > >>> > > > abc = ${var}bc > > >>> > > > > > >>> > > > This is correct (according to me). Note that testing it this > way > > I > > >>> need > > >>> > > two > > >>> > > > backslash characters instead of one as you used Guillaume. > > >>> > > > > > >>> > > > But, assume that I actually want my configuration to include a > > >>> > backslash, > > >>> > > > like this: > > >>> > > > > > >>> > > > a = $\\\\{var} > > >>> > > > ab = ${a}b > > >>> > > > abc = ${ab}c > > >>> > > > > > >>> > > > This evaluates to: > > >>> > > > > > >>> > > > a = $\{var} > > >>> > > > ab = ${var}b > > >>> > > > abc = ${var}bc > > >>> > > > > > >>> > > > Here the variable "a" is OK. But when ${a} is used in the other > > >>> > > variables, > > >>> > > > the backslash is unescaped and lost. This can be seen even more > > >>> clearly > > >>> > > if > > >>> > > > you add two more backslashes. Like this: > > >>> > > > > > >>> > > > a = $\\\\\\\\{var} > > >>> > > > ab = ${a}b > > >>> > > > abc = ${ab}c > > >>> > > > > > >>> > > > We then get: > > >>> > > > > > >>> > > > a = $\\{var} > > >>> > > > ab = $\{var}b > > >>> > > > abc = ${var}bc > > >>> > > > > > >>> > > > Thus, every time the variable "a" is evaluated, a backslash is > > >>> removed. > > >>> > > > > > >>> > > > It would be good if this could be fixed as well so that > > backslashes > > >>> > could > > >>> > > > be part of the configuration in a deterministic way. > > >>> > > > > > >>> > > > Note that the problematic configuration that I had no > workaround > > >>> for > > >>> > now > > >>> > > > works fine. If I put this in the configuration file: > > >>> > > > > > >>> > > > mydir=C:/temp > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > > timestampedfile=$\\{file:onlyname\\}-$\\{date:now:yyyyMMddHHmmssSSS\\}.$\\{file:ext\\} > > >>> > > > > move=${mydir}/archive/$\\{date:now:yyyyMMdd\\}/${timestampedfile} > > >>> > > > moveFailed=${mydir}/failed/${timestampedfile} > > >>> > > > fromUri=file:${mydir}?move=${move}&moveFailed=${moveFailed} > > >>> > > > > > >>> > > > It is evaluated to: > > >>> > > > > > >>> > > > mydir = C:/temp > > >>> > > > timestampedfile = > > >>> > > > ${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext} > > >>> > > > move = > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > > C:/temp/archive/${date:now:yyyyMMdd}/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext} > > >>> > > > moveFailed = > > >>> > > > > > >>> > > > >>> > > C:/temp/failed/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext} > > >>> > > > fromUri = > > >>> > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > > file:C:/temp?move=C:/temp/archive/${date:now:yyyyMMdd}/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext}&moveFailed=C:/temp/failed/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext} > > >>> > > > > > >>> > > > which is what I want. Note that I now only need two backslashes > > to > > >>> make > > >>> > > > this work. > > >>> > > > > > >>> > > > But, if I wanted some part of my configuration to actually > > contain > > >>> a > > >>> > > > backslash then I would run into trouble. > > >>> > > > > > >>> > > > /Bengt > > >>> > > > > > >>> > > > > > >>> > > > > > >>> > > > > > >>> > > > > > >>> > > > > > >>> > > > 2013/12/4 Bengt Rodehav <[email protected]> > > >>> > > > > > >>> > > > > I'll give it a shot. > > >>> > > > > > > >>> > > > > Thanks, > > >>> > > > > > > >>> > > > > /Bengt > > >>> > > > > > > >>> > > > > > > >>> > > > > 2013/12/4 Guillaume Nodet <[email protected]> > > >>> > > > > > > >>> > > > >> Not on the karaf side, but if you build felix utils, file > > >>> install, > > >>> > and > > >>> > > > >> change the karaf version to refer to those new ones and > > >>> rebuild, it > > >>> > > > should > > >>> > > > >> be ok. > > >>> > > > >> > > >>> > > > >> > > >>> > > > >> 2013/12/4 Bengt Rodehav <[email protected]> > > >>> > > > >> > > >>> > > > >> > Will definitely test this out. Thanks a lot. > > >>> > > > >> > > > >>> > > > >> > I assume everything is checked in? > > >>> > > > >> > > > >>> > > > >> > /Bengt > > >>> > > > >> > Den 4 dec 2013 16:09 skrev "Guillaume Nodet" < > > >>> [email protected]>: > > >>> > > > >> > > > >>> > > > >> > > Both are parts of the game. > > >>> > > > >> > > The order actually was significant as shown by the test > > case > > >>> > > mainly > > >>> > > > >> > because > > >>> > > > >> > > of the order difference between the java util Properties > > >>> object > > >>> > > and > > >>> > > > >> the > > >>> > > > >> > > felix Properties object. The first one is relies on a > > >>> Hashtable > > >>> > > > while > > >>> > > > >> > the > > >>> > > > >> > > second relies on a LinkedHashMap. > > >>> > > > >> > > This is significant because of the way the substitution > > was > > >>> > done. > > >>> > > > >> > > if you start from a = $\{var}, ab = ${a}b, abc = ${ab}c > > >>> > > > >> > > you had the following steps: > > >>> > > > >> > > a = $\{var}, ab = ${a}b, abc = ${ab}c > > >>> > > > >> > > a = $\{var}, ab = ${var}b, abc = ${ab}c > > >>> > > > >> > > a = $\{var}, ab = ${var}b, abc = bc > > >>> > > > >> > > The reason is that substitution were done using already > > >>> > > substituted > > >>> > > > >> > > variables, so when computing ${ab}c, it was using > > >>> > > > >> > > ${ab}c > > >>> > > > >> > > ${var}bc > > >>> > > > >> > > bc > > >>> > > > >> > > instead of > > >>> > > > >> > > ${ab}c > > >>> > > > >> > > ${a}bc > > >>> > > > >> > > $\{var}bc > > >>> > > > >> > > ${var}bc > > >>> > > > >> > > So the problem wan't really the order of the values, but > > the > > >>> > fact > > >>> > > > that > > >>> > > > >> > the > > >>> > > > >> > > substitution was done using already substituted values, > > >>> which > > >>> > then > > >>> > > > >> made > > >>> > > > >> > the > > >>> > > > >> > > order significant. > > >>> > > > >> > > > > >>> > > > >> > > Note that the result is now (and irrespective of the > order > > >>> of > > >>> > the > > >>> > > > >> lines): > > >>> > > > >> > > a = ${var}, ab = ${var}b, abc = ${var}bc > > >>> > > > >> > > > > >>> > > > >> > > So I think the escaping is now more deterministic. > Please > > >>> give > > >>> > it > > >>> > > > >> some > > >>> > > > >> > > testing and let me know if you still have problems in > this > > >>> area. > > >>> > > > >> > > > > >>> > > > >> > > 2013/12/4 Bengt Rodehav <[email protected]> > > >>> > > > >> > > > > >>> > > > >> > > > BTW. I did some experimenting with declaring the > > >>> properties in > > >>> > > > >> > different > > >>> > > > >> > > > order in the configuration file. It did not seem to > > >>> matter. I > > >>> > > was > > >>> > > > >> under > > >>> > > > >> > > the > > >>> > > > >> > > > impression that the recursive variable substitution is > > >>> what > > >>> > > makes > > >>> > > > it > > >>> > > > >> > > > non-deterministic. > > >>> > > > >> > > > > > >>> > > > >> > > > If a property has been evaluated already it should not > > be > > >>> > > > evaluated > > >>> > > > >> > again > > >>> > > > >> > > > because another layer of the escape characters will > then > > >>> be > > >>> > > > removed. > > >>> > > > >> > > > > > >>> > > > >> > > > /Bengt > > >>> > > > >> > > > > > >>> > > > >> > > > > > >>> > > > >> > > > 2013/12/4 Bengt Rodehav <[email protected]> > > >>> > > > >> > > > > > >>> > > > >> > > > > OK. > > >>> > > > >> > > > > > > >>> > > > >> > > > > > > >>> > > > >> > > > > 2013/12/4 Guillaume Nodet <[email protected]> > > >>> > > > >> > > > > > > >>> > > > >> > > > >> Unfortunately, it does not seem to be sufficient, > I'm > > >>> > > > >> investigating > > >>> > > > >> > > > >> further > > >>> > > > >> > > > >> > > >>> > > > >> > > > >> > > >>> > > > >> > > > >> 2013/12/4 Bengt Rodehav <[email protected]> > > >>> > > > >> > > > >> > > >>> > > > >> > > > >> > I noticed that you seem to have fixed the issues > I > > >>> had > > >>> > > > reported > > >>> > > > >> > > > >> Guillaume. > > >>> > > > >> > > > >> > Thanks a lot! Looking forward to the next > release. > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > /Bengt > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > 2013/12/2 Bengt Rodehav <[email protected]> > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > Thanks Guillaume! > > >>> > > > >> > > > >> > > > > >>> > > > >> > > > >> > > > > >>> > > > >> > > > >> > > 2013/12/2 Guillaume Nodet < > > [email protected] > > >>> > > > >>> > > > >> > > > >> > > > > >>> > > > >> > > > >> > >> I'll try to have a look at those today or > > >>> tomorrow. > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> 2013/12/2 Bengt Rodehav <[email protected]> > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> > I've replaced FELIX-4332 with FELIX-4338 and > > >>> > > FELIX-4339. > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > I have attached a patch for FELIX-4338 and > > hope > > >>> that > > >>> > > > >> someone > > >>> > > > >> > > can > > >>> > > > >> > > > >> have > > >>> > > > >> > > > >> > a > > >>> > > > >> > > > >> > >> > look at it and possibly commit it. > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > FELIX-4339 is trickier but I would > appreciate > > a > > >>> > > > discussion > > >>> > > > >> > > about > > >>> > > > >> > > > >> how > > >>> > > > >> > > > >> > >> this > > >>> > > > >> > > > >> > >> > should be handled. > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > /Bengt > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > 2013/11/29 Bengt Rodehav <[email protected] > > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > I've tested more with the proposed change > in > > >>> order > > >>> > > to > > >>> > > > >> stop > > >>> > > > >> > > > >> > >> FileInstall to > > >>> > > > >> > > > >> > >> > > incorrectly change the contents of the > > >>> > configuration > > >>> > > > >> file > > >>> > > > >> > > > >> (problem > > >>> > > > >> > > > >> > b) > > >>> > > > >> > > > >> > >> > from > > >>> > > > >> > > > >> > >> > > my previous post). It seems to work fine. > I > > >>> would > > >>> > > > really > > >>> > > > >> > like > > >>> > > > >> > > > >> that > > >>> > > > >> > > > >> > to > > >>> > > > >> > > > >> > >> be > > >>> > > > >> > > > >> > >> > > fixed. Would you like me to create a patch > > >>> > atttached > > >>> > > > to > > >>> > > > >> the > > >>> > > > >> > > > JIRA? > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > Problem a) is probably not trivial to fix. > > >>> I've > > >>> > > > >> > experimented > > >>> > > > >> > > a > > >>> > > > >> > > > >> lot > > >>> > > > >> > > > >> > and > > >>> > > > >> > > > >> > >> > > it's very hard for me to foresee how many > > >>> escape > > >>> > > > >> > characters I > > >>> > > > >> > > > >> need > > >>> > > > >> > > > >> > in > > >>> > > > >> > > > >> > >> > > different circumstances. One real life > > >>> example for > > >>> > > me > > >>> > > > is > > >>> > > > >> > how > > >>> > > > >> > > I > > >>> > > > >> > > > >> > >> configure > > >>> > > > >> > > > >> > >> > an > > >>> > > > >> > > > >> > >> > > integration service that uses a Camel > route > > >>> > > > underneath. > > >>> > > > >> If > > >>> > > > >> > I > > >>> > > > >> > > > put > > >>> > > > >> > > > >> the > > >>> > > > >> > > > >> > >> > > followiing contents in a test.cfg file: > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > *mydir=C:/temp* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > >>> > > > >> > > > > > >>> > > > >> > > > > >>> > > > >> > > > >>> > > > >> > > >>> > > > > > >>> > > > > >>> > > > >>> > > > *timestampedfile=$\\\\{file:onlyname\\\\}-$\\\\{date:now:yyyyMMddHHmmssSSS\\\\}.$\\\\{file:ext\\\\}* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > > >>> > > > >> > > >>> *move=${mydir}/archive/$\\{date:now:yyyyMMdd\\}/${timestampedfile}* > > >>> > > > >> > > > >> > >> > > > > >>> *moveFailed=${mydir}/failed/${timestampedfile}* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > *fromUri=file:${mydir}?move=${move}&moveFailed=${moveFailed}* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > And execute the following command: > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > *config:list "(service.pid=test)"* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > I get the following output: > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > > >>> > > > >> > > >>> *----------------------------------------------------------------* > > >>> > > > >> > > > >> > >> > > *Pid: test* > > >>> > > > >> > > > >> > >> > > *BundleLocation: null* > > >>> > > > >> > > > >> > >> > > *Properties:* > > >>> > > > >> > > > >> > >> > > * moveFailed = > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > >>> > > > >> > > > > > >>> > > > >> > > > > >>> > > > >> > > > >>> > > > >> > > >>> > > > > > >>> > > > > >>> > > > >>> > > > C:/temp/failed/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext}* > > >>> > > > >> > > > >> > >> > > * mydir = C:/temp* > > >>> > > > >> > > > >> > >> > > * timestampedfile = > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > > > >>> > > $\{file:onlyname\}-$\{date:now:yyyyMMddHHmmssSSS\}.$\{file:ext\}* > > >>> > > > >> > > > >> > >> > > * service.pid = test* > > >>> > > > >> > > > >> > >> > > * fromUri = > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > > >>> > > > >> > > >>> file:C:/temp?move=C:/temp/archive//-.&moveFailed=C:/temp/failed/-.* > > >>> > > > >> > > > >> > >> > > * move = > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > >>> > > > >> > > > > > >>> > > > >> > > > > >>> > > > >> > > > >>> > > > >> > > >>> > > > > > >>> > > > > >>> > > > >>> > > > C:/temp/archive/${date:now:yyyyMMdd}/${file:onlyname}-${date:now:yyyyMMddHHmmssSSS}.${file:ext}* > > >>> > > > >> > > > >> > >> > > * felix.fileinstall.filename = > > >>> > > > >> > > > >> > >> > > > > >>> file:/C:/dev/karaf/connect/common/etc/test.cfg* > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > Thus, the variables "move" and > "moveFailed" > > >>> looks > > >>> > > the > > >>> > > > >> way I > > >>> > > > >> > > > want > > >>> > > > >> > > > >> but > > >>> > > > >> > > > >> > >> the > > >>> > > > >> > > > >> > >> > > final variable "fromUri" is messed up > > because > > >>> of > > >>> > an > > >>> > > > >> extra > > >>> > > > >> > > > >> variable > > >>> > > > >> > > > >> > >> > > substitution. > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > I haven't managed to come up with any > number > > >>> of > > >>> > > > >> backslashes > > >>> > > > >> > > > that > > >>> > > > >> > > > >> > will > > >>> > > > >> > > > >> > >> > > produce the correct result for me. > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > The only workaround I have right now is to > > >>> not use > > >>> > > > >> > variables > > >>> > > > >> > > at > > >>> > > > >> > > > >> all. > > >>> > > > >> > > > >> > >> It > > >>> > > > >> > > > >> > >> > > does, however, make the configuration > files > > >>> > > extremely > > >>> > > > >> > verbose > > >>> > > > >> > > > and > > >>> > > > >> > > > >> > it's > > >>> > > > >> > > > >> > >> > easy > > >>> > > > >> > > > >> > >> > > to introduce errors that way. > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > Presently, variable substitution is very > > >>> > > unpredictable > > >>> > > > >> > since > > >>> > > > >> > > > it's > > >>> > > > >> > > > >> > >> being > > >>> > > > >> > > > >> > >> > > done in a recursive way. I would prefer > > doing > > >>> it > > >>> > in > > >>> > > an > > >>> > > > >> > > > iterative > > >>> > > > >> > > > >> > >> manner > > >>> > > > >> > > > >> > >> > to > > >>> > > > >> > > > >> > >> > > make it predictable. E g "${a}" should > > always > > >>> > > evaluate > > >>> > > > >> to > > >>> > > > >> > the > > >>> > > > >> > > > >> same > > >>> > > > >> > > > >> > >> value > > >>> > > > >> > > > >> > >> > no > > >>> > > > >> > > > >> > >> > > matter where in the configuration file it > is > > >>> > > > referenced. > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > /Bengt > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > 2013/11/28 Bengt Rodehav < > [email protected] > > > > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > >> I've investigated this a bit more. There > > are > > >>> > > actually > > >>> > > > >> two > > >>> > > > >> > > > >> different > > >>> > > > >> > > > >> > >> > >> problems: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> a) The number of escape characters I need > > >>> depends > > >>> > > on > > >>> > > > >> from > > >>> > > > >> > > > where > > >>> > > > >> > > > >> I > > >>> > > > >> > > > >> > >> > >> reference the variable. For every > > >>> indirection I > > >>> > > need > > >>> > > > to > > >>> > > > >> > > double > > >>> > > > >> > > > >> the > > >>> > > > >> > > > >> > >> > number > > >>> > > > >> > > > >> > >> > >> of backslashes. This also means that all > > >>> uses of > > >>> > a > > >>> > > > >> > variable > > >>> > > > >> > > > >> > >> containing > > >>> > > > >> > > > >> > >> > >> escape characters must be used from the > > same > > >>> > level > > >>> > > of > > >>> > > > >> > > > >> indirection. > > >>> > > > >> > > > >> > A > > >>> > > > >> > > > >> > >> bit > > >>> > > > >> > > > >> > >> > >> complicated but it's due to the fact that > > all > > >>> > > > variables > > >>> > > > >> > are > > >>> > > > >> > > > >> > evaluated > > >>> > > > >> > > > >> > >> > >> dynamically. This means that unescaping > can > > >>> occur > > >>> > > > >> several > > >>> > > > >> > > > times. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> b) FileInstall incorrectly thinks that a > > >>> > > > configuration > > >>> > > > >> > > > property > > >>> > > > >> > > > >> is > > >>> > > > >> > > > >> > >> > >> changed and therefore overwrites the > > property > > >>> > with > > >>> > > > the > > >>> > > > >> > > > evaluated > > >>> > > > >> > > > >> > >> value. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> I think I've found the reason (and > > possibly a > > >>> > > > >> solution) to > > >>> > > > >> > > b). > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> In the ConfigInstaller.setConfig() method > > the > > >>> > > > >> properties > > >>> > > > >> > are > > >>> > > > >> > > > >> read > > >>> > > > >> > > > >> > >> from a > > >>> > > > >> > > > >> > >> > >> configuration file and propagated as a > > >>> > > configuration. > > >>> > > > >> Here > > >>> > > > >> > > is > > >>> > > > >> > > > an > > >>> > > > >> > > > >> > >> excerpt > > >>> > > > >> > > > >> > >> > >> from that method: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> * final Properties p = new > > >>> > > > >> Properties();* > > >>> > > > >> > > > >> > >> > >> * in.mark(1);* > > >>> > > > >> > > > >> > >> > >> * boolean isXml = > in.read() > > == > > >>> > '<';* > > >>> > > > >> > > > >> > >> > >> * in.reset();* > > >>> > > > >> > > > >> > >> > >> * if (isXml) {* > > >>> > > > >> > > > >> > >> > >> * p.loadFromXML(in);* > > >>> > > > >> > > > >> > >> > >> * } else {* > > >>> > > > >> > > > >> > >> > >> * p.load(in);* > > >>> > > > >> > > > >> > >> > >> * }* > > >>> > > > >> > > > >> > >> > >> * > > >>> > > > >> > > InterpolationHelper.performSubstitution((Map) > > >>> > > > >> > > > >> p, > > >>> > > > >> > > > >> > >> > >> context);* > > >>> > > > >> > > > >> > >> > >> * ht.putAll(p);* > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> Note that the file is read using Java's > > >>> standard > > >>> > > > >> > Properties > > >>> > > > >> > > > >> class. > > >>> > > > >> > > > >> > >> The > > >>> > > > >> > > > >> > >> > >> unescaping is also done by that class. > > Then, > > >>> at > > >>> > the > > >>> > > > >> end, > > >>> > > > >> > the > > >>> > > > >> > > > >> > variable > > >>> > > > >> > > > >> > >> > >> substitution is done as a separate call. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> Then look at the > > >>> > > ConfigInstaller.configurationEvent() > > >>> > > > >> > > method: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> * if (configurationEvent.getType() > > == > > >>> > > > >> > > > >> > >> > >> ConfigurationEvent.CM_UPDATED)* > > >>> > > > >> > > > >> > >> > >> * {* > > >>> > > > >> > > > >> > >> > >> * try* > > >>> > > > >> > > > >> > >> > >> * {* > > >>> > > > >> > > > >> > >> > >> * Configuration config = > > >>> > > > >> > > > >> > >> > >> > getConfigurationAdmin().getConfiguration(* > > >>> > > > >> > > > >> > >> > >> * > > >>> > > > >> > > > >> > >> > configurationEvent.getPid(),* > > >>> > > > >> > > > >> > >> > >> * > > >>> > > > >> > > > >> > >> > >> configurationEvent.getFactoryPid());* > > >>> > > > >> > > > >> > >> > >> * Dictionary dict = > > >>> > > > >> > config.getProperties();* > > >>> > > > >> > > > >> > >> > >> * String fileName = > (String) > > >>> > > dict.get( > > >>> > > > >> > > > >> > >> > >> DirectoryWatcher.FILENAME );* > > >>> > > > >> > > > >> > >> > >> * File file = fileName != > > >>> null ? > > >>> > > > >> > > > >> > >> fromConfigKey(fileName) > > >>> > > > >> > > > >> > >> > : > > >>> > > > >> > > > >> > >> > >> null;* > > >>> > > > >> > > > >> > >> > >> * if( file != null && > > >>> > file.isFile() > > >>> > > > ) > > >>> > > > >> {* > > >>> > > > >> > > > >> > >> > >> * if( > fileName.endsWith( > > >>> > ".cfg" > > >>> > > ) > > >>> > > > )* > > >>> > > > >> > > > >> > >> > >> * {* > > >>> > > > >> > > > >> > >> > >> * > > >>> > > > >> > > > >> > org.apache.felix.utils.properties.Properties > > >>> > > > >> > > > >> > >> > >> props = new > > >>> > > > >> org.apache.felix.utils.properties.Properties( > > >>> > > > >> > > > file, > > >>> > > > >> > > > >> > >> context > > >>> > > > >> > > > >> > >> > );* > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> Note that now the configuration file is > > read > > >>> > using > > >>> > > > >> > > > >> > >> > >> > > org.apache.felix.utils.properties.Properties > > >>> > class. > > >>> > > > It > > >>> > > > >> > turns > > >>> > > > >> > > > out > > >>> > > > >> > > > >> > that > > >>> > > > >> > > > >> > >> > they > > >>> > > > >> > > > >> > >> > >> don't produce identical results. I > haven't > > >>> > > > investigated > > >>> > > > >> > > > exactly > > >>> > > > >> > > > >> how > > >>> > > > >> > > > >> > >> they > > >>> > > > >> > > > >> > >> > >> differ but they do. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> A simple test: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> 1. Create a configuration file with the > > >>> following > > >>> > > > >> content: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> a=$\\\\{var} > > >>> > > > >> > > > >> > >> > >> ab=${a}b > > >>> > > > >> > > > >> > >> > >> abc=${ab}c > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> 2. Add the following line at the end: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> d=foo > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> 3. FileInstall will now incorrectly > change > > >>> the > > >>> > > > >> contents of > > >>> > > > >> > > the > > >>> > > > >> > > > >> > >> > >> configuration file to: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> a=$\\\\{var} > > >>> > > > >> > > > >> > >> > >> ab=${a}b > > >>> > > > >> > > > >> > >> > >> abc = ${var}bc > > >>> > > > >> > > > >> > >> > >> d=foo > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> Now if I change the > > >>> ConfigInstaller.setConfig() > > >>> > > > method > > >>> > > > >> to > > >>> > > > >> > > the > > >>> > > > >> > > > >> > >> following: > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> > > >>> *org.apache.felix.utils.properties.Properties p = > > >>> > > new > > >>> > > > >> > > > >> > >> > >> > > >>> org.apache.felix.utils.properties.Properties( f, > > >>> > > > >> context > > >>> > > > >> > );* > > >>> > > > >> > > > >> > >> > >> > > >>> *InterpolationHelper.performSubstitution((Map) p, > > >>> > > > >> > context);* > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> Then FileInstall will not incorrectly > > change > > >>> the > > >>> > > > >> contents > > >>> > > > >> > of > > >>> > > > >> > > > the > > >>> > > > >> > > > >> > >> > >> configuration file. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> I propose to do this change in order to > > solve > > >>> > > problem > > >>> > > > >> b) > > >>> > > > >> > > > above. > > >>> > > > >> > > > >> I > > >>> > > > >> > > > >> > >> > >> appreciate if you have any thoughts on > > this. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> I realize that problem a) is trickier due > > to > > >>> the > > >>> > > > >> dynamic > > >>> > > > >> > > > nature > > >>> > > > >> > > > >> of > > >>> > > > >> > > > >> > >> > >> variable substitution. I haven't yet > > >>> determined > > >>> > > how I > > >>> > > > >> > think > > >>> > > > >> > > > the > > >>> > > > >> > > > >> > >> escape > > >>> > > > >> > > > >> > >> > >> characters should be handled but the > > current > > >>> > > > situation > > >>> > > > >> is > > >>> > > > >> > > not > > >>> > > > >> > > > >> > ideal. > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> /Bengt > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >> 2013/11/28 Bengt Rodehav < > > [email protected]> > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > >>> JIRA created: > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >>> > > >>> > https://issues.apache.org/jira/browse/FELIX-4332 > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >>> /Bengt > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >>> 2013/11/28 Bengt Rodehav < > > [email protected] > > >>> > > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >>>> I've come up with easily reproducable > > >>> errors > > >>> > > using > > >>> > > > >> Karaf > > >>> > > > >> > > > >> 2.3.3: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> - Install a fresh Karaf 2.3.3 > > >>> > > > >> > > > >> > >> > >>>> - Add the following line to > > >>> > > etc/custom.properties: > > >>> > > > >> > > > >> > >> > >>>> felix.fileinstall.enableConfigSave = > > true > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> Create a file etc/test.cfg with the > > >>> following > > >>> > > > >> contents: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> a=$\\{var} > > >>> > > > >> > > > >> > >> > >>>> ab=${a}b > > >>> > > > >> > > > >> > >> > >>>> abc=${ab}c > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> I expect this to be evaluated to: > > >>> > > > >> > > > >> > >> > >>>> a=$\{var} > > >>> > > > >> > > > >> > >> > >>>> ab=$\{var}b > > >>> > > > >> > > > >> > >> > >>>> abc=$\{var}bc > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> But if I execute the Karaf command: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> config:list "(service.pid=test)" > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> I get: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > > >>> > > > > ---------------------------------------------------------------- > > >>> > > > >> > > > >> > >> > >>>> Pid: test > > >>> > > > >> > > > >> > >> > >>>> BundleLocation: null > > >>> > > > >> > > > >> > >> > >>>> Properties: > > >>> > > > >> > > > >> > >> > >>>> service.pid = test > > >>> > > > >> > > > >> > >> > >>>> a = ${var} > > >>> > > > >> > > > >> > >> > >>>> abc = bc > > >>> > > > >> > > > >> > >> > >>>> felix.fileinstall.filename = > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > file:/C:/dev/Karaf/apache-karaf-2.3.3/etc/test.cfg > > >>> > > > >> > > > >> > >> > >>>> ab = b > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> My interpretation of this is that the > > >>> variable > > >>> > > "a" > > >>> > > > >> has > > >>> > > > >> > > been > > >>> > > > >> > > > >> > >> correctly > > >>> > > > >> > > > >> > >> > >>>> evaluated. But, when evalutating the > > >>> variable > > >>> > > "ab" > > >>> > > > it > > >>> > > > >> > > seems > > >>> > > > >> > > > >> that > > >>> > > > >> > > > >> > >> the > > >>> > > > >> > > > >> > >> > >>>> variable "a" is evaluated again despite > > the > > >>> > fact > > >>> > > > >> that it > > >>> > > > >> > > has > > >>> > > > >> > > > >> > >> already > > >>> > > > >> > > > >> > >> > been > > >>> > > > >> > > > >> > >> > >>>> evaluated. FileInstall now looks for > the > > >>> value > > >>> > > of a > > >>> > > > >> > > variable > > >>> > > > >> > > > >> > called > > >>> > > > >> > > > >> > >> > "var" > > >>> > > > >> > > > >> > >> > >>>> which evalutes to an empty string > because > > >>> there > > >>> > > is > > >>> > > > no > > >>> > > > >> > such > > >>> > > > >> > > > >> > >> variable. > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> The variable "abc" consequently > evaluates > > >>> to > > >>> > "bc" > > >>> > > > >> since > > >>> > > > >> > > the > > >>> > > > >> > > > >> > >> variable > > >>> > > > >> > > > >> > >> > >>>> "ab" has been evaluated to "b". > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> To make it even worse, now change the > > >>> first row > > >>> > > in > > >>> > > > >> > > test.cfg > > >>> > > > >> > > > >> to: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> a=$\\\\{var} > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> We now get: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > > >>> > > > > ---------------------------------------------------------------- > > >>> > > > >> > > > >> > >> > >>>> Pid: test > > >>> > > > >> > > > >> > >> > >>>> BundleLocation: null > > >>> > > > >> > > > >> > >> > >>>> Properties: > > >>> > > > >> > > > >> > >> > >>>> service.pid = test > > >>> > > > >> > > > >> > >> > >>>> a = $\{var} > > >>> > > > >> > > > >> > >> > >>>> abc = ${var}bc > > >>> > > > >> > > > >> > >> > >>>> felix.fileinstall.filename = > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > file:/C:/dev/Karaf/apache-karaf-2.3.3/etc/test.cfg > > >>> > > > >> > > > >> > >> > >>>> ab = ${var}b > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> Thus we get the same phenomenom. The > > >>> variable > > >>> > "a" > > >>> > > > is > > >>> > > > >> > > > evaluated > > >>> > > > >> > > > >> > >> > >>>> differently if it is evaluated on its > own > > >>> or as > > >>> > > > part > > >>> > > > >> of > > >>> > > > >> > > > >> another > > >>> > > > >> > > > >> > >> > expression. > > >>> > > > >> > > > >> > >> > >>>> But, due to having configured > FileInstall > > >>> to > > >>> > > write > > >>> > > > >> back > > >>> > > > >> > > > >> changes, > > >>> > > > >> > > > >> > >> the > > >>> > > > >> > > > >> > >> > >>>> contents of the test.cfg is now changed > > by > > >>> > > > >> FileInstall > > >>> > > > >> > > > despite > > >>> > > > >> > > > >> > the > > >>> > > > >> > > > >> > >> > fact > > >>> > > > >> > > > >> > >> > >>>> that the configuration has not changed > at > > >>> all. > > >>> > > The > > >>> > > > >> > > contents > > >>> > > > >> > > > of > > >>> > > > >> > > > >> > >> > test.cfg is > > >>> > > > >> > > > >> > >> > >>>> now: > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> a=$\\\\{var} > > >>> > > > >> > > > >> > >> > >>>> ab=${a}b > > >>> > > > >> > > > >> > >> > >>>> abc = ${var}bc > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> The "abc" variable has been altered. > > >>> > FileInstall > > >>> > > > has > > >>> > > > >> > > > >> incorrectly > > >>> > > > >> > > > >> > >> > >>>> determined that its value has changed. > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> This is clearly a bug. I will create a > > >>> JIRA. > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> /Bengt > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>> 2013/11/26 Bengt Rodehav < > > >>> [email protected]> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>>>> I'm using Apache Karaf 2.3.3 which > comes > > >>> with > > >>> > > > >> > FileInstall > > >>> > > > >> > > > >> > 3.2.6. I > > >>> > > > >> > > > >> > >> > >>>>> have set the > > >>> > felix.fileinstall.enableConfigSave > > >>> > > > >> > property > > >>> > > > >> > > to > > >>> > > > >> > > > >> true > > >>> > > > >> > > > >> > >> in > > >>> > > > >> > > > >> > >> > order > > >>> > > > >> > > > >> > >> > >>>>> to have FileInstall write back > > >>> configuration > > >>> > > > >> changes to > > >>> > > > >> > > the > > >>> > > > >> > > > >> > file. > > >>> > > > >> > > > >> > >> > Normally > > >>> > > > >> > > > >> > >> > >>>>> all configuration changes are done by > > >>> editing > > >>> > > the > > >>> > > > >> > > > >> configuration > > >>> > > > >> > > > >> > >> file > > >>> > > > >> > > > >> > >> > but > > >>> > > > >> > > > >> > >> > >>>>> there is one property that I change > > >>> > > > programmatically > > >>> > > > >> > > using > > >>> > > > >> > > > >> > >> > ConfigAdmin (an > > >>> > > > >> > > > >> > >> > >>>>> "enable" property to start/stop my > > >>> service). I > > >>> > > am > > >>> > > > >> > > dependent > > >>> > > > >> > > > >> on > > >>> > > > >> > > > >> > >> that > > >>> > > > >> > > > >> > >> > >>>>> property being persisted in the > > >>> configuration > > >>> > > file > > >>> > > > >> > which > > >>> > > > >> > > is > > >>> > > > >> > > > >> why > > >>> > > > >> > > > >> > I > > >>> > > > >> > > > >> > >> > set the > > >>> > > > >> > > > >> > >> > >>>>> enableConfigSave property to true. > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> When configuring FileInstall to write > > back > > >>> > > > >> > configuration > > >>> > > > >> > > > >> changes > > >>> > > > >> > > > >> > >> to > > >>> > > > >> > > > >> > >> > >>>>> the configuration file, it is > important > > >>> that > > >>> > > > >> variables > > >>> > > > >> > > are > > >>> > > > >> > > > >> not > > >>> > > > >> > > > >> > >> > substituted > > >>> > > > >> > > > >> > >> > >>>>> for the evaluated value. This normally > > >>> works > > >>> > > since > > >>> > > > >> > > > >> FileInstall > > >>> > > > >> > > > >> > >> > evalutates > > >>> > > > >> > > > >> > >> > >>>>> the property in the configuration file > > and > > >>> > > > compares > > >>> > > > >> it > > >>> > > > >> > > with > > >>> > > > >> > > > >> the > > >>> > > > >> > > > >> > >> > >>>>> configuration admin's value. If they > are > > >>> the > > >>> > > same, > > >>> > > > >> the > > >>> > > > >> > > > value > > >>> > > > >> > > > >> in > > >>> > > > >> > > > >> > >> the > > >>> > > > >> > > > >> > >> > >>>>> configuration file is kept unchanged. > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> However, when using the escape > character > > >>> this > > >>> > is > > >>> > > > >> > broken. > > >>> > > > >> > > In > > >>> > > > >> > > > >> my > > >>> > > > >> > > > >> > >> case > > >>> > > > >> > > > >> > >> > >>>>> I'm using Apache Camel underneath. > When > > >>> > > > configuring > > >>> > > > >> > > routes > > >>> > > > >> > > > >> via > > >>> > > > >> > > > >> > the > > >>> > > > >> > > > >> > >> > config > > >>> > > > >> > > > >> > >> > >>>>> admin, I sometimes need to set a value > > to > > >>> > > > >> > > > >> > >> > >>>>> > > "${expression-to-be-evaluated-by-camel}". > > >>> I > > >>> > > > >> therefore > > >>> > > > >> > > > escape > > >>> > > > >> > > > >> the > > >>> > > > >> > > > >> > >> "{" > > >>> > > > >> > > > >> > >> > and > > >>> > > > >> > > > >> > >> > >>>>> "}" to stop FileInstall from trying to > > >>> > evaluate > > >>> > > > the > > >>> > > > >> > > > >> expression. > > >>> > > > >> > > > >> > >> Like > > >>> > > > >> > > > >> > >> > this: > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > $\\{expression-to-be-evaluated-by-camel\\} > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> This also normally works but not when > I > > >>> have > > >>> > an > > >>> > > > >> > > > indirection. > > >>> > > > >> > > > >> E g > > >>> > > > >> > > > >> > >> when > > >>> > > > >> > > > >> > >> > >>>>> specifying the following: > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> a=$\\{var} > > >>> > > > >> > > > >> > >> > >>>>> ab=${a}b > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> FileInstall will change the > > configuration > > >>> file > > >>> > > to: > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> a=$\\{var} > > >>> > > > >> > > > >> > >> > >>>>> ab = ${var}b > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> Note that the variable "ab" has now > been > > >>> > > expanded > > >>> > > > >> and > > >>> > > > >> > > > written > > >>> > > > >> > > > >> > >> back to > > >>> > > > >> > > > >> > >> > >>>>> the configuration file even if neither > > of > > >>> the > > >>> > > > >> variables > > >>> > > > >> > > "a" > > >>> > > > >> > > > >> and > > >>> > > > >> > > > >> > >> "ab" > > >>> > > > >> > > > >> > >> > have > > >>> > > > >> > > > >> > >> > >>>>> been changed. > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> I think this is because FileInstall > does > > >>> the > > >>> > > > >> following: > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> 1. Calculates the value of "a" to > > "$\{var} > > >>> > > > >> > > > >> > >> > >>>>> 2. Calculates the value of "b" to > > "${var}b > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> Note that every evaluation will > perform > > >>> > > > >> "unescaping". > > >>> > > > >> > > This > > >>> > > > >> > > > >> means > > >>> > > > >> > > > >> > >> that > > >>> > > > >> > > > >> > >> > >>>>> an extra "unescaping" will be done for > > >>> every > > >>> > > > >> > indirection > > >>> > > > >> > > > >> which > > >>> > > > >> > > > >> > >> fools > > >>> > > > >> > > > >> > >> > >>>>> FileInstall into thinking that the > > >>> property > > >>> > has > > >>> > > > been > > >>> > > > >> > > > changed. > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> I'm not exactly sure how this should > be > > >>> fixed > > >>> > in > > >>> > > > >> > > > FileInstall. > > >>> > > > >> > > > >> > One > > >>> > > > >> > > > >> > >> > idea > > >>> > > > >> > > > >> > >> > >>>>> is to never "unescape" already > evaluated > > >>> > > > variables. > > >>> > > > >> > > > Actually > > >>> > > > >> > > > >> I > > >>> > > > >> > > > >> > >> think > > >>> > > > >> > > > >> > >> > this > > >>> > > > >> > > > >> > >> > >>>>> is probably what would fix this... > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> Does anybody have any ideas about > this? > > >>> > Should I > > >>> > > > >> > create a > > >>> > > > >> > > > >> JIRA? > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> /Bengt > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>>> > > >>> > > > >> > > > >> > >> > >>>> > > >>> > > > >> > > > >> > >> > >>> > > >>> > > > >> > > > >> > >> > >> > > >>> > > > >> > > > >> > >> > > > > >>> > > > >> > > > >> > >> > > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> -- > > >>> > > > >> > > > >> > >> ----------------------- > > >>> > > > >> > > > >> > >> Guillaume Nodet > > >>> > > > >> > > > >> > >> ------------------------ > > >>> > > > >> > > > >> > >> Red Hat, Open Source Integration > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > >> Email: [email protected] > > >>> > > > >> > > > >> > >> Web: http://fusesource.com > > >>> > > > >> > > > >> > >> Blog: http://gnodet.blogspot.com/ > > >>> > > > >> > > > >> > >> > > >>> > > > >> > > > >> > > > > >>> > > > >> > > > >> > > > > >>> > > > >> > > > >> > > > >>> > > > >> > > > >> > > >>> > > > >> > > > > > > >>> > > > >> > > > > > > >>> > > > >> > > > > > >>> > > > >> > > > > >>> > > > >> > > > >>> > > > >> > > >>> > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > >> > > >> > > > > > >

