View Javadoc

1   /*
2    * Copyright 2007 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.springframework.ws.soap.saaj;
18  
19  import java.io.IOException;
20  import java.io.OutputStream;
21  import java.util.Iterator;
22  import java.util.Locale;
23  import javax.activation.DataHandler;
24  import javax.xml.namespace.QName;
25  import javax.xml.soap.AttachmentPart;
26  import javax.xml.soap.Detail;
27  import javax.xml.soap.DetailEntry;
28  import javax.xml.soap.MimeHeader;
29  import javax.xml.soap.MimeHeaders;
30  import javax.xml.soap.SOAPBody;
31  import javax.xml.soap.SOAPConstants;
32  import javax.xml.soap.SOAPElement;
33  import javax.xml.soap.SOAPEnvelope;
34  import javax.xml.soap.SOAPException;
35  import javax.xml.soap.SOAPFault;
36  import javax.xml.soap.SOAPHeader;
37  import javax.xml.soap.SOAPHeaderElement;
38  import javax.xml.soap.SOAPMessage;
39  import javax.xml.transform.Result;
40  import javax.xml.transform.Source;
41  import javax.xml.transform.dom.DOMResult;
42  import javax.xml.transform.dom.DOMSource;
43  
44  import org.springframework.util.ObjectUtils;
45  import org.springframework.ws.soap.SoapVersion;
46  import org.springframework.ws.transport.TransportConstants;
47  import org.springframework.ws.transport.TransportOutputStream;
48  
49  /**
50   * SAAJ 1.3 specific implementation of the <code>SaajImplementation</code> interface.
51   *
52   * @author Arjen Poutsma
53   * @since 1.0.0
54   */
55  class Saaj13Implementation extends SaajImplementation {
56  
57      private static final Saaj13Implementation INSTANCE = new Saaj13Implementation();
58  
59      private Saaj13Implementation() {
60      }
61  
62      public static Saaj13Implementation getInstance() {
63          return INSTANCE;
64      }
65  
66      public QName getName(SOAPElement element) {
67          return element.getElementQName();
68      }
69  
70      public QName getFaultCode(SOAPFault fault) {
71          return fault.getFaultCodeAsQName();
72      }
73  
74      public boolean isSoap11(SOAPElement element) {
75          return SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE.equals(element.getNamespaceURI());
76      }
77  
78      public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException {
79          return detail.addDetailEntry(name);
80      }
81  
82      public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException {
83          return header.addHeaderElement(name);
84      }
85  
86      public String getFaultRole(SOAPFault fault) {
87          return fault.getFaultRole();
88      }
89  
90      public void setFaultRole(SOAPFault fault, String role) throws SOAPException {
91          fault.setFaultRole(role);
92      }
93  
94      public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) throws SOAPException {
95          return header.addNotUnderstoodHeaderElement(name);
96      }
97  
98      public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris)
99              throws SOAPException {
100         return header.addUpgradeHeaderElement(supportedSoapUris);
101     }
102 
103     public Iterator getFaultSubcodes(SOAPFault fault) {
104         return fault.getFaultSubcodes();
105     }
106 
107     public void appendFaultSubcode(SOAPFault fault, QName subcode) throws SOAPException {
108         fault.appendFaultSubcode(subcode);
109     }
110 
111     public String getFaultNode(SOAPFault fault) {
112         return fault.getFaultNode();
113     }
114 
115     public void setFaultNode(SOAPFault fault, String uri) throws SOAPException {
116         fault.setFaultNode(uri);
117     }
118 
119     public String getFaultReasonText(SOAPFault fault, Locale locale) throws SOAPException {
120         return fault.getFaultReasonText(locale);
121     }
122 
123     public void setFaultReasonText(SOAPFault fault, Locale locale, String text) throws SOAPException {
124         fault.addFaultReasonText(text, locale);
125     }
126 
127     public SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException {
128         if (locale == null) {
129             return body.addFault(faultCode, faultString);
130         }
131         else {
132             return body.addFault(faultCode, faultString, locale);
133         }
134     }
135 
136     public Source getSource(SOAPElement element) {
137         return new DOMSource(element);
138     }
139 
140     public Result getResult(SOAPElement element) {
141         return new DOMResult(element);
142     }
143 
144     public String getText(SOAPElement element) {
145         return element.getValue();
146     }
147 
148     public void setText(SOAPElement element, String content) {
149         element.setValue(content);
150     }
151 
152     public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException {
153         element.addAttribute(name, value);
154     }
155 
156     public void removeAttribute(SOAPElement element, QName name) throws SOAPException {
157         element.removeAttribute(name);
158     }
159 
160     public String getAttributeValue(SOAPElement element, QName name) throws SOAPException {
161         return element.getAttributeValue(name);
162     }
163 
164     public Iterator getAllAttibutes(SOAPElement element) {
165         return element.getAllAttributesAsQNames();
166     }
167 
168     public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException {
169         return message.getSOAPPart().getEnvelope();
170     }
171 
172     public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException {
173         return envelope.getHeader();
174     }
175 
176     public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException {
177         return envelope.getBody();
178     }
179 
180     public Iterator examineAllHeaderElements(SOAPHeader header) {
181         return header.examineAllHeaderElements();
182     }
183 
184     public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
185         return header.examineMustUnderstandHeaderElements(actorOrRole);
186     }
187 
188     public String getActorOrRole(SOAPHeaderElement headerElement) {
189         return headerElement.getActor();
190     }
191 
192     public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) {
193         headerElement.setActor(actorOrRole);
194     }
195 
196     public boolean getMustUnderstand(SOAPHeaderElement headerElement) {
197         return headerElement.getMustUnderstand();
198     }
199 
200     public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) {
201         headerElement.setMustUnderstand(mustUnderstand);
202     }
203 
204     public boolean hasFault(SOAPBody body) {
205         return body.hasFault();
206     }
207 
208     public SOAPFault getFault(SOAPBody body) {
209         return body.getFault();
210     }
211 
212     public String getFaultActor(SOAPFault fault) {
213         return fault.getFaultActor();
214     }
215 
216     public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException {
217         fault.setFaultActor(actorOrRole);
218     }
219 
220     public String getFaultString(SOAPFault fault) {
221         return fault.getFaultString();
222     }
223 
224     public Locale getFaultStringLocale(SOAPFault fault) {
225         return fault.getFaultStringLocale();
226     }
227 
228     public Detail getFaultDetail(SOAPFault fault) {
229         return fault.getDetail();
230     }
231 
232     public Detail addFaultDetail(SOAPFault fault) throws SOAPException {
233         return fault.addDetail();
234     }
235 
236     public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException {
237         detailEntry.addTextNode(text);
238     }
239 
240     public Iterator getDetailEntries(Detail detail) {
241         return detail.getDetailEntries();
242     }
243 
244     public SOAPElement getFirstBodyElement(SOAPBody body) {
245         for (Iterator iterator = body.getChildElements(); iterator.hasNext();) {
246             Object child = iterator.next();
247             if (child instanceof SOAPElement) {
248                 return (SOAPElement) child;
249             }
250         }
251         return null;
252     }
253 
254     public void removeContents(SOAPElement element) {
255         element.removeContents();
256     }
257 
258     Iterator getChildElements(SOAPElement element, QName name) throws SOAPException {
259         return element.getChildElements(name);
260     }
261 
262     void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException {
263         element.addNamespaceDeclaration(prefix, namespaceUri);
264     }
265 
266     public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException {
267         if (message.saveRequired()) {
268             message.saveChanges();
269         }
270         if (outputStream instanceof TransportOutputStream) {
271             TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream;
272             // some SAAJ implementations (Axis 1) do not have a Content-Type header by default
273             MimeHeaders headers = message.getMimeHeaders();
274             if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_CONTENT_TYPE))) {
275                 SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
276                 if (envelope.getElementQName().getNamespaceURI()
277                         .equals(SoapVersion.SOAP_11.getEnvelopeNamespaceUri())) {
278                     headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
279                 }
280                 else {
281                     headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_12.getContentType());
282                 }
283                 if (message.saveRequired()) {
284                     message.saveChanges();
285                 }
286             }
287             for (Iterator iterator = headers.getAllHeaders(); iterator.hasNext();) {
288                 MimeHeader mimeHeader = (MimeHeader) iterator.next();
289                 transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
290             }
291         }
292         message.writeTo(outputStream);
293 
294     }
295 
296     public MimeHeaders getMimeHeaders(SOAPMessage message) {
297         return message.getMimeHeaders();
298     }
299 
300     public Iterator getAttachments(SOAPMessage message) {
301         return message.getAttachments();
302     }
303 
304     public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) {
305         return message.getAttachments(mimeHeaders);
306     }
307 
308     public AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler) {
309         AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
310         message.addAttachmentPart(attachmentPart);
311         return attachmentPart;
312     }
313 }