001    /*
002     * Copyright 2001-2004 The Apache Software Foundation.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package javax.xml.soap;
017    
018    /**
019     * The container for the SOAPHeader and SOAPBody portions of a
020     *   <CODE>SOAPPart</CODE> object. By default, a <CODE>
021     *   SOAPMessage</CODE> object is created with a <CODE>
022     *   SOAPPart</CODE> object that has a <CODE>SOAPEnvelope</CODE>
023     *   object. The <CODE>SOAPEnvelope</CODE> object by default has an
024     *   empty <CODE>SOAPBody</CODE> object and an empty <CODE>
025     *   SOAPHeader</CODE> object. The <CODE>SOAPBody</CODE> object is
026     *   required, and the <CODE>SOAPHeader</CODE> object, though
027     *   optional, is used in the majority of cases. If the <CODE>
028     *   SOAPHeader</CODE> object is not needed, it can be deleted,
029     *   which is shown later.</P>
030     *
031     *   <P>A client can access the <CODE>SOAPHeader</CODE> and <CODE>
032     *   SOAPBody</CODE> objects by calling the methods <CODE>
033     *   SOAPEnvelope.getHeader</CODE> and <CODE>
034     *   SOAPEnvelope.getBody</CODE>. The following lines of code use
035     *   these two methods after starting with the <CODE>
036     *   SOAPMessage</CODE> object <I>message</I> to get the <CODE>
037     *   SOAPPart</CODE> object <I>sp</I>, which is then used to get the
038     *   <CODE>SOAPEnvelope</CODE> object <I>se</I>.</P>
039     * <PRE>
040     *    SOAPPart sp = message.getSOAPPart();
041     *    SOAPEnvelope se = sp.getEnvelope();
042     *    SOAPHeader sh = se.getHeader();
043     *    SOAPBody sb = se.getBody();
044     * </PRE>
045     *
046     *   <P>It is possible to change the body or header of a <CODE>
047     *   SOAPEnvelope</CODE> object by retrieving the current one,
048     *   deleting it, and then adding a new body or header. The <CODE>
049     *   javax.xml.soap.Node</CODE> method <CODE>detachNode</CODE>
050     *   detaches the XML element (node) on which it is called. For
051     *   example, the following line of code deletes the <CODE>
052     *   SOAPBody</CODE> object that is retrieved by the method <CODE>
053     *   getBody</CODE>.</P>
054     * <PRE>
055     *     se.getBody().detachNode();
056     * </PRE>
057     *   To create a <CODE>SOAPHeader</CODE> object to replace the one
058     *   that was removed, a client uses the method <CODE>
059     *   SOAPEnvelope.addHeader</CODE>, which creates a new header and
060     *   adds it to the <CODE>SOAPEnvelope</CODE> object. Similarly, the
061     *   method <CODE>addBody</CODE> creates a new <CODE>SOAPBody</CODE>
062     *   object and adds it to the <CODE>SOAPEnvelope</CODE> object. The
063     *   following code fragment retrieves the current header, removes
064     *   it, and adds a new one. Then it retrieves the current body,
065     *   removes it, and adds a new one.
066     * <PRE>
067     *    SOAPPart sp = message.getSOAPPart();
068     *    SOAPEnvelope se = sp.getEnvelope();
069     *    se.getHeader().detachNode();
070     *    SOAPHeader sh = se.addHeader();
071     *    se.getBody().detachNode();
072     *    SOAPBody sb = se.addBody();
073     * </PRE>
074     *   It is an error to add a <CODE>SOAPBody</CODE> or <CODE>
075     *   SOAPHeader</CODE> object if one already exists.
076     *
077     *   <P>The <CODE>SOAPEnvelope</CODE> interface provides three
078     *   methods for creating <CODE>Name</CODE> objects. One method
079     *   creates <CODE>Name</CODE> objects with a local name, a
080     *   namespace prefix, and a namesapce URI. The second method
081     *   creates <CODE>Name</CODE> objects with a local name and a
082     *   namespace prefix, and the third creates <CODE>Name</CODE>
083     *   objects with just a local name. The following line of code, in
084     *   which <I>se</I> is a <CODE>SOAPEnvelope</CODE> object, creates
085     *   a new <CODE>Name</CODE> object with all three.</P>
086     * <PRE>
087     *    Name name = se.createName("GetLastTradePrice", "WOMBAT",
088     *                               "http://www.wombat.org/trader");
089     * </PRE>
090     */
091    public interface SOAPEnvelope extends SOAPElement {
092    
093        /**
094         * Creates a new <CODE>Name</CODE> object initialized with the
095         *   given local name, namespace prefix, and namespace URI.
096         *
097         *   <P>This factory method creates <CODE>Name</CODE> objects
098         *   for use in the SOAP/XML document.
099         * @param   localName a <CODE>String</CODE> giving
100         *     the local name
101         * @param   prefix a <CODE>String</CODE> giving
102         *     the prefix of the namespace
103         * @param   uri  a <CODE>String</CODE> giving the
104         *     URI of the namespace
105         * @return a <CODE>Name</CODE> object initialized with the given
106         *     local name, namespace prefix, and namespace URI
107         * @throws  SOAPException  if there is a SOAP error
108         */
109        public abstract Name createName(String localName, String prefix, String uri)
110            throws SOAPException;
111    
112        /**
113         * Creates a new <CODE>Name</CODE> object initialized with the
114         *   given local name.
115         *
116         *   <P>This factory method creates <CODE>Name</CODE> objects
117         *   for use in the SOAP/XML document.
118         *
119         * @param localName a <CODE>String</CODE> giving
120         * the local name
121         * @return a <CODE>Name</CODE> object initialized with the given
122         *     local name
123         * @throws  SOAPException  if there is a SOAP error
124         */
125        public abstract Name createName(String localName) throws SOAPException;
126    
127        /**
128         * Returns the <CODE>SOAPHeader</CODE> object for this <CODE>
129         *   SOAPEnvelope</CODE> object.
130         *
131         *   <P>A new <CODE>SOAPMessage</CODE> object is by default
132         *   created with a <CODE>SOAPEnvelope</CODE> object that
133         *   contains an empty <CODE>SOAPHeader</CODE> object. As a
134         *   result, the method <CODE>getHeader</CODE> will always
135         *   return a <CODE>SOAPHeader</CODE> object unless the header
136         *   has been removed and a new one has not been added.
137         * @return the <CODE>SOAPHeader</CODE> object or <CODE>
138         *     null</CODE> if there is none
139         * @throws  SOAPException if there is a problem
140         *     obtaining the <CODE>SOAPHeader</CODE> object
141         */
142        public abstract SOAPHeader getHeader() throws SOAPException;
143    
144        /**
145         * Returns the <CODE>SOAPBody</CODE> object associated with
146         *   this <CODE>SOAPEnvelope</CODE> object.
147         *
148         *   <P>A new <CODE>SOAPMessage</CODE> object is by default
149         *   created with a <CODE>SOAPEnvelope</CODE> object that
150         *   contains an empty <CODE>SOAPBody</CODE> object. As a
151         *   result, the method <CODE>getBody</CODE> will always return
152         *   a <CODE>SOAPBody</CODE> object unless the body has been
153         *   removed and a new one has not been added.
154         * @return the <CODE>SOAPBody</CODE> object for this <CODE>
155         *     SOAPEnvelope</CODE> object or <CODE>null</CODE> if there
156         *     is none
157         * @throws  SOAPException  if there is a problem
158         *     obtaining the <CODE>SOAPBody</CODE> object
159         */
160        public abstract SOAPBody getBody() throws SOAPException;
161    
162        /**
163         * Creates a <CODE>SOAPHeader</CODE> object and sets it as the
164         *   <CODE>SOAPHeader</CODE> object for this <CODE>
165         *   SOAPEnvelope</CODE> object.
166         *
167         *   <P>It is illegal to add a header when the envelope already
168         *   contains a header. Therefore, this method should be called
169         *   only after the existing header has been removed.
170         * @return the new <CODE>SOAPHeader</CODE> object
171         * @throws  SOAPException  if this <CODE>
172         *     SOAPEnvelope</CODE> object already contains a valid
173         *     <CODE>SOAPHeader</CODE> object
174         */
175        public abstract SOAPHeader addHeader() throws SOAPException;
176    
177        /**
178         * Creates a <CODE>SOAPBody</CODE> object and sets it as the
179         *   <CODE>SOAPBody</CODE> object for this <CODE>
180         *   SOAPEnvelope</CODE> object.
181         *
182         *   <P>It is illegal to add a body when the envelope already
183         *   contains a body. Therefore, this method should be called
184         *   only after the existing body has been removed.
185         * @return  the new <CODE>SOAPBody</CODE> object
186         * @throws  SOAPException  if this <CODE>
187         *     SOAPEnvelope</CODE> object already contains a valid
188         *     <CODE>SOAPBody</CODE> object
189         */
190        public abstract SOAPBody addBody() throws SOAPException;
191    }