blob: e393f62f887aa8cb885422d0bbf87e5ac9ec7016 [file] [log] [blame]
/*
* 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;
}
}