FileDocCategorySizeDatePackage
EjbWebServiceDispatcher.javaAPI DocGlassfish v2 API13002Fri May 04 22:36:10 BST 2007com.sun.enterprise.webservice

EjbWebServiceDispatcher

public class EjbWebServiceDispatcher extends Object implements EjbMessageDispatcher
Handles dispatching of ejb web service http invocations.
author
Kenneth Saks

Fields Summary
private static Logger
logger
private com.sun.xml.rpc.spi.JaxRpcObjectFactory
rpcFactory
private WsUtil
wsUtil
private com.sun.enterprise.webservice.monitoring.WebServiceEngineImpl
wsEngine
private static final QName
FAULT_CODE_CLIENT
private static final String
HTTP_SERVLET_RESPONSE
Constructors Summary
public EjbWebServiceDispatcher()


      
        rpcFactory = JaxRpcObjectFactory.newInstance();
        wsEngine = WebServiceEngineImpl.getInstance();
    
Methods Summary
protected javax.xml.soap.SOAPMessagecreateSOAPMessage(javax.servlet.http.HttpServletRequest request, javax.xml.soap.MimeHeaders headers)


        InputStream is = request.getInputStream();
        
        byte[] bytes = readFully(is);
        int length = request.getContentLength() == -1 ? bytes.length 
            : request.getContentLength();
        ByteInputStream in = new ByteInputStream(bytes, length);

        SOAPMessageContext msgContext = rpcFactory.createSOAPMessageContext();
        SOAPMessage message = msgContext.createMessage(headers, in);

        return message;
    
private voidhandleGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, javax.servlet.ServletContext ctxt, EjbRuntimeEndpointInfo endpointInfo)

       
        wsUtil.handleGet(req, resp, endpointInfo.getEndpoint());           

    
private voidhandlePost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, EjbRuntimeEndpointInfo endpointInfo)

        
        JAXRPCEndpointImpl endpoint = null;               
        String messageID = null;
        SOAPMessageContext msgContext = null;
        
        try {
            
            MimeHeaders headers = wsUtil.getHeaders(req);
            
            if (!wsUtil.hasTextXmlContentType(headers)) {
                wsUtil.writeInvalidContentType(resp);
                
                return;
            }
            
            msgContext = rpcFactory.createSOAPMessageContext();
            SOAPMessage message = createSOAPMessage(req, headers);
                        
	    ServerAuthContext sAC = null;
	    boolean wssSucceded = true;
            
            if (message != null) {                                
                
                msgContext.setMessage(message);

                // get the endpoint info
                endpoint = (JAXRPCEndpointImpl) endpointInfo.getEndpoint().getExtraAttribute(EndpointImpl.NAME);
                
                if (endpoint!=null) {
                    // first global notification
                    if (wsEngine.hasGlobalMessageListener()) {
                        messageID = wsEngine.preProcessRequest(endpoint);
                    }
                } else {
                    logger.fine("Missing internal monitoring info to trace " + req.getRequestURI());
                }                                   
                
                Handler implementor = null;
                try {
                    Ejb2RuntimeEndpointInfo endpointInfo2 = (Ejb2RuntimeEndpointInfo)endpointInfo;
                    // Do ejb container pre-invocation and pre-handler
                    // logic
                    implementor = endpointInfo2.getHandlerImplementor(msgContext);

                    // Set http response object so one-way operations will
                    // response before actual business method invocation.
                    msgContext.setProperty(HTTP_SERVLET_RESPONSE, resp);
                    
		    ServerAuthConfig authConfig = endpointInfo2.getServerAuthConfig();
		    if (authConfig != null) {
			sAC = authConfig.getAuthContext
			    ((StreamingHandler)implementor,message);
			if (sAC != null) {
			    wssSucceded = 
				WebServiceSecurity.validateRequest(msgContext,sAC);
			}
		    }

                    // Trace if necessary
                    if (messageID!=null || (endpoint!=null && endpoint.hasListeners())) {
                        // create the thread local
                        ThreadLocalInfo threadLocalInfo = 
                            new ThreadLocalInfo(messageID, req);

                        wsEngine.getThreadLocal().set(threadLocalInfo);

                        endpoint.processRequest(msgContext);
                    }
                    
                    // Pass control back to jaxrpc runtime to invoke
                    // any handlers and call the webservice method itself,
                    // which will be flow back into the ejb container.
		    if (wssSucceded) {
			implementor.handle(msgContext);
		    }
                    
                } finally {
                    
                    // Always call release, even if an error happened
                    // during getImplementor(), since some of the
                    // preInvoke steps might have occurred.  It's ok
                    // if implementor is null.
                    endpointInfo.releaseImplementor();

                }
            } else {                
                String errorMsg = "null message POSTed to ejb endpoint " +
                endpointInfo.getEndpoint().getEndpointName() +
                " at " + endpointInfo.getEndpointAddressUri();
                logger.fine(errorMsg);
                msgContext.writeSimpleErrorResponse
                (FAULT_CODE_CLIENT, errorMsg);
            }
            
            if (messageID!=null || endpoint!=null) {
                endpoint.processResponse(msgContext);
            }
                
            SOAPMessage reply = msgContext.getMessage();
            
	    if (sAC != null && wssSucceded) {
		WebServiceSecurity.secureResponse(msgContext,sAC);
	    }
            
            if (reply.saveRequired()) {
                reply.saveChanges();
            }

            wsUtil.writeReply(resp, msgContext);
            

        } catch (Throwable e) {
            
            String errorMessage = "invocation error on ejb endpoint " +
            endpointInfo.getEndpoint().getEndpointName() + " at " +
            endpointInfo.getEndpointAddressUri();
            logger.log(Level.WARNING, errorMessage, e);
            
            SOAPMessageContext errorMsgContext =
            rpcFactory.createSOAPMessageContext();
            errorMsgContext.writeSimpleErrorResponse
            (SOAPConstants.FAULT_CODE_SERVER, errorMessage);
            
            resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            if (messageID!=null || endpoint!=null) {        
                endpoint.processResponse(errorMsgContext);
            }                        
            
            wsUtil.writeReply(resp, errorMsgContext);
        }
        
        // final tracing notification
        if (messageID!=null) {
            HttpResponseInfoImpl response = new HttpResponseInfoImpl(resp);
            wsEngine.postProcessResponse(messageID, response);
        }
        

    
public voidinvoke(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp, javax.servlet.ServletContext ctxt, EjbRuntimeEndpointInfo endpointInfo)


        String method = req.getMethod();
        
        if (logger.isLoggable(Level.FINE)) {
            logger.log(Level.FINE, "WebServiceDispatcher " + req.getMethod() + 
                   " entering for " + req.getRequestURI() + " and query string " + req.getQueryString());
        }
        try {
            if( method.equals("POST") ) {
                
                handlePost(req, resp, endpointInfo);
                
            } else if( method.equals("GET") ) {
                
                handleGet(req, resp, ctxt, endpointInfo);
                
            } else {
                
                String errorMessage =  "Unsupported method request = [" 
                    + method + "] for endpoint " + 
                    endpointInfo.getEndpoint().getEndpointName() + " at " + 
                    endpointInfo.getEndpointAddressUri();
                logger.warning(errorMessage);
                wsUtil.writeInvalidMethodType(resp, errorMessage);
            }
        } catch(Exception e) {
            logger.log(Level.WARNING, "ejb endpoint exception", e);
        }
    
protected byte[]readFully(java.io.InputStream istream)

        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int num = 0;
        while( (num = istream.read(buf)) != -1) {
            bout.write(buf, 0, num);
        }
        byte[] ret = bout.toByteArray();
        return ret;