src/share/jaxws_classes/com/sun/xml/internal/messaging/saaj/soap/impl/BodyImpl.java

Thu, 31 Aug 2017 15:18:52 +0800

author
aoqi
date
Thu, 31 Aug 2017 15:18:52 +0800
changeset 637
9c07ef4934dd
parent 368
0989ad8c0860
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.xml.internal.messaging.saaj.soap.impl;
    28 import java.util.Iterator;
    29 import java.util.Locale;
    30 import java.util.logging.Level;
    32 import javax.xml.namespace.QName;
    33 import javax.xml.soap.*;
    34 import javax.xml.parsers.DocumentBuilder;
    35 import javax.xml.parsers.DocumentBuilderFactory;
    37 import org.w3c.dom.*;
    39 import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
    40 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocument;
    41 import com.sun.xml.internal.messaging.saaj.soap.SOAPDocumentImpl;
    42 import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
    44 /**
    45  * The implementation of SOAP-ENV:BODY or the SOAPBody abstraction.
    46  *
    47  * @author Anil Vijendran (anil@sun.com)
    48  */
    49 public abstract class BodyImpl extends ElementImpl implements SOAPBody {
    50     private SOAPFault fault;
    52     protected BodyImpl(SOAPDocumentImpl ownerDoc, NameImpl bodyName) {
    53         super(ownerDoc, bodyName);
    54     }
    56     protected abstract NameImpl getFaultName(String name);
    57     protected abstract boolean isFault(SOAPElement child);
    58     protected abstract SOAPBodyElement createBodyElement(Name name);
    59     protected abstract SOAPBodyElement createBodyElement(QName name);
    60     protected abstract SOAPFault createFaultElement();
    61     protected abstract QName getDefaultFaultCode();
    63     public SOAPFault addFault() throws SOAPException {
    64         if (hasFault()) {
    65             log.severe("SAAJ0110.impl.fault.already.exists");
    66             throw new SOAPExceptionImpl("Error: Fault already exists");
    67         }
    69         fault = createFaultElement();
    71         addNode(fault);
    73         fault.setFaultCode(getDefaultFaultCode());
    74         fault.setFaultString("Fault string, and possibly fault code, not set");
    76         return fault;
    77     }
    79     public SOAPFault addFault(
    80         Name faultCode,
    81         String faultString,
    82         Locale locale)
    83         throws SOAPException {
    85         SOAPFault fault = addFault();
    86         fault.setFaultCode(faultCode);
    87         fault.setFaultString(faultString, locale);
    88         return fault;
    89     }
    91    public SOAPFault addFault(
    92         QName faultCode,
    93         String faultString,
    94         Locale locale)
    95         throws SOAPException {
    97         SOAPFault fault = addFault();
    98         fault.setFaultCode(faultCode);
    99         fault.setFaultString(faultString, locale);
   100         return fault;
   101     }
   103     public SOAPFault addFault(Name faultCode, String faultString)
   104         throws SOAPException {
   106         SOAPFault fault = addFault();
   107         fault.setFaultCode(faultCode);
   108         fault.setFaultString(faultString);
   109         return fault;
   110     }
   112     public SOAPFault addFault(QName faultCode, String faultString)
   113         throws SOAPException {
   115         SOAPFault fault = addFault();
   116         fault.setFaultCode(faultCode);
   117         fault.setFaultString(faultString);
   118         return fault;
   119     }
   121     void initializeFault() {
   122         FaultImpl flt = (FaultImpl) findFault();
   123         fault = flt;
   124     }
   126     protected SOAPElement findFault() {
   127         Iterator eachChild = getChildElementNodes();
   128         while (eachChild.hasNext()) {
   129             SOAPElement child = (SOAPElement) eachChild.next();
   130             if (isFault(child)) {
   131                 return child;
   132             }
   133         }
   135         return null;
   136     }
   138     public boolean hasFault() {
   139         initializeFault();
   140         return fault != null;
   141     }
   143     public SOAPFault getFault() {
   144         if (hasFault())
   145             return fault;
   146         return null;
   147     }
   149     public SOAPBodyElement addBodyElement(Name name) throws SOAPException {
   150         SOAPBodyElement newBodyElement =
   151             (SOAPBodyElement) ElementFactory.createNamedElement(
   152                 ((SOAPDocument) getOwnerDocument()).getDocument(),
   153                 name.getLocalName(),
   154                 name.getPrefix(),
   155                 name.getURI());
   156         if (newBodyElement == null) {
   157             newBodyElement = createBodyElement(name);
   158         }
   159         addNode(newBodyElement);
   160         return newBodyElement;
   161     }
   163     public SOAPBodyElement addBodyElement(QName qname) throws SOAPException {
   164         SOAPBodyElement newBodyElement =
   165             (SOAPBodyElement) ElementFactory.createNamedElement(
   166                 ((SOAPDocument) getOwnerDocument()).getDocument(),
   167                 qname.getLocalPart(),
   168                 qname.getPrefix(),
   169                 qname.getNamespaceURI());
   170         if (newBodyElement == null) {
   171             newBodyElement = createBodyElement(qname);
   172         }
   173         addNode(newBodyElement);
   174         return newBodyElement;
   175     }
   177     public void setParentElement(SOAPElement element) throws SOAPException {
   179         if (!(element instanceof SOAPEnvelope)) {
   180             log.severe("SAAJ0111.impl.body.parent.must.be.envelope");
   181             throw new SOAPException("Parent of SOAPBody has to be a SOAPEnvelope");
   182         }
   183         super.setParentElement(element);
   184     }
   186     protected SOAPElement addElement(Name name) throws SOAPException {
   187         return addBodyElement(name);
   188     }
   190     protected SOAPElement addElement(QName name) throws SOAPException {
   191         return addBodyElement(name);
   192     }
   194     //    public Node insertBefore(Node newElement, Node ref) throws DOMException {
   195     //        if (!(newElement instanceof SOAPBodyElement) && (newElement instanceof SOAPElement)) {
   196     //            newElement = new ElementWrapper((ElementImpl) newElement);
   197     //        }
   198     //        return super.insertBefore(newElement, ref);
   199     //    }
   200     //
   201     //    public Node replaceChild(Node newElement, Node ref) throws DOMException {
   202     //        if (!(newElement instanceof SOAPBodyElement) && (newElement instanceof SOAPElement)) {
   203     //            newElement = new ElementWrapper((ElementImpl) newElement);
   204     //        }
   205     //        return super.replaceChild(newElement, ref);
   206     //    }
   208     public SOAPBodyElement addDocument(Document document)
   209         throws SOAPException {
   210         /*
   212                 Element rootNode =
   213                     document.getDocumentElement();
   214                 // Causes all deferred nodes to be inflated
   215                 rootNode.normalize();
   216                 adoptElement(rootNode);
   217                 SOAPBodyElement bodyElement = (SOAPBodyElement) convertToSoapElement(rootNode);
   218                 addNode(bodyElement);
   219                 return bodyElement;
   220         */
   221         ///*
   222         SOAPBodyElement newBodyElement = null;
   223         DocumentFragment docFrag = document.createDocumentFragment();
   224         Element rootElement = document.getDocumentElement();
   225         if(rootElement != null) {
   226             docFrag.appendChild(rootElement);
   228             Document ownerDoc = getOwnerDocument();
   229             // This copies the whole tree which could be very big so it's slow.
   230             // However, it does have the advantage of actually working.
   231             org.w3c.dom.Node replacingNode = ownerDoc.importNode(docFrag, true);
   232             // Adding replacingNode at the last of the children list of body
   233             addNode(replacingNode);
   234             Iterator i =
   235                 getChildElements(NameImpl.copyElementName(rootElement));
   236             // Return the child element with the required name which is at the
   237             // end of the list
   238             while(i.hasNext())
   239                 newBodyElement = (SOAPBodyElement) i.next();
   240         }
   241         return newBodyElement;
   242         //*/
   243     }
   245     protected SOAPElement convertToSoapElement(Element element) {
   246         if ((element instanceof SOAPBodyElement) &&
   247             //this check is required because ElementImpl currently
   248             // implements SOAPBodyElement
   249             !(element.getClass().equals(ElementImpl.class))) {
   250             return (SOAPElement) element;
   251         } else {
   252             return replaceElementWithSOAPElement(
   253                 element,
   254                 (ElementImpl) createBodyElement(NameImpl
   255                     .copyElementName(element)));
   256         }
   257     }
   259     public SOAPElement setElementQName(QName newName) throws SOAPException {
   260         log.log(Level.SEVERE,
   261                 "SAAJ0146.impl.invalid.name.change.requested",
   262                 new Object[] {elementQName.getLocalPart(),
   263                               newName.getLocalPart()});
   264         throw new SOAPException("Cannot change name for "
   265                                 + elementQName.getLocalPart() + " to "
   266                                 + newName.getLocalPart());
   267     }
   269     public Document extractContentAsDocument() throws SOAPException {
   271         Iterator eachChild = getChildElements();
   272         javax.xml.soap.Node firstBodyElement = null;
   274         while (eachChild.hasNext() &&
   275                !(firstBodyElement instanceof SOAPElement))
   276             firstBodyElement = (javax.xml.soap.Node) eachChild.next();
   278         boolean exactlyOneChildElement = true;
   279         if (firstBodyElement == null)
   280             exactlyOneChildElement = false;
   281         else {
   282             for (org.w3c.dom.Node node = firstBodyElement.getNextSibling();
   283                  node != null;
   284                  node = node.getNextSibling()) {
   286                 if (node instanceof Element) {
   287                     exactlyOneChildElement = false;
   288                     break;
   289                 }
   290             }
   291         }
   293         if(!exactlyOneChildElement) {
   294             log.log(Level.SEVERE,
   295                     "SAAJ0250.impl.body.should.have.exactly.one.child");
   296             throw new SOAPException("Cannot extract Document from body");
   297         }
   299         Document document = null;
   300         try {
   301             DocumentBuilderFactory factory =
   302                 new com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl();
   303             factory.setNamespaceAware(true);
   304             DocumentBuilder builder = factory.newDocumentBuilder();
   305             document = builder.newDocument();
   307             Element rootElement = (Element) document.importNode(
   308                                                 firstBodyElement,
   309                                                 true);
   311             document.appendChild(rootElement);
   313         } catch(Exception e) {
   314             log.log(Level.SEVERE,
   315                     "SAAJ0251.impl.cannot.extract.document.from.body");
   316             throw new SOAPExceptionImpl(
   317                 "Unable to extract Document from body", e);
   318         }
   320         firstBodyElement.detachNode();
   322         return document;
   323     }
   325 }

mercurial