<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.xml;<a name="line.1"></a>
<FONT color="green">002</FONT>    <a name="line.2"></a>
<FONT color="green">003</FONT>    /*<a name="line.3"></a>
<FONT color="green">004</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.4"></a>
<FONT color="green">005</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.5"></a>
<FONT color="green">006</FONT>     * distributed with this work for additional information<a name="line.6"></a>
<FONT color="green">007</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.7"></a>
<FONT color="green">008</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.8"></a>
<FONT color="green">009</FONT>     * "License"); you may not use this file except in compliance<a name="line.9"></a>
<FONT color="green">010</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     *  http://www.apache.org/licenses/LICENSE-2.0<a name="line.12"></a>
<FONT color="green">013</FONT>     *<a name="line.13"></a>
<FONT color="green">014</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.14"></a>
<FONT color="green">015</FONT>     * software distributed under the License is distributed on an<a name="line.15"></a>
<FONT color="green">016</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.16"></a>
<FONT color="green">017</FONT>     * KIND, either express or implied.  See the License for the<a name="line.17"></a>
<FONT color="green">018</FONT>     * specific language governing permissions and limitations<a name="line.18"></a>
<FONT color="green">019</FONT>     * under the License.<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    <a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.commons.io.IOUtils;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.commons.lang.StringUtils;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.dom4j.Attribute;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.dom4j.Document;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.dom4j.DocumentException;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.dom4j.Element;<a name="line.27"></a>
<FONT color="green">028</FONT>    import org.dom4j.Namespace;<a name="line.28"></a>
<FONT color="green">029</FONT>    import org.dom4j.Node;<a name="line.29"></a>
<FONT color="green">030</FONT>    import org.dom4j.QName;<a name="line.30"></a>
<FONT color="green">031</FONT>    import org.dom4j.XPath;<a name="line.31"></a>
<FONT color="green">032</FONT>    import org.dom4j.io.SAXReader;<a name="line.32"></a>
<FONT color="green">033</FONT>    <a name="line.33"></a>
<FONT color="green">034</FONT>    import java.io.File;<a name="line.34"></a>
<FONT color="green">035</FONT>    import java.io.IOException;<a name="line.35"></a>
<FONT color="green">036</FONT>    import java.io.InputStream;<a name="line.36"></a>
<FONT color="green">037</FONT>    import java.io.InputStreamReader;<a name="line.37"></a>
<FONT color="green">038</FONT>    import java.net.MalformedURLException;<a name="line.38"></a>
<FONT color="green">039</FONT>    import java.net.URL;<a name="line.39"></a>
<FONT color="green">040</FONT>    import java.util.ArrayList;<a name="line.40"></a>
<FONT color="green">041</FONT>    import java.util.HashMap;<a name="line.41"></a>
<FONT color="green">042</FONT>    import java.util.Iterator;<a name="line.42"></a>
<FONT color="green">043</FONT>    import java.util.List;<a name="line.43"></a>
<FONT color="green">044</FONT>    import java.util.Map;<a name="line.44"></a>
<FONT color="green">045</FONT>    <a name="line.45"></a>
<FONT color="green">046</FONT>    /**<a name="line.46"></a>
<FONT color="green">047</FONT>     * XMLReader - a set of common xml utility methods for reading content out of an xml file. <a name="line.47"></a>
<FONT color="green">048</FONT>     *<a name="line.48"></a>
<FONT color="green">049</FONT>     *<a name="line.49"></a>
<FONT color="green">050</FONT>     */<a name="line.50"></a>
<FONT color="green">051</FONT>    public class XMLReader<a name="line.51"></a>
<FONT color="green">052</FONT>    {<a name="line.52"></a>
<FONT color="green">053</FONT>        private URL xmlUrl;<a name="line.53"></a>
<FONT color="green">054</FONT>    <a name="line.54"></a>
<FONT color="green">055</FONT>        private String documentType;<a name="line.55"></a>
<FONT color="green">056</FONT>    <a name="line.56"></a>
<FONT color="green">057</FONT>        private Document document;<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        private Map&lt;String, String&gt; namespaceMap = new HashMap&lt;String, String&gt;();<a name="line.59"></a>
<FONT color="green">060</FONT>    <a name="line.60"></a>
<FONT color="green">061</FONT>        public XMLReader( String type, File file )<a name="line.61"></a>
<FONT color="green">062</FONT>            throws XMLException<a name="line.62"></a>
<FONT color="green">063</FONT>        {<a name="line.63"></a>
<FONT color="green">064</FONT>            if ( !file.exists() )<a name="line.64"></a>
<FONT color="green">065</FONT>            {<a name="line.65"></a>
<FONT color="green">066</FONT>                throw new XMLException( "file does not exist: " + file.getAbsolutePath() );<a name="line.66"></a>
<FONT color="green">067</FONT>            }<a name="line.67"></a>
<FONT color="green">068</FONT>    <a name="line.68"></a>
<FONT color="green">069</FONT>            if ( !file.isFile() )<a name="line.69"></a>
<FONT color="green">070</FONT>            {<a name="line.70"></a>
<FONT color="green">071</FONT>                throw new XMLException( "path is not a file: " + file.getAbsolutePath() );<a name="line.71"></a>
<FONT color="green">072</FONT>            }<a name="line.72"></a>
<FONT color="green">073</FONT>    <a name="line.73"></a>
<FONT color="green">074</FONT>            if ( !file.canRead() )<a name="line.74"></a>
<FONT color="green">075</FONT>            {<a name="line.75"></a>
<FONT color="green">076</FONT>                throw new XMLException( "Cannot read xml file due to permissions: " + file.getAbsolutePath() );<a name="line.76"></a>
<FONT color="green">077</FONT>            }<a name="line.77"></a>
<FONT color="green">078</FONT>    <a name="line.78"></a>
<FONT color="green">079</FONT>            try<a name="line.79"></a>
<FONT color="green">080</FONT>            {<a name="line.80"></a>
<FONT color="green">081</FONT>                init( type, file.toURL() );<a name="line.81"></a>
<FONT color="green">082</FONT>            }<a name="line.82"></a>
<FONT color="green">083</FONT>            catch ( MalformedURLException e )<a name="line.83"></a>
<FONT color="green">084</FONT>            {<a name="line.84"></a>
<FONT color="green">085</FONT>                throw new XMLException( "Unable to translate file " + file + " to URL: " + e.getMessage(), e );<a name="line.85"></a>
<FONT color="green">086</FONT>            }<a name="line.86"></a>
<FONT color="green">087</FONT>        }<a name="line.87"></a>
<FONT color="green">088</FONT>    <a name="line.88"></a>
<FONT color="green">089</FONT>        public XMLReader( String type, URL url )<a name="line.89"></a>
<FONT color="green">090</FONT>            throws XMLException<a name="line.90"></a>
<FONT color="green">091</FONT>        {<a name="line.91"></a>
<FONT color="green">092</FONT>            init( type, url );<a name="line.92"></a>
<FONT color="green">093</FONT>        }<a name="line.93"></a>
<FONT color="green">094</FONT>    <a name="line.94"></a>
<FONT color="green">095</FONT>        private void init( String type, URL url )<a name="line.95"></a>
<FONT color="green">096</FONT>            throws XMLException<a name="line.96"></a>
<FONT color="green">097</FONT>        {<a name="line.97"></a>
<FONT color="green">098</FONT>            this.documentType = type;<a name="line.98"></a>
<FONT color="green">099</FONT>            this.xmlUrl = url;<a name="line.99"></a>
<FONT color="green">100</FONT>    <a name="line.100"></a>
<FONT color="green">101</FONT>            InputStream in = null;<a name="line.101"></a>
<FONT color="green">102</FONT>            SAXReader reader = new SAXReader();<a name="line.102"></a>
<FONT color="green">103</FONT>            <a name="line.103"></a>
<FONT color="green">104</FONT>            try<a name="line.104"></a>
<FONT color="green">105</FONT>            {<a name="line.105"></a>
<FONT color="green">106</FONT>                in = url.openStream();<a name="line.106"></a>
<FONT color="green">107</FONT>                InputStreamReader inReader = new InputStreamReader( in, "UTF-8" );<a name="line.107"></a>
<FONT color="green">108</FONT>                LatinEntityResolutionReader latinReader = new LatinEntityResolutionReader( inReader );<a name="line.108"></a>
<FONT color="green">109</FONT>                this.document = reader.read( latinReader );<a name="line.109"></a>
<FONT color="green">110</FONT>            }<a name="line.110"></a>
<FONT color="green">111</FONT>            catch ( DocumentException e )<a name="line.111"></a>
<FONT color="green">112</FONT>            {<a name="line.112"></a>
<FONT color="green">113</FONT>                throw new XMLException( "Unable to parse " + documentType + " xml " + xmlUrl + ": " + e.getMessage(), e );<a name="line.113"></a>
<FONT color="green">114</FONT>            }<a name="line.114"></a>
<FONT color="green">115</FONT>            catch ( IOException e )<a name="line.115"></a>
<FONT color="green">116</FONT>            {<a name="line.116"></a>
<FONT color="green">117</FONT>                throw new XMLException( "Unable to open stream to " + url + ": " + e.getMessage(), e );<a name="line.117"></a>
<FONT color="green">118</FONT>            }<a name="line.118"></a>
<FONT color="green">119</FONT>            finally<a name="line.119"></a>
<FONT color="green">120</FONT>            {<a name="line.120"></a>
<FONT color="green">121</FONT>                IOUtils.closeQuietly( in );<a name="line.121"></a>
<FONT color="green">122</FONT>            }<a name="line.122"></a>
<FONT color="green">123</FONT>    <a name="line.123"></a>
<FONT color="green">124</FONT>            Element root = this.document.getRootElement();<a name="line.124"></a>
<FONT color="green">125</FONT>            if ( root == null )<a name="line.125"></a>
<FONT color="green">126</FONT>            {<a name="line.126"></a>
<FONT color="green">127</FONT>                throw new XMLException( "Invalid " + documentType + " xml: root element is null." );<a name="line.127"></a>
<FONT color="green">128</FONT>            }<a name="line.128"></a>
<FONT color="green">129</FONT>    <a name="line.129"></a>
<FONT color="green">130</FONT>            if ( !StringUtils.equals( root.getName(), documentType ) )<a name="line.130"></a>
<FONT color="green">131</FONT>            {<a name="line.131"></a>
<FONT color="green">132</FONT>                throw new XMLException( "Invalid " + documentType + " xml: Unexpected root element &lt;" + root.getName()<a name="line.132"></a>
<FONT color="green">133</FONT>                    + "&gt;, expected &lt;" + documentType + "&gt;" );<a name="line.133"></a>
<FONT color="green">134</FONT>            }<a name="line.134"></a>
<FONT color="green">135</FONT>        }<a name="line.135"></a>
<FONT color="green">136</FONT>    <a name="line.136"></a>
<FONT color="green">137</FONT>        public String getDefaultNamespaceURI()<a name="line.137"></a>
<FONT color="green">138</FONT>        {<a name="line.138"></a>
<FONT color="green">139</FONT>            Namespace namespace = this.document.getRootElement().getNamespace();<a name="line.139"></a>
<FONT color="green">140</FONT>            return namespace.getURI();<a name="line.140"></a>
<FONT color="green">141</FONT>        }<a name="line.141"></a>
<FONT color="green">142</FONT>    <a name="line.142"></a>
<FONT color="green">143</FONT>        public void addNamespaceMapping( String elementName, String uri )<a name="line.143"></a>
<FONT color="green">144</FONT>        {<a name="line.144"></a>
<FONT color="green">145</FONT>            this.namespaceMap.put( elementName, uri );<a name="line.145"></a>
<FONT color="green">146</FONT>        }<a name="line.146"></a>
<FONT color="green">147</FONT>    <a name="line.147"></a>
<FONT color="green">148</FONT>        public Element getElement( String xpathExpr )<a name="line.148"></a>
<FONT color="green">149</FONT>            throws XMLException<a name="line.149"></a>
<FONT color="green">150</FONT>        {<a name="line.150"></a>
<FONT color="green">151</FONT>            XPath xpath = createXPath( xpathExpr );<a name="line.151"></a>
<FONT color="green">152</FONT>            Object evaluated = xpath.selectSingleNode( document );<a name="line.152"></a>
<FONT color="green">153</FONT>    <a name="line.153"></a>
<FONT color="green">154</FONT>            if ( evaluated == null )<a name="line.154"></a>
<FONT color="green">155</FONT>            {<a name="line.155"></a>
<FONT color="green">156</FONT>                return null;<a name="line.156"></a>
<FONT color="green">157</FONT>            }<a name="line.157"></a>
<FONT color="green">158</FONT>    <a name="line.158"></a>
<FONT color="green">159</FONT>            if ( evaluated instanceof Element )<a name="line.159"></a>
<FONT color="green">160</FONT>            {<a name="line.160"></a>
<FONT color="green">161</FONT>                return (Element) evaluated;<a name="line.161"></a>
<FONT color="green">162</FONT>            }<a name="line.162"></a>
<FONT color="green">163</FONT>            else<a name="line.163"></a>
<FONT color="green">164</FONT>            {<a name="line.164"></a>
<FONT color="green">165</FONT>                // Unknown evaluated type.<a name="line.165"></a>
<FONT color="green">166</FONT>                throw new XMLException( ".getElement( Expr: " + xpathExpr + " ) resulted in non-Element type -&gt; ("<a name="line.166"></a>
<FONT color="green">167</FONT>                    + evaluated.getClass().getName() + ") " + evaluated );<a name="line.167"></a>
<FONT color="green">168</FONT>            }<a name="line.168"></a>
<FONT color="green">169</FONT>        }<a name="line.169"></a>
<FONT color="green">170</FONT>    <a name="line.170"></a>
<FONT color="green">171</FONT>        private XPath createXPath( String xpathExpr )<a name="line.171"></a>
<FONT color="green">172</FONT>        {<a name="line.172"></a>
<FONT color="green">173</FONT>            XPath xpath = document.createXPath( xpathExpr );<a name="line.173"></a>
<FONT color="green">174</FONT>            if ( !this.namespaceMap.isEmpty() )<a name="line.174"></a>
<FONT color="green">175</FONT>            {<a name="line.175"></a>
<FONT color="green">176</FONT>                xpath.setNamespaceURIs( this.namespaceMap );<a name="line.176"></a>
<FONT color="green">177</FONT>            }<a name="line.177"></a>
<FONT color="green">178</FONT>            return xpath;<a name="line.178"></a>
<FONT color="green">179</FONT>        }<a name="line.179"></a>
<FONT color="green">180</FONT>    <a name="line.180"></a>
<FONT color="green">181</FONT>        public boolean hasElement( String xpathExpr )<a name="line.181"></a>
<FONT color="green">182</FONT>            throws XMLException<a name="line.182"></a>
<FONT color="green">183</FONT>        {<a name="line.183"></a>
<FONT color="green">184</FONT>            XPath xpath = createXPath( xpathExpr );<a name="line.184"></a>
<FONT color="green">185</FONT>            Object evaluated = xpath.selectSingleNode( document );<a name="line.185"></a>
<FONT color="green">186</FONT>    <a name="line.186"></a>
<FONT color="green">187</FONT>            if ( evaluated == null )<a name="line.187"></a>
<FONT color="green">188</FONT>            {<a name="line.188"></a>
<FONT color="green">189</FONT>                return false;<a name="line.189"></a>
<FONT color="green">190</FONT>            }<a name="line.190"></a>
<FONT color="green">191</FONT>    <a name="line.191"></a>
<FONT color="green">192</FONT>            return true;<a name="line.192"></a>
<FONT color="green">193</FONT>        }<a name="line.193"></a>
<FONT color="green">194</FONT>    <a name="line.194"></a>
<FONT color="green">195</FONT>        /**<a name="line.195"></a>
<FONT color="green">196</FONT>         * Remove namespaces from entire document.<a name="line.196"></a>
<FONT color="green">197</FONT>         */<a name="line.197"></a>
<FONT color="green">198</FONT>        public void removeNamespaces()<a name="line.198"></a>
<FONT color="green">199</FONT>        {<a name="line.199"></a>
<FONT color="green">200</FONT>            removeNamespaces( this.document.getRootElement() );<a name="line.200"></a>
<FONT color="green">201</FONT>        }<a name="line.201"></a>
<FONT color="green">202</FONT>    <a name="line.202"></a>
<FONT color="green">203</FONT>        /**<a name="line.203"></a>
<FONT color="green">204</FONT>         * Remove namespaces from element recursively.<a name="line.204"></a>
<FONT color="green">205</FONT>         */<a name="line.205"></a>
<FONT color="green">206</FONT>        @SuppressWarnings("unchecked")<a name="line.206"></a>
<FONT color="green">207</FONT>        public void removeNamespaces( Element elem )<a name="line.207"></a>
<FONT color="green">208</FONT>        {<a name="line.208"></a>
<FONT color="green">209</FONT>            elem.setQName( QName.get( elem.getName(), Namespace.NO_NAMESPACE, elem.getQualifiedName() ) );<a name="line.209"></a>
<FONT color="green">210</FONT>    <a name="line.210"></a>
<FONT color="green">211</FONT>            Node n;<a name="line.211"></a>
<FONT color="green">212</FONT>    <a name="line.212"></a>
<FONT color="green">213</FONT>            Iterator&lt;Node&gt; it = elem.elementIterator();<a name="line.213"></a>
<FONT color="green">214</FONT>            while ( it.hasNext() )<a name="line.214"></a>
<FONT color="green">215</FONT>            {<a name="line.215"></a>
<FONT color="green">216</FONT>                n = it.next();<a name="line.216"></a>
<FONT color="green">217</FONT>    <a name="line.217"></a>
<FONT color="green">218</FONT>                switch ( n.getNodeType() )<a name="line.218"></a>
<FONT color="green">219</FONT>                {<a name="line.219"></a>
<FONT color="green">220</FONT>                    case Node.ATTRIBUTE_NODE:<a name="line.220"></a>
<FONT color="green">221</FONT>                        ( (Attribute) n ).setNamespace( Namespace.NO_NAMESPACE );<a name="line.221"></a>
<FONT color="green">222</FONT>                        break;<a name="line.222"></a>
<FONT color="green">223</FONT>                    case Node.ELEMENT_NODE:<a name="line.223"></a>
<FONT color="green">224</FONT>                        removeNamespaces( (Element) n );<a name="line.224"></a>
<FONT color="green">225</FONT>                        break;<a name="line.225"></a>
<FONT color="green">226</FONT>                }<a name="line.226"></a>
<FONT color="green">227</FONT>            }<a name="line.227"></a>
<FONT color="green">228</FONT>        }<a name="line.228"></a>
<FONT color="green">229</FONT>    <a name="line.229"></a>
<FONT color="green">230</FONT>        public String getElementText( Node context, String xpathExpr )<a name="line.230"></a>
<FONT color="green">231</FONT>            throws XMLException<a name="line.231"></a>
<FONT color="green">232</FONT>        {<a name="line.232"></a>
<FONT color="green">233</FONT>            XPath xpath = createXPath( xpathExpr );<a name="line.233"></a>
<FONT color="green">234</FONT>            Object evaluated = xpath.selectSingleNode( context );<a name="line.234"></a>
<FONT color="green">235</FONT>    <a name="line.235"></a>
<FONT color="green">236</FONT>            if ( evaluated == null )<a name="line.236"></a>
<FONT color="green">237</FONT>            {<a name="line.237"></a>
<FONT color="green">238</FONT>                return null;<a name="line.238"></a>
<FONT color="green">239</FONT>            }<a name="line.239"></a>
<FONT color="green">240</FONT>    <a name="line.240"></a>
<FONT color="green">241</FONT>            if ( evaluated instanceof Element )<a name="line.241"></a>
<FONT color="green">242</FONT>            {<a name="line.242"></a>
<FONT color="green">243</FONT>                Element evalElem = (Element) evaluated;<a name="line.243"></a>
<FONT color="green">244</FONT>                return evalElem.getTextTrim();<a name="line.244"></a>
<FONT color="green">245</FONT>            }<a name="line.245"></a>
<FONT color="green">246</FONT>            else<a name="line.246"></a>
<FONT color="green">247</FONT>            {<a name="line.247"></a>
<FONT color="green">248</FONT>                // Unknown evaluated type.<a name="line.248"></a>
<FONT color="green">249</FONT>                throw new XMLException( ".getElementText( Node, Expr: " + xpathExpr<a name="line.249"></a>
<FONT color="green">250</FONT>                    + " ) resulted in non-Element type -&gt; (" + evaluated.getClass().getName() + ") " + evaluated );<a name="line.250"></a>
<FONT color="green">251</FONT>            }<a name="line.251"></a>
<FONT color="green">252</FONT>        }<a name="line.252"></a>
<FONT color="green">253</FONT>    <a name="line.253"></a>
<FONT color="green">254</FONT>        public String getElementText( String xpathExpr )<a name="line.254"></a>
<FONT color="green">255</FONT>            throws XMLException<a name="line.255"></a>
<FONT color="green">256</FONT>        {<a name="line.256"></a>
<FONT color="green">257</FONT>            XPath xpath = createXPath( xpathExpr );<a name="line.257"></a>
<FONT color="green">258</FONT>            Object evaluated = xpath.selectSingleNode( document );<a name="line.258"></a>
<FONT color="green">259</FONT>    <a name="line.259"></a>
<FONT color="green">260</FONT>            if ( evaluated == null )<a name="line.260"></a>
<FONT color="green">261</FONT>            {<a name="line.261"></a>
<FONT color="green">262</FONT>                return null;<a name="line.262"></a>
<FONT color="green">263</FONT>            }<a name="line.263"></a>
<FONT color="green">264</FONT>    <a name="line.264"></a>
<FONT color="green">265</FONT>            if ( evaluated instanceof Element )<a name="line.265"></a>
<FONT color="green">266</FONT>            {<a name="line.266"></a>
<FONT color="green">267</FONT>                Element evalElem = (Element) evaluated;<a name="line.267"></a>
<FONT color="green">268</FONT>                return evalElem.getTextTrim();<a name="line.268"></a>
<FONT color="green">269</FONT>            }<a name="line.269"></a>
<FONT color="green">270</FONT>            else<a name="line.270"></a>
<FONT color="green">271</FONT>            {<a name="line.271"></a>
<FONT color="green">272</FONT>                // Unknown evaluated type.<a name="line.272"></a>
<FONT color="green">273</FONT>                throw new XMLException( ".getElementText( Expr: " + xpathExpr + " ) resulted in non-Element type -&gt; ("<a name="line.273"></a>
<FONT color="green">274</FONT>                    + evaluated.getClass().getName() + ") " + evaluated );<a name="line.274"></a>
<FONT color="green">275</FONT>            }<a name="line.275"></a>
<FONT color="green">276</FONT>        }<a name="line.276"></a>
<FONT color="green">277</FONT>    <a name="line.277"></a>
<FONT color="green">278</FONT>        @SuppressWarnings("unchecked")<a name="line.278"></a>
<FONT color="green">279</FONT>        public List&lt;Element&gt; getElementList( String xpathExpr )<a name="line.279"></a>
<FONT color="green">280</FONT>            throws XMLException<a name="line.280"></a>
<FONT color="green">281</FONT>        {<a name="line.281"></a>
<FONT color="green">282</FONT>            XPath xpath = createXPath( xpathExpr );<a name="line.282"></a>
<FONT color="green">283</FONT>            Object evaluated = xpath.evaluate( document );<a name="line.283"></a>
<FONT color="green">284</FONT>    <a name="line.284"></a>
<FONT color="green">285</FONT>            if ( evaluated == null )<a name="line.285"></a>
<FONT color="green">286</FONT>            {<a name="line.286"></a>
<FONT color="green">287</FONT>                return null;<a name="line.287"></a>
<FONT color="green">288</FONT>            }<a name="line.288"></a>
<FONT color="green">289</FONT>    <a name="line.289"></a>
<FONT color="green">290</FONT>            /* The xpath.evaluate(Context) method can return:<a name="line.290"></a>
<FONT color="green">291</FONT>             *   1) A Collection or List of dom4j Nodes. <a name="line.291"></a>
<FONT color="green">292</FONT>             *   2) A single dom4j Node.<a name="line.292"></a>
<FONT color="green">293</FONT>             */<a name="line.293"></a>
<FONT color="green">294</FONT>    <a name="line.294"></a>
<FONT color="green">295</FONT>            if ( evaluated instanceof List )<a name="line.295"></a>
<FONT color="green">296</FONT>            {<a name="line.296"></a>
<FONT color="green">297</FONT>                return (List&lt;Element&gt;) evaluated;<a name="line.297"></a>
<FONT color="green">298</FONT>            }<a name="line.298"></a>
<FONT color="green">299</FONT>            else if ( evaluated instanceof Node )<a name="line.299"></a>
<FONT color="green">300</FONT>            {<a name="line.300"></a>
<FONT color="green">301</FONT>                List&lt;Element&gt; ret = new ArrayList&lt;Element&gt;();<a name="line.301"></a>
<FONT color="green">302</FONT>                ret.add( (Element) evaluated );<a name="line.302"></a>
<FONT color="green">303</FONT>                return ret;<a name="line.303"></a>
<FONT color="green">304</FONT>            }<a name="line.304"></a>
<FONT color="green">305</FONT>            else<a name="line.305"></a>
<FONT color="green">306</FONT>            {<a name="line.306"></a>
<FONT color="green">307</FONT>                // Unknown evaluated type.<a name="line.307"></a>
<FONT color="green">308</FONT>                throw new XMLException( ".getElementList( Expr: " + xpathExpr + " ) resulted in non-List type -&gt; ("<a name="line.308"></a>
<FONT color="green">309</FONT>                    + evaluated.getClass().getName() + ") " + evaluated );<a name="line.309"></a>
<FONT color="green">310</FONT>            }<a name="line.310"></a>
<FONT color="green">311</FONT>        }<a name="line.311"></a>
<FONT color="green">312</FONT>    <a name="line.312"></a>
<FONT color="green">313</FONT>        public List&lt;String&gt; getElementListText( String xpathExpr )<a name="line.313"></a>
<FONT color="green">314</FONT>            throws XMLException<a name="line.314"></a>
<FONT color="green">315</FONT>        {<a name="line.315"></a>
<FONT color="green">316</FONT>            List&lt;Element&gt; elemList = getElementList( xpathExpr );<a name="line.316"></a>
<FONT color="green">317</FONT>            if ( elemList == null )<a name="line.317"></a>
<FONT color="green">318</FONT>            {<a name="line.318"></a>
<FONT color="green">319</FONT>                return null;<a name="line.319"></a>
<FONT color="green">320</FONT>            }<a name="line.320"></a>
<FONT color="green">321</FONT>    <a name="line.321"></a>
<FONT color="green">322</FONT>            List&lt;String&gt; ret = new ArrayList&lt;String&gt;();<a name="line.322"></a>
<FONT color="green">323</FONT>            for ( Iterator&lt;Element&gt; iter = elemList.iterator(); iter.hasNext(); )<a name="line.323"></a>
<FONT color="green">324</FONT>            {<a name="line.324"></a>
<FONT color="green">325</FONT>                Element listelem = iter.next();<a name="line.325"></a>
<FONT color="green">326</FONT>                ret.add( listelem.getTextTrim() );<a name="line.326"></a>
<FONT color="green">327</FONT>            }<a name="line.327"></a>
<FONT color="green">328</FONT>            return ret;<a name="line.328"></a>
<FONT color="green">329</FONT>        }<a name="line.329"></a>
<FONT color="green">330</FONT>    <a name="line.330"></a>
<FONT color="green">331</FONT>    }<a name="line.331"></a>




























































</PRE>
</BODY>
</HTML>