[ 
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]

Reply via email to