1 28 29 package com.caucho.xml2; 30 31 import org.w3c.dom.Attr ; 32 import org.w3c.dom.DOMException ; 33 import org.w3c.dom.NamedNodeMap ; 34 import org.w3c.dom.Node ; 35 36 import javax.xml.namespace.QName ; 37 38 public abstract class QAttributedNode extends QNode { 39 QAttr _firstAttribute; 40 41 44 public NamedNodeMap getAttributes() 45 { 46 return new QAttributeMap(this); 47 } 48 49 52 public boolean hasAttributes() 53 { 54 return _firstAttribute != null; 55 } 56 57 60 public Attr getFirstAttribute() 61 { 62 return _firstAttribute; 63 } 64 65 68 public String getAttribute(String name) 69 { 70 for (QAbstractNode attr = _firstAttribute; 71 attr != null; 72 attr = attr._next) { 73 if (name.equals(attr.getNodeName())) 74 return attr.getNodeValue(); 75 } 76 77 return ""; 78 } 79 80 83 public String getAttributeNS(String namespaceURI, String local) 84 { 85 for (QAbstractNode attr = _firstAttribute; 86 attr != null; 87 attr = attr._next) { 88 String attrURI = attr.getNamespaceURI(); 89 90 if (attr.getLocalName().equals(local) && 91 (attrURI == namespaceURI || 92 attrURI != null && attrURI.equals(namespaceURI))) 93 return attr.getNodeValue(); 94 } 95 96 return ""; 97 } 98 99 public boolean hasAttribute(String name) 100 { 101 for (QAbstractNode attr = _firstAttribute; 102 attr != null; 103 attr = attr._next) { 104 if (attr.getNodeName().equals(name)) 105 return true; 106 } 107 108 return false; 109 } 110 111 public boolean hasAttributeNS(String uri, String local) 112 { 113 for (QAbstractNode attr = _firstAttribute; 114 attr != null; 115 attr = attr._next) { 116 String attrURI = attr.getNamespaceURI(); 117 118 if (attr.getLocalName().equals(local) && 119 (attrURI == uri || attrURI != null && attrURI.equals(uri))) 120 return true; 121 } 122 123 return false; 124 } 125 126 129 public Attr getAttributeNode(String name) 130 { 131 for (QAbstractNode attr = _firstAttribute; 132 attr != null; 133 attr = attr._next) { 134 if (attr.getNodeName().equals(name)) 135 return (Attr ) attr; 136 } 137 138 return null; 139 } 140 141 public Attr getAttributeNodeNS(String uri, String local) 142 { 143 for (QAbstractNode attr = _firstAttribute; 144 attr != null; 145 attr = attr._next) { 146 String attrURI = attr.getNamespaceURI(); 147 148 if (attr.getLocalName().equals(local) && 149 (attrURI == uri || 150 attrURI != null && attrURI.equals(uri))) 151 return (Attr ) attr; 152 } 153 154 return null; 155 } 156 157 public void setAttribute(String name, String value) 158 throws DOMException  159 { 160 if (! isNameValid(name)) 161 throw new QDOMException(DOMException.INVALID_CHARACTER_ERR, 162 "illegal attribute `" + name + "'"); 163 164 setAttributeNode(_owner.createAttribute(name, value)); 165 } 166 167 public void setAttributeNS(String uri, String local, String value) 168 { 169 Attr attr = _owner.createAttributeNS(uri, local); 170 attr.setNodeValue(value); 171 172 setAttributeNodeNS(attr); 173 } 174 175 void setAttribute(QName name, String value) 176 throws DOMException  177 { 178 setAttributeNode(_owner.createAttribute(name, value)); 179 } 180 181 184 public void setIdAttribute(String name, boolean isId) 185 throws DOMException  186 { 187 } 188 189 192 public void setIdAttributeNS(String namespaceURI, String localName, 193 boolean isId) 194 throws DOMException  195 { 196 } 197 198 201 public void setIdAttributeNode(Attr attr, boolean isId) 202 throws DOMException  203 { 204 } 205 206 209 public Attr setAttributeNode(Attr attr) 210 throws DOMException  211 { 212 QAttr qAttr = (QAttr) attr; 213 214 if (qAttr._owner == null) 215 qAttr._owner = _owner; 216 else if (qAttr._owner != _owner) 217 throw new QDOMException(DOMException.WRONG_DOCUMENT_ERR, 218 "attribute from wrong document"); 219 220 if (qAttr._parent != null) 221 throw new QDOMException(DOMException.INUSE_ATTRIBUTE_ERR, 222 "attribute `" + attr.getNodeName() + 223 "' is in use"); 224 225 qAttr._parent = this; 226 227 QAttr old = unlink(attr.getNodeName()); 229 230 QAttr ptr = _firstAttribute; 231 232 if (ptr == null) { 233 _firstAttribute = qAttr; 234 } 235 else { 236 for (; ptr._next != null; ptr = (QAttr) ptr._next) { 237 } 238 239 ptr._next = qAttr; 240 } 241 242 return old; 243 } 244 245 public Attr setAttributeNodeNS(Attr attr) 246 throws DOMException  247 { 248 QAttr qAttr = (QAttr) attr; 249 250 if (qAttr._owner != _owner) 251 throw new QDOMException(DOMException.WRONG_DOCUMENT_ERR, 252 "attribute from wrong document"); 253 254 if (qAttr._parent != null) 255 throw new QDOMException(DOMException.INUSE_ATTRIBUTE_ERR, 256 "attribute `" + attr.getNodeName() + 257 "' is in use"); 258 259 QAttr old = unlink(qAttr.getNamespaceURI(), qAttr.getLocalName()); 261 262 qAttr._parent = this; 263 264 qAttr._next = _firstAttribute; 265 _firstAttribute = qAttr; 266 267 return old; 268 } 269 270 273 public void removeAttribute(String name) 274 { 275 if (! isNameValid(name)) 276 throw new QDOMException(DOMException.INVALID_CHARACTER_ERR, 277 "illegal attribute `" + name + "'"); 278 279 unlink(name); 280 } 281 282 285 public void removeAttributeNS(String uri, String name) 286 { 287 unlink(uri, name); 288 } 289 290 293 public Attr removeAttributeNode(Attr attr) 294 { 295 return unlink(attr.getNodeName()); 296 } 297 298 301 public Attr removeAttributeNodeNS(Attr attr) 302 { 303 return unlink(attr.getNamespaceURI(), attr.getLocalName()); 304 } 305 306 309 QAttr unlink(String name) 310 { 311 QAttr prev = null; 312 QAttr ptr; 313 314 for (ptr = _firstAttribute; 315 ptr != null && ! ptr.getNodeName().equals(name); 316 ptr = (QAttr) ptr._next) { 317 prev = ptr; 318 } 319 320 if (ptr == null) 321 return null; 322 323 if (prev == null) 324 _firstAttribute = (QAttr) ptr._next; 325 else 326 prev._next = ptr._next; 327 328 ptr._next = null; 329 330 return ptr; 331 } 332 333 336 public QAttr unlink(String uri, String local) 337 { 338 if (local == null || uri == null) 339 return null; 340 341 QAttr prev = null; 342 QAttr ptr; 343 344 for (ptr = (QAttr) _firstAttribute; 345 ptr != null && (! local.equals(ptr.getLocalName()) || 346 ! uri.equals(ptr.getNamespaceURI())); 347 ptr = (QAttr) ptr._next) { 348 prev = ptr; 349 } 350 351 if (ptr == null) 352 return null; 353 354 if (prev == null) 355 _firstAttribute = (QAttr) ptr._next; 356 else 357 prev._next = ptr._next; 358 359 ptr._next = null; 360 361 return ptr; 362 } 363 364 static class QAttributeMap implements NamedNodeMap { 365 QAttributedNode _elt; 366 int _i; 367 QAttr _attr; 368 369 QAttributeMap(QAttributedNode elt) 370 { 371 _elt = elt; 372 } 373 374 public Node getNamedItem(String name) 375 { 376 return _elt.getAttributeNode(name); 377 } 378 379 public Node getNamedItemNS(String uri, String localName) 380 { 381 return _elt.getAttributeNodeNS(uri, localName); 382 } 383 384 public Node setNamedItem(Node arg) throws DOMException  385 { 386 return _elt.setAttributeNode((Attr ) arg); 387 } 388 389 public Node setNamedItemNS(Node arg) 390 { 391 return _elt.setAttributeNodeNS((Attr ) arg); 392 } 393 394 public Node removeNamedItem(String name) throws DOMException  395 { 396 return _elt.unlink(name); 397 } 398 399 public Node removeNamedItemNS(String uri, String localName) 400 { 401 return _elt.getAttributeNodeNS(uri, localName); 402 } 403 404 public Node item(int index) 405 { 406 QAbstractNode attr = _elt._firstAttribute; 407 408 while (index > 0 && attr != null) { 409 attr = attr._next; 410 index--; 411 } 412 413 return attr; 414 } 415 416 public int getLength() 417 { 418 int length = 0; 419 420 for (QAbstractNode attr = _elt._firstAttribute; 421 attr != null; 422 attr = attr._next) 423 length++; 424 425 return length; 426 } 427 } 428 } 429 | Popular Tags |