1 package org.objectweb.celtix.bus.jaxws.servlet; 2 3 import java.io.BufferedOutputStream ; 4 import java.io.IOException ; 5 import java.util.ArrayList ; 6 import java.util.Enumeration ; 7 import java.util.Iterator ; 8 import java.util.List ; 9 import java.util.Map ; 10 11 import javax.servlet.http.HttpServletRequest ; 12 import javax.servlet.http.HttpServletResponse ; 13 import javax.wsdl.Definition; 14 import javax.wsdl.Port; 15 import javax.wsdl.WSDLException; 16 import javax.wsdl.extensions.ExtensibilityElement; 17 import javax.wsdl.extensions.soap.SOAPAddress; 18 import javax.xml.ws.handler.MessageContext; 19 20 import org.objectweb.celtix.Bus; 21 import org.objectweb.celtix.bus.transports.http.AbstractHTTPServerOutputStreamContext; 22 import org.objectweb.celtix.bus.transports.http.AbstractHTTPServerTransport; 23 import org.objectweb.celtix.bus.transports.http.HTTPServerInputStreamContext; 24 import org.objectweb.celtix.context.OutputStreamMessageContext; 25 import org.objectweb.celtix.transports.ServerTransportCallback; 26 import org.objectweb.celtix.ws.addressing.EndpointReferenceType; 27 import org.objectweb.celtix.wsdl.EndpointReferenceUtils; 28 import org.xmlsoap.schemas.wsdl.http.AddressType; 29 30 public class ServletServerTransport extends AbstractHTTPServerTransport { 31 32 CeltixServlet servlet; 33 34 public ServletServerTransport(Bus b, EndpointReferenceType ref, CeltixServlet s) 35 throws WSDLException, IOException { 36 super(b, ref); 37 servlet = s; 38 } 39 40 public void activate(ServerTransportCallback cb) throws IOException { 41 callback = cb; 42 servlet.addServant(nurl, this); 43 } 44 45 public void deactivate() throws IOException { 46 servlet.removeServant(nurl, this); 47 } 48 49 50 protected void copyRequestHeaders(MessageContext ctx, Map <String , List <String >> headers) { 51 HttpServletRequest req = (HttpServletRequest )ctx.get(HTTPServerInputStreamContext.HTTP_REQUEST); 52 for (Enumeration e = req.getHeaderNames(); e.hasMoreElements();) { 53 String fname = (String )e.nextElement(); 54 List <String > values; 55 if (headers.containsKey(fname)) { 56 values = headers.get(fname); 57 } else { 58 values = new ArrayList <String >(); 59 headers.put(fname, values); 60 } 61 for (Enumeration e2 = req.getHeaders(fname); e2.hasMoreElements();) { 62 String val = (String )e2.nextElement(); 63 values.add(val); 64 } 65 } 66 } 67 protected void setPolicies(MessageContext ctx, Map <String , List <String >> headers) { 68 super.setPolicies(ctx, headers); 69 if (policy.isSetReceiveTimeout()) { 70 82 } 83 } 84 85 86 90 public OutputStreamMessageContext createOutputStreamContext(MessageContext context) 91 throws IOException { 92 return new AbstractHTTPServerOutputStreamContext(this, context) { 93 protected void flushHeaders() throws IOException { 94 HttpServletResponse response = 95 (HttpServletResponse )get(HTTPServerInputStreamContext.HTTP_RESPONSE); 96 97 Integer i = (Integer )context.get(HTTP_RESPONSE_CODE); 98 if (i != null) { 99 response.setStatus(i.intValue()); 100 } 101 102 Map <?, ?> headers = (Map <?, ?>)super.get(HTTP_RESPONSE_HEADERS); 103 if (null != headers) { 104 for (Iterator <?> iter = headers.keySet().iterator(); iter.hasNext();) { 105 String header = (String )iter.next(); 106 List <?> headerList = (List <?>)headers.get(header); 107 for (Object string : headerList) { 108 response.addHeader(header, (String )string); 109 } 110 } 111 } 112 origOut.resetOut(new BufferedOutputStream (response.getOutputStream(), 1024)); 113 } 114 }; 115 } 116 117 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 118 if (policy.isSetRedirectURL()) { 119 resp.sendRedirect(policy.getRedirectURL()); 120 return; 121 } 122 123 if ("GET".equals(req.getMethod())) { 124 try { 125 Definition def = EndpointReferenceUtils.getWSDLDefinition(bus.getWSDLManager(), reference); 126 127 resp.addHeader("Content-Type", "text/xml"); 128 Port port = EndpointReferenceUtils.getPort(bus.getWSDLManager(), reference); 129 List <?> exts = port.getExtensibilityElements(); 130 if (exts.size() > 0) { 131 ExtensibilityElement el = (ExtensibilityElement)exts.get(0); 132 if (el instanceof SOAPAddress) { 133 SOAPAddress add = (SOAPAddress)el; 134 add.setLocationURI(req.getRequestURL().toString()); 135 } 136 if (el instanceof AddressType) { 137 AddressType add = (AddressType)el; 138 add.setLocation(req.getRequestURL().toString()); 139 } 140 } 141 142 143 bus.getWSDLManager().getWSDLFactory().newWSDLWriter().writeWSDL(def, resp.getOutputStream()); 144 resp.getOutputStream().flush(); 145 return; 146 } catch (WSDLException ex) { 147 ex.printStackTrace(); 149 } 150 } 151 } 152 public void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws IOException { 153 HTTPServerInputStreamContext ctx = new HTTPServerInputStreamContext(this) { 154 public void initContext() throws IOException { 155 super.initContext(); 156 inStream = req.getInputStream(); 157 origInputStream = inStream; 158 } 159 }; 160 ctx.put(HTTPServerInputStreamContext.HTTP_REQUEST, req); 161 ctx.put(HTTPServerInputStreamContext.HTTP_RESPONSE, resp); 162 ctx.initContext(); 163 164 callback.dispatch(ctx, this); 165 } 166 } 167 | Popular Tags |