1 57 58 package org.apache.soap.server.http; 59 60 import java.io.*; 61 import java.util.*; 62 import java.lang.reflect.*; 63 import javax.servlet.*; 64 import javax.servlet.http.*; 65 import javax.xml.parsers.*; 66 import org.w3c.dom.*; 67 import org.apache.soap.*; 68 import org.apache.soap.rpc.*; 69 import org.apache.soap.server.*; 70 import org.apache.soap.encoding.*; 71 import org.apache.soap.util.*; 72 import org.apache.soap.util.xml.*; 73 import org.apache.soap.transport.*; 74 75 82 public class MessageRouterServlet extends HttpServlet { 83 122 private EnvelopeEditor editor = null; 123 private String configFilename = null; 124 125 public void init() throws ServletException { 126 ClassLoader servletClassLoader = 127 Thread.currentThread().getContextClassLoader(); 128 129 try 130 { 131 134 servletClassLoader.loadClass(this.getClass().getName()); 135 } 136 catch(ClassNotFoundException e) 137 { 138 servletClassLoader = getClass().getClassLoader(); 139 } 140 141 if (servletClassLoader == null) 142 { 143 147 servletClassLoader = ClassLoader.getSystemClassLoader(); 148 } 149 ServletConfig servletConfig = getServletConfig(); 150 ServletContext servletContext = servletConfig.getServletContext(); 151 String envelopeEditorFactoryClassName = 152 servletConfig.getInitParameter(Constants.ENVELOPE_EDITOR_FACTORY); 153 154 if (envelopeEditorFactoryClassName != null) { 156 EnvelopeEditorFactory factory = 157 (EnvelopeEditorFactory)createObject(envelopeEditorFactoryClassName, 158 servletClassLoader); 159 160 if (factory != null) { 161 try { 162 Properties props = new Properties(); 163 Enumeration enum = servletConfig.getInitParameterNames(); 164 165 while (enum.hasMoreElements()) { 166 String name = (String)enum.nextElement(); 167 168 if (!Constants.ENVELOPE_EDITOR_FACTORY.equals(name) 169 && !Constants.XML_PARSER.equals(name)) { 170 props.put(name, servletConfig.getInitParameter(name)); 171 } 172 } 173 174 String servletContextPath = servletContext.getRealPath(""); 176 177 if (servletContextPath != null) { 178 props.put("SOAPServerContextPath", servletContextPath); 179 } 180 181 editor = factory.create(props); 183 } catch (SOAPException e) { 184 throw new ServletException("Can't create editor", e); 185 } 186 } 187 } 188 189 String tempStr = servletConfig.getInitParameter(Constants.CONFIGFILENAME); 190 191 if (tempStr != null) { 193 configFilename = tempStr; 194 } 195 196 tempStr = servletConfig.getInitParameter(Constants.XML_PARSER); 197 198 if (tempStr != null) { 200 XMLParserUtils.refreshDocumentBuilderFactory(tempStr, 201 true, false); } 204 205 ServerHTTPUtils.setServletClassLoaderIntoContext(servletContext, 206 servletClassLoader); 207 } 208 209 private Object createObject(String className, ClassLoader classLoader) 210 throws ServletException 211 { 212 try { 213 return classLoader.loadClass(className).newInstance(); 214 } catch (ClassNotFoundException e) { 215 throw new ServletException("Can't find class named '" + className + 216 "'."); 217 } catch (InstantiationException e) { 218 throw new ServletException("Can't instantiate class '" + className + 219 "'."); 220 } catch (IllegalAccessException e) { 221 throw new ServletException("WARNING: Can't access the constructor " + 222 "of the class '" + className + "'."); 223 } 224 } 225 226 public void doGet (HttpServletRequest req, HttpServletResponse res) 227 throws ServletException, IOException { 228 res.setContentType("text/html"); 229 230 PrintWriter out = res.getWriter (); 231 232 out.println("<html><head><title>SOAP Message Router</title></head>"); 233 out.println ("<body><h1>SOAP Message Router</h1>"); 234 out.println ("<p>Sorry, I don't speak via HTTP GET- you have to use"); 235 out.println ("HTTP POST to talk to me.</p></body></html>"); 236 } 237 238 public void doPost (HttpServletRequest req, HttpServletResponse res) 239 throws ServletException, IOException 240 { 241 ServletConfig config = getServletConfig(); 242 ServletContext context = config.getServletContext (); 243 HttpSession session = req.getSession (); 244 ServiceManager serviceManager = 245 ServerHTTPUtils.getServiceManagerFromContext (context, configFilename); 246 int status; 247 DeploymentDescriptor dd = null; 248 TransportMessage sres; 249 250 SOAPContext reqCtx = new SOAPContext() ; 251 SOAPContext resCtx = new SOAPContext() ; 252 253 reqCtx.setClassLoader( ServerHTTPUtils. 254 getServletClassLoaderFromContext(context) ); 255 256 try { 257 try { 258 reqCtx.setProperty( Constants.BAG_HTTPSERVLET, this ); 259 reqCtx.setProperty( Constants.BAG_HTTPSESSION, session ); 260 reqCtx.setProperty( Constants.BAG_HTTPSERVLETREQUEST, req ); 261 reqCtx.setProperty( Constants.BAG_HTTPSERVLETRESPONSE, res ); 262 263 265 DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder(); 270 Envelope msgEnv = 271 ServerHTTPUtils.readEnvelopeFromRequest(xdb, 272 req.getContentType(), 273 req.getContentLength(), 274 req.getInputStream(), 275 editor, res, reqCtx); 276 if (msgEnv == null) 277 return; 278 279 Body body = msgEnv.getBody (); 282 Element e = (Element) body.getBodyEntries().elementAt (0); 283 if (e == null) { 284 throw new SOAPException (Constants.FAULT_CODE_CLIENT, 285 "Message envelope's body is empty!"); 286 } 287 String targetID = e.getNamespaceURI (); 288 String messageName = e.getLocalName (); 289 290 dd = serviceManager.query (targetID); 292 reqCtx.setProperty( Constants.BAG_DEPLOYMENTDESCRIPTOR, dd ); 293 294 Provider provider; 295 if ( dd.getProviderType() == DeploymentDescriptor.PROVIDER_JAVA ) { 296 provider = new org.apache.soap.providers.MsgJavaProvider(); 298 } else if (dd.getProviderType() == 299 DeploymentDescriptor.PROVIDER_USER_DEFINED) { 300 provider = ServerUtils.loadProvider(dd, reqCtx); 302 } else { 303 provider = new org.apache.soap.providers.MsgJavaProvider(); 305 } 306 307 provider.locate( dd, msgEnv, null, messageName, targetID, reqCtx ); 308 provider.invoke( reqCtx, resCtx ); 309 310 sres = new TransportMessage(null, resCtx, null); 311 312 sres.editOutgoing(editor); 314 315 status = res.SC_OK; 318 } catch (Throwable t) { 319 324 SOAPException e = null; 325 if (t instanceof SOAPException) 326 e = (SOAPException)t; 327 else 328 e = new SOAPException(Constants.FAULT_CODE_SERVER + 329 ".Exception:", "", t); 330 331 Fault fault = new Fault (e); 332 fault.setFaultActorURI (req.getRequestURI ()); 333 if (dd != null) 334 dd.buildFaultRouter(reqCtx).notifyListeners(fault, e); 335 336 status = res.SC_INTERNAL_SERVER_ERROR; 339 340 resCtx = new SOAPContext(); Response resp = new Response(null, 342 null, 343 fault, 344 null, 345 null, 346 Constants.NS_URI_SOAP_ENC, 347 resCtx); 348 349 Envelope env = resp.buildEnvelope(); 350 StringWriter sw = new StringWriter(); 351 env.marshall(sw, ServerHTTPUtils.getSMRFromContext (context), 352 resp.getSOAPContext()); 353 String envelopeString = sw.toString(); 354 sres = new TransportMessage(envelopeString, resCtx, null); 355 } 356 357 sres.save(); 359 360 res.setStatus(status); 362 res.setContentType(sres.getContentType()); 363 for (Enumeration headers = sres.getHeaderNames(); 364 headers.hasMoreElements(); ) { 365 String name = (String)headers.nextElement(); 366 res.setHeader(name, sres.getHeader(name)); 367 } 368 369 res.setContentLength(sres.getContentLength()); 370 OutputStream outStream = res.getOutputStream(); 371 sres.writeTo(outStream); 372 } 373 catch (Exception e) 374 { 375 throw new ServletException ("Error building response envelope: " + e); 376 } 377 } 378 } 379 | Popular Tags |