FileDocCategorySizeDatePackage
PIHandlerImpl.javaAPI DocJava SE 5 API32834Fri Aug 26 14:54:22 BST 2005com.sun.corba.se.impl.interceptors

PIHandlerImpl

public class PIHandlerImpl extends Object implements com.sun.corba.se.spi.protocol.PIHandler
Provides portable interceptor functionality.

Fields Summary
boolean
printPushPopEnabled
int
pushLevel
private com.sun.corba.se.spi.orb.ORB
orb
com.sun.corba.se.impl.logging.InterceptorsSystemException
wrapper
com.sun.corba.se.impl.logging.ORBUtilSystemException
orbutilWrapper
com.sun.corba.se.impl.logging.OMGSystemException
omgWrapper
private int
serverRequestIdCounter
org.omg.IOP.CodecFactory
codecFactory
String[]
arguments
private InterceptorList
interceptorList
private boolean
hasIORInterceptors
private boolean
hasClientInterceptors
private boolean
hasServerInterceptors
private InterceptorInvoker
interceptorInvoker
private PICurrent
current
private HashMap
policyFactoryTable
private static final short[]
REPLY_MESSAGE_TO_PI_REPLY_STATUS
private ThreadLocal
threadLocalClientRequestInfoStack
private ThreadLocal
threadLocalServerRequestInfoStack
Constructors Summary
public PIHandlerImpl(com.sun.corba.se.spi.orb.ORB orb, String[] args)

    
        
           
	this.orb = orb ;
	wrapper = InterceptorsSystemException.get( orb, 
	    CORBALogDomains.RPC_PROTOCOL ) ;
	orbutilWrapper = ORBUtilSystemException.get( orb,
	    CORBALogDomains.RPC_PROTOCOL ) ;
	omgWrapper = OMGSystemException.get( orb,
	    CORBALogDomains.RPC_PROTOCOL ) ;
	arguments = args ;

	// Create codec factory:
	codecFactory = new CodecFactoryImpl( orb );

	// Create new interceptor list:
	interceptorList = new InterceptorList( wrapper );

        // Create a new PICurrent.
        current = new PICurrent( orb );

	// Create new interceptor invoker, initially disabled:
	interceptorInvoker = new InterceptorInvoker( orb, interceptorList, 
                                                     current );

	// Register the PI current and Codec factory objects
	orb.getLocalResolver().register( ORBConstants.PI_CURRENT_NAME, 
	    ClosureFactory.makeConstant( current ) ) ;
	orb.getLocalResolver().register( ORBConstants.CODEC_FACTORY_NAME, 
	    ClosureFactory.makeConstant( codecFactory ) ) ;
    
Methods Summary
public voidadapterManagerStateChanged(int managerId, short newState)

	if (!hasIORInterceptors)
	    return ;

	interceptorInvoker.adapterManagerStateChanged( managerId, newState ) ;
    
public voidadapterStateChanged(org.omg.PortableInterceptor.ObjectReferenceTemplate[] templates, short newState)

	if (!hasIORInterceptors)
	    return ;

	interceptorInvoker.adapterStateChanged( templates, newState ) ;
    
public synchronized intallocateServerRequestId()

	return serverRequestIdCounter++;
    
public voidcleanupClientPIRequest()

	if( !hasClientInterceptors ) return;
        if( !isClientPIEnabledForThisThread() ) return;

        ClientRequestInfoImpl info = peekClientRequestInfoImplStack();
        
        // If the replyStatus has not yet been set, this is an indication
        // that the ORB threw an exception before we had a chance to
        // invoke the client interceptor ending points.
        //
        // _REVISIT_ We cannot handle any exceptions or ForwardRequests
        // flagged by the ending points here because there is no way
        // to gracefully handle this in any of the calling code.  
        // This is a rare corner case, so we will ignore this for now.
        short replyStatus = info.getReplyStatus();
        if( replyStatus == info.UNINITIALIZED ) {
	    invokeClientPIEndingPoint( ReplyMessage.SYSTEM_EXCEPTION,
		wrapper.unknownRequestInvoke( 
		    CompletionStatus.COMPLETED_MAYBE ) ) ;
        }
        
        // Decrement entry count, and if it is zero, pop it from the stack.
        info.decrementEntryCount();
        if( info.getEntryCount() == 0 ) {
	    RequestInfoStack infoStack = 
		(RequestInfoStack)threadLocalClientRequestInfoStack.get();
            infoStack.pop();
	    printPop();
        }
    
public voidcleanupServerPIRequest()

	if( !hasServerInterceptors ) return;

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalServerRequestInfoStack.get();
	infoStack.pop();
	printPop();
    
private intconvertPIReplyStatusToReplyMessage(short replyStatus)
Utility method to convert a PI reply status short to a ReplyMessage constant. This is a reverse lookup on the table defined in REPLY_MESSAGE_TO_PI_REPLY_STATUS. The reverse lookup need not be performed as quickly since it is only executed in exception conditions.

        int result = 0;
        for( int i = 0; i < REPLY_MESSAGE_TO_PI_REPLY_STATUS.length; i++ ) {
            if( REPLY_MESSAGE_TO_PI_REPLY_STATUS[i] == replyStatus ) {
                result = i;
		break;
            }
        }
        return result;
    
private ORBInitInfoImplcreateORBInitInfo()
Creates the ORBInitInfo object to be passed to ORB intializers' pre_init and post_init methods

	ORBInitInfoImpl result = null;
	
	// arguments comes from set_parameters.  May be null.

	// _REVISIT_ The spec does not specify which ID this is to be.
	// We currently get this from the corba.ORB, which reads it from
	// the ORB_ID_PROPERTY property.
	String orbId = orb.getORBData().getORBId() ;

	result = new ORBInitInfoImpl( orb, arguments, orbId, codecFactory );

	return result;
    
public org.omg.CORBA.Policycreate_policy(int type, org.omg.CORBA.Any val)
This is the implementation of standard API defined in org.omg.CORBA.ORB class. This method finds the Policy Factory for the given Policy Type and instantiates the Policy object from the Factory. It will throw PolicyError exception, If the PolicyFactory for the given type is not registered. _REVISIT_, Once Policy Framework work is completed, Reorganize this method to com.sun.corba.se.spi.orb.ORB.

        if( val == null ) {
            nullParam( );
        }
        if( policyFactoryTable == null ) {
            throw new org.omg.CORBA.PolicyError(
                "There is no PolicyFactory Registered for type " + type, 
		BAD_POLICY.value );
        }
        PolicyFactory factory = (PolicyFactory)policyFactoryTable.get(
            new Integer(type) );
        if( factory == null ) {
            throw new org.omg.CORBA.PolicyError(
                " Could Not Find PolicyFactory for the Type " + type, 
                BAD_POLICY.value);
        }
        org.omg.CORBA.Policy policy = factory.create_policy( type, val );
        return policy;
    
public voiddestroyInterceptors()
ptc/00-08-06 p 205: "When an application calls ORB::destroy, the ORB 1) waits for all requests in progress to complete 2) calls the Interceptor::destroy operation for each interceptor 3) completes destruction of the ORB" This must be called at the end of ORB.destroy. Note that this is not part of the PIHandler interface, since ORBImpl implements the ORB interface.

        interceptorList.destroyAll();
    
public voiddisableInterceptorsThisThread()

	if( !hasClientInterceptors ) return;

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalClientRequestInfoStack.get();
        infoStack.disableCount++;
    
public voidenableInterceptorsThisThread()

	if( !hasClientInterceptors ) return;

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalClientRequestInfoStack.get();
        infoStack.disableCount--;
    
public org.omg.PortableInterceptor.CurrentgetPICurrent()

        return current;
    
public voidinitialize()

	// If we have any orb initializers, make use of them:
	if( orb.getORBData().getORBInitializers() != null ) {
	    // Create the ORBInitInfo object to pass to ORB intializers:
	    ORBInitInfoImpl orbInitInfo = createORBInitInfo();

	    // Make sure get_slot and set_slot are not called from within
	    // ORB initializers:
	    current.setORBInitializing( true );

	    // Call pre_init on all ORB initializers:
	    preInitORBInitializers( orbInitInfo );

	    // Call post_init on all ORB initializers:
	    postInitORBInitializers( orbInitInfo );

	    // Proprietary: sort interceptors:
	    interceptorList.sortInterceptors();

	    // Re-enable get_slot and set_slot to be called from within
	    // ORB initializers:
	    current.setORBInitializing( false );

	    // Ensure nobody makes any more calls on this object.
            orbInitInfo.setStage( ORBInitInfoImpl.STAGE_CLOSED );

	    // Set cached flags indicating whether we have interceptors
	    // registered of a given type.
	    hasIORInterceptors = interceptorList.hasInterceptorsOfType(
		InterceptorList.INTERCEPTOR_TYPE_IOR );
	    // XXX This must always be true, so that using the new generic
	    // RPC framework can pass info between the PI stack and the
	    // framework invocation stack.  Temporary until Harold fixes 
	    // this.  Note that this must never be true until after the
	    // ORBInitializer instances complete executing.
	    //hasClientInterceptors = interceptorList.hasInterceptorsOfType(
		//InterceptorList.INTERCEPTOR_TYPE_CLIENT );
	    hasClientInterceptors = true;
	    hasServerInterceptors = interceptorList.hasInterceptorsOfType(
		InterceptorList.INTERCEPTOR_TYPE_SERVER );

	    // Enable interceptor invoker (not necessary if no interceptors 
	    // are registered).  This should be the last stage of ORB
	    // initialization.
	    interceptorInvoker.setEnabled( true );
	}
    
public voidinitializeServerPIInfo(com.sun.corba.se.spi.protocol.CorbaMessageMediator request, com.sun.corba.se.spi.oa.ObjectAdapter oa, byte[] objectId, com.sun.corba.se.spi.ior.ObjectKeyTemplate oktemp)

	if( !hasServerInterceptors ) return;

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalServerRequestInfoStack.get();
        ServerRequestInfoImpl info = new ServerRequestInfoImpl( orb );
	infoStack.push( info );
	printPush();

	// Notify request object that once response is constructed, make
	// sure we execute ending points.
        request.setExecutePIInResponseConstructor( true );

        info.setInfo( request, oa, objectId, oktemp );
    
public voidinitiateClientPIRequest(boolean diiRequest)

	if( !hasClientInterceptors ) return;
        if( !isClientPIEnabledForThisThread() ) return;

	// Get the most recent info object from the thread local 
	// ClientRequestInfoImpl stack:
	RequestInfoStack infoStack = 
	    (RequestInfoStack)threadLocalClientRequestInfoStack.get();
	ClientRequestInfoImpl info = null;
	if( !infoStack.empty() ) info = 
	    (ClientRequestInfoImpl)infoStack.peek();

	if( !diiRequest && (info != null) && info.isDIIInitiate() ) {
	    // In RequestImpl.doInvocation we already called 
	    // initiateClientPIRequest( true ), so ignore this initiate.
	    info.setDIIInitiate( false );
	}
	else {
	    // If there is no info object or if we are not retrying a request,
	    // push a new ClientRequestInfoImpl on the stack:
	    if( (info == null) || !info.getRetryRequest() ) {
		info = new ClientRequestInfoImpl( orb );
		infoStack.push( info );
		printPush();
		// Note: the entry count is automatically initialized to 0.
	    }
	    
	    // Reset the retry request flag so that recursive calls will
	    // push a new info object, and bump up entry count so we know
	    // when to pop this info object:
	    info.setRetryRequest( false );
	    info.incrementEntryCount();

	    // If this is a DII request, make sure we ignore the next initiate.
	    if( diiRequest ) {
		info.setDIIInitiate( true );
	    }
	}
    
public java.lang.ExceptioninvokeClientPIEndingPoint(int replyStatus, java.lang.Exception exception)

	if( !hasClientInterceptors ) return exception;
        if( !isClientPIEnabledForThisThread() ) return exception;

        // Translate ReplyMessage.replyStatus into PI replyStatus:
	// Note: this is also an assertion to make sure a valid replyStatus
	// is passed in (IndexOutOfBoundsException will be thrown otherwise)
        short piReplyStatus = REPLY_MESSAGE_TO_PI_REPLY_STATUS[replyStatus];
        
        // Invoke the ending interception points and record exception
        // and reply status info in the info object:
        ClientRequestInfoImpl info = peekClientRequestInfoImplStack();
        info.setReplyStatus( piReplyStatus );
        info.setException( exception );
        interceptorInvoker.invokeClientInterceptorEndingPoint( info );
	piReplyStatus = info.getReplyStatus();

        // Check reply status:
        if( (piReplyStatus == LOCATION_FORWARD.value) ||
            (piReplyStatus == TRANSPORT_RETRY.value) ) 
        {
            // If this is a forward or a retry, reset and reuse 
            // info object:
            info.reset();
            info.setRetryRequest( true );

            // ... and return a RemarshalException so the orb internals know
            exception = new RemarshalException();
        }
        else if( (piReplyStatus == SYSTEM_EXCEPTION.value) ||
                 (piReplyStatus == USER_EXCEPTION.value) ) 
	{
            exception = info.getException();
        }
        
        return exception;
    
public voidinvokeClientPIStartingPoint()

	if( !hasClientInterceptors ) return;
        if( !isClientPIEnabledForThisThread() ) return;

        // Invoke the starting interception points and record exception
        // and reply status info in the info object:
        ClientRequestInfoImpl info = peekClientRequestInfoImplStack();
        interceptorInvoker.invokeClientInterceptorStartingPoint( info );
        
        // Check reply status.  If we will not have another chance later
        // to invoke the client ending points, do it now.
        short replyStatus = info.getReplyStatus();
        if( (replyStatus == SYSTEM_EXCEPTION.value) ||
            (replyStatus == LOCATION_FORWARD.value) )
        {
	    // Note: Transport retry cannot happen here since this happens
	    // before the request hits the wire.

            Exception exception = invokeClientPIEndingPoint( 
                convertPIReplyStatusToReplyMessage( replyStatus ),
                info.getException() );
            if( exception == null ) {
                // Do not throw anything.  Otherwise, it must be a
                // SystemException, UserException or RemarshalException.
            } if( exception instanceof SystemException ) {
                throw (SystemException)exception;
            } else if( exception instanceof RemarshalException ) {
                throw (RemarshalException)exception;
            } else if( (exception instanceof UserException) ||
		     (exception instanceof ApplicationException) ) {
                // It should not be possible for an interceptor to throw 
		// a UserException.  By asserting instead of throwing the
		// UserException, we need not declare anything but 
		// RemarshalException in the throws clause.
		throw wrapper.exceptionInvalid() ;
            }
        }
	else if( replyStatus != ClientRequestInfoImpl.UNINITIALIZED ) {
	    throw wrapper.replyStatusNotInit() ;
	}
    
public voidinvokeServerPIEndingPoint(com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage replyMessage)

	if( !hasServerInterceptors ) return;
        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();

	// REVISIT: This needs to be done "early" for the following workaround.
	info.setReplyMessage( replyMessage );

	// REVISIT: This was done inside of invokeServerInterceptorEndingPoint
	// but needs to be here for now.  See comment in that method for why.
	info.setCurrentExecutionPoint( info.EXECUTION_POINT_ENDING );

        // It is possible we might have entered this method more than
        // once (e.g. if an ending point threw a SystemException, then
        // a new ServerResponseImpl is created).
        if( !info.getAlreadyExecuted() ) {
	    int replyStatus = replyMessage.getReplyStatus();

            // Translate ReplyMessage.replyStatus into PI replyStatus:
            // Note: this is also an assertion to make sure a valid 
            // replyStatus is passed in (IndexOutOfBoundsException will be 
            // thrown otherwise)
            short piReplyStatus = 
                REPLY_MESSAGE_TO_PI_REPLY_STATUS[replyStatus];

	    // Make forwarded IOR available to interceptors, if applicable:
	    if( ( piReplyStatus == LOCATION_FORWARD.value ) ||
		( piReplyStatus == TRANSPORT_RETRY.value ) ) 
	    {
		info.setForwardRequest( replyMessage.getIOR() );
	    }

	    // REVISIT: Do early above for now.
	    // Make reply message available to interceptors:
	    //info.setReplyMessage( replyMessage );

            // Remember exception so we can tell if an interceptor changed it.
            Exception prevException = info.getException();

	    // _REVISIT_ We do not have access to the User Exception at
	    // this point, so treat it as an UNKNOWN for now.
	    // Note that if this is a DSI call, we do have the user exception.
	    if( !info.isDynamic() && 
		(piReplyStatus == USER_EXCEPTION.value) ) 
	    {
		info.setException( omgWrapper.unknownUserException( 
		    CompletionStatus.COMPLETED_MAYBE ) ) ;
	    }
            
            // Invoke the ending interception points:
            info.setReplyStatus( piReplyStatus );
            interceptorInvoker.invokeServerInterceptorEndingPoint( info );
            short newPIReplyStatus = info.getReplyStatus();
            Exception newException = info.getException();
            
            // Check reply status.  If an interceptor threw a SystemException
            // and it is different than the one that we came in with,
            // rethrow it so the proper response can be constructed:
            if( ( newPIReplyStatus == SYSTEM_EXCEPTION.value ) &&
                ( newException != prevException ) ) 
            {
                throw (SystemException)newException;
            }

	    // If we are to forward the location:
	    if( newPIReplyStatus == LOCATION_FORWARD.value ) {
	        if( piReplyStatus != LOCATION_FORWARD.value ) {
	            // Treat a ForwardRequest as a ForwardException.
                    IOR ior = info.getForwardRequestIOR();
		    throw new ForwardException( orb, ior ) ;
		}
		else if( info.isForwardRequestRaisedInEnding() ) {
	            // Treat a ForwardRequest by changing the IOR.
                    replyMessage.setIOR( info.getForwardRequestIOR() );
		}
	    }
        }
    
public voidinvokeServerPIIntermediatePoint()

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        interceptorInvoker.invokeServerInterceptorIntermediatePoint( info );
        
        // Clear servant from info object so that the user has control over
        // its lifetime:
        info.releaseServant();

	// Handle SystemException or ForwardRequest:
	serverPIHandleExceptions( info );
    
public voidinvokeServerPIStartingPoint()

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        interceptorInvoker.invokeServerInterceptorStartingPoint( info );

	// Handle SystemException or ForwardRequest:
	serverPIHandleExceptions( info );
    
private booleanisClientPIEnabledForThisThread()
Convenience method to determine whether Client PI is enabled for requests on this thread.

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalClientRequestInfoStack.get();
        return (infoStack.disableCount == 0);
    
private voidnullParam()
Called when an invalid null parameter was passed. Throws a BAD_PARAM with a minor code of 1

	throw orbutilWrapper.nullParam() ;
    
public voidobjectAdapterCreated(com.sun.corba.se.spi.oa.ObjectAdapter oa)

	if (!hasIORInterceptors)
	    return ;

	interceptorInvoker.objectAdapterCreated( oa ) ;
    
private ClientRequestInfoImplpeekClientRequestInfoImplStack()
Convenience method to get the ClientRequestInfoImpl object off the top of the ThreadLocal stack. Throws an INTERNAL exception if the Info stack is empty.

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalClientRequestInfoStack.get();
        ClientRequestInfoImpl info = null;
        if( !infoStack.empty() ) {
	    info = (ClientRequestInfoImpl)infoStack.peek();
	} else {
	    throw wrapper.clientInfoStackNull() ;
	}
        
        return info;
    
private ServerRequestInfoImplpeekServerRequestInfoImplStack()
Convenience method to get the ServerRequestInfoImpl object off the top of the ThreadLocal stack. Returns null if there are none.

        RequestInfoStack infoStack = 
            (RequestInfoStack)threadLocalServerRequestInfoStack.get();
        ServerRequestInfoImpl info = null;

        if( !infoStack.empty() ) {
            info = (ServerRequestInfoImpl)infoStack.peek();
        } else {
	    throw wrapper.serverInfoStackNull() ;
        }

        return info;
    
private voidpostInitORBInitializers(ORBInitInfoImpl info)
Call post_init on all ORB initializers


	// Inform ORBInitInfo we are in post_init stage
        info.setStage( ORBInitInfoImpl.STAGE_POST_INIT );

	// Step through each initializer instantiation and call its post_init.
	// Ignore any exceptions.
	for( int i = 0; i < orb.getORBData().getORBInitializers().length; 
	    i++ ) {
	    ORBInitializer init = orb.getORBData().getORBInitializers()[i];
	    if( init != null ) {
		try {
		    init.post_init( info );
		}
		catch( Exception e ) {
		    // As per orbos/99-12-02, section 9.3.1.2, "If there are 
		    // any exceptions, the ORB shall ignore them and proceed."
		}
	    }
	}
    
private voidpreInitORBInitializers(ORBInitInfoImpl info)
Call pre_init on all ORB initializers


	// Inform ORBInitInfo we are in pre_init stage
        info.setStage( ORBInitInfoImpl.STAGE_PRE_INIT );

	// Step through each initializer instantiation and call its 
	// pre_init.  Ignore any exceptions.
	for( int i = 0; i < orb.getORBData().getORBInitializers().length; 
	    i++ ) {
	    ORBInitializer init = orb.getORBData().getORBInitializers()[i];
	    if( init != null ) {
		try {
		    init.pre_init( info );
		}
		catch( Exception e ) {
		    // As per orbos/99-12-02, section 9.3.1.2, "If there are 
		    // any exceptions, the ORB shall ignore them and proceed."
		}
	    }
	}
    
private voidprintPop()

	if (! printPushPopEnabled) return;
	pushLevel--;
	printSpaces(pushLevel);
	System.out.println("POP");
    
private voidprintPush()

      
    
	if (! printPushPopEnabled) return;
	printSpaces(pushLevel);
	pushLevel++;
	System.out.println("PUSH");
    
private voidprintSpaces(int n)

	for (int i = 0; i < n; i++) {
	    System.out.print(" ");
	}
    
public voidregisterPolicyFactory(int type, org.omg.PortableInterceptor.PolicyFactory factory)
This method registers the Policy Factory in the policyFactoryTable, which is a HashMap. This method is made package private, because it is used internally by the Interceptors.

        if( policyFactoryTable == null ) {
            policyFactoryTable = new HashMap();
        }
        Integer key = new Integer( type );
        java.lang.Object val = policyFactoryTable.get( key );
        if( val == null ) {
            policyFactoryTable.put( key, factory );
        }
        else {
	    throw omgWrapper.policyFactoryRegFailed( new Integer( type ) ) ;
        }
    
public voidregister_interceptor(org.omg.PortableInterceptor.Interceptor interceptor, int type)
Called by ORBInitInfo when an interceptor needs to be registered. The type is one of:
  • INTERCEPTOR_TYPE_CLIENT - ClientRequestInterceptor
  • INTERCEPTOR_TYPE_SERVER - ServerRequestInterceptor
  • INTERCEPTOR_TYPE_IOR - IORInterceptor

exception
DuplicateName Thrown if an interceptor of the given name already exists for the given type.

	// We will assume interceptor is not null, since it is called
	// internally.
	if( (type >= InterceptorList.NUM_INTERCEPTOR_TYPES) || (type < 0) ) {
	    throw wrapper.typeOutOfRange( new Integer( type ) ) ;
	}

        String interceptorName = interceptor.name();

        if( interceptorName == null ) {
	    throw wrapper.nameNull() ;
        }

	// Register with interceptor list:
	interceptorList.register_interceptor( interceptor, type );
    
private voidserverPIHandleExceptions(ServerRequestInfoImpl info)
Handles exceptions for the starting and intermediate points for server request interceptors. This is common code that has been factored out into this utility method.

This method will NOT work for ending points.

        int endingPointCall = info.getEndingPointCall();
        if(endingPointCall == ServerRequestInfoImpl.CALL_SEND_EXCEPTION) {
            // If a system exception was thrown, throw it to caller:
            throw (SystemException)info.getException();
        }
        else if( (endingPointCall == ServerRequestInfoImpl.CALL_SEND_OTHER) &&
                 (info.getForwardRequestException() != null) )
        {
            // If an interceptor throws a forward request, convert it
            // into a ForwardException for easier handling:
            IOR ior = info.getForwardRequestIOR();
	    throw new ForwardException( orb, ior );
        }
    
public voidsetClientPIInfo(com.sun.corba.se.spi.protocol.CorbaMessageMediator messageMediator)

	if( !hasClientInterceptors ) return;
        if( !isClientPIEnabledForThisThread() ) return;
        
        peekClientRequestInfoImplStack().setInfo(messageMediator);
    
public voidsetClientPIInfo(com.sun.corba.se.impl.corba.RequestImpl requestImpl)

	if( !hasClientInterceptors ) return;
        if( !isClientPIEnabledForThisThread() ) return;
        
        peekClientRequestInfoImplStack().setDIIRequest( requestImpl );
    
public voidsetServerPIExceptionInfo(org.omg.CORBA.Any exception)

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        info.setDSIException( exception );
    
public voidsetServerPIInfo(java.lang.Exception exception)

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        info.setException( exception );
    
public voidsetServerPIInfo(org.omg.CORBA.NVList arguments)

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        info.setDSIArguments( arguments );
    
public voidsetServerPIInfo(org.omg.CORBA.Any result)

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        info.setDSIResult( result );
    
public voidsetServerPIInfo(java.lang.Object servant, java.lang.String targetMostDerivedInterface)

	if( !hasServerInterceptors ) return;

        ServerRequestInfoImpl info = peekServerRequestInfoImplStack();
        info.setInfo( servant, targetMostDerivedInterface );