1 package org.codehaus.xfire.transport.http;
2
3 import java.io.IOException;
4 import java.io.OutputStream;
5
6 import javax.servlet.http.HttpServletResponse;
7 import javax.xml.stream.XMLStreamWriter;
8
9 import org.codehaus.xfire.MessageContext;
10 import org.codehaus.xfire.XFireException;
11 import org.codehaus.xfire.XFireRuntimeException;
12 import org.codehaus.xfire.attachments.Attachments;
13 import org.codehaus.xfire.exchange.OutMessage;
14 import org.codehaus.xfire.transport.AbstractChannel;
15 import org.codehaus.xfire.transport.Channel;
16 import org.codehaus.xfire.util.STAXUtils;
17
18 public class HttpSoapChannel
19 extends AbstractChannel
20 {
21 public HttpSoapChannel(String uri, SoapHttpTransport transport)
22 {
23 setTransport(transport);
24 setUri(uri);
25 }
26
27 public void open()
28 {
29 }
30
31 public void send(MessageContext context, OutMessage message) throws XFireException
32 {
33 if (message.getUri().equals(Channel.BACKCHANNEL_URI))
34 {
35 HttpServletResponse response = XFireServletController.getResponse();
36
37 if (response == null)
38 {
39 throw new XFireRuntimeException("No backchannel exists for message");
40 }
41
42 Attachments atts = message.getAttachments();
43 if (atts != null && atts.size() > 0)
44 {
45 throw new UnsupportedOperationException("Sending attachments isn't supported at this time.");
46 }
47
48 try
49 {
50 OutputStream out = response.getOutputStream();
51 XMLStreamWriter writer = STAXUtils.createXMLStreamWriter(out, message.getEncoding());
52
53 message.getSerializer().writeMessage(message, writer, context);
54
55 out.flush();
56 out.close();
57 }
58 catch (Exception e)
59 {
60 if (e instanceof XFireException)
61 throw (XFireException) e;
62
63 throw new XFireException("Couldn't send message.", e);
64 }
65 }
66 else
67 {
68 sendViaClient(context, message);
69 }
70 }
71
72 private void sendViaClient(MessageContext context, OutMessage message)
73 throws XFireException
74 {
75 HttpMessageSender sender = new HttpMessageSender(message.getUri(), message.getEncoding());
76 try
77 {
78 sender.setAction(message.getAction());
79 sender.open();
80
81 OutputStream out = sender.getOutputStream();
82 XMLStreamWriter writer = STAXUtils.createXMLStreamWriter(out, message.getEncoding());
83
84 message.getSerializer().writeMessage(message, writer, context);
85
86 out.flush();
87 out.close();
88
89 getEndpoint().onReceive(context, sender.getInMessage());
90 }
91 catch (IOException e)
92 {
93 throw new XFireException("Couldn't send message.", e);
94 }
95 finally
96 {
97 sender.close();
98 }
99 }
100
101 public void close()
102 {
103 }
104 }