<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<FONT color="green">003</FONT>     * or more contributor license agreements. See the NOTICE file<a name="line.3"></a>
<FONT color="green">004</FONT>     * distributed with this work for additional information<a name="line.4"></a>
<FONT color="green">005</FONT>     * regarding copyright ownership. The ASF licenses this file<a name="line.5"></a>
<FONT color="green">006</FONT>     * to you under the Apache License, Version 2.0 (the  "License");<a name="line.6"></a>
<FONT color="green">007</FONT>     * you may not use this file except in compliance with the License.<a name="line.7"></a>
<FONT color="green">008</FONT>     * You may obtain a copy of the License at<a name="line.8"></a>
<FONT color="green">009</FONT>     *<a name="line.9"></a>
<FONT color="green">010</FONT>     *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
<FONT color="green">013</FONT>     * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
<FONT color="green">014</FONT>     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
<FONT color="green">015</FONT>     * See the License for the specific language governing permissions and<a name="line.15"></a>
<FONT color="green">016</FONT>     * limitations under the License.<a name="line.16"></a>
<FONT color="green">017</FONT>     */<a name="line.17"></a>
<FONT color="green">018</FONT>    /*<a name="line.18"></a>
<FONT color="green">019</FONT>     * $Id: AttList.java 468654 2006-10-28 07:09:23Z minchau $<a name="line.19"></a>
<FONT color="green">020</FONT>     */<a name="line.20"></a>
<FONT color="green">021</FONT>    package org.apache.xml.serializer.utils;<a name="line.21"></a>
<FONT color="green">022</FONT>    <a name="line.22"></a>
<FONT color="green">023</FONT>    import org.w3c.dom.Attr;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.w3c.dom.NamedNodeMap;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.w3c.dom.Node;<a name="line.25"></a>
<FONT color="green">026</FONT>    <a name="line.26"></a>
<FONT color="green">027</FONT>    import org.xml.sax.Attributes;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    /**<a name="line.29"></a>
<FONT color="green">030</FONT>     * Wraps a DOM attribute list in a SAX Attributes.<a name="line.30"></a>
<FONT color="green">031</FONT>     * <a name="line.31"></a>
<FONT color="green">032</FONT>     * This class is a copy of the one in org.apache.xml.utils. <a name="line.32"></a>
<FONT color="green">033</FONT>     * It exists to cut the serializers dependancy on that package.<a name="line.33"></a>
<FONT color="green">034</FONT>     * A minor changes from that package are:<a name="line.34"></a>
<FONT color="green">035</FONT>     * DOMHelper reference changed to DOM2Helper, class is not "public"<a name="line.35"></a>
<FONT color="green">036</FONT>     *  <a name="line.36"></a>
<FONT color="green">037</FONT>     * This class is not a public API, it is only public because it is <a name="line.37"></a>
<FONT color="green">038</FONT>     * used in org.apache.xml.serializer.<a name="line.38"></a>
<FONT color="green">039</FONT>     * <a name="line.39"></a>
<FONT color="green">040</FONT>     * @xsl.usage internal<a name="line.40"></a>
<FONT color="green">041</FONT>     */<a name="line.41"></a>
<FONT color="green">042</FONT>    public final class AttList implements Attributes<a name="line.42"></a>
<FONT color="green">043</FONT>    {<a name="line.43"></a>
<FONT color="green">044</FONT>    <a name="line.44"></a>
<FONT color="green">045</FONT>      /** List of attribute nodes          */<a name="line.45"></a>
<FONT color="green">046</FONT>      NamedNodeMap m_attrs;<a name="line.46"></a>
<FONT color="green">047</FONT>    <a name="line.47"></a>
<FONT color="green">048</FONT>      /** Index of last attribute node          */<a name="line.48"></a>
<FONT color="green">049</FONT>      int m_lastIndex;<a name="line.49"></a>
<FONT color="green">050</FONT>    <a name="line.50"></a>
<FONT color="green">051</FONT>      // ARGHH!!  JAXP Uses Xerces without setting the namespace processing to ON!<a name="line.51"></a>
<FONT color="green">052</FONT>      // DOM2Helper m_dh = new DOM2Helper();<a name="line.52"></a>
<FONT color="green">053</FONT>    <a name="line.53"></a>
<FONT color="green">054</FONT>      /** Local reference to DOMHelper          */<a name="line.54"></a>
<FONT color="green">055</FONT>      DOM2Helper m_dh;<a name="line.55"></a>
<FONT color="green">056</FONT>    <a name="line.56"></a>
<FONT color="green">057</FONT>    //  /**<a name="line.57"></a>
<FONT color="green">058</FONT>    //   * Constructor AttList<a name="line.58"></a>
<FONT color="green">059</FONT>    //   *<a name="line.59"></a>
<FONT color="green">060</FONT>    //   *<a name="line.60"></a>
<FONT color="green">061</FONT>    //   * @param attrs List of attributes this will contain<a name="line.61"></a>
<FONT color="green">062</FONT>    //   */<a name="line.62"></a>
<FONT color="green">063</FONT>    //  public AttList(NamedNodeMap attrs)<a name="line.63"></a>
<FONT color="green">064</FONT>    //  {<a name="line.64"></a>
<FONT color="green">065</FONT>    //<a name="line.65"></a>
<FONT color="green">066</FONT>    //    m_attrs = attrs;<a name="line.66"></a>
<FONT color="green">067</FONT>    //    m_lastIndex = m_attrs.getLength() - 1;<a name="line.67"></a>
<FONT color="green">068</FONT>    //    m_dh = new DOM2Helper();<a name="line.68"></a>
<FONT color="green">069</FONT>    //  }<a name="line.69"></a>
<FONT color="green">070</FONT>    <a name="line.70"></a>
<FONT color="green">071</FONT>      /**<a name="line.71"></a>
<FONT color="green">072</FONT>       * Constructor AttList<a name="line.72"></a>
<FONT color="green">073</FONT>       *<a name="line.73"></a>
<FONT color="green">074</FONT>       *<a name="line.74"></a>
<FONT color="green">075</FONT>       * @param attrs List of attributes this will contain<a name="line.75"></a>
<FONT color="green">076</FONT>       * @param dh DOMHelper <a name="line.76"></a>
<FONT color="green">077</FONT>       */<a name="line.77"></a>
<FONT color="green">078</FONT>      public AttList(NamedNodeMap attrs, DOM2Helper dh)<a name="line.78"></a>
<FONT color="green">079</FONT>      {<a name="line.79"></a>
<FONT color="green">080</FONT>        <a name="line.80"></a>
<FONT color="green">081</FONT>        m_attrs = attrs;<a name="line.81"></a>
<FONT color="green">082</FONT>        m_lastIndex = m_attrs.getLength() - 1;<a name="line.82"></a>
<FONT color="green">083</FONT>        m_dh = dh;<a name="line.83"></a>
<FONT color="green">084</FONT>      }<a name="line.84"></a>
<FONT color="green">085</FONT>    <a name="line.85"></a>
<FONT color="green">086</FONT>      /**<a name="line.86"></a>
<FONT color="green">087</FONT>       * Get the number of attribute nodes in the list <a name="line.87"></a>
<FONT color="green">088</FONT>       *<a name="line.88"></a>
<FONT color="green">089</FONT>       *<a name="line.89"></a>
<FONT color="green">090</FONT>       * @return number of attribute nodes<a name="line.90"></a>
<FONT color="green">091</FONT>       */<a name="line.91"></a>
<FONT color="green">092</FONT>      public int getLength()<a name="line.92"></a>
<FONT color="green">093</FONT>      {<a name="line.93"></a>
<FONT color="green">094</FONT>        return m_attrs.getLength();<a name="line.94"></a>
<FONT color="green">095</FONT>      }<a name="line.95"></a>
<FONT color="green">096</FONT>    <a name="line.96"></a>
<FONT color="green">097</FONT>      /**<a name="line.97"></a>
<FONT color="green">098</FONT>       * Look up an attribute's Namespace URI by index.<a name="line.98"></a>
<FONT color="green">099</FONT>       *<a name="line.99"></a>
<FONT color="green">100</FONT>       * @param index The attribute index (zero-based).<a name="line.100"></a>
<FONT color="green">101</FONT>       * @return The Namespace URI, or the empty string if none<a name="line.101"></a>
<FONT color="green">102</FONT>       *         is available, or null if the index is out of<a name="line.102"></a>
<FONT color="green">103</FONT>       *         range.<a name="line.103"></a>
<FONT color="green">104</FONT>       */<a name="line.104"></a>
<FONT color="green">105</FONT>      public String getURI(int index)<a name="line.105"></a>
<FONT color="green">106</FONT>      {<a name="line.106"></a>
<FONT color="green">107</FONT>        String ns = m_dh.getNamespaceOfNode(((Attr) m_attrs.item(index)));<a name="line.107"></a>
<FONT color="green">108</FONT>        if(null == ns)<a name="line.108"></a>
<FONT color="green">109</FONT>          ns = "";<a name="line.109"></a>
<FONT color="green">110</FONT>        return ns;<a name="line.110"></a>
<FONT color="green">111</FONT>      }<a name="line.111"></a>
<FONT color="green">112</FONT>    <a name="line.112"></a>
<FONT color="green">113</FONT>      /**<a name="line.113"></a>
<FONT color="green">114</FONT>       * Look up an attribute's local name by index.<a name="line.114"></a>
<FONT color="green">115</FONT>       *<a name="line.115"></a>
<FONT color="green">116</FONT>       * @param index The attribute index (zero-based).<a name="line.116"></a>
<FONT color="green">117</FONT>       * @return The local name, or the empty string if Namespace<a name="line.117"></a>
<FONT color="green">118</FONT>       *         processing is not being performed, or null<a name="line.118"></a>
<FONT color="green">119</FONT>       *         if the index is out of range.<a name="line.119"></a>
<FONT color="green">120</FONT>       */<a name="line.120"></a>
<FONT color="green">121</FONT>      public String getLocalName(int index)<a name="line.121"></a>
<FONT color="green">122</FONT>      {<a name="line.122"></a>
<FONT color="green">123</FONT>        return m_dh.getLocalNameOfNode(((Attr) m_attrs.item(index)));<a name="line.123"></a>
<FONT color="green">124</FONT>      }<a name="line.124"></a>
<FONT color="green">125</FONT>    <a name="line.125"></a>
<FONT color="green">126</FONT>      /**<a name="line.126"></a>
<FONT color="green">127</FONT>       * Look up an attribute's qualified name by index.<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>       * @param i The attribute index (zero-based).<a name="line.130"></a>
<FONT color="green">131</FONT>       *<a name="line.131"></a>
<FONT color="green">132</FONT>       * @return The attribute's qualified name<a name="line.132"></a>
<FONT color="green">133</FONT>       */<a name="line.133"></a>
<FONT color="green">134</FONT>      public String getQName(int i)<a name="line.134"></a>
<FONT color="green">135</FONT>      {<a name="line.135"></a>
<FONT color="green">136</FONT>        return ((Attr) m_attrs.item(i)).getName();<a name="line.136"></a>
<FONT color="green">137</FONT>      }<a name="line.137"></a>
<FONT color="green">138</FONT>    <a name="line.138"></a>
<FONT color="green">139</FONT>      /**<a name="line.139"></a>
<FONT color="green">140</FONT>       * Get the attribute's node type by index<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>       * @param i The attribute index (zero-based)<a name="line.143"></a>
<FONT color="green">144</FONT>       *<a name="line.144"></a>
<FONT color="green">145</FONT>       * @return the attribute's node type<a name="line.145"></a>
<FONT color="green">146</FONT>       */<a name="line.146"></a>
<FONT color="green">147</FONT>      public String getType(int i)<a name="line.147"></a>
<FONT color="green">148</FONT>      {<a name="line.148"></a>
<FONT color="green">149</FONT>        return "CDATA";  // for the moment<a name="line.149"></a>
<FONT color="green">150</FONT>      }<a name="line.150"></a>
<FONT color="green">151</FONT>    <a name="line.151"></a>
<FONT color="green">152</FONT>      /**<a name="line.152"></a>
<FONT color="green">153</FONT>       * Get the attribute's node value by index<a name="line.153"></a>
<FONT color="green">154</FONT>       *<a name="line.154"></a>
<FONT color="green">155</FONT>       *<a name="line.155"></a>
<FONT color="green">156</FONT>       * @param i The attribute index (zero-based)<a name="line.156"></a>
<FONT color="green">157</FONT>       *<a name="line.157"></a>
<FONT color="green">158</FONT>       * @return the attribute's node value<a name="line.158"></a>
<FONT color="green">159</FONT>       */<a name="line.159"></a>
<FONT color="green">160</FONT>      public String getValue(int i)<a name="line.160"></a>
<FONT color="green">161</FONT>      {<a name="line.161"></a>
<FONT color="green">162</FONT>        return ((Attr) m_attrs.item(i)).getValue();<a name="line.162"></a>
<FONT color="green">163</FONT>      }<a name="line.163"></a>
<FONT color="green">164</FONT>    <a name="line.164"></a>
<FONT color="green">165</FONT>      /**<a name="line.165"></a>
<FONT color="green">166</FONT>       * Get the attribute's node type by name<a name="line.166"></a>
<FONT color="green">167</FONT>       *<a name="line.167"></a>
<FONT color="green">168</FONT>       *<a name="line.168"></a>
<FONT color="green">169</FONT>       * @param name Attribute name<a name="line.169"></a>
<FONT color="green">170</FONT>       *<a name="line.170"></a>
<FONT color="green">171</FONT>       * @return the attribute's node type<a name="line.171"></a>
<FONT color="green">172</FONT>       */<a name="line.172"></a>
<FONT color="green">173</FONT>      public String getType(String name)<a name="line.173"></a>
<FONT color="green">174</FONT>      {<a name="line.174"></a>
<FONT color="green">175</FONT>        return "CDATA";  // for the moment<a name="line.175"></a>
<FONT color="green">176</FONT>      }<a name="line.176"></a>
<FONT color="green">177</FONT>    <a name="line.177"></a>
<FONT color="green">178</FONT>      /**<a name="line.178"></a>
<FONT color="green">179</FONT>       * Look up an attribute's type by Namespace name.<a name="line.179"></a>
<FONT color="green">180</FONT>       *<a name="line.180"></a>
<FONT color="green">181</FONT>       * @param uri The Namespace URI, or the empty String if the<a name="line.181"></a>
<FONT color="green">182</FONT>       *        name has no Namespace URI.<a name="line.182"></a>
<FONT color="green">183</FONT>       * @param localName The local name of the attribute.<a name="line.183"></a>
<FONT color="green">184</FONT>       * @return The attribute type as a string, or null if the<a name="line.184"></a>
<FONT color="green">185</FONT>       *         attribute is not in the list or if Namespace<a name="line.185"></a>
<FONT color="green">186</FONT>       *         processing is not being performed.<a name="line.186"></a>
<FONT color="green">187</FONT>       */<a name="line.187"></a>
<FONT color="green">188</FONT>      public String getType(String uri, String localName)<a name="line.188"></a>
<FONT color="green">189</FONT>      {<a name="line.189"></a>
<FONT color="green">190</FONT>        return "CDATA";  // for the moment<a name="line.190"></a>
<FONT color="green">191</FONT>      }<a name="line.191"></a>
<FONT color="green">192</FONT>    <a name="line.192"></a>
<FONT color="green">193</FONT>      /**<a name="line.193"></a>
<FONT color="green">194</FONT>       * Look up an attribute's value by name.<a name="line.194"></a>
<FONT color="green">195</FONT>       *<a name="line.195"></a>
<FONT color="green">196</FONT>       *<a name="line.196"></a>
<FONT color="green">197</FONT>       * @param name The attribute node's name<a name="line.197"></a>
<FONT color="green">198</FONT>       *<a name="line.198"></a>
<FONT color="green">199</FONT>       * @return The attribute node's value<a name="line.199"></a>
<FONT color="green">200</FONT>       */<a name="line.200"></a>
<FONT color="green">201</FONT>      public String getValue(String name)<a name="line.201"></a>
<FONT color="green">202</FONT>      {<a name="line.202"></a>
<FONT color="green">203</FONT>        Attr attr = ((Attr) m_attrs.getNamedItem(name));<a name="line.203"></a>
<FONT color="green">204</FONT>        return (null != attr) <a name="line.204"></a>
<FONT color="green">205</FONT>              ? attr.getValue() : null;<a name="line.205"></a>
<FONT color="green">206</FONT>      }<a name="line.206"></a>
<FONT color="green">207</FONT>    <a name="line.207"></a>
<FONT color="green">208</FONT>      /**<a name="line.208"></a>
<FONT color="green">209</FONT>       * Look up an attribute's value by Namespace name.<a name="line.209"></a>
<FONT color="green">210</FONT>       *<a name="line.210"></a>
<FONT color="green">211</FONT>       * @param uri The Namespace URI, or the empty String if the<a name="line.211"></a>
<FONT color="green">212</FONT>       *        name has no Namespace URI.<a name="line.212"></a>
<FONT color="green">213</FONT>       * @param localName The local name of the attribute.<a name="line.213"></a>
<FONT color="green">214</FONT>       * @return The attribute value as a string, or null if the<a name="line.214"></a>
<FONT color="green">215</FONT>       *         attribute is not in the list.<a name="line.215"></a>
<FONT color="green">216</FONT>       */<a name="line.216"></a>
<FONT color="green">217</FONT>      public String getValue(String uri, String localName)<a name="line.217"></a>
<FONT color="green">218</FONT>      {<a name="line.218"></a>
<FONT color="green">219</FONT>            Node a=m_attrs.getNamedItemNS(uri,localName);<a name="line.219"></a>
<FONT color="green">220</FONT>            return (a==null) ? null : a.getNodeValue();<a name="line.220"></a>
<FONT color="green">221</FONT>      }<a name="line.221"></a>
<FONT color="green">222</FONT>    <a name="line.222"></a>
<FONT color="green">223</FONT>      /**<a name="line.223"></a>
<FONT color="green">224</FONT>       * Look up the index of an attribute by Namespace name.<a name="line.224"></a>
<FONT color="green">225</FONT>       *<a name="line.225"></a>
<FONT color="green">226</FONT>       * @param uri The Namespace URI, or the empty string if<a name="line.226"></a>
<FONT color="green">227</FONT>       *        the name has no Namespace URI.<a name="line.227"></a>
<FONT color="green">228</FONT>       * @param localPart The attribute's local name.<a name="line.228"></a>
<FONT color="green">229</FONT>       * @return The index of the attribute, or -1 if it does not<a name="line.229"></a>
<FONT color="green">230</FONT>       *         appear in the list.<a name="line.230"></a>
<FONT color="green">231</FONT>       */<a name="line.231"></a>
<FONT color="green">232</FONT>      public int getIndex(String uri, String localPart)<a name="line.232"></a>
<FONT color="green">233</FONT>      {<a name="line.233"></a>
<FONT color="green">234</FONT>        for(int i=m_attrs.getLength()-1;i&gt;=0;--i)<a name="line.234"></a>
<FONT color="green">235</FONT>        {<a name="line.235"></a>
<FONT color="green">236</FONT>          Node a=m_attrs.item(i);<a name="line.236"></a>
<FONT color="green">237</FONT>          String u=a.getNamespaceURI();<a name="line.237"></a>
<FONT color="green">238</FONT>          if( (u==null ? uri==null : u.equals(uri))<a name="line.238"></a>
<FONT color="green">239</FONT>          &amp;&amp;<a name="line.239"></a>
<FONT color="green">240</FONT>          a.getLocalName().equals(localPart) )<a name="line.240"></a>
<FONT color="green">241</FONT>        return i;<a name="line.241"></a>
<FONT color="green">242</FONT>        }<a name="line.242"></a>
<FONT color="green">243</FONT>        return -1;<a name="line.243"></a>
<FONT color="green">244</FONT>      }<a name="line.244"></a>
<FONT color="green">245</FONT>    <a name="line.245"></a>
<FONT color="green">246</FONT>      /**<a name="line.246"></a>
<FONT color="green">247</FONT>       * Look up the index of an attribute by raw XML 1.0 name.<a name="line.247"></a>
<FONT color="green">248</FONT>       *<a name="line.248"></a>
<FONT color="green">249</FONT>       * @param qName The qualified (prefixed) name.<a name="line.249"></a>
<FONT color="green">250</FONT>       * @return The index of the attribute, or -1 if it does not<a name="line.250"></a>
<FONT color="green">251</FONT>       *         appear in the list.<a name="line.251"></a>
<FONT color="green">252</FONT>       */<a name="line.252"></a>
<FONT color="green">253</FONT>      public int getIndex(String qName)<a name="line.253"></a>
<FONT color="green">254</FONT>      {<a name="line.254"></a>
<FONT color="green">255</FONT>        for(int i=m_attrs.getLength()-1;i&gt;=0;--i)<a name="line.255"></a>
<FONT color="green">256</FONT>        {<a name="line.256"></a>
<FONT color="green">257</FONT>          Node a=m_attrs.item(i);<a name="line.257"></a>
<FONT color="green">258</FONT>          if(a.getNodeName().equals(qName) )<a name="line.258"></a>
<FONT color="green">259</FONT>        return i;<a name="line.259"></a>
<FONT color="green">260</FONT>        }<a name="line.260"></a>
<FONT color="green">261</FONT>        return -1;<a name="line.261"></a>
<FONT color="green">262</FONT>      }<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>




























































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