<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.<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 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>