1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /*
   6  * Licensed to the Apache Software Foundation (ASF) under one or more
   7  * contributor license agreements.  See the NOTICE file distributed with
   8  * this work for additional information regarding copyright ownership.
   9  * The ASF licenses this file to You under the Apache License, Version 2.0
  10  * (the "License"); you may not use this file except in compliance with
  11  * the License.  You may obtain a copy of the License at
  12  *
  13  *      http://www.apache.org/licenses/LICENSE-2.0
  14  *
  15  * Unless required by applicable law or agreed to in writing, software
  16  * distributed under the License is distributed on an "AS IS" BASIS,
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18  * See the License for the specific language governing permissions and
  19  * limitations under the License.
  20  */
  21 
  22 package com.sun.org.apache.xml.internal.serializer.utils;
  23 
  24 import org.w3c.dom.Attr;
  25 import org.w3c.dom.NamedNodeMap;
  26 import org.w3c.dom.Node;
  27 
  28 import org.xml.sax.Attributes;
  29 
  30 /**
  31  * Wraps a DOM attribute list in a SAX Attributes.
  32  *
  33  * This class is a copy of the one in com.sun.org.apache.xml.internal.utils.
  34  * It exists to cut the serializers dependancy on that package.
  35  * A minor changes from that package are:
  36  * DOMHelper reference changed to DOM2Helper, class is not "public"
  37  *
  38  * This class is not a public API, it is only public because it is
  39  * used in com.sun.org.apache.xml.internal.serializer.
  40  *
  41  * @xsl.usage internal
  42  */
  43 public final class AttList implements Attributes
  44 {
  45 
  46   /** List of attribute nodes          */
  47   NamedNodeMap m_attrs;
  48 
  49   /** Index of last attribute node          */
  50   int m_lastIndex;
  51 
  52   // ARGHH!!  JAXP Uses Xerces without setting the namespace processing to ON!
  53   // DOM2Helper m_dh = new DOM2Helper();
  54 
  55   /** Local reference to DOMHelper          */
  56   DOM2Helper m_dh;
  57 
  58 //  /**
  59 //   * Constructor AttList
  60 //   *
  61 //   *
  62 //   * @param attrs List of attributes this will contain
  63 //   */
  64 //  public AttList(NamedNodeMap attrs)
  65 //  {
  66 //
  67 //    m_attrs = attrs;
  68 //    m_lastIndex = m_attrs.getLength() - 1;
  69 //    m_dh = new DOM2Helper();
  70 //  }
  71 
  72   /**
  73    * Constructor AttList
  74    *
  75    *
  76    * @param attrs List of attributes this will contain
  77    * @param dh DOMHelper
  78    */
  79   public AttList(NamedNodeMap attrs, DOM2Helper dh)
  80   {
  81 
  82     m_attrs = attrs;
  83     m_lastIndex = m_attrs.getLength() - 1;
  84     m_dh = dh;
  85   }
  86 
  87   /**
  88    * Get the number of attribute nodes in the list
  89    *
  90    *
  91    * @return number of attribute nodes
  92    */
  93   public int getLength()
  94   {
  95     return m_attrs.getLength();
  96   }
  97 
  98   /**
  99    * Look up an attribute's Namespace URI by index.
 100    *
 101    * @param index The attribute index (zero-based).
 102    * @return The Namespace URI, or the empty string if none
 103    *         is available, or null if the index is out of
 104    *         range.
 105    */
 106   public String getURI(int index)
 107   {
 108     String ns = m_dh.getNamespaceOfNode(((Attr) m_attrs.item(index)));
 109     if(null == ns)
 110       ns = "";
 111     return ns;
 112   }
 113 
 114   /**
 115    * Look up an attribute's local name by index.
 116    *
 117    * @param index The attribute index (zero-based).
 118    * @return The local name, or the empty string if Namespace
 119    *         processing is not being performed, or null
 120    *         if the index is out of range.
 121    */
 122   public String getLocalName(int index)
 123   {
 124     return m_dh.getLocalNameOfNode(((Attr) m_attrs.item(index)));
 125   }
 126 
 127   /**
 128    * Look up an attribute's qualified name by index.
 129    *
 130    *
 131    * @param i The attribute index (zero-based).
 132    *
 133    * @return The attribute's qualified name
 134    */
 135   public String getQName(int i)
 136   {
 137     return ((Attr) m_attrs.item(i)).getName();
 138   }
 139 
 140   /**
 141    * Get the attribute's node type by index
 142    *
 143    *
 144    * @param i The attribute index (zero-based)
 145    *
 146    * @return the attribute's node type
 147    */
 148   public String getType(int i)
 149   {
 150     return "CDATA";  // for the moment
 151   }
 152 
 153   /**
 154    * Get the attribute's node value by index
 155    *
 156    *
 157    * @param i The attribute index (zero-based)
 158    *
 159    * @return the attribute's node value
 160    */
 161   public String getValue(int i)
 162   {
 163     return ((Attr) m_attrs.item(i)).getValue();
 164   }
 165 
 166   /**
 167    * Get the attribute's node type by name
 168    *
 169    *
 170    * @param name Attribute name
 171    *
 172    * @return the attribute's node type
 173    */
 174   public String getType(String name)
 175   {
 176     return "CDATA";  // for the moment
 177   }
 178 
 179   /**
 180    * Look up an attribute's type by Namespace name.
 181    *
 182    * @param uri The Namespace URI, or the empty String if the
 183    *        name has no Namespace URI.
 184    * @param localName The local name of the attribute.
 185    * @return The attribute type as a string, or null if the
 186    *         attribute is not in the list or if Namespace
 187    *         processing is not being performed.
 188    */
 189   public String getType(String uri, String localName)
 190   {
 191     return "CDATA";  // for the moment
 192   }
 193 
 194   /**
 195    * Look up an attribute's value by name.
 196    *
 197    *
 198    * @param name The attribute node's name
 199    *
 200    * @return The attribute node's value
 201    */
 202   public String getValue(String name)
 203   {
 204     Attr attr = ((Attr) m_attrs.getNamedItem(name));
 205     return (null != attr)
 206           ? attr.getValue() : null;
 207   }
 208 
 209   /**
 210    * Look up an attribute's value by Namespace name.
 211    *
 212    * @param uri The Namespace URI, or the empty String if the
 213    *        name has no Namespace URI.
 214    * @param localName The local name of the attribute.
 215    * @return The attribute value as a string, or null if the
 216    *         attribute is not in the list.
 217    */
 218   public String getValue(String uri, String localName)
 219   {
 220         Node a=m_attrs.getNamedItemNS(uri,localName);
 221         return (a==null) ? null : a.getNodeValue();
 222   }
 223 
 224   /**
 225    * Look up the index of an attribute by Namespace name.
 226    *
 227    * @param uri The Namespace URI, or the empty string if
 228    *        the name has no Namespace URI.
 229    * @param localPart The attribute's local name.
 230    * @return The index of the attribute, or -1 if it does not
 231    *         appear in the list.
 232    */
 233   public int getIndex(String uri, String localPart)
 234   {
 235     for(int i=m_attrs.getLength()-1;i>=0;--i)
 236     {
 237       Node a=m_attrs.item(i);
 238       String u=a.getNamespaceURI();
 239       if( (u==null ? uri==null : u.equals(uri))
 240       &&
 241       a.getLocalName().equals(localPart) )
 242     return i;
 243     }
 244     return -1;
 245   }
 246 
 247   /**
 248    * Look up the index of an attribute by raw XML 1.0 name.
 249    *
 250    * @param qName The qualified (prefixed) name.
 251    * @return The index of the attribute, or -1 if it does not
 252    *         appear in the list.
 253    */
 254   public int getIndex(String qName)
 255   {
 256     for(int i=m_attrs.getLength()-1;i>=0;--i)
 257     {
 258       Node a=m_attrs.item(i);
 259       if(a.getNodeName().equals(qName) )
 260     return i;
 261     }
 262     return -1;
 263   }
 264 }