src/share/classes/com/sun/xml/internal/messaging/saaj/soap/impl/ElementImpl.java

Mon, 04 May 2009 21:10:41 -0700

author
tbell
date
Mon, 04 May 2009 21:10:41 -0700
changeset 50
42dfec6871f6
parent 45
31822b475baa
child 78
860b95cc8d1d
permissions
-rw-r--r--

6658158: Mutable statics in SAAJ (findbugs)
6658163: txw2.DatatypeWriter.BUILDIN is a mutable static (findbugs)
Reviewed-by: darcy

duke@1 1 /*
tbell@45 2 * Copyright 2005-2006 Sun Microsystems, Inc. All Rights Reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
duke@1 7 * published by the Free Software Foundation. Sun designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
duke@1 9 * by Sun in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
duke@1 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@1 22 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@1 23 * have any questions.
duke@1 24 */
tbell@45 25 /*
tbell@50 26 *
tbell@50 27 *
tbell@50 28 *
tbell@45 29 */
tbell@45 30
tbell@45 31
duke@1 32 package com.sun.xml.internal.messaging.saaj.soap.impl;
duke@1 33
duke@1 34 import java.util.*;
duke@1 35 import java.util.logging.Level;
duke@1 36 import java.util.logging.Logger;
duke@1 37
duke@1 38 import javax.xml.namespace.QName;
duke@1 39 import javax.xml.soap.*;
duke@1 40
duke@1 41 import com.sun.org.apache.xerces.internal.xni.NamespaceContext;
duke@1 42 import org.w3c.dom.*;
duke@1 43 import org.w3c.dom.Node;
duke@1 44
duke@1 45 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
duke@1 46 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument;
duke@1 47 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
duke@1 48 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
duke@1 49 import com.sun.xml.internal.messaging.saaj.util.*;
duke@1 50
duke@1 51 public class ElementImpl
duke@1 52 extends com.sun.org.apache.xerces.internal.dom.ElementNSImpl
duke@1 53 implements SOAPElement, SOAPBodyElement {
duke@1 54
duke@1 55 public static final String DSIG_NS = "http://www.w3.org/2000/09/xmldsig#".intern();
duke@1 56 public static final String XENC_NS = "http://www.w3.org/2001/04/xmlenc#".intern();
duke@1 57 public static final String WSU_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd".intern();
duke@1 58
duke@1 59 private AttributeManager encodingStyleAttribute = new AttributeManager();
duke@1 60
duke@1 61 protected QName elementQName;
duke@1 62
tbell@50 63 protected static final Logger log =
duke@1 64 Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN,
duke@1 65 "com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings");
duke@1 66
duke@1 67 public ElementImpl(SOAPDocumentImpl ownerDoc, Name name) {
duke@1 68 super(
duke@1 69 ownerDoc,
duke@1 70 name.getURI(),
duke@1 71 name.getQualifiedName(),
duke@1 72 name.getLocalName());
duke@1 73 elementQName = NameImpl.convertToQName(name);
duke@1 74 }
duke@1 75
duke@1 76 public ElementImpl(SOAPDocumentImpl ownerDoc, QName name) {
duke@1 77 super(
duke@1 78 ownerDoc,
duke@1 79 name.getNamespaceURI(),
duke@1 80 getQualifiedName(name),
duke@1 81 name.getLocalPart());
duke@1 82 elementQName = name;
duke@1 83 }
duke@1 84
duke@1 85 public ElementImpl(
duke@1 86 SOAPDocumentImpl ownerDoc,
duke@1 87 String uri,
duke@1 88 String qualifiedName) {
duke@1 89
duke@1 90 super(ownerDoc, uri, qualifiedName);
duke@1 91 elementQName =
duke@1 92 new QName(uri, getLocalPart(qualifiedName), getPrefix(qualifiedName));
duke@1 93 }
duke@1 94
duke@1 95 public void ensureNamespaceIsDeclared(String prefix, String uri) {
duke@1 96 String alreadyDeclaredUri = getNamespaceURI(prefix);
duke@1 97 if (alreadyDeclaredUri == null || !alreadyDeclaredUri.equals(uri)) {
duke@1 98 try {
duke@1 99 addNamespaceDeclaration(prefix, uri);
duke@1 100 } catch (SOAPException e) { /*ignore*/
duke@1 101 }
duke@1 102 }
duke@1 103 }
duke@1 104
duke@1 105 public Document getOwnerDocument() {
duke@1 106 SOAPDocument ownerSOAPDocument =
duke@1 107 ((SOAPDocument) super.getOwnerDocument());
duke@1 108 if (ownerSOAPDocument == null) {
duke@1 109 return null;
duke@1 110 }
duke@1 111 return ownerSOAPDocument.getDocument();
duke@1 112 }
duke@1 113
duke@1 114 public SOAPElement addChildElement(Name name) throws SOAPException {
duke@1 115 return addElement(name);
duke@1 116 }
duke@1 117
duke@1 118 public SOAPElement addChildElement(QName qname) throws SOAPException {
duke@1 119 return addElement(qname);
duke@1 120 }
duke@1 121
duke@1 122 public SOAPElement addChildElement(String localName) throws SOAPException {
duke@1 123 return (SOAPElement) addChildElement(
duke@1 124 NameImpl.createFromUnqualifiedName(localName));
duke@1 125 }
duke@1 126
duke@1 127 public SOAPElement addChildElement(String localName, String prefix)
duke@1 128 throws SOAPException {
duke@1 129 String uri = getNamespaceURI(prefix);
duke@1 130 if (uri == null) {
duke@1 131 log.log(
duke@1 132 Level.SEVERE,
duke@1 133 "SAAJ0101.impl.parent.of.body.elem.mustbe.body",
duke@1 134 new String[] { prefix });
duke@1 135 throw new SOAPExceptionImpl(
duke@1 136 "Unable to locate namespace for prefix " + prefix);
duke@1 137 }
duke@1 138 return addChildElement(localName, prefix, uri);
duke@1 139 }
duke@1 140
duke@1 141 public String getNamespaceURI(String prefix) {
duke@1 142
duke@1 143 if ("xmlns".equals(prefix)) {
duke@1 144 return NamespaceContext.XMLNS_URI;
duke@1 145 }
duke@1 146
duke@1 147 if("xml".equals(prefix)) {
duke@1 148 return NamespaceContext.XML_URI;
duke@1 149 }
duke@1 150
duke@1 151 if ("".equals(prefix)) {
duke@1 152
duke@1 153 org.w3c.dom.Node currentAncestor = this;
duke@1 154 while (currentAncestor != null &&
duke@1 155 !(currentAncestor instanceof Document)) {
duke@1 156
duke@1 157 if (currentAncestor instanceof ElementImpl) {
duke@1 158 QName name = ((ElementImpl) currentAncestor).getElementQName();
duke@1 159 /*
duke@1 160 if (prefix.equals(name.getPrefix())) {
duke@1 161 String uri = name.getNamespaceURI();
duke@1 162 if ("".equals(uri)) {
duke@1 163 return null;
duke@1 164 }
duke@1 165 else {
duke@1 166 return uri;
duke@1 167 }
duke@1 168 }*/
duke@1 169 if (((Element) currentAncestor).hasAttributeNS(
duke@1 170 NamespaceContext.XMLNS_URI, "xmlns")) {
duke@1 171
duke@1 172 String uri =
duke@1 173 ((Element) currentAncestor).getAttributeNS(
duke@1 174 NamespaceContext.XMLNS_URI, "xmlns");
duke@1 175 if ("".equals(uri))
duke@1 176 return null;
duke@1 177 else {
duke@1 178 return uri;
duke@1 179 }
duke@1 180 }
duke@1 181 }
duke@1 182 currentAncestor = currentAncestor.getParentNode();
duke@1 183 }
duke@1 184
duke@1 185 } else if (prefix != null) {
duke@1 186 // Find if there's an ancester whose name contains this prefix
duke@1 187 org.w3c.dom.Node currentAncestor = this;
tbell@45 188
tbell@45 189 // String uri = currentAncestor.lookupNamespaceURI(prefix);
tbell@45 190 // return uri;
duke@1 191 while (currentAncestor != null &&
duke@1 192 !(currentAncestor instanceof Document)) {
tbell@45 193
tbell@45 194 /* if (prefix.equals(currentAncestor.getPrefix())) {
duke@1 195 String uri = currentAncestor.getNamespaceURI();
duke@1 196 // this is because the javadoc says getNamespaceURI() is not a computed value
duke@1 197 // and URI for a non-empty prefix cannot be null
duke@1 198 if (uri != null)
duke@1 199 return uri;
duke@1 200 }*/
tbell@45 201 //String uri = currentAncestor.lookupNamespaceURI(prefix);
tbell@45 202 //if (uri != null) {
tbell@45 203 // return uri;
tbell@45 204 //}
tbell@45 205
duke@1 206 if (((Element) currentAncestor).hasAttributeNS(
duke@1 207 NamespaceContext.XMLNS_URI, prefix)) {
duke@1 208 return ((Element) currentAncestor).getAttributeNS(
duke@1 209 NamespaceContext.XMLNS_URI, prefix);
duke@1 210 }
duke@1 211
duke@1 212 currentAncestor = currentAncestor.getParentNode();
duke@1 213 }
duke@1 214 }
duke@1 215
duke@1 216 return null;
duke@1 217 }
duke@1 218
duke@1 219 public SOAPElement setElementQName(QName newName) throws SOAPException {
duke@1 220 ElementImpl copy =
duke@1 221 new ElementImpl((SOAPDocumentImpl) getOwnerDocument(), newName);
duke@1 222 return replaceElementWithSOAPElement(this,copy);
duke@1 223 }
duke@1 224
duke@1 225 public QName createQName(String localName, String prefix)
duke@1 226 throws SOAPException {
duke@1 227 String uri = getNamespaceURI(prefix);
duke@1 228 if (uri == null) {
duke@1 229 log.log(Level.SEVERE, "SAAJ0102.impl.cannot.locate.ns",
duke@1 230 new Object[] {prefix});
duke@1 231 throw new SOAPException("Unable to locate namespace for prefix "
duke@1 232 + prefix);
duke@1 233 }
duke@1 234 return new QName(uri, localName, prefix);
duke@1 235 }
duke@1 236
duke@1 237 public String getNamespacePrefix(String uri) {
duke@1 238
duke@1 239 NamespaceContextIterator eachNamespace = getNamespaceContextNodes();
duke@1 240 while (eachNamespace.hasNext()) {
duke@1 241 org.w3c.dom.Attr namespaceDecl = eachNamespace.nextNamespaceAttr();
duke@1 242 if (namespaceDecl.getNodeValue().equals(uri)) {
duke@1 243 String candidatePrefix = namespaceDecl.getLocalName();
duke@1 244 if ("xmlns".equals(candidatePrefix))
duke@1 245 return "";
duke@1 246 else
duke@1 247 return candidatePrefix;
duke@1 248 }
duke@1 249 }
duke@1 250
duke@1 251 // Find if any of the ancestors' name has this uri
duke@1 252 org.w3c.dom.Node currentAncestor = this;
duke@1 253 while (currentAncestor != null &&
duke@1 254 !(currentAncestor instanceof Document)) {
duke@1 255
duke@1 256 if (uri.equals(currentAncestor.getNamespaceURI()))
duke@1 257 return currentAncestor.getPrefix();
duke@1 258 currentAncestor = currentAncestor.getParentNode();
duke@1 259 }
duke@1 260
duke@1 261 return null;
duke@1 262 }
duke@1 263
duke@1 264 protected org.w3c.dom.Attr getNamespaceAttr(String prefix) {
duke@1 265 NamespaceContextIterator eachNamespace = getNamespaceContextNodes();
duke@1 266 if (!"".equals(prefix))
duke@1 267 prefix = ":"+prefix;
duke@1 268 while (eachNamespace.hasNext()) {
duke@1 269 org.w3c.dom.Attr namespaceDecl = eachNamespace.nextNamespaceAttr();
duke@1 270 if (!"".equals(prefix)) {
duke@1 271 if (namespaceDecl.getNodeName().endsWith(prefix))
duke@1 272 return namespaceDecl;
duke@1 273 } else {
duke@1 274 if (namespaceDecl.getNodeName().equals("xmlns"))
duke@1 275 return namespaceDecl;
duke@1 276 }
duke@1 277 }
duke@1 278 return null;
duke@1 279 }
duke@1 280
duke@1 281 public NamespaceContextIterator getNamespaceContextNodes() {
duke@1 282 return getNamespaceContextNodes(true);
duke@1 283 }
duke@1 284
duke@1 285 public NamespaceContextIterator getNamespaceContextNodes(boolean traverseStack) {
duke@1 286 return new NamespaceContextIterator(this, traverseStack);
duke@1 287 }
duke@1 288
duke@1 289 public SOAPElement addChildElement(
duke@1 290 String localName,
duke@1 291 String prefix,
duke@1 292 String uri)
duke@1 293 throws SOAPException {
duke@1 294
duke@1 295 SOAPElement newElement = createElement(NameImpl.create(localName, prefix, uri));
duke@1 296 addNode(newElement);
duke@1 297 return convertToSoapElement(newElement);
duke@1 298 }
duke@1 299
duke@1 300 public SOAPElement addChildElement(SOAPElement element)
duke@1 301 throws SOAPException {
duke@1 302
duke@1 303 // check if Element falls in SOAP 1.1 or 1.2 namespace.
duke@1 304 String elementURI = element.getElementName().getURI();
duke@1 305 String localName = element.getLocalName();
duke@1 306
duke@1 307 if ((SOAPConstants.URI_NS_SOAP_ENVELOPE).equals(elementURI)
duke@1 308 || (SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE).equals(elementURI)) {
duke@1 309
duke@1 310
duke@1 311 if ("Envelope".equalsIgnoreCase(localName) ||
duke@1 312 "Header".equalsIgnoreCase(localName) || "Body".equalsIgnoreCase(localName)) {
duke@1 313 log.severe("SAAJ0103.impl.cannot.add.fragements");
duke@1 314 throw new SOAPExceptionImpl(
duke@1 315 "Cannot add fragments which contain elements "
duke@1 316 + "which are in the SOAP namespace");
duke@1 317 }
duke@1 318
duke@1 319 if ("Fault".equalsIgnoreCase(localName) && !"Body".equalsIgnoreCase(this.getLocalName())) {
duke@1 320 log.severe("SAAJ0154.impl.adding.fault.to.nonbody");
duke@1 321 throw new SOAPExceptionImpl("Cannot add a SOAPFault as a child of " + this.getLocalName());
duke@1 322 }
duke@1 323
duke@1 324 if ("Detail".equalsIgnoreCase(localName) && !"Fault".equalsIgnoreCase(this.getLocalName())) {
duke@1 325 log.severe("SAAJ0155.impl.adding.detail.nonfault");
duke@1 326 throw new SOAPExceptionImpl("Cannot add a Detail as a child of " + this.getLocalName());
duke@1 327 }
duke@1 328
duke@1 329 if ("Fault".equalsIgnoreCase(localName)) {
duke@1 330 // if body is not empty throw an exception
duke@1 331 if (!elementURI.equals(this.getElementName().getURI())) {
duke@1 332 log.severe("SAAJ0158.impl.version.mismatch.fault");
duke@1 333 throw new SOAPExceptionImpl("SOAP Version mismatch encountered when trying to add SOAPFault to SOAPBody");
duke@1 334 }
duke@1 335 Iterator it = this.getChildElements();
duke@1 336 if (it.hasNext()) {
duke@1 337 log.severe("SAAJ0156.impl.adding.fault.error");
duke@1 338 throw new SOAPExceptionImpl("Cannot add SOAPFault as a child of a non-Empty SOAPBody");
duke@1 339 }
duke@1 340 }
duke@1 341 }
duke@1 342
duke@1 343 // preserve the encodingStyle attr as it may get lost in the import
duke@1 344 String encodingStyle = element.getEncodingStyle();
duke@1 345
duke@1 346 ElementImpl importedElement = (ElementImpl) importElement(element);
duke@1 347 addNode(importedElement);
duke@1 348
duke@1 349 if (encodingStyle != null)
duke@1 350 importedElement.setEncodingStyle(encodingStyle);
duke@1 351
duke@1 352 return convertToSoapElement(importedElement);
duke@1 353 }
duke@1 354
duke@1 355 protected Element importElement(Element element) {
duke@1 356 Document document = getOwnerDocument();
duke@1 357 Document oldDocument = element.getOwnerDocument();
duke@1 358 if (!oldDocument.equals(document)) {
duke@1 359 return (Element) document.importNode(element, true);
duke@1 360 } else {
duke@1 361 return element;
duke@1 362 }
duke@1 363 }
duke@1 364
duke@1 365 protected SOAPElement addElement(Name name) throws SOAPException {
duke@1 366 SOAPElement newElement = createElement(name);
duke@1 367 addNode(newElement);
duke@1 368 return circumventBug5034339(newElement);
duke@1 369 }
duke@1 370
duke@1 371 protected SOAPElement addElement(QName name) throws SOAPException {
duke@1 372 SOAPElement newElement = createElement(name);
duke@1 373 addNode(newElement);
duke@1 374 return circumventBug5034339(newElement);
duke@1 375 }
duke@1 376
duke@1 377 protected SOAPElement createElement(Name name) {
duke@1 378
duke@1 379 if (isNamespaceQualified(name)) {
duke@1 380 return (SOAPElement)
duke@1 381 getOwnerDocument().createElementNS(
duke@1 382 name.getURI(),
duke@1 383 name.getQualifiedName());
duke@1 384 } else {
duke@1 385 return (SOAPElement)
duke@1 386 getOwnerDocument().createElement(name.getQualifiedName());
duke@1 387 }
duke@1 388 }
duke@1 389
duke@1 390 protected SOAPElement createElement(QName name) {
duke@1 391
duke@1 392 if (isNamespaceQualified(name)) {
duke@1 393 return (SOAPElement)
duke@1 394 getOwnerDocument().createElementNS(
duke@1 395 name.getNamespaceURI(),
duke@1 396 getQualifiedName(name));
duke@1 397 } else {
duke@1 398 return (SOAPElement)
duke@1 399 getOwnerDocument().createElement(getQualifiedName(name));
duke@1 400 }
duke@1 401 }
duke@1 402
duke@1 403 protected void addNode(org.w3c.dom.Node newElement) throws SOAPException {
duke@1 404 insertBefore(newElement, null);
duke@1 405
duke@1 406 if (getOwnerDocument() instanceof DocumentFragment)
duke@1 407 return;
duke@1 408
duke@1 409 if (newElement instanceof ElementImpl) {
duke@1 410 ElementImpl element = (ElementImpl) newElement;
duke@1 411 QName elementName = element.getElementQName();
duke@1 412 if (!"".equals(elementName.getNamespaceURI())) {
duke@1 413 element.ensureNamespaceIsDeclared(
duke@1 414 elementName.getPrefix(), elementName.getNamespaceURI());
duke@1 415 }
duke@1 416 }
duke@1 417
duke@1 418 }
duke@1 419
duke@1 420 protected SOAPElement findChild(NameImpl name) {
duke@1 421 Iterator eachChild = getChildElementNodes();
duke@1 422 while (eachChild.hasNext()) {
duke@1 423 SOAPElement child = (SOAPElement) eachChild.next();
duke@1 424 if (child.getElementName().equals(name)) {
duke@1 425 return child;
duke@1 426 }
duke@1 427 }
duke@1 428
duke@1 429 return null;
duke@1 430 }
duke@1 431
duke@1 432 public SOAPElement addTextNode(String text) throws SOAPException {
duke@1 433 if (text.startsWith(CDATAImpl.cdataUC)
duke@1 434 || text.startsWith(CDATAImpl.cdataLC))
duke@1 435 return addCDATA(
duke@1 436 text.substring(CDATAImpl.cdataUC.length(), text.length() - 3));
duke@1 437 return addText(text);
duke@1 438 }
duke@1 439
duke@1 440 protected SOAPElement addCDATA(String text) throws SOAPException {
duke@1 441 org.w3c.dom.Text cdata =
duke@1 442 (org.w3c.dom.Text) getOwnerDocument().createCDATASection(text);
duke@1 443 addNode(cdata);
duke@1 444 return this;
duke@1 445 }
duke@1 446
duke@1 447 protected SOAPElement addText(String text) throws SOAPException {
duke@1 448 org.w3c.dom.Text textNode =
duke@1 449 (org.w3c.dom.Text) getOwnerDocument().createTextNode(text);
duke@1 450 addNode(textNode);
duke@1 451 return this;
duke@1 452 }
duke@1 453
duke@1 454 public SOAPElement addAttribute(Name name, String value)
duke@1 455 throws SOAPException {
duke@1 456 addAttributeBare(name, value);
duke@1 457 if (!"".equals(name.getURI())) {
duke@1 458 ensureNamespaceIsDeclared(name.getPrefix(), name.getURI());
duke@1 459 }
duke@1 460 return this;
duke@1 461 }
duke@1 462
duke@1 463 public SOAPElement addAttribute(QName qname, String value)
duke@1 464 throws SOAPException {
duke@1 465 addAttributeBare(qname, value);
duke@1 466 if (!"".equals(qname.getNamespaceURI())) {
duke@1 467 ensureNamespaceIsDeclared(qname.getPrefix(), qname.getNamespaceURI());
duke@1 468 }
duke@1 469 return this;
duke@1 470 }
duke@1 471
duke@1 472 private void addAttributeBare(Name name, String value) {
duke@1 473 addAttributeBare(
duke@1 474 name.getURI(),
duke@1 475 name.getPrefix(),
duke@1 476 name.getQualifiedName(),
duke@1 477 value);
duke@1 478 }
duke@1 479 private void addAttributeBare(QName name, String value) {
duke@1 480 addAttributeBare(
duke@1 481 name.getNamespaceURI(),
duke@1 482 name.getPrefix(),
duke@1 483 getQualifiedName(name),
duke@1 484 value);
duke@1 485 }
duke@1 486
duke@1 487 private void addAttributeBare(
duke@1 488 String uri,
duke@1 489 String prefix,
duke@1 490 String qualifiedName,
duke@1 491 String value) {
duke@1 492
duke@1 493 uri = uri.length() == 0 ? null : uri;
duke@1 494 if (qualifiedName.equals("xmlns")) {
duke@1 495 uri = NamespaceContext.XMLNS_URI;
duke@1 496 }
duke@1 497
duke@1 498 if (uri == null) {
duke@1 499 setAttribute(qualifiedName, value);
duke@1 500 } else {
duke@1 501 setAttributeNS(uri, qualifiedName, value);
duke@1 502 }
duke@1 503 }
duke@1 504
duke@1 505 public SOAPElement addNamespaceDeclaration(String prefix, String uri)
duke@1 506 throws SOAPException {
duke@1 507 if (prefix.length() > 0) {
duke@1 508 setAttributeNS(NamespaceContext.XMLNS_URI, "xmlns:" + prefix, uri);
duke@1 509 } else {
duke@1 510 setAttributeNS(NamespaceContext.XMLNS_URI, "xmlns", uri);
duke@1 511 }
tbell@45 512 //Fix for CR:6474641
tbell@45 513 //tryToFindEncodingStyleAttributeName();
duke@1 514 return this;
duke@1 515 }
duke@1 516
duke@1 517 public String getAttributeValue(Name name) {
duke@1 518 return getAttributeValueFrom(this, name);
duke@1 519 }
duke@1 520
duke@1 521 public String getAttributeValue(QName qname) {
duke@1 522 return getAttributeValueFrom(
duke@1 523 this,
duke@1 524 qname.getNamespaceURI(),
duke@1 525 qname.getLocalPart(),
duke@1 526 qname.getPrefix(),
duke@1 527 getQualifiedName(qname));
duke@1 528 }
duke@1 529
duke@1 530 public Iterator getAllAttributes() {
duke@1 531 Iterator i = getAllAttributesFrom(this);
duke@1 532 ArrayList list = new ArrayList();
duke@1 533 while (i.hasNext()) {
duke@1 534 Name name = (Name) i.next();
duke@1 535 if (!"xmlns".equalsIgnoreCase(name.getPrefix()))
duke@1 536 list.add(name);
duke@1 537 }
duke@1 538 return list.iterator();
duke@1 539 }
duke@1 540
duke@1 541 public Iterator getAllAttributesAsQNames() {
duke@1 542 Iterator i = getAllAttributesFrom(this);
duke@1 543 ArrayList list = new ArrayList();
duke@1 544 while (i.hasNext()) {
duke@1 545 Name name = (Name) i.next();
duke@1 546 if (!"xmlns".equalsIgnoreCase(name.getPrefix())) {
duke@1 547 list.add(NameImpl.convertToQName(name));
duke@1 548 }
duke@1 549 }
duke@1 550 return list.iterator();
duke@1 551 }
duke@1 552
duke@1 553
duke@1 554 public Iterator getNamespacePrefixes() {
duke@1 555 return doGetNamespacePrefixes(false);
duke@1 556 }
duke@1 557
duke@1 558 public Iterator getVisibleNamespacePrefixes() {
duke@1 559 return doGetNamespacePrefixes(true);
duke@1 560 }
duke@1 561
duke@1 562 protected Iterator doGetNamespacePrefixes(final boolean deep) {
duke@1 563 return new Iterator() {
duke@1 564 String next = null;
duke@1 565 String last = null;
duke@1 566 NamespaceContextIterator eachNamespace =
duke@1 567 getNamespaceContextNodes(deep);
duke@1 568
duke@1 569 void findNext() {
duke@1 570 while (next == null && eachNamespace.hasNext()) {
duke@1 571 String attributeKey =
duke@1 572 eachNamespace.nextNamespaceAttr().getNodeName();
duke@1 573 if (attributeKey.startsWith("xmlns:")) {
duke@1 574 next = attributeKey.substring("xmlns:".length());
duke@1 575 }
duke@1 576 }
duke@1 577 }
duke@1 578
duke@1 579 public boolean hasNext() {
duke@1 580 findNext();
duke@1 581 return next != null;
duke@1 582 }
duke@1 583
duke@1 584 public Object next() {
duke@1 585 findNext();
duke@1 586 if (next == null) {
duke@1 587 throw new NoSuchElementException();
duke@1 588 }
duke@1 589
duke@1 590 last = next;
duke@1 591 next = null;
duke@1 592 return last;
duke@1 593 }
duke@1 594
duke@1 595 public void remove() {
duke@1 596 if (last == null) {
duke@1 597 throw new IllegalStateException();
duke@1 598 }
duke@1 599 eachNamespace.remove();
duke@1 600 next = null;
duke@1 601 last = null;
duke@1 602 }
duke@1 603 };
duke@1 604 }
duke@1 605
duke@1 606 public Name getElementName() {
duke@1 607 return NameImpl.convertToName(elementQName);
duke@1 608 }
duke@1 609
duke@1 610 public QName getElementQName() {
duke@1 611 return elementQName;
duke@1 612 }
duke@1 613
duke@1 614 public boolean removeAttribute(Name name) {
duke@1 615 return removeAttribute(name.getURI(), name.getLocalName());
duke@1 616 }
duke@1 617
duke@1 618 public boolean removeAttribute(QName name) {
duke@1 619 return removeAttribute(name.getNamespaceURI(), name.getLocalPart());
duke@1 620 }
duke@1 621
duke@1 622 private boolean removeAttribute(String uri, String localName) {
duke@1 623 String nonzeroLengthUri =
duke@1 624 (uri == null || uri.length() == 0) ? null : uri;
duke@1 625 org.w3c.dom.Attr attribute =
duke@1 626 getAttributeNodeNS(nonzeroLengthUri, localName);
duke@1 627 if (attribute == null) {
duke@1 628 return false;
duke@1 629 }
duke@1 630 removeAttributeNode(attribute);
duke@1 631 return true;
duke@1 632 }
duke@1 633
duke@1 634 public boolean removeNamespaceDeclaration(String prefix) {
duke@1 635 org.w3c.dom.Attr declaration = getNamespaceAttr(prefix);
duke@1 636 if (declaration == null) {
duke@1 637 return false;
duke@1 638 }
duke@1 639 try {
duke@1 640 removeAttributeNode(declaration);
duke@1 641 } catch (DOMException de) {
duke@1 642 // ignore
duke@1 643 }
duke@1 644 return true;
duke@1 645 }
duke@1 646
duke@1 647 public Iterator getChildElements() {
duke@1 648 return getChildElementsFrom(this);
duke@1 649 }
duke@1 650
duke@1 651 protected SOAPElement convertToSoapElement(Element element) {
duke@1 652 if (element instanceof SOAPElement) {
duke@1 653 return (SOAPElement) element;
duke@1 654 } else {
duke@1 655 return replaceElementWithSOAPElement(
duke@1 656 element,
duke@1 657 (ElementImpl) createElement(NameImpl.copyElementName(element)));
duke@1 658 }
duke@1 659 }
duke@1 660
duke@1 661 protected static SOAPElement replaceElementWithSOAPElement(
duke@1 662 Element element,
duke@1 663 ElementImpl copy) {
duke@1 664
duke@1 665 Iterator eachAttribute = getAllAttributesFrom(element);
duke@1 666 while (eachAttribute.hasNext()) {
duke@1 667 Name name = (Name) eachAttribute.next();
duke@1 668 copy.addAttributeBare(name, getAttributeValueFrom(element, name));
duke@1 669 }
duke@1 670
duke@1 671 Iterator eachChild = getChildElementsFrom(element);
duke@1 672 while (eachChild.hasNext()) {
duke@1 673 Node nextChild = (Node) eachChild.next();
duke@1 674 copy.insertBefore(nextChild, null);
duke@1 675 }
duke@1 676
duke@1 677 Node parent = element.getParentNode();
duke@1 678 if (parent != null) {
duke@1 679 parent.replaceChild(copy, element);
duke@1 680 } // XXX else throw an exception?
duke@1 681
duke@1 682 return copy;
duke@1 683 }
duke@1 684
duke@1 685 protected Iterator getChildElementNodes() {
duke@1 686 return new Iterator() {
duke@1 687 Iterator eachNode = getChildElements();
duke@1 688 Node next = null;
duke@1 689 Node last = null;
duke@1 690
duke@1 691 public boolean hasNext() {
duke@1 692 if (next == null) {
duke@1 693 while (eachNode.hasNext()) {
duke@1 694 Node node = (Node) eachNode.next();
duke@1 695 if (node instanceof SOAPElement) {
duke@1 696 next = node;
duke@1 697 break;
duke@1 698 }
duke@1 699 }
duke@1 700 }
duke@1 701 return next != null;
duke@1 702 }
duke@1 703
duke@1 704 public Object next() {
duke@1 705 if (hasNext()) {
duke@1 706 last = next;
duke@1 707 next = null;
duke@1 708 return last;
duke@1 709 }
duke@1 710 throw new NoSuchElementException();
duke@1 711 }
duke@1 712
duke@1 713 public void remove() {
duke@1 714 if (last == null) {
duke@1 715 throw new IllegalStateException();
duke@1 716 }
duke@1 717 Node target = last;
duke@1 718 last = null;
duke@1 719 removeChild(target);
duke@1 720 }
duke@1 721 };
duke@1 722 }
duke@1 723
duke@1 724 public Iterator getChildElements(final Name name) {
duke@1 725 return getChildElements(name.getURI(), name.getLocalName());
duke@1 726 }
duke@1 727
duke@1 728 public Iterator getChildElements(final QName qname) {
duke@1 729 return getChildElements(qname.getNamespaceURI(), qname.getLocalPart());
duke@1 730 }
duke@1 731
duke@1 732 private Iterator getChildElements(final String nameUri, final String nameLocal) {
duke@1 733 return new Iterator() {
duke@1 734 Iterator eachElement = getChildElementNodes();
duke@1 735 Node next = null;
duke@1 736 Node last = null;
duke@1 737
duke@1 738 public boolean hasNext() {
duke@1 739 if (next == null) {
duke@1 740 while (eachElement.hasNext()) {
duke@1 741 Node element = (Node) eachElement.next();
duke@1 742 String elementUri = element.getNamespaceURI();
duke@1 743 elementUri = elementUri == null ? "" : elementUri;
duke@1 744 String elementName = element.getLocalName();
duke@1 745 if (elementUri.equals(nameUri)
duke@1 746 && elementName.equals(nameLocal)) {
duke@1 747 next = element;
duke@1 748 break;
duke@1 749 }
duke@1 750 }
duke@1 751 }
duke@1 752 return next != null;
duke@1 753 }
duke@1 754
duke@1 755 public Object next() {
duke@1 756 if (!hasNext()) {
duke@1 757 throw new NoSuchElementException();
duke@1 758 }
duke@1 759 last = next;
duke@1 760 next = null;
duke@1 761 return last;
duke@1 762 }
duke@1 763
duke@1 764 public void remove() {
duke@1 765 if (last == null) {
duke@1 766 throw new IllegalStateException();
duke@1 767 }
duke@1 768 Node target = last;
duke@1 769 last = null;
duke@1 770 removeChild(target);
duke@1 771 }
duke@1 772 };
duke@1 773 }
duke@1 774
duke@1 775 public void removeContents() {
duke@1 776 Node currentChild = getFirstChild();
duke@1 777
duke@1 778 while (currentChild != null) {
duke@1 779 Node temp = currentChild.getNextSibling();
duke@1 780 if (currentChild instanceof javax.xml.soap.Node) {
duke@1 781 ((javax.xml.soap.Node) currentChild).detachNode();
duke@1 782 } else {
duke@1 783 Node parent = currentChild.getParentNode();
duke@1 784 if (parent != null) {
duke@1 785 parent.removeChild(currentChild);
duke@1 786 }
duke@1 787
duke@1 788 }
duke@1 789 currentChild = temp;
duke@1 790 }
duke@1 791 }
duke@1 792
duke@1 793 public void setEncodingStyle(String encodingStyle) throws SOAPException {
duke@1 794 if (!"".equals(encodingStyle)) {
duke@1 795 try {
duke@1 796 JaxmURI uri = new JaxmURI(encodingStyle);
duke@1 797 } catch (JaxmURI.MalformedURIException m) {
duke@1 798 log.log(
duke@1 799 Level.SEVERE,
duke@1 800 "SAAJ0105.impl.encoding.style.mustbe.valid.URI",
duke@1 801 new String[] { encodingStyle });
duke@1 802 throw new IllegalArgumentException(
duke@1 803 "Encoding style (" + encodingStyle + ") should be a valid URI");
duke@1 804 }
duke@1 805 }
duke@1 806 encodingStyleAttribute.setValue(encodingStyle);
duke@1 807 tryToFindEncodingStyleAttributeName();
duke@1 808 }
duke@1 809
duke@1 810 public String getEncodingStyle() {
duke@1 811 String encodingStyle = encodingStyleAttribute.getValue();
duke@1 812 if (encodingStyle != null)
duke@1 813 return encodingStyle;
duke@1 814 String soapNamespace = getSOAPNamespace();
duke@1 815 if (soapNamespace != null) {
duke@1 816 Attr attr = getAttributeNodeNS(soapNamespace, "encodingStyle");
duke@1 817 if (attr != null) {
duke@1 818 encodingStyle = attr.getValue();
duke@1 819 try {
duke@1 820 setEncodingStyle(encodingStyle);
duke@1 821 } catch (SOAPException se) {
duke@1 822 // has to be ignored
duke@1 823 }
duke@1 824 return encodingStyle;
duke@1 825 }
duke@1 826 }
duke@1 827 return null;
duke@1 828 }
duke@1 829
duke@1 830 // Node methods
duke@1 831 public String getValue() {
duke@1 832 javax.xml.soap.Node valueNode = getValueNode();
duke@1 833 return valueNode == null ? null : valueNode.getValue();
duke@1 834 }
duke@1 835
duke@1 836 public void setValue(String value) {
duke@1 837 Node valueNode = getValueNodeStrict();
duke@1 838 if (valueNode != null) {
duke@1 839 valueNode.setNodeValue(value);
duke@1 840 } else {
duke@1 841 try {
duke@1 842 addTextNode(value);
duke@1 843 } catch (SOAPException e) {
duke@1 844 throw new RuntimeException(e.getMessage());
duke@1 845 }
duke@1 846 }
duke@1 847 }
duke@1 848
duke@1 849 protected Node getValueNodeStrict() {
duke@1 850 Node node = getFirstChild();
duke@1 851 if (node != null) {
duke@1 852 if (node.getNextSibling() == null
duke@1 853 && node.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
duke@1 854 return node;
duke@1 855 } else {
duke@1 856 log.severe("SAAJ0107.impl.elem.child.not.single.text");
duke@1 857 throw new IllegalStateException();
duke@1 858 }
duke@1 859 }
duke@1 860
duke@1 861 return null;
duke@1 862 }
duke@1 863
duke@1 864 protected javax.xml.soap.Node getValueNode() {
duke@1 865 Iterator i = getChildElements();
duke@1 866 while (i.hasNext()) {
duke@1 867 javax.xml.soap.Node n = (javax.xml.soap.Node) i.next();
duke@1 868 if (n.getNodeType() == org.w3c.dom.Node.TEXT_NODE ||
duke@1 869 n.getNodeType() == org.w3c.dom.Node.CDATA_SECTION_NODE) {
duke@1 870 // TODO: Hack to fix text node split into multiple lines.
duke@1 871 normalize();
duke@1 872 // Should remove the normalization step when this gets fixed in
duke@1 873 // DOM/Xerces.
duke@1 874 return (javax.xml.soap.Node) n;
duke@1 875 }
duke@1 876 }
duke@1 877 return null;
duke@1 878 }
duke@1 879
duke@1 880 public void setParentElement(SOAPElement element) throws SOAPException {
duke@1 881 if (element == null) {
duke@1 882 log.severe("SAAJ0106.impl.no.null.to.parent.elem");
duke@1 883 throw new SOAPException("Cannot pass NULL to setParentElement");
duke@1 884 }
duke@1 885 element.addChildElement(this);
duke@1 886 findEncodingStyleAttributeName();
duke@1 887 }
duke@1 888
duke@1 889 protected void findEncodingStyleAttributeName() throws SOAPException {
duke@1 890 String soapNamespace = getSOAPNamespace();
duke@1 891 if (soapNamespace != null) {
duke@1 892 String soapNamespacePrefix = getNamespacePrefix(soapNamespace);
duke@1 893 if (soapNamespacePrefix != null) {
duke@1 894 setEncodingStyleNamespace(soapNamespace, soapNamespacePrefix);
duke@1 895 }
duke@1 896 }
duke@1 897 }
duke@1 898
duke@1 899 protected void setEncodingStyleNamespace(
duke@1 900 String soapNamespace,
duke@1 901 String soapNamespacePrefix)
duke@1 902 throws SOAPException {
duke@1 903 Name encodingStyleAttributeName =
duke@1 904 NameImpl.create(
duke@1 905 "encodingStyle",
duke@1 906 soapNamespacePrefix,
duke@1 907 soapNamespace);
duke@1 908 encodingStyleAttribute.setName(encodingStyleAttributeName);
duke@1 909 }
duke@1 910
duke@1 911 public SOAPElement getParentElement() {
duke@1 912 Node parentNode = getParentNode();
duke@1 913 if (parentNode instanceof SOAPDocument) {
duke@1 914 return null;
duke@1 915 }
duke@1 916 return (SOAPElement) parentNode;
duke@1 917 }
duke@1 918
duke@1 919 protected String getSOAPNamespace() {
duke@1 920 String soapNamespace = null;
duke@1 921
duke@1 922 SOAPElement antecedent = this;
duke@1 923 while (antecedent != null) {
duke@1 924 Name antecedentName = antecedent.getElementName();
duke@1 925 String antecedentNamespace = antecedentName.getURI();
duke@1 926
duke@1 927 if (NameImpl.SOAP11_NAMESPACE.equals(antecedentNamespace)
duke@1 928 || NameImpl.SOAP12_NAMESPACE.equals(antecedentNamespace)) {
duke@1 929
duke@1 930 soapNamespace = antecedentNamespace;
duke@1 931 break;
duke@1 932 }
duke@1 933
duke@1 934 antecedent = antecedent.getParentElement();
duke@1 935 }
duke@1 936
duke@1 937 return soapNamespace;
duke@1 938 }
duke@1 939
duke@1 940 public void detachNode() {
duke@1 941 Node parent = getParentNode();
duke@1 942 if (parent != null) {
duke@1 943 parent.removeChild(this);
duke@1 944 }
tbell@45 945 encodingStyleAttribute.clearNameAndValue();
tbell@45 946 // Fix for CR: 6474641
tbell@45 947 //tryToFindEncodingStyleAttributeName();
duke@1 948 }
duke@1 949
duke@1 950 public void tryToFindEncodingStyleAttributeName() {
duke@1 951 try {
duke@1 952 findEncodingStyleAttributeName();
duke@1 953 } catch (SOAPException e) { /*okay to fail*/
duke@1 954 }
duke@1 955 }
duke@1 956
duke@1 957 public void recycleNode() {
duke@1 958 detachNode();
duke@1 959 // TBD
duke@1 960 // - add this to the factory so subsequent
duke@1 961 // creations can reuse this object.
duke@1 962 }
duke@1 963
duke@1 964 class AttributeManager {
duke@1 965 Name attributeName = null;
duke@1 966 String attributeValue = null;
duke@1 967
duke@1 968 public void setName(Name newName) throws SOAPException {
duke@1 969 clearAttribute();
duke@1 970 attributeName = newName;
duke@1 971 reconcileAttribute();
duke@1 972 }
duke@1 973 public void clearName() {
duke@1 974 clearAttribute();
duke@1 975 attributeName = null;
duke@1 976 }
duke@1 977 public void setValue(String value) throws SOAPException {
duke@1 978 attributeValue = value;
duke@1 979 reconcileAttribute();
duke@1 980 }
duke@1 981 public Name getName() {
duke@1 982 return attributeName;
duke@1 983 }
duke@1 984 public String getValue() {
duke@1 985 return attributeValue;
duke@1 986 }
tbell@45 987
tbell@45 988 /** Note: to be used only in detachNode method */
tbell@45 989 public void clearNameAndValue() {
tbell@45 990 attributeName = null;
tbell@45 991 attributeValue = null;
tbell@45 992 }
tbell@45 993
duke@1 994 private void reconcileAttribute() throws SOAPException {
duke@1 995 if (attributeName != null) {
duke@1 996 removeAttribute(attributeName);
duke@1 997 if (attributeValue != null) {
duke@1 998 addAttribute(attributeName, attributeValue);
duke@1 999 }
duke@1 1000 }
duke@1 1001 }
duke@1 1002 private void clearAttribute() {
duke@1 1003 if (attributeName != null) {
duke@1 1004 removeAttribute(attributeName);
duke@1 1005 }
duke@1 1006 }
duke@1 1007 }
duke@1 1008
duke@1 1009 protected static org.w3c.dom.Attr getNamespaceAttrFrom(
duke@1 1010 Element element,
duke@1 1011 String prefix) {
duke@1 1012 NamespaceContextIterator eachNamespace =
duke@1 1013 new NamespaceContextIterator(element);
duke@1 1014 while (eachNamespace.hasNext()) {
duke@1 1015 org.w3c.dom.Attr namespaceDecl = eachNamespace.nextNamespaceAttr();
duke@1 1016 String declaredPrefix =
duke@1 1017 NameImpl.getLocalNameFromTagName(namespaceDecl.getNodeName());
duke@1 1018 if (declaredPrefix.equals(prefix)) {
duke@1 1019 return namespaceDecl;
duke@1 1020 }
duke@1 1021 }
duke@1 1022 return null;
duke@1 1023 }
duke@1 1024
duke@1 1025 protected static Iterator getAllAttributesFrom(final Element element) {
duke@1 1026 final NamedNodeMap attributes = element.getAttributes();
duke@1 1027
duke@1 1028 return new Iterator() {
duke@1 1029 int attributesLength = attributes.getLength();
duke@1 1030 int attributeIndex = 0;
duke@1 1031 String currentName;
duke@1 1032
duke@1 1033 public boolean hasNext() {
duke@1 1034 return attributeIndex < attributesLength;
duke@1 1035 }
duke@1 1036
duke@1 1037 public Object next() {
duke@1 1038 if (!hasNext()) {
duke@1 1039 throw new NoSuchElementException();
duke@1 1040 }
duke@1 1041 Node current = attributes.item(attributeIndex++);
duke@1 1042 currentName = current.getNodeName();
duke@1 1043
duke@1 1044 String prefix = NameImpl.getPrefixFromTagName(currentName);
duke@1 1045 if (prefix.length() == 0) {
duke@1 1046 return NameImpl.createFromUnqualifiedName(currentName);
duke@1 1047 } else {
duke@1 1048 Name attributeName =
duke@1 1049 NameImpl.createFromQualifiedName(
duke@1 1050 currentName,
duke@1 1051 current.getNamespaceURI());
duke@1 1052 return attributeName;
duke@1 1053 }
duke@1 1054 }
duke@1 1055
duke@1 1056 public void remove() {
duke@1 1057 if (currentName == null) {
duke@1 1058 throw new IllegalStateException();
duke@1 1059 }
duke@1 1060 attributes.removeNamedItem(currentName);
duke@1 1061 }
duke@1 1062 };
duke@1 1063 }
duke@1 1064
duke@1 1065 protected static String getAttributeValueFrom(Element element, Name name) {
duke@1 1066 return getAttributeValueFrom(
duke@1 1067 element,
duke@1 1068 name.getURI(),
duke@1 1069 name.getLocalName(),
duke@1 1070 name.getPrefix(),
duke@1 1071 name.getQualifiedName());
duke@1 1072 }
duke@1 1073
duke@1 1074 private static String getAttributeValueFrom(
duke@1 1075 Element element,
duke@1 1076 String uri,
duke@1 1077 String localName,
duke@1 1078 String prefix,
duke@1 1079 String qualifiedName) {
duke@1 1080
duke@1 1081 String nonzeroLengthUri =
duke@1 1082 (uri == null || uri.length() == 0) ? null : uri;
duke@1 1083
duke@1 1084 boolean mustUseGetAttributeNodeNS = (nonzeroLengthUri != null);
duke@1 1085
duke@1 1086 if (mustUseGetAttributeNodeNS) {
duke@1 1087
duke@1 1088 if (!element.hasAttributeNS(uri, localName)) {
duke@1 1089 return null;
duke@1 1090 }
duke@1 1091
duke@1 1092 String attrValue =
duke@1 1093 element.getAttributeNS(nonzeroLengthUri, localName);
duke@1 1094
duke@1 1095 return attrValue;
duke@1 1096 }
duke@1 1097
duke@1 1098 Attr attribute = null;
duke@1 1099 attribute = element.getAttributeNode(qualifiedName);
duke@1 1100
duke@1 1101 return attribute == null ? null : attribute.getValue();
duke@1 1102 }
duke@1 1103
duke@1 1104 protected static Iterator getChildElementsFrom(final Element element) {
duke@1 1105 return new Iterator() {
duke@1 1106 Node next = element.getFirstChild();
duke@1 1107 Node nextNext = null;
duke@1 1108 Node last = null;
duke@1 1109
duke@1 1110 public boolean hasNext() {
duke@1 1111 if (next != null) {
duke@1 1112 return true;
duke@1 1113 }
duke@1 1114 if (next == null && nextNext != null) {
duke@1 1115 next = nextNext;
duke@1 1116 }
duke@1 1117
duke@1 1118 return next != null;
duke@1 1119 }
duke@1 1120
duke@1 1121 public Object next() {
duke@1 1122 if (hasNext()) {
duke@1 1123 last = next;
duke@1 1124 next = null;
duke@1 1125
duke@1 1126 if ((element instanceof ElementImpl)
duke@1 1127 && (last instanceof Element)) {
duke@1 1128 last =
duke@1 1129 ((ElementImpl) element).convertToSoapElement(
duke@1 1130 (Element) last);
duke@1 1131 }
duke@1 1132
duke@1 1133 nextNext = last.getNextSibling();
duke@1 1134 return last;
duke@1 1135 }
duke@1 1136 throw new NoSuchElementException();
duke@1 1137 }
duke@1 1138
duke@1 1139 public void remove() {
duke@1 1140 if (last == null) {
duke@1 1141 throw new IllegalStateException();
duke@1 1142 }
duke@1 1143 Node target = last;
duke@1 1144 last = null;
duke@1 1145 element.removeChild(target);
duke@1 1146 }
duke@1 1147 };
duke@1 1148 }
duke@1 1149
duke@1 1150 public static String getQualifiedName(QName name) {
duke@1 1151 String prefix = name.getPrefix();
duke@1 1152 String localName = name.getLocalPart();
duke@1 1153 String qualifiedName = null;
duke@1 1154
duke@1 1155 if (prefix != null && prefix.length() > 0) {
duke@1 1156 qualifiedName = prefix + ":" + localName;
duke@1 1157 } else {
duke@1 1158 qualifiedName = localName;
duke@1 1159 }
duke@1 1160 return qualifiedName;
duke@1 1161 }
duke@1 1162
duke@1 1163 public static String getLocalPart(String qualifiedName) {
duke@1 1164 if (qualifiedName == null) {
duke@1 1165 // Log
duke@1 1166 throw new IllegalArgumentException("Cannot get local name for a \"null\" qualified name");
duke@1 1167 }
duke@1 1168
duke@1 1169 int index = qualifiedName.indexOf(':');
duke@1 1170 if (index < 0)
duke@1 1171 return qualifiedName;
duke@1 1172 else
duke@1 1173 return qualifiedName.substring(index + 1);
duke@1 1174 }
duke@1 1175
duke@1 1176 public static String getPrefix(String qualifiedName) {
duke@1 1177 if (qualifiedName == null) {
duke@1 1178 // Log
duke@1 1179 throw new IllegalArgumentException("Cannot get prefix for a \"null\" qualified name");
duke@1 1180 }
duke@1 1181
duke@1 1182 int index = qualifiedName.indexOf(':');
duke@1 1183 if (index < 0)
duke@1 1184 return "";
duke@1 1185 else
duke@1 1186 return qualifiedName.substring(0, index);
duke@1 1187 }
duke@1 1188
duke@1 1189 protected boolean isNamespaceQualified(Name name) {
duke@1 1190 return !"".equals(name.getURI());
duke@1 1191 }
duke@1 1192
duke@1 1193 protected boolean isNamespaceQualified(QName name) {
duke@1 1194 return !"".equals(name.getNamespaceURI());
duke@1 1195 }
duke@1 1196
duke@1 1197 protected SOAPElement circumventBug5034339(SOAPElement element) {
duke@1 1198
duke@1 1199 Name elementName = element.getElementName();
duke@1 1200 if (!isNamespaceQualified(elementName)) {
duke@1 1201 String prefix = elementName.getPrefix();
duke@1 1202 String defaultNamespace = getNamespaceURI(prefix);
duke@1 1203 if (defaultNamespace != null) {
duke@1 1204 Name newElementName =
duke@1 1205 NameImpl.create(
duke@1 1206 elementName.getLocalName(),
duke@1 1207 elementName.getPrefix(),
duke@1 1208 defaultNamespace);
duke@1 1209 SOAPElement newElement = createElement(newElementName);
duke@1 1210 replaceChild(newElement, element);
duke@1 1211 return newElement;
duke@1 1212 }
duke@1 1213 }
duke@1 1214 return element;
duke@1 1215 }
duke@1 1216
duke@1 1217 //TODO: This is a temporary SAAJ workaround for optimizing XWS
duke@1 1218 // should be removed once the corresponding JAXP bug is fixed
duke@1 1219 // It appears the bug will be fixed in JAXP 1.4 (not by Appserver 9 timeframe)
duke@1 1220 public void setAttributeNS(
duke@1 1221 String namespaceURI,String qualifiedName, String value) {
duke@1 1222 int index = qualifiedName.indexOf(':');
duke@1 1223 String prefix, localName;
duke@1 1224 if (index < 0) {
duke@1 1225 prefix = null;
duke@1 1226 localName = qualifiedName;
duke@1 1227 }
duke@1 1228 else {
duke@1 1229 prefix = qualifiedName.substring(0, index);
duke@1 1230 localName = qualifiedName.substring(index + 1);
duke@1 1231 }
tbell@45 1232
tbell@45 1233 // Workaround for bug 6467808 - This needs to be fixed in JAXP
tbell@45 1234
tbell@45 1235 // Rolling back this fix, this is a wrong fix, infact its causing other regressions in JAXWS tck and
tbell@45 1236 // other tests, because of this change the namespace declarations on soapenv:Fault element are never
tbell@45 1237 // picked up. The fix for bug 6467808 should be in JAXP.
tbell@45 1238 // if(elementQName.getLocalPart().equals("Fault") &&
tbell@45 1239 // (SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(value) ||
tbell@45 1240 // SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE.equals(value)))
tbell@45 1241 // return;
tbell@45 1242
tbell@45 1243 super.setAttributeNS(namespaceURI,qualifiedName,value);
duke@1 1244 //String tmpLocalName = this.getLocalName();
duke@1 1245 String tmpURI = this.getNamespaceURI();
duke@1 1246 boolean isIDNS = false;
duke@1 1247 if( tmpURI != null && (tmpURI.equals(DSIG_NS) || tmpURI.equals(XENC_NS))){
duke@1 1248 isIDNS = true;
duke@1 1249 }
duke@1 1250 //No need to check for Signature/encryption element
duke@1 1251 //just check for namespace.
duke@1 1252 if(localName.equals("Id")){
duke@1 1253 if(namespaceURI == null || namespaceURI.equals("")){
duke@1 1254 setIdAttribute(localName,true);
duke@1 1255 }else if(isIDNS || WSU_NS.equals(namespaceURI)){
duke@1 1256 setIdAttributeNS(namespaceURI,localName,true);
duke@1 1257 }
duke@1 1258 }
duke@1 1259
duke@1 1260 }
duke@1 1261
duke@1 1262 }

mercurial