We are having some problems using the latest webtest release with dwr and
javascript templates.
JDK is 1.5.0.11.
Initially, mark pointed us too some improvements made on htmlunit trunk for
regex processing.
I checked out html unit 1.14 tagged release and ported the trunk change for
HTMLUnitRegexProxy to that branch. Everything worked fine for a bit, until our
developers introduced dwr onto a second page. Our stack overflow errors then
reappeared.
[sleep] Exception in thread "HtmlUnit Managed Thread #7:
XMLHttpRequest.send" java.lang.StackOverflowError
[sleep] at java.util.regex.Pattern$Curly.match(Pattern.java:4190)
I've hacked around at the htmlunit source, putting in a bunch of debug
statements to try and narrow the problem.
[sleep] INFO
(com.gargoylesoftware.htmlunit.javascript.regexp.HtmlUnitRegExpProxy$RegExpData)
- After escapeJSCurly re is ^(\s*\S*(\s+\S+)*)\s*$
[sleep] INFO
(com.gargoylesoftware.htmlunit.javascript.regexp.HtmlUnitRegExpProxy) - Pattern
compiled
[sleep] INFO
(com.gargoylesoftware.htmlunit.javascript.regexp.HtmlUnitRegExpProxy) - We are
now calling pattern matcher with string: {var hourTypeIndicators = ["Branch
Working Hours","Specific Hours","Not Available"]}
[sleep] {var hourValues =
["01","02","03","04","05","06","07","08","09","10","11"]}
[sleep] {var minuteValues = ["00","30"]}
[sleep] {var ampmValues = ["AM","PM"]}
[sleep] {var timeWindowSizes = [1, 2, 3,4, 5, 6,7, 8, 9,10, 11, 12,13, 14,
15,16,17, 18, 19,20, 21, 22,23,24]}
[sleep] {if schedulingConfig != null}
[sleep] {if (schedulingConfig.isBranchView)}
I SNIPPED some the code which gets output here, it's a big javascript
template.
[sleep]
[sleep]
[sleep] INFO
(com.gargoylesoftware.htmlunit.javascript.regexp.HtmlUnitRegExpProxy) - The
matcher is created
[sleep] INFO
(com.gargoylesoftware.htmlunit.javascript.regexp.HtmlUnitRegExpProxy) - Calling
replaceAll on the matcher with replacemetn : $1
[sleep] Exception in thread "HtmlUnit Managed Thread #7:
XMLHttpRequest.send" java.lang.StackOverflowError
[sleep] at java.util.regex.Pattern$Curly.match(Pattern.java:4190)
Now the interesting part. I forced HTMLUnit to write out the the context
string, the regex pattern and the flags to 3 respective files. Then I wrote a
small test class to simulate the behavior.
public static void main(String[] args) {
// TODO Auto-generated method stub
Regexp regexp = new Regexp("^(\\s*\\S*(\\s+\\S+)*)\\s*$");
String thisString= null;
byte b[];
try {
FileInputStream fis = new FileInputStream("c:\\string.txt");
int x= fis.available();
b = new byte[x];
fis.read(b);
thisString = new String(b);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("About to compile a pattern");
System.out.println("Regexp is " + regexp.toString());
final Pattern pattern = Pattern.compile(regexp.toString(), 0 );
System.out.println("Pattern compiled");
final Matcher matcher = pattern.matcher(thisString);
System.out.println("The matcher is created ");
String done = matcher.replaceAll("$1");
}
I can't get it to fail. Is the NativeRegExp class coming into play somehow
and causing this bug? I haven't found a way to instantiate it in my test.....
Thanks!
Ruel Loehr