<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Hi Wayne, all.<br>
      <br>
      I created an issue:
      <a class="moz-txt-link-freetext" href="https://github.com/hunterhacker/jdom/issues/120">https://github.com/hunterhacker/jdom/issues/120</a> and I have pushed
      a fix
      <a class="moz-txt-link-freetext" href="https://github.com/hunterhacker/jdom/commit/7d009dea5c1bf3c2c450bb6f4ded551610b7039b">https://github.com/hunterhacker/jdom/commit/7d009dea5c1bf3c2c450bb6f4ded551610b7039b</a>
      for this issue up to github. I will release 2.0.6 in about two
      weeks, unless something else comes up first (this is a 'normal'
      process for JDOM - to delay a release to see if anything else is
      found first).<br>
      <br>
      Feel free to pull/build the code yourself (pull branch 2.0.x) in
      the mean time, or to work around the problem. If you want, I can
      e-mail you a hot-fix jar for JDOM that would contain the fix.<br>
      <br>
      Rolf<br>
      <br>
      On 08/06/2013 11:02 AM, Rolf Lear wrote:<br>
    </div>
    <blockquote cite="mid:51B34784.2070804@tuis.net" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">Hi Wayne.<br>
        <br>
        This is a bug.... thanks. The clone() method of the default
        (Jaxen) implementation does not do a correct clone().<br>
        <br>
        Technically, the Jaxen API requires a Variable 'context', and
        while the clone() operation successfully duplicates the variable
        context, and querying the JDOM wrapper for variable values
        successfully returns the correct data (different sets of
        variables for the original and the clone), the actual Jaxen API
        is *always* given the context from the original instance. The
        JDOM test cases made sure that the right values were set in the
        new instance, and that they were independant of the original
        instance, but did not run through the Jaxen code that had the
        wrong instance....<br>
        <br>
        I will fix this asap.<br>
        <br>
        If you want a workaround.... it seems that a thread-local is a
        good option:<br>
        <br>
        <small><font face="Courier">    private static final
            ThreadLocal<Map<String,XPathExpression<Element>>>
            tl_pathMap = </font><br>
          <font face="Courier">            new
            ThreadLocal<Map<String,XPathExpression<Element>>>()
            {</font><br>
          <font face="Courier">        protected
            Map<String,org.jdom2.xpath.XPathExpression<Element>>
            initialValue() {</font><br>
          <font face="Courier">            XPathFactory fac =
            XPathFactory.instance();</font><br>
          <font face="Courier">           
            HashMap<String,org.jdom2.xpath.XPathExpression<Element>>
            init = new HashMap<String,
            XPathExpression<Element>>();</font><br>
          <font face="Courier">            init.put("method_a",
            fac.compile(....));<br>
                        ......<br>
          </font><font face="Courier">            return init;</font><br>
          <font face="Courier">        }</font><br>
          <font face="Courier">    };</font><br>
        </small><br>
        then you can use it with:<br>
        <br>
        <p class="MsoNormal" style="text-autospace:none"><span
            style="font-size:10.0pt;font-family:Consolas;color:black">                       

            XPathExpression<Element> xPath = </span><i><span
              style="font-size:10.0pt;font-family:Consolas;color:#0000C0">tl_pathMap</span></i><span
            style="font-size:10.0pt;font-family:Consolas;color:black">.get().get(method);</span><span
            style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
        <p class="MsoNormal" style="text-autospace:none"><span
            style="font-size:10.0pt;font-family:Consolas;color:black">                       

            xPath.setVariable(</span><span
            style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"variable"</span><span
            style="font-size:10.0pt;font-family:Consolas;color:black">,
          </span><i><span
              style="font-size:10.0pt;font-family:Consolas;color:#0000C0">namespace</span></i><span
            style="font-size:10.0pt;font-family:Consolas;color:black">,
          </span><span
            style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"fString"</span><span
            style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span
            style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
        <p class="MsoNormal"><span
            style="font-size:10.0pt;font-family:Consolas;color:black">                       

            List<Element> elems =
            xPath.evaluate(model.asDocument());<o:p></o:p></span></p>
        <span style="font-size:10.0pt;font-family:Consolas;color:black"><o:p></o:p></span><br>
        Rolf<br>
        <br>
        <br>
        <br>
        <br>
        On 07/06/2013 2:35 PM, Keeney, Wayne wrote:<br>
      </div>
      <blockquote
cite="mid:1C8985E6271A2E4AAD3D9F2C5BEE5E9031FEFFC0B5@RTL-MAIL01.Integ.Local"
        type="cite">
        <meta http-equiv="Content-Type" content="text/html;
          charset=ISO-8859-1">
        <meta name="Generator" content="Microsoft Word 14 (filtered
          medium)">
        <style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
        <div class="WordSection1">
          <p class="MsoNormal">Here’s hoping this question gets to the
            right place.  <o:p></o:p></p>
          <p class="MsoNormal"><o:p> </o:p></p>
          <p class="MsoNormal">We are using JDOM2 (2.0.3) and it’s my
            understanding that instances of XPathExpression are not
            thread safe.  We were using clone as a (hopefully) more
            efficient method of getting our “own” instance of a pre
            compiled XPathExpression safe from other thread access. 
            This is not my main question, but is it more efficient?<o:p></o:p></p>
          <p class="MsoNormal"><o:p> </o:p></p>
          <p class="MsoNormal">My main question has to do with setting
            variables on the XPathExpression.  I could not get the
            variable setting to work on a cloned copy of an
            XPathExpression, but it works if I set the variable before
            cloning.  The problem with this, is of course, thread
            safety.<o:p></o:p></p>
          <p class="MsoNormal"><o:p> </o:p></p>
          <p class="MsoNormal">Is this a known bug, maybe fixed?  <o:p></o:p></p>
          <p class="MsoNormal"><o:p> </o:p></p>
          <p class="MsoNormal">This works (but opens an opportunity for
            threading problems since we’re using precompiled static
            instances):<o:p></o:p></p>
          <p class="MsoNormal" style="text-autospace:none"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              XPathExpression<Element> xPath = </span><i><span
                style="font-size:10.0pt;font-family:Consolas;color:#0000C0">pathMap</span></i><span
              style="font-size:10.0pt;font-family:Consolas;color:black">.get(method);</span><span
              style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
          <p class="MsoNormal" style="text-autospace:none"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              xPath.setVariable(</span><span
              style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"variable"</span><span
              style="font-size:10.0pt;font-family:Consolas;color:black">,
            </span><i><span
                style="font-size:10.0pt;font-family:Consolas;color:#0000C0">namespace</span></i><span
              style="font-size:10.0pt;font-family:Consolas;color:black">,
            </span><span
              style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"fString"</span><span
              style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span
              style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              List<Element> elems =
              xPath.clone().evaluate(model.asDocument());<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">But

              this doesn’t work, it doesn’t seem to recognize the
              variable replacement:<o:p></o:p></span></p>
          <p class="MsoNormal" style="text-autospace:none"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              XPathExpression<Element> xPath = </span><i><span
                style="font-size:10.0pt;font-family:Consolas;color:#0000C0">pathMap</span></i><span
              style="font-size:10.0pt;font-family:Consolas;color:black">.get(method).clone();</span><span
              style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
          <p class="MsoNormal" style="text-autospace:none"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              xPath.setVariable(</span><span
              style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"variable"</span><span
              style="font-size:10.0pt;font-family:Consolas;color:black">,
            </span><i><span
                style="font-size:10.0pt;font-family:Consolas;color:#0000C0">namespace</span></i><span
              style="font-size:10.0pt;font-family:Consolas;color:black">,
            </span><span
              style="font-size:10.0pt;font-family:Consolas;color:#2A00FF">"fString"</span><span
              style="font-size:10.0pt;font-family:Consolas;color:black">);</span><span
              style="font-size:10.0pt;font-family:Consolas"><o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">                       

              List<Element> elems =
              xPath.evaluate(model.asDocument());<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">pathmap

              is just a map of precompiled XPathExpressions.<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">Thanks,<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black"><o:p> </o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">Wayne

              Keeney<o:p></o:p></span></p>
          <p class="MsoNormal"><span
              style="font-size:10.0pt;font-family:Consolas;color:black">SAT

              Services</span><o:p></o:p></p>
          <p class="MsoNormal"><o:p> </o:p></p>
        </div>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
To control your jdom-interest membership:
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com">http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com</a></pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
To control your jdom-interest membership:
<a class="moz-txt-link-freetext" href="http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com">http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com</a></pre>
    </blockquote>
    <br>
  </body>
</html>