FileDocCategorySizeDatePackage
ServletSystemHandlerDelegate.javaAPI DocGlassfish v2 API9683Fri May 04 22:36:12 BST 2007com.sun.enterprise.webservice

ServletSystemHandlerDelegate

public class ServletSystemHandlerDelegate extends Object implements com.sun.xml.rpc.spi.runtime.SystemHandlerDelegate
The methods of this interface are invoked by the JAXRPCServletDelegate on the path to web sevice endpoints deployed as servlets. NOTE: The methods of this interface may also be called on the client side of jaxrpc invocations, although at this time, we have not decided from where such invocations would be made.
author
Ron Monzillo

Fields Summary
protected static final Logger
_logger
private static final String
IMPLEMENTOR
private static final String
SERVER_AUTH_CONTEXT
private static com.sun.enterprise.util.i18n.StringManager
localStrings
com.sun.enterprise.security.jauth.ServerAuthConfig
config_
com.sun.enterprise.deployment.WebServiceEndpoint
endpoint_
Constructors Summary
public ServletSystemHandlerDelegate(com.sun.enterprise.security.jauth.ServerAuthConfig config, com.sun.enterprise.deployment.WebServiceEndpoint ep)


         
	config_ = config;
        endpoint_ = ep;
    
Methods Summary
public booleanprocessRequest(com.sun.xml.rpc.spi.runtime.SOAPMessageContext messageContext)
The processRequest method is invoked with an object that implements com.sun.xml.rpc.spi.runtime.SOAPMessageContext.

When this method is called by the JAXRPCServletDelegate (on the server side of jaxrpc servlet container invocation processing) it must be called just before the call to implementor.getTie().handle(), and at the time of the request message and the following properties must have been set on the SOAPMessageContext.

com.sun.xml.rpc.server.http.MessageContextProperties.IMPLEMENTOR
This property must be set to the com.sun.xml.rpc.spi.runtime.Implementor object corresponding to the target endpoint.

com.sun.xml.rpc.server.http.MessageContextProperties.HTTP_SERVLET_REQUEST
This property must be set to the javax.servlet.http.HttpServletRequest object containing the JAXRPC invocation.

com.sun.xml.rpc.server.http.MessageContextProperties.HTTP_SERVLET_RESPONSE
This property must be set to the javax.servlet.http.HttpServletResponse object corresponding to the JAXRPC invocation.

com.sun.xml.rpc.server.MessageContextProperties.HTTP_SERVLET_CONTEXT
This property must be set to the javax.servlet.ServletContext object corresponding to web application in which the JAXRPC servlet is running.

param
messageContext the SOAPMessageContext object containing the request message and the properties described above.
return
true if processing by the delegate was such that the caller should continue with its normal message processing. Returns false if the processing by the delegate resulted in the messageContext containing a response message that should be returned without the caller proceding to its normal message processing.
throws
java.lang.RuntimeException when the processing by the delegate failed, without yielding a response message. In this case, the expectation is that the caller will return a HTTP layer response code reporting that an internal error occured.


	if(_logger.isLoggable(Level.FINE)){
	    _logger.fine("ws.processRequest");
	}

        final SOAPMessageContext finalMC = messageContext;
	Implementor implementor = (Implementor) messageContext.getProperty( IMPLEMENTOR );
        final Tie tie = implementor.getTie();
	StreamingHandler handler = (StreamingHandler) implementor.getTie();
	SOAPMessage request = finalMC.getMessage();
	final ServerAuthContext sAC = config_.getAuthContext(handler,request);

        boolean status = true;
	try {
	    if (sAC != null) {
		status = false;
                // proceed to process message security
                status = WebServiceSecurity.validateRequest(finalMC,sAC);

		if (status) {
		    messageContext.setProperty(SERVER_AUTH_CONTEXT, sAC);
		}
            } 
	} catch (AuthException ae) {
	    _logger.log(Level.SEVERE, "ws.error_validate_request", ae);
	    throw new RuntimeException(ae);
	} finally {
	    WebServiceSecurity.auditInvocation(messageContext, endpoint_, status); 
        }

        if (status) {

	    // only do doAsPriv if SecurityManager in effect.

	    if (System.getSecurityManager() != null) {

		// on this branch, the endpoint invocation and the 
		// processing of the response will be initiated from
		// within the system handler delegate. delegate returns
		// false so that dispatcher will not invoke the endpoint.

		status = false;

		try {

		    Subject.doAsPrivileged
			(SecurityContext.getCurrent().getSubject(),
			 new PrivilegedExceptionAction() {
			    public Object run() throws Exception {
				tie.handle(finalMC);
				processResponse(finalMC);
				return null;
			    }
                     }, null);

		} catch (PrivilegedActionException pae) {
		    Throwable cause = pae.getCause();
		    if (cause instanceof AuthException){
			_logger.log(Level.SEVERE, "ws.error_secure_response", cause);
		    }
		    RuntimeException re = null;
		    if (cause instanceof RuntimeException) {
			re = (RuntimeException) cause;
		    } else {
			re = new RuntimeException(cause);
		    }
		    throw re;
		}
	    }
        }
	return status;
    
public voidprocessResponse(com.sun.xml.rpc.spi.runtime.SOAPMessageContext messageContext)
The processResponse method is invoked with an object that implements com.sun.xml.rpc.spi.runtime.SOAPMessageContext.

When this method is called by the JAXRPCServletDelegate (on the server side of jaxrpc servlet container invocation processing) it must be called just just after the call to implementor.getTie().handle(). In the special case where the handle method throws an exception, the processResponse message must not be called.

The SOAPMessageContext passed to the processRequest and handle messages is passed to the processResponse method.

throws
java.lang.RuntimeException when the processing by the delegate failed, in which case the caller is expected to return an HTTP layer response code reporting that an internal error occured.


	if(_logger.isLoggable(Level.FINE)){
	    _logger.fine("ws.processResponse");
	}

	ServerAuthContext sAC = 
	    (ServerAuthContext) messageContext.getProperty( SERVER_AUTH_CONTEXT );

	if (sAC == null) {
	    return;
	}

	try {
	    WebServiceSecurity.secureResponse(messageContext,sAC);
	} catch (AuthException ae) {
            _logger.log(Level.SEVERE, "ws.error_secure_response", ae);
	    throw new RuntimeException(ae);
	}