Gary Gregory wrote:

Oliver and all:

The text.VariableFormatter class throws an IllegalStateException for the
template "The ${} jumps over the ${}.":

java.lang.IllegalStateException: Infinite loop in property interpolation
of The ${} jumps over the ${}.: ->
        at
org.apache.commons.lang.text.VariableFormatter.doReplace(VariableFormatt
er.java:380)
        at
org.apache.commons.lang.text.VariableFormatter.replaceObject(VariableFor
matter.java:513)
        at
org.apache.commons.lang.text.VariableFormatterTest.testReplaceNoElement(
VariableFormatterTest.java:230)
        at
org.apache.commons.lang.text.VariableFormatterTest.testReplaceNoEmptyKey
s(VariableFormatterTest.java:263)


I would think that replaceObject should just return the pattern string,
which is what happens when other kinds of malformed patterns are
submitted.

Could you fix this? Or do you think this is really the proper behavior?

Thanks,
Gary

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


Attached is a fix (if the list lets it through). The problem was that variables that could not be resolved were not removed from the priorVariables list. Good test case!

Oliver
Index: src/java/org/apache/commons/lang/text/VariableFormatter.java
===================================================================
--- src/java/org/apache/commons/lang/text/VariableFormatter.java        
(Revision 225162)
+++ src/java/org/apache/commons/lang/text/VariableFormatter.java        
(Arbeitskopie)
@@ -390,16 +390,16 @@
                     objResult = doReplace(objResult, priorVariables);
                     result.append(objResult);
                     objLen = objResult.toString().length();
-
-                    // pop the interpolated variable off the stack
-                    // this maintains priorVariables correctness for
-                    // properties with multiple interpolations, e.g.
-                    // 
prop.name=${some.other.prop1}/blahblah/${some.other.prop2}
-                    priorVariables.remove(priorVariables.size() - 1);
                 } else {
                     // variable not defined - so put it back in the value
                     
result.append(getVariablePrefix()).append(variable).append(getVariableSuffix());
                 }
+
+                // pop the interpolated variable off the stack
+                // this maintains priorVariables correctness for
+                // properties with multiple interpolations, e.g.
+                // prop.name=${some.other.prop1}/blahblah/${some.other.prop2}
+                priorVariables.remove(priorVariables.size() - 1);
             }
 
             prec = end;

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to