Class PIHandlerImpl

  • All Implemented Interfaces:
    PIHandler, java.io.Closeable, java.lang.AutoCloseable

    public class PIHandlerImpl
    extends java.lang.Object
    implements PIHandler
    Provides portable interceptor functionality.
    • Constructor Detail

      • PIHandlerImpl

        public PIHandlerImpl​(ORB orb,
                             java.lang.String[] args)
    • Method Detail

      • getReplyStatus

        static java.lang.String getReplyStatus​(int piReplyStatus)
      • close

        public void close()
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
      • initialize

        public void initialize()
        Description copied from interface: PIHandler
        Complete the initialization of the PIHandler. This will execute the methods on the ORBInitializers, if any are defined. This must be done here so that the ORB can obtain the PIHandler BEFORE the ORBInitializers run, since they will need access to the PIHandler through the ORB.
        Specified by:
        initialize in interface PIHandler
      • destroyInterceptors

        public void destroyInterceptors()
        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.
        Specified by:
        destroyInterceptors in interface PIHandler
      • objectAdapterCreated

        public void objectAdapterCreated​(ObjectAdapter oa)
        Description copied from interface: PIHandler
        Called when a new object adapter is created.
        Specified by:
        objectAdapterCreated in interface PIHandler
        Parameters:
        oa - The adapter associated with the interceptors to be invoked.
      • adapterManagerStateChanged

        public void adapterManagerStateChanged​(int managerId,
                                               short newState)
        Description copied from interface: PIHandler
        Called whenever a state change occurs in an adapter manager.
        Specified by:
        adapterManagerStateChanged in interface PIHandler
        Parameters:
        managerId - managerId The adapter manager id
        newState - newState The new state of the adapter manager, and by implication of all object adapters managed by this manager.
      • adapterStateChanged

        public void adapterStateChanged​(ObjectReferenceTemplate[] templates,
                                        short newState)
        Description copied from interface: PIHandler
        Called whenever a state change occurs in an object adapter that was not caused by an adapter manager state change.
        Specified by:
        adapterStateChanged in interface PIHandler
        Parameters:
        templates - The templates that are changing state.
        newState - The new state of the adapters identified by the templates.
      • disableInterceptorsThisThread

        public void disableInterceptorsThisThread()
        Description copied from interface: PIHandler
        Called for pseudo-ops to temporarily disable portable interceptor hooks for calls on this thread. Keeps track of the number of times this is called and increments the disabledCount.
        Specified by:
        disableInterceptorsThisThread in interface PIHandler
      • enableInterceptorsThisThread

        public void enableInterceptorsThisThread()
        Description copied from interface: PIHandler
        Called for pseudo-ops to re-enable portable interceptor hooks for calls on this thread. Decrements the disabledCount. If disabledCount is 0, interceptors are re-enabled.
        Specified by:
        enableInterceptorsThisThread in interface PIHandler
      • invokeClientPIStartingPoint

        public void invokeClientPIStartingPoint()
                                         throws RemarshalException
        Description copied from interface: PIHandler
        Called when the send_request or send_poll portable interception point is to be invoked for all appropriate client-side request interceptors.
        Specified by:
        invokeClientPIStartingPoint in interface PIHandler
        Throws:
        RemarshalException - - Thrown when this request needs to be retried.
      • makeCompletedClientRequest

        public java.lang.Exception makeCompletedClientRequest​(int replyStatus,
                                                              java.lang.Exception exception)
        Description copied from interface: PIHandler
        Called when a retry is needed after initiateClientPIRequest but before invokeClientPIRequest. In this case, we need to properly balance initiateClientPIRequest/cleanupClientPIRequest calls, but WITHOUT extraneous calls to invokeClientPIEndingPoint (see bug 6763340).
        Specified by:
        makeCompletedClientRequest in interface PIHandler
        Parameters:
        replyStatus - One of the constants in iiop.messages.ReplyMessage indicating which reply status to set.
        exception - The exception before ending interception points have been invoked, or null if no exception at the moment.
        Returns:
        The exception to be thrown, after having gone through all ending points, or null if there is no exception to be thrown. Note that this exception can be either the same or different from the exception set using setClientPIException. There are four possible return types: null (no exception), SystemException, UserException, or RemarshalException.
      • invokeClientPIEndingPoint

        public java.lang.Exception invokeClientPIEndingPoint​(int replyStatus,
                                                             java.lang.Exception exception)
        Description copied from interface: PIHandler
        Called when the appropriate client ending interception point is to be invoked for all apporpriate client-side request interceptors.
        Specified by:
        invokeClientPIEndingPoint in interface PIHandler
        Parameters:
        replyStatus - One of the constants in iiop.messages.ReplyMessage indicating which reply status to set.
        exception - The exception before ending interception points have been invoked, or null if no exception at the moment.
        Returns:
        The exception to be thrown, after having gone through all ending points, or null if there is no exception to be thrown. Note that this exception can be either the same or different from the exception set using setClientPIException. There are four possible return types: null (no exception), SystemException, UserException, or RemarshalException.
      • handleClientPIEndingPoint

        public java.lang.Exception handleClientPIEndingPoint​(int replyStatus,
                                                             java.lang.Exception exception,
                                                             boolean invokeEndingPoint)
      • secondCallForADIIRequest

        @InfoMethod
        private void secondCallForADIIRequest()
      • normalCall

        @InfoMethod
        private void normalCall()
      • clientInfoStackWasPushed

        @InfoMethod
        private void clientInfoStackWasPushed()
      • initiateClientPIRequest

        public void initiateClientPIRequest​(boolean diiRequest)
        Description copied from interface: PIHandler
        Invoked when a request is about to be created. Must be called before any of the setClientPI* methods so that a new info object can be prepared for information collection.
        Specified by:
        initiateClientPIRequest in interface PIHandler
        Parameters:
        diiRequest - True if this is to be a DII request, or false if it is a "normal" request. In the DII case, initiateClientPIRequest is called twice and we need to ignore the second one.
      • clientInfoStackWasPopped

        @InfoMethod
        private void clientInfoStackWasPopped()
      • cleanupClientPIRequest

        public void cleanupClientPIRequest()
        Description copied from interface: PIHandler
        Invoked when a request is about to be cleaned up. Must be called after ending points are called so that the info object on the stack can be deinitialized and popped from the stack at the appropriate time.
        Specified by:
        cleanupClientPIRequest in interface PIHandler
      • setClientPIInfo

        public void setClientPIInfo​(MessageMediator messageMediator)
        Description copied from interface: PIHandler
        Notify PI of the MessageMediator for the request.
        Specified by:
        setClientPIInfo in interface PIHandler
        Parameters:
        messageMediator - Mediator to notify
      • setClientPIInfo

        public void setClientPIInfo​(RequestImpl requestImpl)
        Description copied from interface: PIHandler
        Notifies PI of additional information for client-side interceptors. PI will use this information as a source of information for the ClientRequestInfo object.
        Specified by:
        setClientPIInfo in interface PIHandler
        Parameters:
        requestImpl - request used as source of information
      • invokeServerPIStartingPoint

        public void invokeServerPIStartingPoint()
        Description copied from interface: PIHandler
        Called when the appropriate server starting interception point is to be invoked for all appropriate server-side request interceptors.
        Specified by:
        invokeServerPIStartingPoint in interface PIHandler
      • invokeServerPIIntermediatePoint

        public void invokeServerPIIntermediatePoint()
        Description copied from interface: PIHandler
        Called when the appropriate server intermediate interception point is to be invoked for all appropriate server-side request interceptors.
        Specified by:
        invokeServerPIIntermediatePoint in interface PIHandler
      • invokeServerPIEndingPoint

        public void invokeServerPIEndingPoint​(ReplyMessage replyMessage)
        Description copied from interface: PIHandler
        Called when the appropriate server ending interception point is to be invoked for all appropriate server-side request interceptors.
        Specified by:
        invokeServerPIEndingPoint in interface PIHandler
        Parameters:
        replyMessage - The iiop.messages.ReplyMessage containing the reply status.
      • setServerPIInfo

        public void setServerPIInfo​(java.lang.Exception exception)
        Description copied from interface: PIHandler
        Notifies PI of additional information required for ServerRequestInfo.
        Specified by:
        setServerPIInfo in interface PIHandler
        Parameters:
        exception - the exception that will be returned
      • setServerPIInfo

        public void setServerPIInfo​(NVList arguments)
        Description copied from interface: PIHandler
        Notifies PI of additional information for server-side interceptors. PI will use this information as a source of information for the ServerRequestInfo object. These are the arguments for a DSI request.
        Specified by:
        setServerPIInfo in interface PIHandler
        Parameters:
        arguments - Arguments for a DSI request.
      • setServerPIExceptionInfo

        public void setServerPIExceptionInfo​(Any exception)
        Description copied from interface: PIHandler
        Notifies PI of additional information for server-side interceptors. PI will use this information as a source of information for the ServerRequestInfo object. This is the exception of a DSI request.
        Specified by:
        setServerPIExceptionInfo in interface PIHandler
        Parameters:
        exception - Exception of a DSI request
      • setServerPIInfo

        public void setServerPIInfo​(Any result)
        Description copied from interface: PIHandler
        Notifies PI of additional information for server-side interceptors. PI will use this information as a source of information for the ServerRequestInfo object. This is the result of a DSI request.
        Specified by:
        setServerPIInfo in interface PIHandler
        Parameters:
        result - Result of a DSI request
      • serverInfoStackWasPushed

        @InfoMethod
        private void serverInfoStackWasPushed()
      • serverInfoStackWasPopped

        @InfoMethod
        private void serverInfoStackWasPopped()
      • initializeServerPIInfo

        public void initializeServerPIInfo​(MessageMediator request,
                                           ObjectAdapter oa,
                                           byte[] objectId,
                                           ObjectKeyTemplate oktemp)
        Description copied from interface: PIHandler
        Notifies PI to start a new server request and set initial information for server-side interceptors. PI will use this information as a source of information for the ServerRequestInfo object. poaimpl is declared as an Object so that we need not introduce a dependency on the POA package.
        Specified by:
        initializeServerPIInfo in interface PIHandler
        Parameters:
        request - Request holder, included the Connection
        oa - Object Adapter
        objectId - id of object
        oktemp - template for object
      • setServerPIInfo

        public void setServerPIInfo​(java.lang.Object servant,
                                    java.lang.String targetMostDerivedInterface)
        Description copied from interface: PIHandler
        Notifies PI of additional information reqired for ServerRequestInfo.
        Specified by:
        setServerPIInfo in interface PIHandler
        Parameters:
        servant - The servant. This is java.lang.Object because in the POA case, this will be a org.omg.PortableServer.Servant whereas in the ServerRequestDispatcher case this will be an ObjectImpl.
        targetMostDerivedInterface - The most derived interface. This is passed in instead of calculated when needed because it requires extra information in the POA case that we didn't want to bother creating extra methods for to pass in.
      • cleanupServerPIRequest

        public void cleanupServerPIRequest()
        Description copied from interface: PIHandler
        Invoked when a request is about to be cleaned up. Must be called after ending points are called so that the info object on the stack can be deinitialized and popped from the stack at the appropriate time.
        Specified by:
        cleanupServerPIRequest in interface PIHandler
      • serverPIHandleExceptions

        private void serverPIHandleExceptions​(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.

      • convertPIReplyStatusToReplyMessage

        private int convertPIReplyStatusToReplyMessage​(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.
      • peekClientRequestInfoImplStack

        private ClientRequestInfoImpl peekClientRequestInfoImplStack()
        Convenience method to get the ClientRequestInfoImpl object off the top of the ThreadLocal stack. Throws an INTERNAL exception if the Info stack is empty.
      • peekServerRequestInfoImplStack

        private ServerRequestInfoImpl peekServerRequestInfoImplStack()
        Convenience method to get the ServerRequestInfoImpl object off the top of the ThreadLocal stack. Returns null if there are none.
      • isClientPIEnabledForThisThread

        private boolean isClientPIEnabledForThisThread()
        Convenience method to determine whether Client PI is enabled for requests on this thread.
      • preInitORBInitializers

        private void preInitORBInitializers​(ORBInitInfoImpl info)
        Call pre_init on all ORB initializers
      • postInitORBInitializers

        private void postInitORBInitializers​(ORBInitInfoImpl info)
        Call post_init on all ORB initializers
      • createORBInitInfo

        private ORBInitInfoImpl createORBInitInfo()
        Creates the ORBInitInfo object to be passed to ORB intializers' pre_init and post_init methods
      • register_interceptor

        public void register_interceptor​(Interceptor interceptor,
                                         int type)
                                  throws DuplicateName
        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
        Specified by:
        register_interceptor in interface PIHandler
        Throws:
        DuplicateName - Thrown if an interceptor of the given name already exists for the given type.
      • nullParam

        private void nullParam()
                        throws BAD_PARAM
        Called when an invalid null parameter was passed. Throws a BAD_PARAM with a minor code of 1
        Throws:
        BAD_PARAM
      • create_policy

        public Policy create_policy​(int type,
                                    Any val)
                             throws PolicyError
        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.ee.spi.orb.ORB.
        Specified by:
        create_policy in interface PIHandler
        Throws:
        PolicyError
      • registerPolicyFactory

        public void registerPolicyFactory​(int type,
                                          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.
        Specified by:
        registerPolicyFactory in interface PIHandler