src/share/classes/com/sun/xml/internal/messaging/saaj/soap/SOAPPartImpl.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;
duke@1 33
duke@1 34 import java.io.*;
duke@1 35 import java.util.Iterator;
duke@1 36 import java.util.logging.Logger;
duke@1 37 import java.util.logging.Level;
duke@1 38
duke@1 39 import javax.activation.DataHandler;
duke@1 40 import javax.activation.DataSource;
duke@1 41 import javax.xml.soap.*;
duke@1 42 import javax.xml.transform.Source;
duke@1 43 import javax.xml.transform.stream.StreamSource;
duke@1 44
duke@1 45 import org.w3c.dom.*;
duke@1 46
duke@1 47 import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeBodyPart;
duke@1 48
duke@1 49 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
duke@1 50 import com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl;
duke@1 51 import com.sun.xml.internal.messaging.saaj.soap.impl.EnvelopeImpl;
duke@1 52 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
duke@1 53 import com.sun.xml.internal.messaging.saaj.util.*;
duke@1 54 import javax.xml.transform.sax.SAXSource;
duke@1 55
duke@1 56 /**
duke@1 57 * SOAPPartImpl is the first attachment. This contains the XML/SOAP document.
duke@1 58 *
duke@1 59 * @author Anil Vijendran (anil@sun.com)
duke@1 60 */
duke@1 61 public abstract class SOAPPartImpl extends SOAPPart implements SOAPDocument {
tbell@50 62 protected static final Logger log =
duke@1 63 Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
duke@1 64 "com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
duke@1 65
duke@1 66 protected MimeHeaders headers;
duke@1 67 protected Envelope envelope;
duke@1 68 protected Source source;
duke@1 69 protected SOAPDocumentImpl document;
duke@1 70
duke@1 71 //flag to indicate if a setContent happened.
duke@1 72 private boolean sourceWasSet = false;
duke@1 73
duke@1 74 // Records whether the input source had an xml decl or not.
duke@1 75 protected boolean omitXmlDecl = true;
duke@1 76
duke@1 77 // Records the charset encoding of the input stream source if provided.
duke@1 78 protected String sourceCharsetEncoding = null;
duke@1 79
duke@1 80 /**
duke@1 81 * Reference to containing message (may be null)
duke@1 82 */
duke@1 83 protected MessageImpl message;
duke@1 84
duke@1 85 protected SOAPPartImpl() {
duke@1 86 this(null);
duke@1 87 }
duke@1 88
duke@1 89 protected SOAPPartImpl(MessageImpl message) {
duke@1 90 document = new SOAPDocumentImpl(this);
duke@1 91 headers = new MimeHeaders();
duke@1 92 this.message = message;
duke@1 93 headers.setHeader("Content-Type", getContentType());
duke@1 94 }
duke@1 95
duke@1 96 protected abstract String getContentType();
duke@1 97 protected abstract Envelope createEnvelopeFromSource()
duke@1 98 throws SOAPException;
duke@1 99 protected abstract Envelope createEmptyEnvelope(String prefix)
duke@1 100 throws SOAPException;
duke@1 101 protected abstract SOAPPartImpl duplicateType();
duke@1 102
duke@1 103 protected String getContentTypeString() {
duke@1 104 return getContentType();
duke@1 105 }
duke@1 106
duke@1 107 public boolean isFastInfoset() {
duke@1 108 return (message != null) ? message.isFastInfoset() : false;
duke@1 109 }
duke@1 110
duke@1 111 public SOAPEnvelope getEnvelope() throws SOAPException {
duke@1 112
duke@1 113 // If there is no SOAP envelope already created, then create
duke@1 114 // one from a source if one exists. If there is a newer source
duke@1 115 // then use that source.
duke@1 116
duke@1 117 if (sourceWasSet)
duke@1 118 sourceWasSet = false;
duke@1 119
duke@1 120 lookForEnvelope();
duke@1 121 if (envelope != null) {
duke@1 122 if (source != null) { // there's a newer source, use it
duke@1 123 document.removeChild(envelope);
duke@1 124 envelope = createEnvelopeFromSource();
duke@1 125 }
duke@1 126 } else if (source != null) {
duke@1 127 envelope = createEnvelopeFromSource();
duke@1 128 } else {
duke@1 129 envelope = createEmptyEnvelope(null);
duke@1 130 document.insertBefore(envelope, null);
duke@1 131 }
duke@1 132 return envelope;
duke@1 133 }
duke@1 134
duke@1 135 protected void lookForEnvelope() throws SOAPException {
duke@1 136 Element envelopeChildElement = document.doGetDocumentElement();
duke@1 137 if (envelopeChildElement == null || envelopeChildElement instanceof Envelope) {
duke@1 138 envelope = (EnvelopeImpl) envelopeChildElement;
duke@1 139 } else if (!(envelopeChildElement instanceof ElementImpl)) {
duke@1 140 log.severe("SAAJ0512.soap.incorrect.factory.used");
duke@1 141 throw new SOAPExceptionImpl("Unable to create envelope: incorrect factory used during tree construction");
duke@1 142 } else {
duke@1 143 ElementImpl soapElement = (ElementImpl) envelopeChildElement;
duke@1 144 if (soapElement.getLocalName().equalsIgnoreCase("Envelope")) {
duke@1 145 String prefix = soapElement.getPrefix();
duke@1 146 String uri = (prefix == null) ? soapElement.getNamespaceURI() : soapElement.getNamespaceURI(prefix);
duke@1 147 if(!uri.equals(NameImpl.SOAP11_NAMESPACE) && !uri.equals(NameImpl.SOAP12_NAMESPACE)) {
duke@1 148 log.severe("SAAJ0513.soap.unknown.ns");
duke@1 149 throw new SOAPVersionMismatchException("Unable to create envelope from given source because the namespace was not recognized");
duke@1 150 }
duke@1 151 } else {
duke@1 152 log.severe("SAAJ0514.soap.root.elem.not.named.envelope");
duke@1 153 throw new SOAPExceptionImpl(
duke@1 154 "Unable to create envelope from given source because the root element is not named \"Envelope\"");
duke@1 155 }
duke@1 156 }
duke@1 157 }
duke@1 158
duke@1 159 public void removeAllMimeHeaders() {
duke@1 160 headers.removeAllHeaders();
duke@1 161 }
duke@1 162
duke@1 163 public void removeMimeHeader(String header) {
duke@1 164 headers.removeHeader(header);
duke@1 165 }
duke@1 166
duke@1 167 public String[] getMimeHeader(String name) {
duke@1 168 return headers.getHeader(name);
duke@1 169 }
duke@1 170
duke@1 171 public void setMimeHeader(String name, String value) {
duke@1 172 headers.setHeader(name, value);
duke@1 173 }
duke@1 174
duke@1 175 public void addMimeHeader(String name, String value) {
duke@1 176 headers.addHeader(name, value);
duke@1 177 }
duke@1 178
duke@1 179 public Iterator getAllMimeHeaders() {
duke@1 180 return headers.getAllHeaders();
duke@1 181 }
duke@1 182
duke@1 183 public Iterator getMatchingMimeHeaders(String[] names) {
duke@1 184 return headers.getMatchingHeaders(names);
duke@1 185 }
duke@1 186
duke@1 187 public Iterator getNonMatchingMimeHeaders(String[] names) {
duke@1 188 return headers.getNonMatchingHeaders(names);
duke@1 189 }
duke@1 190
duke@1 191 public Source getContent() throws SOAPException {
duke@1 192 if (source != null) {
duke@1 193 InputStream bis = null;
duke@1 194 if (source instanceof JAXMStreamSource) {
duke@1 195 StreamSource streamSource = (StreamSource)source;
duke@1 196 bis = streamSource.getInputStream();
duke@1 197 } else if (FastInfosetReflection.isFastInfosetSource(source)) {
duke@1 198 // FastInfosetSource inherits from SAXSource
duke@1 199 SAXSource saxSource = (SAXSource)source;
duke@1 200 bis = saxSource.getInputSource().getByteStream();
duke@1 201 }
duke@1 202
duke@1 203 if (bis != null) {
duke@1 204 try {
duke@1 205 bis.reset();
duke@1 206 } catch (IOException e) {
duke@1 207 /* This exception will never be thrown.
duke@1 208 *
duke@1 209 * The setContent method will modify the source
duke@1 210 * if StreamSource to JAXMStreamSource, that uses
duke@1 211 * a ByteInputStream, and for a FastInfosetSource will
duke@1 212 * replace the InputStream with a ByteInputStream.
duke@1 213 */
duke@1 214 }
duke@1 215 }
duke@1 216 return source;
duke@1 217 }
duke@1 218
duke@1 219 return ((Envelope) getEnvelope()).getContent();
duke@1 220 }
duke@1 221
duke@1 222 public void setContent(Source source) throws SOAPException {
duke@1 223 try {
duke@1 224 if (source instanceof StreamSource) {
duke@1 225 InputStream is = ((StreamSource) source).getInputStream();
duke@1 226 Reader rdr = ((StreamSource) source).getReader();
duke@1 227
duke@1 228 if (is != null) {
duke@1 229 this.source = new JAXMStreamSource(is);
duke@1 230 } else if (rdr != null) {
duke@1 231 this.source = new JAXMStreamSource(rdr);
duke@1 232 } else {
duke@1 233 log.severe("SAAJ0544.soap.no.valid.reader.for.src");
duke@1 234 throw new SOAPExceptionImpl("Source does not have a valid Reader or InputStream");
duke@1 235 }
duke@1 236 }
duke@1 237 else if (FastInfosetReflection.isFastInfosetSource(source)) {
duke@1 238 // InputStream is = source.getInputStream()
duke@1 239 InputStream is = FastInfosetReflection.FastInfosetSource_getInputStream(source);
duke@1 240
duke@1 241 /*
duke@1 242 * Underlying stream must be ByteInputStream for getContentAsStream(). We pay the
duke@1 243 * cost of copying the underlying bytes here to avoid multiple copies every time
duke@1 244 * getBytes() is called on a ByteInputStream.
duke@1 245 */
duke@1 246 if (!(is instanceof ByteInputStream)) {
duke@1 247 ByteOutputStream bout = new ByteOutputStream();
duke@1 248 bout.write(is);
duke@1 249
duke@1 250 // source.setInputStream(new ByteInputStream(...))
duke@1 251 FastInfosetReflection.FastInfosetSource_setInputStream(
duke@1 252 source, bout.newInputStream());
duke@1 253 }
duke@1 254 this.source = source;
duke@1 255 }
duke@1 256 else {
duke@1 257 this.source = source;
duke@1 258 }
duke@1 259 sourceWasSet = true;
duke@1 260 }
duke@1 261 catch (Exception ex) {
duke@1 262 ex.printStackTrace();
duke@1 263
duke@1 264 log.severe("SAAJ0545.soap.cannot.set.src.for.part");
duke@1 265 throw new SOAPExceptionImpl(
duke@1 266 "Error setting the source for SOAPPart: " + ex.getMessage());
duke@1 267 }
duke@1 268 }
duke@1 269
duke@1 270 public ByteInputStream getContentAsStream() throws IOException {
duke@1 271 if (source != null) {
duke@1 272 InputStream is = null;
duke@1 273
duke@1 274 // Allow message to be transcode if so requested
duke@1 275 if (source instanceof StreamSource && !isFastInfoset()) {
duke@1 276 is = ((StreamSource) source).getInputStream();
duke@1 277 }
duke@1 278 else if (FastInfosetReflection.isFastInfosetSource(source) &&
duke@1 279 isFastInfoset())
duke@1 280 {
duke@1 281 try {
duke@1 282 // InputStream is = source.getInputStream()
duke@1 283 is = FastInfosetReflection.FastInfosetSource_getInputStream(source);
duke@1 284 }
duke@1 285 catch (Exception e) {
duke@1 286 throw new IOException(e.toString());
duke@1 287 }
duke@1 288 }
duke@1 289
duke@1 290 if (is != null) {
duke@1 291 if (!(is instanceof ByteInputStream)) {
duke@1 292 log.severe("SAAJ0546.soap.stream.incorrect.type");
duke@1 293 throw new IOException("Internal error: stream not of the right type");
duke@1 294 }
duke@1 295 return (ByteInputStream) is;
duke@1 296 }
duke@1 297 // need to do something here for reader...
duke@1 298 // for now we'll see if we can fallback...
duke@1 299 }
duke@1 300
duke@1 301 ByteOutputStream b = new ByteOutputStream();
duke@1 302
duke@1 303 Envelope env = null;
duke@1 304
duke@1 305 try {
duke@1 306 env = (Envelope) getEnvelope();
duke@1 307 env.output(b, isFastInfoset());
duke@1 308 }
duke@1 309 catch (SOAPException soapException) {
duke@1 310 log.severe("SAAJ0547.soap.cannot.externalize");
duke@1 311 throw new SOAPIOException(
duke@1 312 "SOAP exception while trying to externalize: ",
duke@1 313 soapException);
duke@1 314 }
duke@1 315
duke@1 316 return b.newInputStream();
duke@1 317 }
duke@1 318
duke@1 319 MimeBodyPart getMimePart() throws SOAPException {
duke@1 320 try {
duke@1 321 MimeBodyPart headerEnvelope = new MimeBodyPart();
duke@1 322
duke@1 323 headerEnvelope.setDataHandler(getDataHandler());
duke@1 324 AttachmentPartImpl.copyMimeHeaders(headers, headerEnvelope);
duke@1 325
duke@1 326 return headerEnvelope;
duke@1 327 } catch (SOAPException ex) {
duke@1 328 throw ex;
duke@1 329 } catch (Exception ex) {
duke@1 330 log.severe("SAAJ0548.soap.cannot.externalize.hdr");
duke@1 331 throw new SOAPExceptionImpl("Unable to externalize header", ex);
duke@1 332 }
duke@1 333 }
duke@1 334
duke@1 335 MimeHeaders getMimeHeaders() {
duke@1 336 return headers;
duke@1 337 }
duke@1 338
duke@1 339 DataHandler getDataHandler() {
duke@1 340 DataSource ds = new DataSource() {
duke@1 341 public OutputStream getOutputStream() throws IOException {
duke@1 342 throw new IOException("Illegal Operation");
duke@1 343 }
duke@1 344
duke@1 345 public String getContentType() {
duke@1 346 return getContentTypeString();
duke@1 347 }
duke@1 348
duke@1 349 public String getName() {
duke@1 350 return getContentId();
duke@1 351 }
duke@1 352
duke@1 353 public InputStream getInputStream() throws IOException {
duke@1 354 return getContentAsStream();
duke@1 355 }
duke@1 356 };
duke@1 357 return new DataHandler(ds);
duke@1 358 }
duke@1 359
duke@1 360 public SOAPDocumentImpl getDocument() {
duke@1 361 handleNewSource();
duke@1 362 return document;
duke@1 363 }
duke@1 364
duke@1 365 public SOAPPartImpl getSOAPPart() {
duke@1 366 return this;
duke@1 367 }
duke@1 368
duke@1 369 public DocumentType getDoctype() {
duke@1 370 return document.getDoctype();
duke@1 371 }
duke@1 372
duke@1 373 // Forward all of these calls to the document to ensure that they work the
duke@1 374 // same way whether they are called from here or directly from the document.
duke@1 375 // If the document needs any help from this SOAPPart then
duke@1 376 // Make it use a call-back as in doGetDocumentElement() below
duke@1 377 public DOMImplementation getImplementation() {
duke@1 378 return document.getImplementation();
duke@1 379 }
duke@1 380
duke@1 381 public Element getDocumentElement() {
duke@1 382 // If there is no SOAP envelope already created, then create
duke@1 383 // one from a source if one exists. If there is a newer source
duke@1 384 // then use that source.
duke@1 385 try {
duke@1 386 getEnvelope();
duke@1 387 } catch (SOAPException e) {
duke@1 388 }
duke@1 389 return document.getDocumentElement();
duke@1 390 }
duke@1 391
duke@1 392 protected void doGetDocumentElement() {
duke@1 393 handleNewSource();
duke@1 394 try {
duke@1 395 lookForEnvelope();
duke@1 396 } catch (SOAPException e) {
duke@1 397 }
duke@1 398 }
duke@1 399
duke@1 400 public Element createElement(String tagName) throws DOMException {
duke@1 401 return document.createElement(tagName);
duke@1 402 }
duke@1 403
duke@1 404 public DocumentFragment createDocumentFragment() {
duke@1 405 return document.createDocumentFragment();
duke@1 406 }
duke@1 407
duke@1 408 public org.w3c.dom.Text createTextNode(String data) {
duke@1 409 return document.createTextNode(data);
duke@1 410 }
duke@1 411
duke@1 412 public Comment createComment(String data) {
duke@1 413 return document.createComment(data);
duke@1 414 }
duke@1 415
duke@1 416 public CDATASection createCDATASection(String data) throws DOMException {
duke@1 417 return document.createCDATASection(data);
duke@1 418 }
duke@1 419
duke@1 420 public ProcessingInstruction createProcessingInstruction(
duke@1 421 String target,
duke@1 422 String data)
duke@1 423 throws DOMException {
duke@1 424 return document.createProcessingInstruction(target, data);
duke@1 425 }
duke@1 426
duke@1 427 public Attr createAttribute(String name) throws DOMException {
duke@1 428 return document.createAttribute(name);
duke@1 429 }
duke@1 430
duke@1 431 public EntityReference createEntityReference(String name)
duke@1 432 throws DOMException {
duke@1 433 return document.createEntityReference(name);
duke@1 434 }
duke@1 435
duke@1 436 public NodeList getElementsByTagName(String tagname) {
duke@1 437 handleNewSource();
duke@1 438 return document.getElementsByTagName(tagname);
duke@1 439 }
duke@1 440
duke@1 441 public org.w3c.dom.Node importNode(
duke@1 442 org.w3c.dom.Node importedNode,
duke@1 443 boolean deep)
duke@1 444 throws DOMException {
duke@1 445 handleNewSource();
duke@1 446 return document.importNode(importedNode, deep);
duke@1 447 }
duke@1 448
duke@1 449 public Element createElementNS(String namespaceURI, String qualifiedName)
duke@1 450 throws DOMException {
duke@1 451 return document.createElementNS(namespaceURI, qualifiedName);
duke@1 452 }
duke@1 453
duke@1 454 public Attr createAttributeNS(String namespaceURI, String qualifiedName)
duke@1 455 throws DOMException {
duke@1 456 return document.createAttributeNS(namespaceURI, qualifiedName);
duke@1 457 }
duke@1 458
duke@1 459 public NodeList getElementsByTagNameNS(
duke@1 460 String namespaceURI,
duke@1 461 String localName) {
duke@1 462 handleNewSource();
duke@1 463 return document.getElementsByTagNameNS(namespaceURI, localName);
duke@1 464 }
duke@1 465
duke@1 466 public Element getElementById(String elementId) {
duke@1 467 handleNewSource();
duke@1 468 return document.getElementById(elementId);
duke@1 469 }
duke@1 470 public org.w3c.dom.Node appendChild(org.w3c.dom.Node newChild)
duke@1 471 throws DOMException {
duke@1 472 handleNewSource();
duke@1 473 return document.appendChild(newChild);
duke@1 474 }
duke@1 475
duke@1 476 public org.w3c.dom.Node cloneNode(boolean deep) {
duke@1 477 handleNewSource();
duke@1 478 return document.cloneNode(deep);
duke@1 479 }
duke@1 480
duke@1 481 protected SOAPPartImpl doCloneNode() {
duke@1 482 handleNewSource();
duke@1 483 SOAPPartImpl newSoapPart = duplicateType();
duke@1 484
duke@1 485 newSoapPart.headers = MimeHeadersUtil.copy(this.headers);
duke@1 486 newSoapPart.source = this.source;
duke@1 487 return newSoapPart;
duke@1 488 }
duke@1 489
duke@1 490 public NamedNodeMap getAttributes() {
duke@1 491 return document.getAttributes();
duke@1 492 }
duke@1 493
duke@1 494 public NodeList getChildNodes() {
duke@1 495 handleNewSource();
duke@1 496 return document.getChildNodes();
duke@1 497 }
duke@1 498
duke@1 499 public org.w3c.dom.Node getFirstChild() {
duke@1 500 handleNewSource();
duke@1 501 return document.getFirstChild();
duke@1 502 }
duke@1 503
duke@1 504 public org.w3c.dom.Node getLastChild() {
duke@1 505 handleNewSource();
duke@1 506 return document.getLastChild();
duke@1 507 }
duke@1 508
duke@1 509 public String getLocalName() {
duke@1 510 return document.getLocalName();
duke@1 511 }
duke@1 512
duke@1 513 public String getNamespaceURI() {
duke@1 514 return document.getNamespaceURI();
duke@1 515 }
duke@1 516
duke@1 517 public org.w3c.dom.Node getNextSibling() {
duke@1 518 handleNewSource();
duke@1 519 return document.getNextSibling();
duke@1 520 }
duke@1 521
duke@1 522 public String getNodeName() {
duke@1 523 return document.getNodeName();
duke@1 524 }
duke@1 525
duke@1 526 public short getNodeType() {
duke@1 527 return document.getNodeType();
duke@1 528 }
duke@1 529
duke@1 530 public String getNodeValue() throws DOMException {
duke@1 531 return document.getNodeValue();
duke@1 532 }
duke@1 533
duke@1 534 public Document getOwnerDocument() {
duke@1 535 return document.getOwnerDocument();
duke@1 536 }
duke@1 537
duke@1 538 public org.w3c.dom.Node getParentNode() {
duke@1 539 return document.getParentNode();
duke@1 540 }
duke@1 541
duke@1 542 public String getPrefix() {
duke@1 543 return document.getPrefix();
duke@1 544 }
duke@1 545
duke@1 546 public org.w3c.dom.Node getPreviousSibling() {
duke@1 547 return document.getPreviousSibling();
duke@1 548 }
duke@1 549
duke@1 550 public boolean hasAttributes() {
duke@1 551 return document.hasAttributes();
duke@1 552 }
duke@1 553
duke@1 554 public boolean hasChildNodes() {
duke@1 555 handleNewSource();
duke@1 556 return document.hasChildNodes();
duke@1 557 }
duke@1 558
duke@1 559 public org.w3c.dom.Node insertBefore(
duke@1 560 org.w3c.dom.Node arg0,
duke@1 561 org.w3c.dom.Node arg1)
duke@1 562 throws DOMException {
duke@1 563 handleNewSource();
duke@1 564 return document.insertBefore(arg0, arg1);
duke@1 565 }
duke@1 566
duke@1 567 public boolean isSupported(String arg0, String arg1) {
duke@1 568 return document.isSupported(arg0, arg1);
duke@1 569 }
duke@1 570
duke@1 571 public void normalize() {
duke@1 572 handleNewSource();
duke@1 573 document.normalize();
duke@1 574 }
duke@1 575
duke@1 576 public org.w3c.dom.Node removeChild(org.w3c.dom.Node arg0)
duke@1 577 throws DOMException {
duke@1 578 handleNewSource();
duke@1 579 return document.removeChild(arg0);
duke@1 580 }
duke@1 581
duke@1 582 public org.w3c.dom.Node replaceChild(
duke@1 583 org.w3c.dom.Node arg0,
duke@1 584 org.w3c.dom.Node arg1)
duke@1 585 throws DOMException {
duke@1 586 handleNewSource();
duke@1 587 return document.replaceChild(arg0, arg1);
duke@1 588 }
duke@1 589
duke@1 590 public void setNodeValue(String arg0) throws DOMException {
duke@1 591 document.setNodeValue(arg0);
duke@1 592 }
duke@1 593
duke@1 594 public void setPrefix(String arg0) throws DOMException {
duke@1 595 document.setPrefix(arg0);
duke@1 596 }
duke@1 597
duke@1 598 private void handleNewSource() {
duke@1 599 if (sourceWasSet) {
duke@1 600 // There is a newer source use that source.
duke@1 601 try {
duke@1 602 getEnvelope();
duke@1 603 } catch (SOAPException e) {
duke@1 604 }
duke@1 605 }
duke@1 606 }
duke@1 607
duke@1 608 protected XMLDeclarationParser lookForXmlDecl() throws SOAPException {
duke@1 609 if ((source != null) && (source instanceof StreamSource)) {
duke@1 610
duke@1 611 Reader reader = null;
duke@1 612
duke@1 613 InputStream inputStream = ((StreamSource) source).getInputStream();
duke@1 614 if (inputStream != null) {
duke@1 615 if (sourceCharsetEncoding == null) {
duke@1 616 reader = new InputStreamReader(inputStream);
duke@1 617 } else {
duke@1 618 try {
duke@1 619 reader =
duke@1 620 new InputStreamReader(
duke@1 621 inputStream, sourceCharsetEncoding);
duke@1 622 } catch (UnsupportedEncodingException uee) {
duke@1 623 log.log(
duke@1 624 Level.SEVERE,
duke@1 625 "SAAJ0551.soap.unsupported.encoding",
duke@1 626 new Object[] {sourceCharsetEncoding});
duke@1 627 throw new SOAPExceptionImpl(
duke@1 628 "Unsupported encoding " + sourceCharsetEncoding,
duke@1 629 uee);
duke@1 630 }
duke@1 631 }
duke@1 632 } else {
duke@1 633 reader = ((StreamSource) source).getReader();
duke@1 634 }
duke@1 635 if (reader != null) {
duke@1 636 PushbackReader pushbackReader =
duke@1 637 new PushbackReader(reader, 4096); //some size to unread <?xml ....?>
duke@1 638 XMLDeclarationParser ev =
duke@1 639 new XMLDeclarationParser(pushbackReader);
duke@1 640 try {
duke@1 641 ev.parse();
duke@1 642 } catch (Exception e) {
duke@1 643 log.log(
duke@1 644 Level.SEVERE,
duke@1 645 "SAAJ0552.soap.xml.decl.parsing.failed");
duke@1 646 throw new SOAPExceptionImpl(
duke@1 647 "XML declaration parsing failed", e);
duke@1 648 }
duke@1 649 String xmlDecl = ev.getXmlDeclaration();
duke@1 650 if ((xmlDecl != null) && (xmlDecl.length() > 0))
duke@1 651 this.omitXmlDecl = false;
duke@1 652 return ev;
duke@1 653 }
duke@1 654 }
duke@1 655 return null;
duke@1 656 }
duke@1 657
duke@1 658 public void setSourceCharsetEncoding(String charset) {
duke@1 659 this.sourceCharsetEncoding = charset;
duke@1 660 }
duke@1 661
duke@1 662 public org.w3c.dom.Node renameNode(org.w3c.dom.Node n, String namespaceURI, String qualifiedName)
duke@1 663 throws DOMException {
duke@1 664 handleNewSource();
duke@1 665 return document.renameNode(n, namespaceURI, qualifiedName);
duke@1 666 }
duke@1 667
duke@1 668 public void normalizeDocument() {
duke@1 669 document.normalizeDocument();
duke@1 670 }
duke@1 671
duke@1 672 public DOMConfiguration getDomConfig() {
duke@1 673 return document.getDomConfig();
duke@1 674 }
duke@1 675
duke@1 676 public org.w3c.dom.Node adoptNode(org.w3c.dom.Node source) throws DOMException {
duke@1 677 handleNewSource();
duke@1 678 return document.adoptNode(source);
duke@1 679 }
duke@1 680
duke@1 681 public void setDocumentURI(String documentURI) {
duke@1 682 document.setDocumentURI(documentURI);
duke@1 683 }
duke@1 684
duke@1 685 public String getDocumentURI() {
duke@1 686 return document.getDocumentURI();
duke@1 687 }
duke@1 688
duke@1 689 public void setStrictErrorChecking(boolean strictErrorChecking) {
duke@1 690 document.setStrictErrorChecking(strictErrorChecking);
duke@1 691 }
duke@1 692
duke@1 693 public String getInputEncoding() {
duke@1 694 return document.getInputEncoding();
duke@1 695 }
duke@1 696
duke@1 697 public String getXmlEncoding() {
duke@1 698 return document.getXmlEncoding();
duke@1 699 }
duke@1 700
duke@1 701 public boolean getXmlStandalone() {
duke@1 702 return document.getXmlStandalone();
duke@1 703 }
duke@1 704
duke@1 705 public void setXmlStandalone(boolean xmlStandalone) throws DOMException {
duke@1 706 document.setXmlStandalone(xmlStandalone);
duke@1 707 }
duke@1 708
duke@1 709 public String getXmlVersion() {
duke@1 710 return document.getXmlVersion();
duke@1 711 }
duke@1 712
duke@1 713 public void setXmlVersion(String xmlVersion) throws DOMException {
duke@1 714 document.setXmlVersion(xmlVersion);
duke@1 715 }
duke@1 716
duke@1 717 public boolean getStrictErrorChecking() {
duke@1 718 return document.getStrictErrorChecking();
duke@1 719 }
duke@1 720
duke@1 721 // DOM L3 methods from org.w3c.dom.Node
duke@1 722 public String getBaseURI() {
duke@1 723 return document.getBaseURI();
duke@1 724 }
duke@1 725
duke@1 726 public short compareDocumentPosition(org.w3c.dom.Node other)
duke@1 727 throws DOMException {
duke@1 728 return document.compareDocumentPosition(other);
duke@1 729 }
duke@1 730
duke@1 731 public String getTextContent()
duke@1 732 throws DOMException {
duke@1 733 return document.getTextContent();
duke@1 734 }
duke@1 735
duke@1 736 public void setTextContent(String textContent) throws DOMException {
duke@1 737 document.setTextContent(textContent);
duke@1 738 }
duke@1 739
duke@1 740 public boolean isSameNode(org.w3c.dom.Node other) {
duke@1 741 return document.isSameNode(other);
duke@1 742 }
duke@1 743
duke@1 744 public String lookupPrefix(String namespaceURI) {
duke@1 745 return document.lookupPrefix(namespaceURI);
duke@1 746 }
duke@1 747
duke@1 748 public boolean isDefaultNamespace(String namespaceURI) {
duke@1 749 return document.isDefaultNamespace(namespaceURI);
duke@1 750 }
duke@1 751
duke@1 752 public String lookupNamespaceURI(String prefix) {
duke@1 753 return document.lookupNamespaceURI(prefix);
duke@1 754 }
duke@1 755
duke@1 756 public boolean isEqualNode(org.w3c.dom.Node arg) {
duke@1 757 return document.isEqualNode(arg);
duke@1 758 }
duke@1 759
duke@1 760 public Object getFeature(String feature,
duke@1 761 String version) {
duke@1 762 return document.getFeature(feature,version);
duke@1 763 }
duke@1 764
duke@1 765 public Object setUserData(String key,
duke@1 766 Object data,
duke@1 767 UserDataHandler handler) {
duke@1 768 return document.setUserData(key, data, handler);
duke@1 769 }
duke@1 770
duke@1 771 public Object getUserData(String key) {
duke@1 772 return document.getUserData(key);
duke@1 773 }
duke@1 774
duke@1 775 public void recycleNode() {
duke@1 776 // Nothing seems to be required to be done here
duke@1 777 }
duke@1 778
duke@1 779 public String getValue() {
duke@1 780 return null;
duke@1 781 }
duke@1 782
duke@1 783 public void setValue(String value) {
duke@1 784 log.severe("SAAJ0571.soappart.setValue.not.defined");
duke@1 785 throw new IllegalStateException("Setting value of a soap part is not defined");
duke@1 786 }
duke@1 787
duke@1 788 public void setParentElement(SOAPElement parent) throws SOAPException {
duke@1 789 log.severe("SAAJ0570.soappart.parent.element.not.defined");
duke@1 790 throw new SOAPExceptionImpl("The parent element of a soap part is not defined");
duke@1 791 }
duke@1 792
duke@1 793 public SOAPElement getParentElement() {
duke@1 794 return null;
duke@1 795 }
duke@1 796
duke@1 797 public void detachNode() {
duke@1 798 // Nothing seems to be required to be done here
duke@1 799 }
duke@1 800 }

mercurial