Not long ago Serge, one of DNA’s committers, found a bug when running our XML sequencer with Java 6. Turns out the culprit is actually the Java 6’s SAX parser, which is calling the handler methods for entity references in the wrong order! Ouch!
Normally, when processing an XML entity reference, whether a standard entity like “
<” or a custom one like “
&version;“, the SAX parser first calls
startEntity(String) method on
LexicalHandler with the name of the entity (e.g., “lt”). It then calls the the
character(...) method on
ContentHandler to process the replacement content (e.g., “<“). Finally, the parser then calls
endEntity(String) method on
LexicalHandler (again with the name of the entity).
That’s the way it’s supposed to work. In Java 6, the
startEntity(String) method is called correctly, but the
endEntity(String) method is then called, and the content passed to the
characters(...) includes the replacement content and the next set of content that would be processed. WTF?
I had a tough time finding out whether anyone else hand encountered this. Surely they had – a problem like this? In fact, my search results kept including the DNA bug in the top results. (In hindsight, the only reason we care is that we want to keep the original entity reference rather than use the replacement content, which SAX normally does. So most people may not actually notice the problem.)
But, for the moment, it didn’t matter whether it was a JDK problem or not. We want to release DNA in a few days, and the XML sequencer worked correctly in Java 5, but not in Java 6. So, either find a fix or treat as a known issue. Well, this issue could come up a lot with XML sequencing, so we tried a fix. In fact, I found a workaround that was actually pretty minimal, so now the sequencer works on both Java versions. Score!
Okay, now that DNA was on track, back to the JDK bug. Based upon our unit tests, I had a hunch it was just Java 6 on OS-X. So, would I file the bug with Apple or with Sun? This morning I started working on a simple test to show the problem, which I could use to find out exactly which JDKs were a problem and where I’d need to file the bug.
But then open source to the rescue! Daniel (from the Smooks project) found the same problem and he filed a bug report. Today no less. Turns out my hunch about OS-X was wrong, and it’s a problem in Java 6 and 7. Of course, like a good open-source citizen, Daniel commented on our JIRA issue. That’s how I found out about his bug report. Thanks, Daniel – you saved me some time, and hopefully our initial triaging served you well.
I love how open source works.
Filed under: open source, testing