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 }