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.ArrayList;
22  import java.util.Iterator;
23  import java.util.List;
24  import java.util.Locale;
25  import javax.activation.DataHandler;
26  import javax.xml.namespace.QName;
27  import javax.xml.soap.AttachmentPart;
28  import javax.xml.soap.Detail;
29  import javax.xml.soap.DetailEntry;
30  import javax.xml.soap.MimeHeader;
31  import javax.xml.soap.MimeHeaders;
32  import javax.xml.soap.Name;
33  import javax.xml.soap.SOAPBody;
34  import javax.xml.soap.SOAPElement;
35  import javax.xml.soap.SOAPEnvelope;
36  import javax.xml.soap.SOAPException;
37  import javax.xml.soap.SOAPFault;
38  import javax.xml.soap.SOAPHeader;
39  import javax.xml.soap.SOAPHeaderElement;
40  import javax.xml.soap.SOAPMessage;
41  import javax.xml.transform.Result;
42  import javax.xml.transform.Source;
43  import javax.xml.transform.dom.DOMResult;
44  import javax.xml.transform.dom.DOMSource;
45  
46  import org.springframework.util.ObjectUtils;
47  import org.springframework.ws.soap.SoapVersion;
48  import org.springframework.ws.soap.saaj.support.SaajUtils;
49  import org.springframework.ws.transport.TransportConstants;
50  import org.springframework.ws.transport.TransportOutputStream;
51  
52  /**
53   * SAAJ 1.2 specific implementation of the <code>SaajImplementation</code> interface.
54   *
55   * @author Arjen Poutsma
56   * @since 1.0.0
57   */
58  class Saaj12Implementation extends SaajImplementation {
59  
60      private static final Saaj12Implementation INSTANCE = new Saaj12Implementation();
61  
62      private Saaj12Implementation() {
63      }
64  
65      public static Saaj12Implementation getInstance() {
66          return INSTANCE;
67      }
68  
69      public QName getName(SOAPElement element) {
70          return SaajUtils.toQName(element.getElementName());
71      }
72  
73      public QName getFaultCode(SOAPFault fault) {
74          return SaajUtils.toQName(fault.getFaultCodeAsName());
75      }
76  
77      public boolean isSoap11(SOAPElement element) {
78          return true;
79      }
80  
81      public DetailEntry addDetailEntry(Detail detail, QName name) throws SOAPException {
82          Name detailEntryName = SaajUtils.toName(name, detail);
83          return detail.addDetailEntry(detailEntryName);
84      }
85  
86      public SOAPHeaderElement addHeaderElement(SOAPHeader header, QName name) throws SOAPException {
87          Name saajName = SaajUtils.toName(name, header);
88          return header.addHeaderElement(saajName);
89      }
90  
91      public SOAPFault addFault(SOAPBody body, QName faultCode, String faultString, Locale locale) throws SOAPException {
92          Name name = SaajUtils.toName(faultCode, body);
93          if (locale == null) {
94              return body.addFault(name, faultString);
95          }
96          else {
97              return body.addFault(name, faultString, locale);
98          }
99      }
100 
101     public Source getSource(SOAPElement element) {
102         return new DOMSource(element);
103     }
104 
105     public Result getResult(SOAPElement element) {
106         return new DOMResult(element);
107     }
108 
109     public void addAttribute(SOAPElement element, QName name, String value) throws SOAPException {
110         Name attributeName = SaajUtils.toName(name, element);
111         element.addAttribute(attributeName, value);
112     }
113 
114     public void removeAttribute(SOAPElement element, QName name) throws SOAPException {
115         Name attributeName = SaajUtils.toName(name, element);
116         element.removeAttribute(attributeName);
117     }
118 
119     public String getAttributeValue(SOAPElement element, QName name) throws SOAPException {
120         Name attributeName = SaajUtils.toName(name, element);
121         return element.getAttributeValue(attributeName);
122     }
123 
124     public Iterator getAllAttibutes(SOAPElement element) {
125         List results = new ArrayList();
126         for (Iterator iterator = element.getAllAttributes(); iterator.hasNext();) {
127             Name attributeName = (Name) iterator.next();
128             results.add(SaajUtils.toQName(attributeName));
129         }
130         return results.iterator();
131     }
132 
133     public String getText(SOAPElement element) {
134         return element.getValue();
135     }
136 
137     public void setText(SOAPElement element, String content) {
138         element.setValue(content);
139     }
140 
141     public SOAPEnvelope getEnvelope(SOAPMessage message) throws SOAPException {
142         return message.getSOAPPart().getEnvelope();
143     }
144 
145     public SOAPHeader getHeader(SOAPEnvelope envelope) throws SOAPException {
146         return envelope.getHeader();
147     }
148 
149     public SOAPBody getBody(SOAPEnvelope envelope) throws SOAPException {
150         return envelope.getBody();
151     }
152 
153     public Iterator examineAllHeaderElements(SOAPHeader header) {
154         return header.examineAllHeaderElements();
155     }
156 
157     public Iterator examineMustUnderstandHeaderElements(SOAPHeader header, String actorOrRole) {
158         return header.examineMustUnderstandHeaderElements(actorOrRole);
159     }
160 
161     public String getActorOrRole(SOAPHeaderElement headerElement) {
162         return headerElement.getActor();
163     }
164 
165     public void setActorOrRole(SOAPHeaderElement headerElement, String actorOrRole) {
166         headerElement.setActor(actorOrRole);
167     }
168 
169     public boolean getMustUnderstand(SOAPHeaderElement headerElement) {
170         return headerElement.getMustUnderstand();
171     }
172 
173     public void setMustUnderstand(SOAPHeaderElement headerElement, boolean mustUnderstand) {
174         headerElement.setMustUnderstand(mustUnderstand);
175     }
176 
177     public boolean hasFault(SOAPBody body) {
178         return body.hasFault();
179     }
180 
181     public SOAPFault getFault(SOAPBody body) {
182         return body.getFault();
183     }
184 
185     public String getFaultActor(SOAPFault fault) {
186         return fault.getFaultActor();
187     }
188 
189     public void setFaultActor(SOAPFault fault, String actorOrRole) throws SOAPException {
190         fault.setFaultActor(actorOrRole);
191     }
192 
193     public String getFaultString(SOAPFault fault) {
194         return fault.getFaultString();
195     }
196 
197     public Locale getFaultStringLocale(SOAPFault fault) {
198         return fault.getFaultStringLocale();
199     }
200 
201     public Detail getFaultDetail(SOAPFault fault) {
202         return fault.getDetail();
203     }
204 
205     public Detail addFaultDetail(SOAPFault fault) throws SOAPException {
206         return fault.addDetail();
207     }
208 
209     public void addTextNode(DetailEntry detailEntry, String text) throws SOAPException {
210         detailEntry.addTextNode(text);
211     }
212 
213     public Iterator getDetailEntries(Detail detail) {
214         return detail.getDetailEntries();
215     }
216 
217     public SOAPElement getFirstBodyElement(SOAPBody body) {
218         for (Iterator iterator = body.getChildElements(); iterator.hasNext();) {
219             Object child = iterator.next();
220             if (child instanceof SOAPElement) {
221                 return (SOAPElement) child;
222             }
223         }
224         return null;
225     }
226 
227     public void removeContents(SOAPElement element) {
228         element.removeContents();
229     }
230 
231     Iterator getChildElements(SOAPElement element, QName name) throws SOAPException {
232         Name elementName = SaajUtils.toName(name, element);
233         return element.getChildElements(elementName);
234     }
235 
236     void addNamespaceDeclaration(SOAPElement element, String prefix, String namespaceUri) throws SOAPException {
237         element.addNamespaceDeclaration(prefix, namespaceUri);
238     }
239 
240     public void writeTo(SOAPMessage message, OutputStream outputStream) throws SOAPException, IOException {
241         if (message.saveRequired()) {
242             message.saveChanges();
243         }
244         if (outputStream instanceof TransportOutputStream) {
245             TransportOutputStream transportOutputStream = (TransportOutputStream) outputStream;
246             // some SAAJ implementations (Axis 1) do not have a Content-Type header by default
247             MimeHeaders headers = message.getMimeHeaders();
248             if (ObjectUtils.isEmpty(headers.getHeader(TransportConstants.HEADER_CONTENT_TYPE))) {
249                 headers.addHeader(TransportConstants.HEADER_CONTENT_TYPE, SoapVersion.SOAP_11.getContentType());
250                 if (message.saveRequired()) {
251                     message.saveChanges();
252                 }
253             }
254             for (Iterator iterator = headers.getAllHeaders(); iterator.hasNext();) {
255                 MimeHeader mimeHeader = (MimeHeader) iterator.next();
256                 transportOutputStream.addHeader(mimeHeader.getName(), mimeHeader.getValue());
257             }
258         }
259         message.writeTo(outputStream);
260 
261     }
262 
263     public MimeHeaders getMimeHeaders(SOAPMessage message) {
264         return message.getMimeHeaders();
265     }
266 
267     public Iterator getAttachments(SOAPMessage message) {
268         return message.getAttachments();
269     }
270 
271     public Iterator getAttachment(SOAPMessage message, MimeHeaders mimeHeaders) {
272         return message.getAttachments(mimeHeaders);
273     }
274 
275     public AttachmentPart addAttachmentPart(SOAPMessage message, DataHandler dataHandler) {
276         AttachmentPart attachmentPart = message.createAttachmentPart(dataHandler);
277         message.addAttachmentPart(attachmentPart);
278         return attachmentPart;
279     }
280 
281     //
282     // Unsupported
283     //
284 
285     public String getFaultRole(SOAPFault fault) {
286         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
287     }
288 
289     public void setFaultRole(SOAPFault fault, String role) {
290         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
291     }
292 
293     public SOAPHeaderElement addNotUnderstoodHeaderElement(SOAPHeader header, QName name) {
294         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
295     }
296 
297     public SOAPHeaderElement addUpgradeHeaderElement(SOAPHeader header, String[] supportedSoapUris) {
298         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
299     }
300 
301     public Iterator getFaultSubcodes(SOAPFault fault) {
302         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
303     }
304 
305     public void appendFaultSubcode(SOAPFault fault, QName subcode) {
306         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
307     }
308 
309     public String getFaultNode(SOAPFault fault) {
310         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
311     }
312 
313     public void setFaultNode(SOAPFault fault, String uri) {
314         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
315     }
316 
317     public String getFaultReasonText(SOAPFault fault, Locale locale) {
318         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
319     }
320 
321     public void setFaultReasonText(SOAPFault fault, Locale locale, String text) {
322         throw new UnsupportedOperationException("SAAJ 1.2 does not support SOAP 1.2");
323     }
324 
325 }