1 package org.objectweb.celtix.bus.jaxws.servlet; 2 3 import java.io.IOException ; 4 import java.io.InputStream ; 5 import java.lang.ref.WeakReference ; 6 import java.net.MalformedURLException ; 7 import java.net.URL ; 8 import java.util.ArrayList ; 9 import java.util.HashMap ; 10 import java.util.Hashtable ; 11 import java.util.List ; 12 import java.util.Map ; 13 14 import javax.servlet.ServletConfig ; 15 import javax.servlet.ServletException ; 16 import javax.servlet.http.HttpServlet ; 17 import javax.servlet.http.HttpServletRequest ; 18 import javax.servlet.http.HttpServletResponse ; 19 import javax.xml.namespace.QName ; 20 import javax.xml.parsers.DocumentBuilderFactory ; 21 import javax.xml.parsers.ParserConfigurationException ; 22 23 import org.w3c.dom.Document ; 24 import org.w3c.dom.Element ; 25 import org.w3c.dom.Node ; 26 27 import org.xml.sax.SAXException ; 28 29 import org.objectweb.celtix.Bus; 30 import org.objectweb.celtix.BusException; 31 import org.objectweb.celtix.bus.jaxws.EndpointImpl; 32 import org.objectweb.celtix.transports.TransportFactory; 33 import org.objectweb.celtix.ws.addressing.EndpointReferenceType; 34 import org.objectweb.celtix.wsdl.EndpointReferenceUtils; 35 36 public class CeltixServlet extends HttpServlet { 37 static final String HTTP_REQUEST = 38 CeltixServlet.class.getName() + ".REQUEST"; 39 static final String HTTP_RESPONSE = 40 CeltixServlet.class.getName() + ".RESPONSE"; 41 42 static final Map <String , WeakReference <Bus>> BUS_MAP = new Hashtable <String , WeakReference <Bus>>(); 43 44 protected Bus bus; 45 protected Map <String , ServletServerTransport> servantMap 46 = new HashMap <String , ServletServerTransport>(); 47 48 public void init(ServletConfig servletConfig) throws ServletException { 49 super.init(servletConfig); 50 51 List <String > list = new ArrayList <String >(); 52 String busid = servletConfig.getInitParameter("bus.id"); 53 if (null != busid) { 54 list.add("-BUSid"); 55 list.add(busid); 56 WeakReference <Bus> ref = BUS_MAP.get(busid); 57 if (null != ref) { 58 bus = ref.get(); 59 } 60 } 61 try { 62 if (null == bus) { 63 bus = Bus.init(list.toArray(new String [list.size()])); 64 65 TransportFactory factory = createServletTransportFactory(); 66 factory.init(bus); 67 registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/soap/"); 68 registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/soap/http"); 69 registerTransport(factory, "http://schemas.xmlsoap.org/wsdl/http/"); 70 registerTransport(factory, "http://celtix.objectweb.org/bindings/xmlformat"); 71 registerTransport(factory, "http://celtix.objectweb.org/transports/http/configuration"); 72 } 73 } catch (BusException ex) { 74 ex.printStackTrace(); 76 } 77 if (null != busid) { 78 BUS_MAP.put(busid, new WeakReference <Bus>(bus)); 79 } 80 81 InputStream ins = servletConfig.getServletContext() 82 .getResourceAsStream("/WEB-INF/celtix-servlet.xml"); 83 if (ins != null) { 84 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 85 builderFactory.setNamespaceAware(true); 86 builderFactory.setValidating(false); 87 88 89 try { 90 Document doc = builderFactory.newDocumentBuilder().parse(ins); 91 Node nd = doc.getDocumentElement().getFirstChild(); 92 while (nd != null) { 93 if ("endpoint".equals(nd.getLocalName())) { 94 loadEndpoint(servletConfig, nd); 95 } 96 nd = nd.getNextSibling(); 97 } 98 } catch (SAXException ex) { 99 ex.printStackTrace(); 101 } catch (IOException ex) { 102 ex.printStackTrace(); 104 } catch (ParserConfigurationException ex) { 105 ex.printStackTrace(); 107 } 108 } 109 } 110 111 114 protected TransportFactory createServletTransportFactory() { 115 return new ServletTransportFactory(this); 116 } 117 118 private void registerTransport(TransportFactory factory, String namespace) throws BusException { 119 this.bus.getTransportFactoryManager().registerTransportFactory(namespace, 120 factory); 121 } 122 123 public void loadEndpoint(String implName, 124 String serviceName, 125 String wsdlName, 126 String portName, 127 String urlPat) { 128 129 try { 130 URL url = null; 131 if (wsdlName != null) { 132 try { 133 url = getServletConfig().getServletContext().getResource(wsdlName); 134 } catch (MalformedURLException ex) { 135 try { 136 url = new URL (wsdlName); 137 } catch (MalformedURLException ex2) { 138 try { 139 url = getServletConfig().getServletContext().getResource("/" + wsdlName); 140 } catch (MalformedURLException ex3) { 141 url = null; 142 } 143 } 144 } 145 } 146 Class cls = Class.forName(implName, false, Thread.currentThread().getContextClassLoader()); 147 Object impl = cls.newInstance(); 148 EndpointReferenceType ref; 149 if (url != null) { 150 ref = EndpointReferenceUtils 151 .getEndpointReference(url, 152 QName.valueOf(serviceName), 153 portName); 154 } else { 155 ref = 156 EndpointReferenceUtils.getEndpointReference(bus.getWSDLManager(), 157 impl); 158 } 159 EndpointImpl ep = new EndpointImpl(bus, impl, null, ref); 160 161 ep.publish("http://localhost" + (urlPat.charAt(0) == '/' ? "" : "/") + urlPat); 163 } catch (ClassNotFoundException ex) { 164 ex.printStackTrace(); 166 } catch (InstantiationException ex) { 167 ex.printStackTrace(); 169 } catch (IllegalAccessException ex) { 170 ex.printStackTrace(); 172 } 173 } 174 175 public void loadEndpoint(ServletConfig servletConfig, Node node) { 176 Element el = (Element )node; 177 String implName = el.getAttribute("implementation"); 178 String serviceName = el.getAttribute("service"); 179 String wsdlName = el.getAttribute("wsdl"); 180 String portName = el.getAttribute("port"); 181 String urlPat = el.getAttribute("url-pattern"); 182 186 187 loadEndpoint(implName, serviceName, wsdlName, portName, urlPat); 188 } 189 190 public void destroy() { 191 try { 192 String s = bus.getBusID(); 193 BUS_MAP.remove(s); 194 195 bus.shutdown(true); 196 } catch (BusException ex) { 197 ex.printStackTrace(); 198 } 200 } 201 202 void addServant(URL url, ServletServerTransport servant) { 203 servantMap.put(url.getPath(), servant); 204 } 205 void removeServant(URL url, ServletServerTransport servant) { 206 servantMap.remove(url.getPath()); 207 } 208 209 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException { 210 ServletServerTransport tp = servantMap.get(request.getPathInfo()); 211 if (tp == null) { 212 throw new ServletException ("Unknown servlet mapping " + request.getPathInfo()); 213 } 214 try { 215 tp.doPost(request, response); 216 } catch (IOException ex) { 217 throw new ServletException (ex.getMessage()); 218 } 219 } 220 221 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { 222 ServletServerTransport tp = servantMap.get(request.getPathInfo()); 223 if (tp == null) { 224 throw new ServletException ("Unknown servlet mapping " + request.getPathInfo()); 225 } 226 try { 227 tp.doGet(request, response); 228 } catch (IOException ex) { 229 throw new ServletException (ex.getMessage()); 230 } 231 } 232 233 } 234 | Popular Tags |