[
https://issues.apache.org/jira/browse/XERCESJ-1457?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12887229#action_12887229
]
Stephanie Dietzel commented on XERCESJ-1457:
--------------------------------------------
In XSDHandler, the QName is created with non-interned fields, and immediately
passed into the method getGlobalDecl(...), which compares the QName.uri using
the == operator. This control flow suggests it is not a purposeful exception
to the rule and that fields must be interned for both clarity and correctness.
> Sometimes it's okay to break the rules when there are no consequences.
One consequence is readability. The QName documentation states, "To be used
correctly, the strings must be identical references for equal strings." If
this is not true, then could you correct the comment to clarify the
circumstances in which the requirement does not hold? That will help people
who are trying to understand Xerces-J and use it without introducing errors.
Also, it is possible that the small cost of interning may be worth the
improvement in code quality, simplicity, and avoiding future bugs.
> Also note that some of these strings (e.g. the ones in the DTDGrammar)
> may have already been interned somewhere else.
Thanks for pointing this out. Are value and otherValue always interned if they
are Strings? If so, it would be really helpful to document that fact. The
"value" and "otherValue" fields of of XMLContentSpec are not always interned.
For example, see the call to XMLContentSpec.setValues on line 1999 of
DTDGrammar.java, which sets a field to a non-interned array.
> Forgotten calls on intern() for QName fields
> --------------------------------------------
>
> Key: XERCESJ-1457
> URL: https://issues.apache.org/jira/browse/XERCESJ-1457
> Project: Xerces2-J
> Issue Type: Bug
> Components: Other
> Affects Versions: 2.10.0
> Reporter: Stephanie Dietzel
> Attachments: interning-fix.patch
>
> Original Estimate: 0.08h
> Remaining Estimate: 0.08h
>
> In the class Qname.java, the documentation states, "To be used correctly, the
> strings must be identical references for equal strings."
> Here are 26 places where a QName is constructed or modifed with non-interned
> strings.
> This is an efficiency concern, because the non-interned strings may take up
> more memory than interned ones. It is also a correctness concern, because
> Xerces-J performs comparisons against QName fields using ==.
> The attached patch corrects these problems.
> For example, in XIncludeHandler.java,
> new QName(
> XMLSymbols.PREFIX_XMLNS,
> "",
> XMLSymbols.PREFIX_XMLNS + ":",
> NamespaceContext.XMLNS_URI)
> becomes
> new QName(
> XMLSymbols.PREFIX_XMLNS,
> "",
> (XMLSymbols.PREFIX_XMLNS + ":").intern(),
> NamespaceContext.XMLNS_URI)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]