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

ServletImplInvocationHandler

public class ServletImplInvocationHandler extends Object implements InvocationHandler
InvocationHandler used to delegate calls to JAXRPC servlet impls that aren't subtypes of their associated Service Endpoint Interface.
author
Kenneth Saks

Fields Summary
private static Logger
logger
private Object
servletImplDelegate
private Class
servletImplClass
Constructors Summary
public ServletImplInvocationHandler(Object delegate)

    
       
        servletImplDelegate = delegate;
        servletImplClass    = delegate.getClass();
    
Methods Summary
public java.lang.Objectinvoke(java.lang.Object proxy, java.lang.reflect.Method method, java.lang.Object[] args)


        // NOTE : be careful with "args" parameter.  It is null
        //        if method signature has 0 arguments.

        Class methodClass = method.getDeclaringClass();
        if( methodClass == java.lang.Object.class )  {
            return invokeJavaObjectMethod(this, method, args);
        }

        Object returnValue = null;

        try {
            // Since impl class isn't subtype of SEI, we need to do a 
            // method lookup to get method object to use for invocation.
            Method implMethod = servletImplClass.getMethod
                (method.getName(), method.getParameterTypes());
            returnValue = implMethod.invoke(servletImplDelegate, args);
        } catch(InvocationTargetException ite) {
            logger.log(Level.FINE, "", ite);
            throw ite.getCause();
        } catch(Throwable t) {
            logger.log(Level.INFO, "Error invoking servlet impl", t);
            throw t;
        }

	return returnValue;
    
private java.lang.ObjectinvokeJavaObjectMethod(java.lang.reflect.InvocationHandler handler, java.lang.reflect.Method method, java.lang.Object[] args)


        Object returnValue = null;

        // Can only be one of : 
        //     boolean java.lang.Object.equals(Object)
        //     int     java.lang.Object.hashCode()
        //     String  java.lang.Object.toString()
        //
        // Optimize by comparing as few characters as possible.

        switch( method.getName().charAt(0) ) {
            case 'e" :
                Object other = Proxy.isProxyClass(args[0].getClass()) ?
                    Proxy.getInvocationHandler(args[0]) : args[0];
                returnValue = new Boolean(handler.equals(other));
                break;
            case 'h" :
                returnValue = new Integer(handler.hashCode());
                break;
            case 't" :
                returnValue = handler.toString();
                break;
            default :
                throw new Throwable("Object method " + method.getName() + 
                                    "not found");
        }

        return returnValue;