KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > bus > jaxws > servlet > ServletServerTransport


1 package org.objectweb.celtix.bus.jaxws.servlet;
2
3 import java.io.BufferedOutputStream JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.util.ArrayList JavaDoc;
6 import java.util.Enumeration JavaDoc;
7 import java.util.Iterator JavaDoc;
8 import java.util.List JavaDoc;
9 import java.util.Map JavaDoc;
10
11 import javax.servlet.http.HttpServletRequest JavaDoc;
12 import javax.servlet.http.HttpServletResponse JavaDoc;
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 JavaDoc {
36         super(b, ref);
37         servlet = s;
38     }
39
40     public void activate(ServerTransportCallback cb) throws IOException JavaDoc {
41         callback = cb;
42         servlet.addServant(nurl, this);
43     }
44
45     public void deactivate() throws IOException JavaDoc {
46         servlet.removeServant(nurl, this);
47     }
48
49     
50     protected void copyRequestHeaders(MessageContext ctx, Map JavaDoc<String JavaDoc, List JavaDoc<String JavaDoc>> headers) {
51         HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc)ctx.get(HTTPServerInputStreamContext.HTTP_REQUEST);
52         for (Enumeration JavaDoc e = req.getHeaderNames(); e.hasMoreElements();) {
53             String JavaDoc fname = (String JavaDoc)e.nextElement();
54             List JavaDoc<String JavaDoc> values;
55             if (headers.containsKey(fname)) {
56                 values = headers.get(fname);
57             } else {
58                 values = new ArrayList JavaDoc<String JavaDoc>();
59                 headers.put(fname, values);
60             }
61             for (Enumeration JavaDoc e2 = req.getHeaders(fname); e2.hasMoreElements();) {
62                 String JavaDoc val = (String JavaDoc)e2.nextElement();
63                 values.add(val);
64             }
65         }
66     }
67     protected void setPolicies(MessageContext ctx, Map JavaDoc<String JavaDoc, List JavaDoc<String JavaDoc>> headers) {
68         super.setPolicies(ctx, headers);
69         if (policy.isSetReceiveTimeout()) {
70             /*
71              * @@TODO - can we set a timout?
72             Object connection = req.getHttpConnection().getConnection();
73             if (connection instanceof Socket) {
74                 Socket sock = (Socket)connection;
75                 try {
76                     sock.setSoTimeout((int)policy.getReceiveTimeout());
77                 } catch (SocketException ex) {
78                     LOG.log(Level.INFO, "Could not set SoTimeout", ex);
79                 }
80             }
81              */

82         }
83     }
84     
85     
86     /**
87      * @param context The associated MessageContext.
88      * @return the context that will be used to obtain the OutputStream
89      */

90     public OutputStreamMessageContext createOutputStreamContext(MessageContext context)
91         throws IOException JavaDoc {
92         return new AbstractHTTPServerOutputStreamContext(this, context) {
93             protected void flushHeaders() throws IOException JavaDoc {
94                 HttpServletResponse JavaDoc response =
95                     (HttpServletResponse JavaDoc)get(HTTPServerInputStreamContext.HTTP_RESPONSE);
96                 
97                 Integer JavaDoc i = (Integer JavaDoc)context.get(HTTP_RESPONSE_CODE);
98                 if (i != null) {
99                     response.setStatus(i.intValue());
100                 }
101                 
102                 Map JavaDoc<?, ?> headers = (Map JavaDoc<?, ?>)super.get(HTTP_RESPONSE_HEADERS);
103                 if (null != headers) {
104                     for (Iterator JavaDoc<?> iter = headers.keySet().iterator(); iter.hasNext();) {
105                         String JavaDoc header = (String JavaDoc)iter.next();
106                         List JavaDoc<?> headerList = (List JavaDoc<?>)headers.get(header);
107                         for (Object JavaDoc string : headerList) {
108                             response.addHeader(header, (String JavaDoc)string);
109                         }
110                     }
111                 }
112                 origOut.resetOut(new BufferedOutputStream JavaDoc(response.getOutputStream(), 1024));
113             }
114         };
115     }
116     
117     public void doGet(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc resp) throws IOException JavaDoc {
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 JavaDoc<?> 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                 // TODO Auto-generated catch block
148
ex.printStackTrace();
149             }
150         }
151     }
152     public void doPost(final HttpServletRequest JavaDoc req, final HttpServletResponse JavaDoc resp) throws IOException JavaDoc {
153         HTTPServerInputStreamContext ctx = new HTTPServerInputStreamContext(this) {
154             public void initContext() throws IOException JavaDoc {
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