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.transport.*; 72 import org.apache.soap.util.*; 73 import org.apache.soap.util.xml.*; 74 import org.apache.soap.transport.EnvelopeEditor; 75 import org.apache.soap.transport.EnvelopeEditorFactory; 76 77 89 public class RPCRouterServlet extends HttpServlet { 90 129 private EnvelopeEditor editor = null; 130 private String configFilename = null; 131 132 public void init() throws ServletException { 133 ClassLoader servletClassLoader = 134 Thread.currentThread().getContextClassLoader(); 135 136 try 137 { 138 141 servletClassLoader.loadClass(this.getClass().getName()); 142 } 143 catch(ClassNotFoundException e) 144 { 145 servletClassLoader = getClass().getClassLoader(); 146 } 147 148 if (servletClassLoader == null) 149 { 150 154 servletClassLoader = ClassLoader.getSystemClassLoader(); 155 } 156 ServletConfig servletConfig = getServletConfig(); 157 ServletContext servletContext = servletConfig.getServletContext(); 158 162 String envelopeEditorFactoryClassName = 163 servletConfig.getInitParameter(Constants.ENVELOPE_EDITOR_FACTORY); 164 if (envelopeEditorFactoryClassName == null) 165 envelopeEditorFactoryClassName 166 = servletContext.getInitParameter(Constants.ENVELOPE_EDITOR_FACTORY); 167 168 169 if (envelopeEditorFactoryClassName != null) { 171 EnvelopeEditorFactory factory = 172 (EnvelopeEditorFactory)createObject(envelopeEditorFactoryClassName, 173 servletClassLoader); 174 175 if (factory != null) { 176 try { 177 Properties props = new Properties(); 178 181 Enumeration enum = servletContext.getInitParameterNames(); 182 183 while (enum.hasMoreElements()) { 184 String name = (String)enum.nextElement(); 185 186 if (!Constants.ENVELOPE_EDITOR_FACTORY.equals(name) 187 && !Constants.XML_PARSER.equals(name)) { 188 props.put(name, servletContext.getInitParameter(name)); 189 } 190 } 191 192 enum = servletConfig.getInitParameterNames(); 193 194 while (enum.hasMoreElements()) { 195 String name = (String)enum.nextElement(); 196 197 if (!Constants.ENVELOPE_EDITOR_FACTORY.equals(name) 198 && !Constants.XML_PARSER.equals(name)) { 199 props.put(name, servletConfig.getInitParameter(name)); 200 } 201 } 202 203 String servletContextPath = servletContext.getRealPath(""); 205 206 if (servletContextPath != null) { 207 props.put("SOAPServerContextPath", servletContextPath); 208 } 209 210 editor = factory.create(props); 212 } catch (SOAPException e) { 213 throw new ServletException("Can't create editor", e); 214 } 215 } 216 } 217 218 219 String tempStr = servletConfig.getInitParameter(Constants.CONFIGFILENAME); 220 if (tempStr == null) 221 tempStr = servletContext.getInitParameter(Constants.CONFIGFILENAME); 222 223 if (tempStr != null) { 225 configFilename = tempStr; 226 } 227 228 tempStr = servletConfig.getInitParameter(Constants.XML_PARSER); 229 if (tempStr == null) 230 tempStr = servletContext.getInitParameter(Constants.XML_PARSER); 231 232 if (tempStr != null) { 234 XMLParserUtils.refreshDocumentBuilderFactory(tempStr, 235 true, false); } 238 239 ServerHTTPUtils.setServletClassLoaderIntoContext(servletContext, 240 servletClassLoader); 241 } 242 243 private Object createObject(String className, ClassLoader classLoader) 244 throws ServletException 245 { 246 try { 247 return classLoader.loadClass(className).newInstance(); 248 } catch (ClassNotFoundException e) { 249 throw new ServletException("Can't find class named '" + className + 250 "'."); 251 } catch (InstantiationException e) { 252 throw new ServletException("Can't instantiate class '" + className + 253 "'."); 254 } catch (IllegalAccessException e) { 255 throw new ServletException("WARNING: Can't access the constructor " + 256 "of the class '" + className + "'."); 257 } 258 } 259 260 public void doGet (HttpServletRequest req, HttpServletResponse res) 261 throws ServletException, IOException { 262 res.setContentType("text/html"); 263 264 PrintWriter out = res.getWriter (); 265 266 out.println("<html><head><title>SOAP RPC Router</title></head>"); 267 out.println ("<body><h1>SOAP RPC Router</h1>"); 268 out.println ("<p>Sorry, I don't speak via HTTP GET- you have to use"); 269 out.println ("HTTP POST to talk to me.</p></body></html>"); 270 } 271 272 public void doPost (HttpServletRequest req, HttpServletResponse res) 273 throws ServletException, IOException { 274 ServletConfig config = getServletConfig(); 275 ServletContext context = config.getServletContext (); 276 HttpSession session = req.getSession (); 277 ServiceManager serviceManager = 278 ServerHTTPUtils.getServiceManagerFromContext (context, configFilename); 279 Call call = null; 280 Response resp = null; 281 String targetID = null; 282 String fullTargetID = null; 283 int status = res.SC_OK; 284 DeploymentDescriptor dd = null; 285 286 SOAPContext reqCtx = new SOAPContext(); 287 SOAPContext resCtx = new SOAPContext(); 288 Envelope callEnv = null ; 289 290 reqCtx.setClassLoader( ServerHTTPUtils. 291 getServletClassLoaderFromContext(context) ); 292 293 try { try { try { reqCtx.setProperty( Constants.BAG_HTTPSERVLET, this ); 298 reqCtx.setProperty( Constants.BAG_HTTPSESSION, session ); 299 reqCtx.setProperty( Constants.BAG_HTTPSERVLETREQUEST, req ); 300 reqCtx.setProperty( Constants.BAG_HTTPSERVLETRESPONSE, res ); 301 302 305 DocumentBuilder xdb = XMLParserUtils.getXMLDocBuilder(); 310 311 callEnv = 312 ServerHTTPUtils.readEnvelopeFromRequest(xdb, 313 req.getContentType(), 314 req.getContentLength(), 315 req.getInputStream(), 316 editor, 317 res, 318 reqCtx); 319 if (callEnv == null) 320 return; 321 call = RPCRouter.extractCallFromEnvelope(serviceManager, callEnv, 322 reqCtx); 323 targetID = call.getTargetObjectURI (); 324 fullTargetID = call.getFullTargetObjectURI (); 325 } catch (IllegalArgumentException e) { 326 String msg = e.getMessage (); 327 String faultCode = 328 (msg != null && msg.equals (Constants.ERR_MSG_VERSION_MISMATCH)) 329 ? Constants.FAULT_CODE_VERSION_MISMATCH 330 : Constants.FAULT_CODE_CLIENT; 331 throw new SOAPException (faultCode, msg, e); 332 } 333 334 dd = serviceManager.query (targetID); 337 reqCtx.setProperty( Constants.BAG_DEPLOYMENTDESCRIPTOR, dd ); 338 339 Provider provider; 340 if ( dd.getProviderType() == DeploymentDescriptor.PROVIDER_JAVA ) { 341 provider = new org.apache.soap.providers.RPCJavaProvider(); 343 } else if (dd.getProviderType() == 344 DeploymentDescriptor.PROVIDER_USER_DEFINED) { 345 provider = ServerUtils.loadProvider(dd, reqCtx); 347 } else { 348 provider = new org.apache.soap.providers.RPCJavaProvider(); 350 } 351 352 provider.locate( dd, callEnv, call, call.getMethodName(), fullTargetID, 353 reqCtx ); 354 provider.invoke( reqCtx, resCtx ); 355 356 } catch (Throwable t) { 357 SOAPException e = null; 362 if (t instanceof SOAPException) 363 e = (SOAPException) t; 364 else 365 e = new SOAPException(Constants.FAULT_CODE_SERVER + 366 ".Exception:", "", t); 367 368 Fault fault = new Fault (e); 369 fault.setFaultActorURI (req.getRequestURI ()); 370 if (dd != null) 371 dd.buildFaultRouter(reqCtx).notifyListeners(fault, e); 372 373 status = res.SC_INTERNAL_SERVER_ERROR; 376 377 String respEncStyle = null; 378 if(call != null) 379 respEncStyle = call.getEncodingStyleURI(); 380 if(respEncStyle == null) 381 respEncStyle = Constants.NS_URI_SOAP_ENC; 382 383 resCtx = new SOAPContext(); resp = new Response (null, null, fault, null, null, respEncStyle, 385 resCtx); 386 SOAPMappingRegistry smr = 387 (call != null) ? call.getSOAPMappingRegistry () 388 : ServerHTTPUtils.getSMRFromContext (context); 389 Envelope env = resp.buildEnvelope(); 390 StringWriter sw = new StringWriter(); 391 env.marshall(sw, smr, resp.getSOAPContext()); 392 resp.getSOAPContext().setRootPart( sw.toString(), 393 Constants.HEADERVAL_CONTENT_TYPE_UTF8); 394 } 395 396 TransportMessage sres = new TransportMessage(null, resCtx, null ); 398 sres.editOutgoing(editor); 399 400 sres.save(); 402 403 res.setStatus(status); 405 res.setContentType(sres.getContentType()); 406 for (Enumeration headers = sres.getHeaderNames(); 407 headers.hasMoreElements(); ) { 408 String name = (String)headers.nextElement(); 409 res.setHeader(name, sres.getHeader(name)); 410 } 411 412 res.setContentLength(sres.getContentLength()); 413 OutputStream outStream = res.getOutputStream(); 414 sres.writeTo(outStream); 415 } 416 catch (Exception e) 417 { 418 throw new ServletException ("Error building response envelope: " + e); 419 } 420 } 421 } 422 | Popular Tags |