/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 javax.xml.soap; import javax.activation.DataHandler; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; /** *

The root class for all SOAP messages. As transmitted on the * "wire", a SOAP message is an XML document or a MIME message * whose first body part is an XML/SOAP document.

* *

A SOAPMessage object consists of a SOAP part * and optionally one or more attachment parts. The SOAP part for * a SOAPMessage object is a SOAPPart * object, which contains information used for message routing and * identification, and which can contain application-specific * content. All data in the SOAP Part of a message must be in XML * format.

* *

A new SOAPMessage object contains the following * by default:

* * * The SOAP part of a message can be retrieved by calling the * method SOAPMessage.getSOAPPart(). The * SOAPEnvelope object is retrieved from the * SOAPPart object, and the SOAPEnvelope * object is used to retrieve the SOAPBody and * SOAPHeader objects. *
 * SOAPPart sp = message.getSOAPPart();
 * SOAPEnvelope se = sp.getEnvelope();
 * SOAPBody sb = se.getBody();
 * SOAPHeader sh = se.getHeader();
 * 
* *

In addition to the mandatory SOAPPart object, a * SOAPMessage object may contain zero or more * AttachmentPart objects, each of which contains * application-specific data. The SOAPMessage * interface provides methods for creating * AttachmentPart objects and also for adding them to a * SOAPMessage object. A party that has received a * SOAPMessage object can examine its contents by * retrieving individual attachment parts.

* *

Unlike the rest of a SOAP message, an attachment is not * required to be in XML format and can therefore be anything from * simple text to an image file. Consequently, any message content * that is not in XML format must be in an * AttachmentPart object.

* *

A MessageFactory object creates new * SOAPMessage objects. If the MessageFactory * object was initialized with a messaging Profile, it produces * SOAPMessage objects that conform to that Profile. * For example, a SOAPMessage object created by a * MessageFactory object initialized with the ebXML * Profile will have the appropriate ebXML headers.

* @see MessageFactory MessageFactory * @see AttachmentPart AttachmentPart */ public abstract class SOAPMessage { public SOAPMessage() {} /** * Retrieves a description of this SOAPMessage * object's content. * @return a String describing the content of this * message or null if no description has been * set * @see #setContentDescription(java.lang.String) setContentDescription(java.lang.String) */ public abstract String getContentDescription(); /** * Sets the description of this SOAPMessage * object's content with the given description. * @param description a String * describing the content of this message * @see #getContentDescription() getContentDescription() */ public abstract void setContentDescription(String description); /** * Gets the SOAP part of this SOAPMessage object. * * *

If a SOAPMessage object contains one or * more attachments, the SOAP Part must be the first MIME body * part in the message.

* @return the SOAPPart object for this * SOAPMessage object */ public abstract SOAPPart getSOAPPart(); /** * Removes all AttachmentPart objects that have * been added to this SOAPMessage object. * *

This method does not touch the SOAP part.

*/ public abstract void removeAllAttachments(); /** * Gets a count of the number of attachments in this * message. This count does not include the SOAP part. * @return the number of AttachmentPart objects * that are part of this SOAPMessage * object */ public abstract int countAttachments(); /** * Retrieves all the AttachmentPart objects * that are part of this SOAPMessage object. * @return an iterator over all the attachments in this * message */ public abstract Iterator getAttachments(); /** * Retrieves all the AttachmentPart objects * that have header entries that match the specified headers. * Note that a returned attachment could have headers in * addition to those specified. * @param headers a MimeHeaders * object containing the MIME headers for which to * search * @return an iterator over all attachments that have a header * that matches one of the given headers */ public abstract Iterator getAttachments(MimeHeaders headers); /** * Adds the given AttachmentPart object to this * SOAPMessage object. An * AttachmentPart object must be created before it can be * added to a message. * @param attachmentpart an * AttachmentPart object that is to become part of * this SOAPMessage object * @throws java.lang.IllegalArgumentException */ public abstract void addAttachmentPart(AttachmentPart attachmentpart); /** * Creates a new empty AttachmentPart object. * Note that the method addAttachmentPart must be * called with this new AttachmentPart object as * the parameter in order for it to become an attachment to this * SOAPMessage object. * @return a new AttachmentPart object that can be * populated and added to this SOAPMessage * object */ public abstract AttachmentPart createAttachmentPart(); /** * Creates an AttachmentPart object and * populates it using the given DataHandler * object. * @param datahandler the * javax.activation.DataHandler object that will * generate the content for this SOAPMessage * object * @return a new AttachmentPart object that * contains data generated by the given * DataHandler object * @throws java.lang.IllegalArgumentException if * there was a problem with the specified * DataHandler object * @see DataHandler DataHandler * @see javax.activation.DataContentHandler DataContentHandler */ public AttachmentPart createAttachmentPart(DataHandler datahandler) { AttachmentPart attachmentpart = createAttachmentPart(); attachmentpart.setDataHandler(datahandler); return attachmentpart; } /** * Returns all the transport-specific MIME headers for this * SOAPMessage object in a transport-independent * fashion. * @return a MimeHeaders object containing the * MimeHeader objects */ public abstract MimeHeaders getMimeHeaders(); /** * Creates an AttachmentPart object and * populates it with the specified data of the specified content * type. * @param content an Object * containing the content for this SOAPMessage * object * @param contentType a String * object giving the type of content; examples are * "text/xml", "text/plain", and "image/jpeg" * @return a new AttachmentPart object that * contains the given data * @throws java.lang.IllegalArgumentException if the contentType does not match the type of the content * object, or if there was no * DataContentHandler object for the given content * object * @see DataHandler DataHandler * @see javax.activation.DataContentHandler DataContentHandler */ public AttachmentPart createAttachmentPart(Object content, String contentType) { AttachmentPart attachmentpart = createAttachmentPart(); attachmentpart.setContent(content, contentType); return attachmentpart; } /** * Updates this SOAPMessage object with all the * changes that have been made to it. This method is called * automatically when a message is sent or written to by the * methods ProviderConnection.send, * SOAPConnection.call, or * SOAPMessage.writeTo. However, if changes are made to * a message that was received or to one that has already been * sent, the method saveChanges needs to be * called explicitly in order to save the changes. The method * saveChanges also generates any changes that * can be read back (for example, a MessageId in profiles that * support a message id). All MIME headers in a message that * is created for sending purposes are guaranteed to have * valid values only after saveChanges has been * called. * *

In addition, this method marks the point at which the * data from all constituent AttachmentPart * objects are pulled into the message.

* @throws SOAPException if there * was a problem saving changes to this message. */ public abstract void saveChanges() throws SOAPException; /** * Indicates whether this SOAPMessage object * has had the method saveChanges called on * it. * @return true if saveChanges has * been called on this message at least once; * false otherwise. */ public abstract boolean saveRequired(); /** * Writes this SOAPMessage object to the given * output stream. The externalization format is as defined by * the SOAP 1.1 with Attachments specification. * *

If there are no attachments, just an XML stream is * written out. For those messages that have attachments, * writeTo writes a MIME-encoded byte stream.

* @param out the OutputStream * object to which this SOAPMessage object will * be written * @throws SOAPException if there was a problem in * externalizing this SOAP message * @throws IOException if an I/O error * occurs */ public abstract void writeTo(OutputStream out) throws SOAPException, IOException; /** * Gets the SOAP Body contained in this SOAPMessage object. * * @return the SOAPBody object contained by this * SOAPMessage object * @throws SOAPException if the SOAP Body does not exist or cannot be * retrieved */ public SOAPBody getSOAPBody() throws SOAPException { throw new UnsupportedOperationException("getSOAPBody must be overridden in subclasses of SOAPMessage"); } /** * Gets the SOAP Header contained in this SOAPMessage object. * * @return the SOAPHeader object contained by this * SOAPMessage object * @throws SOAPException if the SOAP Header does not exist or cannot be * retrieved */ public SOAPHeader getSOAPHeader() throws SOAPException { throw new UnsupportedOperationException("getSOAPHeader must be overridden in subclasses of SOAPMessage"); } /** * Associates the specified value with the specified property. If there was * already a value associated with this property, the old value is replaced. *

* The valid property names include WRITE_XML_DECLARATION and * CHARACTER_SET_ENCODING. All of these standard SAAJ * properties are prefixed by "javax.xml.soap". Vendors may also add * implementation specific properties. These properties must be prefixed * with package names that are unique to the vendor. *

* Setting the property WRITE_XML_DECLARATION to * "true" will cause an XML Declaration to be written out at * the start of the SOAP message. The default value of "false" suppresses * this declaration. *

* The property CHARACTER_SET_ENCODING defaults to the value * "utf-8" which causes the SOAP message to be encoded using * UTF-8. Setting CHARACTER_SET_ENCODING to * "utf-16" causes the SOAP message to be encoded using UTF-16. *

* Some implementations may allow encodings in addition to UTF-8 and UTF-16. * Refer to your vendor's documentation for details. * * @param property the property with which the specified value is to be * associated * @param value the value to be associated with the specified property * @throws SOAPException if the property name is not recognized */ public void setProperty(String property, Object value) throws SOAPException { throw new UnsupportedOperationException("setProperty must be overridden in subclasses of SOAPMessage"); } /** * Retrieves value of the specified property. * * @param property the name of the property to retrieve * @return the value of the property or null if no such * property exists * @throws SOAPException if the property name is not recognized */ public Object getProperty(String property) throws SOAPException { throw new UnsupportedOperationException("getProperty must be overridden in subclasses of SOAPMessage"); } /** Specifies the character type encoding for the SOAP Message. */ public static final String CHARACTER_SET_ENCODING = "javax.xml.soap.character-set-encoding"; /** Specifies whether the SOAP Message should contain an XML declaration. */ public static final String WRITE_XML_DECLARATION = "javax.xml.soap.write-xml-declaration"; }