1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.ws.soap.soap11.encoder;
18
19 import java.io.IOException;
20 import java.io.OutputStreamWriter;
21 import java.io.UnsupportedEncodingException;
22 import java.io.Writer;
23
24 import org.opensaml.ws.message.MessageContext;
25 import org.opensaml.ws.message.encoder.MessageEncodingException;
26 import org.opensaml.ws.message.handler.BaseHandlerChainAwareMessageEncoder;
27 import org.opensaml.ws.soap.common.SOAPObjectBuilder;
28 import org.opensaml.ws.soap.soap11.Body;
29 import org.opensaml.ws.soap.soap11.Envelope;
30 import org.opensaml.ws.transport.OutTransport;
31 import org.opensaml.xml.Configuration;
32 import org.opensaml.xml.XMLObjectBuilderFactory;
33 import org.opensaml.xml.util.XMLHelper;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import org.w3c.dom.Element;
37
38
39
40
41 public class SOAP11Encoder extends BaseHandlerChainAwareMessageEncoder {
42
43
44 private final Logger log = LoggerFactory.getLogger(SOAP11Encoder.class);
45
46
47 private SOAPObjectBuilder<Envelope> envBuilder;
48
49
50 private SOAPObjectBuilder<Body> bodyBuilder;
51
52
53
54 @SuppressWarnings("unchecked")
55 public SOAP11Encoder() {
56 super();
57 XMLObjectBuilderFactory builderFactory = Configuration.getBuilderFactory();
58 envBuilder = (SOAPObjectBuilder<Envelope>) builderFactory.getBuilder(Envelope.DEFAULT_ELEMENT_NAME);
59 bodyBuilder = (SOAPObjectBuilder<Body>) builderFactory.getBuilder(Body.DEFAULT_ELEMENT_NAME);
60 }
61
62
63 public boolean providesMessageConfidentiality(MessageContext messageContext) throws MessageEncodingException {
64 return messageContext.getOutboundMessageTransport().isConfidential();
65 }
66
67
68 public boolean providesMessageIntegrity(MessageContext messageContext) throws MessageEncodingException {
69 return messageContext.getOutboundMessageTransport().isIntegrityProtected();
70 }
71
72
73 protected void prepareMessageContext(MessageContext messageContext) throws MessageEncodingException {
74 if (messageContext.getOutboundMessage() == null) {
75 messageContext.setOutboundMessage(buildSOAPEnvelope(messageContext));
76 }
77 }
78
79
80 protected void encodeToTransport(MessageContext messageContext) throws MessageEncodingException {
81 Element envelopeElem = marshallMessage(messageContext.getOutboundMessage());
82
83 preprocessTransport(messageContext);
84
85 try {
86 OutTransport outTransport = messageContext.getOutboundMessageTransport();
87 Writer out = new OutputStreamWriter(outTransport.getOutgoingStream(), "UTF-8");
88 XMLHelper.writeNode(envelopeElem, out);
89 out.flush();
90 } catch (UnsupportedEncodingException e) {
91 log.error("JVM does not support required UTF-8 encoding");
92 throw new MessageEncodingException("JVM does not support required UTF-8 encoding");
93 } catch (IOException e) {
94 log.error("Unable to write message content to outbound stream", e);
95 throw new MessageEncodingException("Unable to write message content to outbound stream", e);
96 }
97 }
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 protected void preprocessTransport(MessageContext messageContext) throws MessageEncodingException {
113 }
114
115
116
117
118
119
120
121
122 protected Envelope buildSOAPEnvelope(MessageContext messageContext) {
123 log.debug("Building SOAP envelope");
124
125 Envelope envelope = envBuilder.buildObject();
126
127 Body body = bodyBuilder.buildObject();
128 envelope.setBody(body);
129
130 return envelope;
131 }
132
133 }