Padraig --
I did see this before and it is on my list. I've been having a few
challenges here in getting my PC upgraded but that seems to be behind me
so I should get to this in the near future.
Could you please enter this into bugzilla so that it can be tracked?
Thanks,
Gary
Padraig O'hIceadha wrote:
>
> Hi,
>
> Apologies if you have seen this before, I'm resending it as I've
> just read the proto-FAQ and realised I hadn't used the corrent subject line.
>
> I had problems with an XSL output method of html using JDK 1.1. I
> checked that the output method had been set on the transformer but it
> still output with XML format tags (e.g. <BR/>).
>
> I dubugged through the code and found that when the
> output_html.properties file was being loaded the key names were not
> being fixed up correctly.
>
> The relevant entry is :
>
>{http\u003a//xml.apache.org/xslt}content-handler=org.apache.xalan.serialize.SerializerToHTML
>
> JDK 1.x didn't properly expand Unicode escape sequences in Property
> key names (such as \u003a), so
> org.apache.xalan.templates.OutputProperties has some code in the
> loadPropertiesFile method to fix these references.
>
> The code gets an Enumerator for the Properties and enumerates through
> each key. If the key needs fixing it removes the old key and then adds
> it back with the correct key. However the Enumerator is not valid after
> the modification and some of the original values (including
> {http\u003a//xml.apache.org/xslt}content-handler) were being skipped as
> a result and not patched (other keys appeared twice in the enumerator).
>
> From the JDK docs of Hashtable (which Properties inherits its
> implementation of keys() ):
> The Iterators returned by the iterator and listIterator methods of the
> Collections returned by all of Hashtable's "collection view methods" are
> fail-fast: if the Hashtable is structurally modified at any time after
> the Iterator is created, in any way except through the Iterator's own
> remove or add methods, the Iterator will throw a
> ConcurrentModificationException. Thus, in the face of concurrent
> modification, the Iterator fails quickly and cleanly, rather than
> risking arbitrary, non-deterministic behavior at an undetermined time in
> the future. The Enumerations returned by Hashtable's keys and values
> methods are not fail-fast.
>
> The code is structurally modifying the Properties Hashtable
> directly, without going through the Enumeration (which you can't, you
> can only do this with Iterator), so the Enumeration behaves
> non-deterministically and skips some items and visits others more than
> once. By cloning the Properties object and Enumerating the clone we
> ensure that the Properties object that we are enumerating is never
> modified. As we only want the keys this works well.
>
> I changed it to Enumerate a clone of the Properties object and this
> seems to work.
>
> I'm including the patch. Could a committer please review this patch
> and if it is valid make the change in cvs ?
>
> Thanks very much,
>
> Regards,
>
> Padraig
>
> ==========================================================
> --- OutputProperties.java.orig Wed May 23 08:43:14 2001
> +++ OutputProperties.java Fri May 25 17:32:43 2001
> @@ -237,7 +237,7 @@
> // Note that we're working at the HashTable level here,
> // and not at the Properties level! This is important
> // because we don't want to modify the default properties.
> - Enumeration keys = props.keys();
> + Enumeration keys = ((Properties)props.clone()).keys();
> while(keys.hasMoreElements())
> {
> String key = (String)keys.nextElement();
> ==========================================================
>
> Padraig O'hIceadha,
> Chief Technical Architect,
> Gradient Solutions, a Sabre Company
>
> ------------------------------------------------------------------------
> --- OutputProperties.java.orig Wed May 23 08:43:14 2001
> +++ OutputProperties.java Fri May 25 17:32:43 2001
> @@ -237,7 +237,7 @@
> // Note that we're working at the HashTable level here,
> // and not at the Properties level! This is important
> // because we don't want to modify the default properties.
> - Enumeration keys = props.keys();
> + Enumeration keys = ((Properties)props.clone()).keys();
> while(keys.hasMoreElements())
> {
> String key = (String)keys.nextElement();