javax.xml.soap.SOAPMessage Maven / Gradle / Ivy
/*
 * Copyright 2001-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 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:
 *
 * 
 *  - A 
SOAPPart object 
 *
 *  - A 
SOAPEnvelope object 
 *
 *  - A 
SOAPBody object 
 *
 *  - A 
SOAPHeader object 
 * 
 * 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";
}