001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: AttList.java 468655 2006-10-28 07:12:06Z minchau $ 020 */ 021 package org.apache.xml.utils; 022 023 import org.w3c.dom.Attr; 024 import org.w3c.dom.NamedNodeMap; 025 import org.w3c.dom.Node; 026 027 import org.xml.sax.Attributes; 028 029 /** 030 * Wraps a DOM attribute list in a SAX Attributes. 031 * @xsl.usage internal 032 */ 033 public class AttList implements Attributes 034 { 035 036 /** List of attribute nodes */ 037 NamedNodeMap m_attrs; 038 039 /** Index of last attribute node */ 040 int m_lastIndex; 041 042 // ARGHH!! JAXP Uses Xerces without setting the namespace processing to ON! 043 // DOM2Helper m_dh = new DOM2Helper(); 044 045 /** Local reference to DOMHelper */ 046 DOMHelper m_dh; 047 048 // /** 049 // * Constructor AttList 050 // * 051 // * 052 // * @param attrs List of attributes this will contain 053 // */ 054 // public AttList(NamedNodeMap attrs) 055 // { 056 // 057 // m_attrs = attrs; 058 // m_lastIndex = m_attrs.getLength() - 1; 059 // m_dh = new DOM2Helper(); 060 // } 061 062 /** 063 * Constructor AttList 064 * 065 * 066 * @param attrs List of attributes this will contain 067 * @param dh DOMHelper 068 */ 069 public AttList(NamedNodeMap attrs, DOMHelper dh) 070 { 071 072 m_attrs = attrs; 073 m_lastIndex = m_attrs.getLength() - 1; 074 m_dh = dh; 075 } 076 077 /** 078 * Get the number of attribute nodes in the list 079 * 080 * 081 * @return number of attribute nodes 082 */ 083 public int getLength() 084 { 085 return m_attrs.getLength(); 086 } 087 088 /** 089 * Look up an attribute's Namespace URI by index. 090 * 091 * @param index The attribute index (zero-based). 092 * @return The Namespace URI, or the empty string if none 093 * is available, or null if the index is out of 094 * range. 095 */ 096 public String getURI(int index) 097 { 098 String ns = m_dh.getNamespaceOfNode(((Attr) m_attrs.item(index))); 099 if(null == ns) 100 ns = ""; 101 return ns; 102 } 103 104 /** 105 * Look up an attribute's local name by index. 106 * 107 * @param index The attribute index (zero-based). 108 * @return The local name, or the empty string if Namespace 109 * processing is not being performed, or null 110 * if the index is out of range. 111 */ 112 public String getLocalName(int index) 113 { 114 return m_dh.getLocalNameOfNode(((Attr) m_attrs.item(index))); 115 } 116 117 /** 118 * Look up an attribute's qualified name by index. 119 * 120 * 121 * @param i The attribute index (zero-based). 122 * 123 * @return The attribute's qualified name 124 */ 125 public String getQName(int i) 126 { 127 return ((Attr) m_attrs.item(i)).getName(); 128 } 129 130 /** 131 * Get the attribute's node type by index 132 * 133 * 134 * @param i The attribute index (zero-based) 135 * 136 * @return the attribute's node type 137 */ 138 public String getType(int i) 139 { 140 return "CDATA"; // for the moment 141 } 142 143 /** 144 * Get the attribute's node value by index 145 * 146 * 147 * @param i The attribute index (zero-based) 148 * 149 * @return the attribute's node value 150 */ 151 public String getValue(int i) 152 { 153 return ((Attr) m_attrs.item(i)).getValue(); 154 } 155 156 /** 157 * Get the attribute's node type by name 158 * 159 * 160 * @param name Attribute name 161 * 162 * @return the attribute's node type 163 */ 164 public String getType(String name) 165 { 166 return "CDATA"; // for the moment 167 } 168 169 /** 170 * Look up an attribute's type by Namespace name. 171 * 172 * @param uri The Namespace URI, or the empty String if the 173 * name has no Namespace URI. 174 * @param localName The local name of the attribute. 175 * @return The attribute type as a string, or null if the 176 * attribute is not in the list or if Namespace 177 * processing is not being performed. 178 */ 179 public String getType(String uri, String localName) 180 { 181 return "CDATA"; // for the moment 182 } 183 184 /** 185 * Look up an attribute's value by name. 186 * 187 * 188 * @param name The attribute node's name 189 * 190 * @return The attribute node's value 191 */ 192 public String getValue(String name) 193 { 194 Attr attr = ((Attr) m_attrs.getNamedItem(name)); 195 return (null != attr) 196 ? attr.getValue() : null; 197 } 198 199 /** 200 * Look up an attribute's value by Namespace name. 201 * 202 * @param uri The Namespace URI, or the empty String if the 203 * name has no Namespace URI. 204 * @param localName The local name of the attribute. 205 * @return The attribute value as a string, or null if the 206 * attribute is not in the list. 207 */ 208 public String getValue(String uri, String localName) 209 { 210 Node a=m_attrs.getNamedItemNS(uri,localName); 211 return (a==null) ? null : a.getNodeValue(); 212 } 213 214 /** 215 * Look up the index of an attribute by Namespace name. 216 * 217 * @param uri The Namespace URI, or the empty string if 218 * the name has no Namespace URI. 219 * @param localPart The attribute's local name. 220 * @return The index of the attribute, or -1 if it does not 221 * appear in the list. 222 */ 223 public int getIndex(String uri, String localPart) 224 { 225 for(int i=m_attrs.getLength()-1;i>=0;--i) 226 { 227 Node a=m_attrs.item(i); 228 String u=a.getNamespaceURI(); 229 if( (u==null ? uri==null : u.equals(uri)) 230 && 231 a.getLocalName().equals(localPart) ) 232 return i; 233 } 234 return -1; 235 } 236 237 /** 238 * Look up the index of an attribute by raw XML 1.0 name. 239 * 240 * @param qName The qualified (prefixed) name. 241 * @return The index of the attribute, or -1 if it does not 242 * appear in the list. 243 */ 244 public int getIndex(String qName) 245 { 246 for(int i=m_attrs.getLength()-1;i>=0;--i) 247 { 248 Node a=m_attrs.item(i); 249 if(a.getNodeName().equals(qName) ) 250 return i; 251 } 252 return -1; 253 } 254 } 255