Java tutorial
/* * Copyright 2002-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.axis.message; import org.apache.axis.AxisFault; import org.apache.axis.Constants; import org.apache.axis.components.logger.LogFactory; import org.apache.axis.encoding.DeserializationContext; import org.apache.axis.encoding.SerializationContext; import org.apache.axis.soap.SOAPConstants; import org.apache.axis.utils.Messages; import org.apache.commons.logging.Log; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.Attributes; import javax.xml.namespace.QName; import javax.xml.soap.Name; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Vector; /** * Holder for body elements. * * @author Glyn Normington (glyn@apache.org) */ public class SOAPBody extends MessageElement implements javax.xml.soap.SOAPBody { private static Log log = LogFactory.getLog(SOAPBody.class.getName()); private SOAPConstants soapConstants; private boolean disableFormatting = false; private boolean doSAAJEncodingCompliance = false; private static ArrayList knownEncodingStyles = new ArrayList(); static { knownEncodingStyles.add(Constants.URI_SOAP11_ENC); knownEncodingStyles.add(Constants.URI_SOAP12_ENC); knownEncodingStyles.add(""); knownEncodingStyles.add(Constants.URI_SOAP12_NOENC); } SOAPBody(SOAPEnvelope env, SOAPConstants soapConsts) { super(soapConsts.getEnvelopeURI(), Constants.ELEM_BODY); soapConstants = soapConsts; try { setParentElement(env); } catch (SOAPException ex) { // class cast should never fail when parent is a SOAPEnvelope log.fatal(Messages.getMessage("exception00"), ex); } } public SOAPBody(String namespace, String localPart, String prefix, Attributes attributes, DeserializationContext context, SOAPConstants soapConsts) throws AxisFault { super(namespace, localPart, prefix, attributes, context); soapConstants = soapConsts; } public void setParentElement(SOAPElement parent) throws SOAPException { if (parent == null) { throw new IllegalArgumentException(Messages.getMessage("nullParent00")); } try { SOAPEnvelope env = (SOAPEnvelope) parent; super.setParentElement(env); setEnvelope(env); } catch (Throwable t) { throw new SOAPException(t); } } public void disableFormatting() { this.disableFormatting = true; } public void setEncodingStyle(String encodingStyle) throws SOAPException { if (encodingStyle == null) { encodingStyle = ""; } if (doSAAJEncodingCompliance) { // Make sure this matches a known encodingStyle. This is if (!knownEncodingStyles.contains(encodingStyle)) throw new IllegalArgumentException(Messages.getMessage("badEncodingStyle1", encodingStyle)); } super.setEncodingStyle(encodingStyle); } protected void outputImpl(SerializationContext context) throws Exception { boolean oldPretty = context.getPretty(); if (!disableFormatting) { context.setPretty(true); } else { context.setPretty(false); } List bodyElements = getChildren(); if (bodyElements == null || bodyElements.isEmpty()) { // This is a problem. // throw new Exception("No body elements!"); // If there are no body elements just return - it's ok that // the body is empty } // Output <SOAP-ENV:Body> context.startElement(new QName(soapConstants.getEnvelopeURI(), Constants.ELEM_BODY), getAttributesEx()); if (bodyElements != null) { Iterator e = bodyElements.iterator(); while (e.hasNext()) { MessageElement body = (MessageElement) e.next(); body.output(context); // Output this body element. } } // Output multi-refs if appropriate context.outputMultiRefs(); // Output </SOAP-ENV:Body> context.endElement(); context.setPretty(oldPretty); } Vector getBodyElements() throws AxisFault { initializeChildren(); return new Vector(getChildren()); } SOAPBodyElement getFirstBody() throws AxisFault { if (!hasChildNodes()) return null; return (SOAPBodyElement) getChildren().get(0); } void addBodyElement(SOAPBodyElement element) { if (log.isDebugEnabled()) log.debug(Messages.getMessage("addBody00")); try { addChildElement(element); } catch (SOAPException ex) { // class cast should never fail when parent is a SOAPBody log.fatal(Messages.getMessage("exception00"), ex); } } void removeBodyElement(SOAPBodyElement element) { if (log.isDebugEnabled()) log.debug(Messages.getMessage("removeBody00")); removeChild((MessageElement) element); } void clearBody() { removeContents(); } SOAPBodyElement getBodyByName(String namespace, String localPart) throws AxisFault { QName name = new QName(namespace, localPart); return (SOAPBodyElement) getChildElement(name); } // JAXM methods public javax.xml.soap.SOAPBodyElement addBodyElement(Name name) throws SOAPException { SOAPBodyElement bodyElement = new SOAPBodyElement(name); addChildElement(bodyElement); return bodyElement; } public javax.xml.soap.SOAPFault addFault(Name name, String s, Locale locale) throws SOAPException { AxisFault af = new AxisFault(new QName(name.getURI(), name.getLocalName()), s, "", new Element[0]); SOAPFault fault = new SOAPFault(af); addChildElement(fault); return fault; } public javax.xml.soap.SOAPFault addFault(Name name, String s) throws SOAPException { AxisFault af = new AxisFault(new QName(name.getURI(), name.getLocalName()), s, "", new Element[0]); SOAPFault fault = new SOAPFault(af); addChildElement(fault); return fault; } public javax.xml.soap.SOAPBodyElement addDocument(Document document) throws SOAPException { SOAPBodyElement bodyElement = new SOAPBodyElement(document.getDocumentElement()); addChildElement(bodyElement); return bodyElement; } public javax.xml.soap.SOAPFault addFault() throws SOAPException { AxisFault af = new AxisFault(new QName(Constants.NS_URI_AXIS, Constants.FAULT_SERVER_GENERAL), "", "", new Element[0]); SOAPFault fault = new SOAPFault(af); addChildElement(fault); return fault; } public javax.xml.soap.SOAPFault getFault() { List bodyElements = getChildren(); if (bodyElements != null) { Iterator e = bodyElements.iterator(); while (e.hasNext()) { Object element = e.next(); if (element instanceof javax.xml.soap.SOAPFault) { return (javax.xml.soap.SOAPFault) element; } } } return null; } public boolean hasFault() { return (getFault() != null); } // overwrite the one in MessageElement and set envelope public void addChild(MessageElement element) throws SOAPException { // Commented out for SAAJ compatibility - gdaniels, 05/19/2003 // if (!(element instanceof javax.xml.soap.SOAPBodyElement)) { // throw new SOAPException(Messages.getMessage("badSOAPBodyElement00")); // } element.setEnvelope(getEnvelope()); super.addChild(element); } // overwrite the one in MessageElement and sets dirty flag public SOAPElement addChildElement(SOAPElement element) throws SOAPException { // Commented out for SAAJ compatibility - gdaniels, 05/19/2003 // if (!(element instanceof javax.xml.soap.SOAPBodyElement)) { // throw new SOAPException(Messages.getMessage("badSOAPBodyElement00")); // } SOAPElement child = super.addChildElement(element); setDirty(); return child; } public SOAPElement addChildElement(Name name) throws SOAPException { SOAPBodyElement child = new SOAPBodyElement(name); addChildElement(child); return child; } public SOAPElement addChildElement(String localName) throws SOAPException { // Inherit parent's namespace SOAPBodyElement child = new SOAPBodyElement(getNamespaceURI(), localName); addChildElement(child); return child; } public SOAPElement addChildElement(String localName, String prefix) throws SOAPException { SOAPBodyElement child = new SOAPBodyElement(getNamespaceURI(prefix), localName); child.setPrefix(prefix); addChildElement(child); return child; } public SOAPElement addChildElement(String localName, String prefix, String uri) throws SOAPException { SOAPBodyElement child = new SOAPBodyElement(uri, localName); child.setPrefix(prefix); child.addNamespaceDeclaration(prefix, uri); addChildElement(child); return child; } public void setSAAJEncodingCompliance(boolean comply) { this.doSAAJEncodingCompliance = true; } }