stubinvocationhandlerimpl.java

来自「JAVA 所有包」· Java 代码 · 共 196 行

JAVA
196
字号
/* * @(#)StubFactoryImpl.java	1.9 03/12/03 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.impl.presentation.rmi ;import java.security.AccessController;import java.security.PrivilegedAction;import java.lang.reflect.Method ;import java.lang.reflect.InvocationHandler ;import java.lang.reflect.Proxy ;import java.lang.reflect.InvocationTargetException ;import java.io.ObjectInputStream ;import java.io.ObjectOutputStream ;import java.io.IOException ;import java.rmi.Remote ;import javax.rmi.CORBA.Util ;import org.omg.CORBA.portable.ObjectImpl ;import org.omg.CORBA.portable.Delegate ;import org.omg.CORBA.portable.ServantObject ;import org.omg.CORBA.portable.ApplicationException ;import org.omg.CORBA.portable.RemarshalException ;import org.omg.CORBA.SystemException ;import com.sun.corba.se.spi.orb.ORB ;import com.sun.corba.se.pept.transport.ContactInfoList ;import com.sun.corba.se.spi.transport.CorbaContactInfoList ;import com.sun.corba.se.spi.protocol.CorbaClientDelegate ;import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcher ;import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator ;import com.sun.corba.se.spi.presentation.rmi.DynamicMethodMarshaller ;import com.sun.corba.se.spi.presentation.rmi.PresentationManager ;import com.sun.corba.se.spi.presentation.rmi.StubAdapter ;import com.sun.corba.se.spi.orbutil.proxy.InvocationHandlerFactory ;import com.sun.corba.se.spi.orbutil.proxy.LinkedInvocationHandler ;import com.sun.corba.se.impl.corba.CORBAObjectImpl ;public final class StubInvocationHandlerImpl implements LinkedInvocationHandler  {    private transient PresentationManager.ClassData classData ;    private transient PresentationManager pm ;    private transient org.omg.CORBA.Object stub ;    private transient Proxy self ;    public void setProxy( Proxy self )    {	this.self = self ;    }    public Proxy getProxy()    {	return self ;    }    public StubInvocationHandlerImpl( PresentationManager pm,	PresentationManager.ClassData classData, org.omg.CORBA.Object stub )     {	SecurityManager s = System.getSecurityManager();	if (s != null) {	    s.checkPermission(new DynamicAccessPermission("access"));	}	this.classData = classData ;	this.pm = pm ;	this.stub = stub ;    }    private boolean isLocal()    {	boolean result = false ;	Delegate delegate = StubAdapter.getDelegate( stub ) ;	if (delegate instanceof CorbaClientDelegate) {	    CorbaClientDelegate cdel = (CorbaClientDelegate)delegate ;	    ContactInfoList cil = cdel.getContactInfoList() ;	    if (cil instanceof CorbaContactInfoList) {		CorbaContactInfoList ccil = (CorbaContactInfoList)cil ;		LocalClientRequestDispatcher lcrd = 		    ccil.getLocalClientRequestDispatcher() ;		result = lcrd.useLocalInvocation( null ) ;	    }	}	 	return result ;    }    /** Invoke the given method with the args and return the result.     *  This may result in a remote invocation.     *  @param proxy The proxy used for this class (null if not using java.lang.reflect.Proxy)     */    public Object invoke( Object proxy, final Method method, 	Object[] args ) throws Throwable    {	String giopMethodName = classData.getIDLNameTranslator().	    getIDLName( method )  ;	DynamicMethodMarshaller dmm = 	    pm.getDynamicMethodMarshaller( method ) ;	Delegate delegate = null ;	try {	    delegate = StubAdapter.getDelegate( stub ) ;	} catch (SystemException ex) {	    throw Util.mapSystemException(ex) ;	} 	if (!isLocal()) {	    try {		org.omg.CORBA_2_3.portable.InputStream in = null ;		try {		    // create request		    org.omg.CORBA_2_3.portable.OutputStream out = 			(org.omg.CORBA_2_3.portable.OutputStream)			delegate.request( stub, giopMethodName, true);		    // marshal arguments		    dmm.writeArguments( out, args ) ;		    // finish invocation		    in = (org.omg.CORBA_2_3.portable.InputStream)			delegate.invoke( stub, out);			    // unmarshal result		    return dmm.readResult( in ) ;		} catch (ApplicationException ex) {		    throw dmm.readException( ex ) ;		} catch (RemarshalException ex) {		    return invoke( proxy, method, args ) ; 		} finally {		    delegate.releaseReply( stub, in );		}	    } catch (SystemException ex) {		throw Util.mapSystemException(ex) ;	    } 	} else {	    // local branch	    ORB orb = (ORB)delegate.orb( stub ) ;	    ServantObject so = delegate.servant_preinvoke( stub, giopMethodName,		method.getDeclaringClass() );	    if (so == null) {		return invoke( stub, method, args ) ; 	    }	    try {		Object[] copies = dmm.copyArguments( args, orb ) ;	        if (!method.isAccessible()) {			    // Make sure that we can invoke a method from a normally		    // inaccessible package, as this reflective class must always		    // be able to invoke a non-public method.		    AccessController.doPrivileged(new PrivilegedAction() {			public Object run() {			    method.setAccessible( true ) ;			    return null ;			} 		    } ) ;		}		Object result = method.invoke( so.servant, copies ) ;		return dmm.copyResult( result, orb ) ;	    } catch (InvocationTargetException ex) {		Throwable mex = ex.getCause() ;		// mex should never be null, as null cannot be thrown		Throwable exCopy = (Throwable)Util.copyObject(mex,orb);		if (dmm.isDeclaredException( exCopy ))		    throw exCopy ;		else		    throw Util.wrapException(exCopy);	    } catch (Throwable thr) {		if (thr instanceof ThreadDeath)		    throw (ThreadDeath)thr ;		// This is not a user thrown exception from the		// method call, so don't copy it.  This is either		// an error or a reflective invoke exception.		throw Util.wrapException( thr ) ;	    } finally {		delegate.servant_postinvoke( stub, so);	    }	}    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?