alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (ServerRequestInfoImpl.java)

This example Java source code file (ServerRequestInfoImpl.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

addreplyservicecontextcommand, any, arraylist, call_receive_request, call_receive_request_service_context, call_send_exception, call_send_other, call_send_reply, corba, corbamessagemediator, execution_point_ending, hashmap, mid_ri_last, mid_sending_exception, string, util

The ServerRequestInfoImpl.java Java example source code

/*
 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.sun.corba.se.impl.interceptors;

import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_INV_ORDER;
import org.omg.CORBA.CompletionStatus;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.NO_IMPLEMENT;
import org.omg.CORBA.NO_RESOURCES;
import org.omg.CORBA.NVList;
import org.omg.CORBA.Object;
import org.omg.CORBA.Policy;
import org.omg.CORBA.TypeCode;

import org.omg.PortableServer.Servant;

import org.omg.IOP.TaggedProfile;
import org.omg.IOP.ServiceContext;

import org.omg.Dynamic.Parameter;

import org.omg.PortableInterceptor.InvalidSlot;
import org.omg.PortableInterceptor.ServerRequestInfo;
import org.omg.PortableInterceptor.LOCATION_FORWARD;
import org.omg.PortableInterceptor.SUCCESSFUL;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import org.omg.PortableInterceptor.TRANSPORT_RETRY;
import org.omg.PortableInterceptor.USER_EXCEPTION;

import com.sun.corba.se.spi.oa.ObjectAdapter;
import com.sun.corba.se.spi.presentation.rmi.StubAdapter;

import com.sun.corba.se.impl.protocol.giopmsgheaders.ReplyMessage;

import com.sun.corba.se.spi.servicecontext.ServiceContexts;
import com.sun.corba.se.spi.orb.ORB;

import com.sun.corba.se.spi.ior.ObjectKeyTemplate;
import com.sun.corba.se.spi.ior.ObjectAdapterId ;

import com.sun.corba.se.spi.protocol.CorbaMessageMediator;

import java.util.*;

/**
 * Implementation of the ServerRequestInfo interface as specified in
 * orbos/99-12-02 section 5.4.3.
 */
public final class ServerRequestInfoImpl
    extends RequestInfoImpl
    implements ServerRequestInfo
{
    // The available constants for startingPointCall
    static final int CALL_RECEIVE_REQUEST_SERVICE_CONTEXT = 0;

    // The available constants for intermediatePointCall.  The default (0)
    // is receive_request, but can be set to none on demand.
    static final int CALL_RECEIVE_REQUEST = 0;
    static final int CALL_INTERMEDIATE_NONE = 1;

    // The available constants for endingPointCall
    static final int CALL_SEND_REPLY = 0;
    static final int CALL_SEND_EXCEPTION = 1;
    static final int CALL_SEND_OTHER = 2;

    //////////////////////////////////////////////////////////////////////
    //
    // NOTE: IF AN ATTRIBUTE IS ADDED, PLEASE UPDATE RESET();
    //
    //////////////////////////////////////////////////////////////////////

    // Set to true if the server ending point raised ForwardRequest at some
    // point in the ending point.
    private boolean forwardRequestRaisedInEnding;

    // Sources of server request information:
    private CorbaMessageMediator request;
    private java.lang.Object servant;
    private byte[] objectId;
    private ObjectKeyTemplate oktemp ;

    // Information cached from calls to oktemp
    private byte[] adapterId;
    private String[] adapterName;

    private ArrayList addReplyServiceContextQueue;
    private ReplyMessage replyMessage;
    private String targetMostDerivedInterface;
    private NVList dsiArguments;
    private Any dsiResult;
    private Any dsiException;
    private boolean isDynamic;
    private ObjectAdapter objectAdapter;
    private int serverRequestId;

    // Cached information:
    private Parameter[] cachedArguments;
    private Any cachedSendingException;
    // key = Integer, value = IOP.ServiceContext.
    private HashMap cachedRequestServiceContexts;
    // key = Integer, value = IOP.ServiceContext.
    private HashMap cachedReplyServiceContexts;

    //////////////////////////////////////////////////////////////////////
    //
    // NOTE: IF AN ATTRIBUTE IS ADDED, PLEASE UPDATE RESET();
    //
    //////////////////////////////////////////////////////////////////////


    /**
     * Reset the info object so that it can be reused for a retry,
     * for example.
     */
    void reset() {
        super.reset();

        // Please keep these in the same order as declared above.

        forwardRequestRaisedInEnding = false;

        request = null;
        servant = null;
        objectId = null;
        oktemp = null;

        adapterId = null;
        adapterName = null;

        addReplyServiceContextQueue = null;
        replyMessage = null;
        targetMostDerivedInterface = null;
        dsiArguments = null;
        dsiResult = null;
        dsiException = null;
        isDynamic = false;
        objectAdapter = null;
        serverRequestId = myORB.getPIHandler().allocateServerRequestId();

        // reset cached attributes:
        cachedArguments = null;
        cachedSendingException = null;
        cachedRequestServiceContexts = null;
        cachedReplyServiceContexts = null;

        startingPointCall = CALL_RECEIVE_REQUEST_SERVICE_CONTEXT;
        intermediatePointCall = CALL_RECEIVE_REQUEST;
        endingPointCall = CALL_SEND_REPLY;
    }

    /*
     **********************************************************************
     * Access protection
     **********************************************************************/

    // Method IDs for all methods in ServerRequestInfo.  This allows for a
    // convenient O(1) lookup for checkAccess().
    protected static final int MID_SENDING_EXCEPTION       = MID_RI_LAST +  1;
    protected static final int MID_OBJECT_ID               = MID_RI_LAST +  2;
    protected static final int MID_ADAPTER_ID              = MID_RI_LAST +  3;
    protected static final int MID_TARGET_MOST_DERIVED_INTERFACE
                                                           = MID_RI_LAST +  4;
    protected static final int MID_GET_SERVER_POLICY       = MID_RI_LAST +  5;
    protected static final int MID_SET_SLOT                = MID_RI_LAST +  6;
    protected static final int MID_TARGET_IS_A             = MID_RI_LAST +  7;
    protected static final int MID_ADD_REPLY_SERVICE_CONTEXT
                                                           = MID_RI_LAST +  8;
    protected static final int MID_SERVER_ID               = MID_RI_LAST +  9;
    protected static final int MID_ORB_ID                  = MID_RI_LAST +  10;
    protected static final int MID_ADAPTER_NAME            = MID_RI_LAST +  11;

    // ServerRequestInfo validity table (see ptc/00-08-06 table 21-2).
    // Note: These must be in the same order as specified in contants.
    private static final boolean validCall[][] = {
        // LEGEND:
        // r_rsc = receive_request_service_contexts
        // r_req = receive_request
        // s_rep = send_reply
        // s_exc = send_exception
        // s_oth = send_other
        //
        // A true value indicates call is valid at specified point.
        // A false value indicates the call is invalid.
        //
        // NOTE: If the order or number of columns change, update
        // checkAccess() accordingly.
        //
        //                              { r_rsc, r_req, s_rep, s_exc, s_oth }
        // RequestInfo methods:
        /*request_id*/                  { true , true , true , true , true  },
        /*operation*/                   { true , true , true , true , true  },
        /*arguments*/                   { false, true , true , false, false },
        /*exceptions*/                  { false, true , true , true , true  },
        /*contexts*/                    { false, true , true , true , true  },
        /*operation_context*/           { false, true , true , false, false },
        /*result*/                      { false, false, true , false, false },
        /*response_expected*/           { true , true , true , true , true  },
        /*sync_scope*/                  { true , true , true , true , true  },
        /*reply_status*/                { false, false, true , true , true  },
        /*forward_reference*/           { false, false, false, false, true  },
        /*get_slot*/                    { true , true , true , true , true  },
        /*get_request_service_context*/ { true , true , true , true , true  },
        /*get_reply_service_context*/   { false, false, true , true , true  },
        //
        // ServerRequestInfo methods::
        /*sending_exception*/           { false, false, false, true , false },
        /*object_id*/                   { false, true , true , true , true  },
        /*adapter_id*/                  { false, true , true , true , true  },
        /*target_most_derived_inte...*/ { false, true , false, false, false },
        /*get_server_policy*/           { true , true , true , true , true  },
        /*set_slot*/                    { true , true , true , true , true  },
        /*target_is_a*/                 { false, true , false, false, false },
        /*add_reply_service_context*/   { true , true , true , true , true  },
        /*orb_id*/                      { false, true , true , true , true  },
        /*server_id*/                   { false, true , true , true , true  },
        /*adapter_name*/                { false, true , true , true , true  }
    };

    /*
     **********************************************************************
     * Public interfaces
     **********************************************************************/

    /**
     * Creates a new ServerRequestInfo implementation.
     * The constructor is package scope since no other package need create
     * an instance of this class.
     */
    ServerRequestInfoImpl( ORB myORB ) {
        super( myORB );
        startingPointCall = CALL_RECEIVE_REQUEST_SERVICE_CONTEXT;
        intermediatePointCall = CALL_RECEIVE_REQUEST;
        endingPointCall = CALL_SEND_REPLY;
        serverRequestId = myORB.getPIHandler().allocateServerRequestId();
    }

    /**
     * Any containing the exception to be returned to the client.
     */
    public Any sending_exception () {
        checkAccess( MID_SENDING_EXCEPTION );

        if( cachedSendingException == null ) {
            Any result = null ;

            if( dsiException != null ) {
                result = dsiException;
            } else if( exception != null ) {
                result = exceptionToAny( exception );
            } else {
                // sending_exception should not be callable if both dsiException
                // and exception are null.
                throw wrapper.exceptionUnavailable() ;
            }

            cachedSendingException = result;
        }

        return cachedSendingException;
    }

    /**
     * The opaque object_id describing the target of the operation invocation.
     */
    public byte[] object_id () {
        checkAccess( MID_OBJECT_ID );

        if( objectId == null ) {
            // For some reason, we never set object id.  This could be
            // because a servant locator caused a location forward or
            // raised an exception.  As per ptc/00-08-06, section 21.3.14,
            // we throw NO_RESOURCES
            throw stdWrapper.piOperationNotSupported6() ;
        }

        // Good citizen: In the interest of efficiency, we will assume
        // interceptors will not change the resulting byte[] array.
        // Otherwise, we would need to make a clone of this array.

        return objectId;
    }

    private void checkForNullTemplate()
    {
        if (oktemp == null) {
            // For some reason, we never set the ObjectKeyTemplate
            // because a servant locator caused a location forward or
            // raised an exception.  As per ptc/00-08-06, section 21.3.14,
            // we throw NO_RESOURCES
            throw stdWrapper.piOperationNotSupported7() ;
        }
    }

    public String server_id()
    {
        checkAccess( MID_SERVER_ID ) ;
        checkForNullTemplate() ;

        // Good citizen: In the interest of efficiency, we will assume
        // interceptors will not change the resulting byte[] array.
        // Otherwise, we would need to make a clone of this array.

        return Integer.toString( oktemp.getServerId() ) ;
    }

    public String orb_id()
    {
        checkAccess( MID_ORB_ID ) ;

        return myORB.getORBData().getORBId() ;
    }

    synchronized public String[] adapter_name()
    {
        checkAccess( MID_ADAPTER_NAME ) ;

        if (adapterName == null) {
            checkForNullTemplate() ;

            ObjectAdapterId oaid = oktemp.getObjectAdapterId() ;
            adapterName = oaid.getAdapterName() ;
        }

        return adapterName ;
    }

    /**
     * The opaque identifier for the object adapter.
     */
    synchronized public byte[] adapter_id ()
    {
        checkAccess( MID_ADAPTER_ID );

        if( adapterId == null ) {
            checkForNullTemplate() ;
            adapterId = oktemp.getAdapterId() ;
        }

        return adapterId;
    }

    /**
     * The RepositoryID for the most derived interface of the servant.
     */
    public String target_most_derived_interface () {
        checkAccess( MID_TARGET_MOST_DERIVED_INTERFACE );
        return targetMostDerivedInterface;
    }

    /**
     * Returns the policy in effect for this operation for the given policy
     * type.
     */
    public Policy get_server_policy (int type) {
        // access is currently valid for all states:
        //checkAccess( MID_GET_SERVER_POLICY );

        Policy result = null;

        if( objectAdapter != null ) {
            result = objectAdapter.getEffectivePolicy( type );
        }

        // _REVISIT_ RTF Issue: get_server_policy spec not in sync with
        // get_effective_policy spec.

        return result;
    }

    /**
     * Allows an Interceptor to set a slot in the Current that is in the scope
     * of the request.  If data already exists in that slot, it will be
     * overwritten.  If the ID does not define an allocated slot, InvalidSlot
     * is raised.
     */
    public void set_slot (int id, Any data) throws InvalidSlot {
        // access is currently valid for all states:
        //checkAccess( MID_SET_SLOT );

        slotTable.set_slot( id, data );
    }

    /**
     * Returns true if the servant is the given RepositoryId, false if it is
     * not.
     */
    public boolean target_is_a (String id) {
        checkAccess( MID_TARGET_IS_A );

        boolean result = false ;
        if( servant instanceof Servant ) {
            result = ((Servant)servant)._is_a( id );
        } else if (StubAdapter.isStub( servant )) {
            result = ((org.omg.CORBA.Object)servant)._is_a( id );
        } else {
            throw wrapper.servantInvalid() ;
        }

        return result;
    }

    /**
     * Allows Interceptors to add service contexts to the request.
     */
    public void add_reply_service_context ( ServiceContext service_context,
                                            boolean replace )
    {
        // access is currently valid for all states:
        //checkAccess( MID_ADD_REPLY_SERVICE_CONTEXT );

        if( currentExecutionPoint == EXECUTION_POINT_ENDING ) {
            ServiceContexts scs = replyMessage.getServiceContexts();

            // May be null.  If this is null, create a new one in its place.
            if( scs == null ) {
                scs = new ServiceContexts( myORB );
                replyMessage.setServiceContexts( scs );
            }

            if( cachedReplyServiceContexts == null ) {
                cachedReplyServiceContexts = new HashMap();
            }

            // This is during and ending point, so we now have enough
            // information to add the reply service context.
            addServiceContext( cachedReplyServiceContexts, scs,
                               service_context, replace );
        }

        // We enqueue all adds for the following reasons:
        //
        // If we are not in the ending point then we do not yet have a
        // pointer to the ServiceContexts object so we cannot access the
        // service contexts until we get to the ending point.
        // So we enqueue this add reply service context request.
        // It is added when we do have a handle on the service contexts object.
        //
        // If we are in the ending point and we just add directly to the
        // SC container but then an interceptor raises a SystemException
        // then that add will be lost since a new container is created
        // for the SystemException response.
        //
        // Therefore we always enqueue and never dequeue (per request) so
        // that all adds will be completed.

        AddReplyServiceContextCommand addReply =
            new AddReplyServiceContextCommand();
        addReply.service_context = service_context;
        addReply.replace = replace;

        if( addReplyServiceContextQueue == null ) {
            addReplyServiceContextQueue = new ArrayList();
        }

        // REVISIT: this does not add to the cache.
        enqueue( addReply );
    }

    // NOTE: When adding a method, be sure to:
    // 1. Add a MID_* constant for that method
    // 2. Call checkAccess at the start of the method
    // 3. Define entries in the validCall[][] table for interception points.

    /*
     **********************************************************************
     * Public RequestInfo interfaces
     *
     * These are implemented here because they have differing
     * implementations depending on whether this is a client or a server
     * request info object.
     **********************************************************************/

    /**
     * See ServerRequestInfo for javadocs.
     */
    public int request_id (){
        // access is currently valid for all states:
        //checkAccess( MID_REQUEST_ID );
        /*
         * NOTE: The request id in server interceptors is NOT the
         * same as the GIOP request id.  The ORB may be servicing several
         * connections, each with possibly overlapping sets of request ids.
         * Therefore we create a request id specific to interceptors.
         */
        return serverRequestId;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public String operation (){
        // access is currently valid for all states:
        //checkAccess( MID_OPERATION );
        return request.getOperationName();
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public Parameter[] arguments (){
        checkAccess( MID_ARGUMENTS );

        if( cachedArguments == null ) {
            if( !isDynamic ) {
                throw stdWrapper.piOperationNotSupported1() ;
            }

            if( dsiArguments == null ) {
                throw stdWrapper.piOperationNotSupported8() ;
            }

            // If it is a DSI request then get the arguments from the DSI req
            // and convert that into parameters.
            cachedArguments = nvListToParameterArray( dsiArguments );
        }

        // Good citizen: In the interest of efficiency, we assume
        // interceptors will be "good citizens" in that they will not
        // modify the contents of the Parameter[] array.  We also assume
        // they will not change the values of the containing Anys.

        return cachedArguments;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public TypeCode[] exceptions (){
        checkAccess( MID_EXCEPTIONS );

        // _REVISIT_ PI RTF Issue: No exception list on server side.

        throw stdWrapper.piOperationNotSupported2() ;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public String[] contexts (){
        checkAccess( MID_CONTEXTS );

        // We do not support this because our ORB does not send contexts.

        throw stdWrapper.piOperationNotSupported3() ;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public String[] operation_context (){
        checkAccess( MID_OPERATION_CONTEXT );

        // We do not support this because our ORB does not send
        // operation_context.

        throw stdWrapper.piOperationNotSupported4() ;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public Any result (){
        checkAccess( MID_RESULT );

        if( !isDynamic ) {
            throw stdWrapper.piOperationNotSupported5() ;
        }

        if( dsiResult == null ) {
            throw wrapper.piDsiResultIsNull() ;
        }

        // Good citizen: In the interest of efficiency, we assume that
        // interceptors will not modify the contents of the result Any.
        // Otherwise, we would need to create a deep copy of the Any.

        return dsiResult;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public boolean response_expected (){
        // access is currently valid for all states:
        //checkAccess( MID_RESPONSE_EXPECTED );
        return !request.isOneWay();
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public Object forward_reference (){
        checkAccess( MID_FORWARD_REFERENCE );
        // Check to make sure we are in LOCATION_FORWARD
        // state as per ptc/00-08-06, table 21-2
        // footnote 2.
        if( replyStatus != LOCATION_FORWARD.value ) {
            throw stdWrapper.invalidPiCall1() ;
        }

        return getForwardRequestException().forward;
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public org.omg.IOP.ServiceContext get_request_service_context( int id ) {
        checkAccess( MID_GET_REQUEST_SERVICE_CONTEXT );

        if( cachedRequestServiceContexts == null ) {
            cachedRequestServiceContexts = new HashMap();
        }

        return getServiceContext( cachedRequestServiceContexts,
                                  request.getRequestServiceContexts(), id );
    }

    /**
     * See ServerRequestInfo for javadocs.
     */
    public org.omg.IOP.ServiceContext get_reply_service_context( int id ) {
        checkAccess( MID_GET_REPLY_SERVICE_CONTEXT );

        if( cachedReplyServiceContexts == null ) {
            cachedReplyServiceContexts = new HashMap();
        }

        return getServiceContext( cachedReplyServiceContexts,
                                  replyMessage.getServiceContexts(), id );
    }

    /*
     **********************************************************************
     * Private-scope classes and methods
     **********************************************************************/

    // A command encapsulating a request to add a reply service context.
    // These commands are enqueued until we have a handle on the actual
    // reply service context, at which point they are executed.
    private class AddReplyServiceContextCommand {
        ServiceContext service_context;
        boolean replace;
    }

    // Adds the given add reply service context command to the queue of
    // such commands.  If a command is detected to have the same id as
    // the service context in this command, and replace is false,
    // BAD_INV_ORDER is thrown.  If replace is true, the original command
    // in the queue is replaced by this command.
    private void enqueue( AddReplyServiceContextCommand addReply ) {
        int size = addReplyServiceContextQueue.size();
        boolean found = false;

        for( int i = 0; i < size; i++ ) {
            AddReplyServiceContextCommand cmd =
                (AddReplyServiceContextCommand)
                addReplyServiceContextQueue.get( i );

            if( cmd.service_context.context_id ==
                addReply.service_context.context_id )
            {
                found = true;
                if( addReply.replace ) {
                    addReplyServiceContextQueue.set( i, addReply );
                } else {
                    throw stdWrapper.serviceContextAddFailed(
                        new Integer( cmd.service_context.context_id ) ) ;
                }
                break;
            }
        }

        if( !found ) {
            addReplyServiceContextQueue.add( addReply );
        }
    }

    /*
     **********************************************************************
     * Package and protected-scope methods
     **********************************************************************/

    /**
     * Overridden from RequestInfoImpl.  This version calls the super
     * and then, if we are changing to ending points, executes all
     * enqueued AddReplyServiceContextCommands.
     */
    protected void setCurrentExecutionPoint( int executionPoint ) {
        super.setCurrentExecutionPoint( executionPoint );

        // If we are transitioning to ending point, we will now have a pointer
        // to the reply service contexts, so we can execute all queued
        // add reply service context requests.
        if( (executionPoint == EXECUTION_POINT_ENDING) &&
            (addReplyServiceContextQueue != null) )
        {
            int size = addReplyServiceContextQueue.size();
            for( int i = 0; i < size; i++ ) {
                AddReplyServiceContextCommand addReply =
                    (AddReplyServiceContextCommand)
                    addReplyServiceContextQueue.get( i );
                try {
                    add_reply_service_context( addReply.service_context,
                                               addReply.replace );
                }
                catch( BAD_INV_ORDER e ) {
                    // _REVISIT_  The only way this can happen is if during
                    // rrsc or rr, the interceptor tried to add with
                    // replace=false to a service context that is present in
                    // the reply message.  At that time there was no way for
                    // us to check for this, so the best we can do is ignore
                    // the original request.
                }
            }

            // We specifically do not empty the SC queue so that if
            // the interceptor raises an exception the queued service contexts
            // will be put in the exception response.
        }
    }

    /**
     * Stores the various sources of information used for this info object.
     */
    protected void setInfo( CorbaMessageMediator request, ObjectAdapter oa,
        byte[] objectId, ObjectKeyTemplate oktemp )
    {
        this.request = request;
        this.objectId = objectId;
        this.oktemp = oktemp;
        this.objectAdapter = oa ;
        this.connection = (com.sun.corba.se.spi.legacy.connection.Connection)
            request.getConnection();
    }

    /**
     * Stores the various sources of information used for this info object.
     */
    protected void setDSIArguments( NVList arguments ) {
        this.dsiArguments = arguments;
    }

    /**
     * Stores the various sources of information used for this info object.
     */
    protected void setDSIException( Any exception ) {
        this.dsiException = exception;

        // Clear cached exception value:
        cachedSendingException = null;
    }

    /**
     * Stores the various sources of information used for this info object.
     */
    protected void setDSIResult( Any result ) {
        this.dsiResult = result;
    }

    /**
     * Sets the exception to be returned by received_exception and
     * received_exception_id.
     */
    protected void setException( Exception exception ) {
        super.setException( exception );

        // Make sure DSIException is null because this is the more recent one.
        this.dsiException = null;

        // Clear cached exception value:
        cachedSendingException = null;
    }

    /**
     * Stores the various sources of information used for this info object.
     */
    protected void setInfo( java.lang.Object servant,
                            String targetMostDerivedInterface )
    {
        this.servant = servant;
        this.targetMostDerivedInterface = targetMostDerivedInterface;
        this.isDynamic =
            (servant instanceof
            org.omg.PortableServer.DynamicImplementation) ||
            (servant instanceof org.omg.CORBA.DynamicImplementation);
    }

    /**
     * Set reply message
     */
    void setReplyMessage( ReplyMessage replyMessage ) {
        this.replyMessage = replyMessage;
    }

    /**
     * Overridden from RequestInfoImpl.  Calls the super class, then
     * sets the ending point call depending on the reply status.
     */
    protected void setReplyStatus( short replyStatus ) {
        super.setReplyStatus( replyStatus );
        switch( replyStatus ) {
        case SUCCESSFUL.value:
            endingPointCall = CALL_SEND_REPLY;
            break;
        case SYSTEM_EXCEPTION.value:
        case USER_EXCEPTION.value:
            endingPointCall = CALL_SEND_EXCEPTION;
            break;
        case LOCATION_FORWARD.value:
        case TRANSPORT_RETRY.value:
            endingPointCall = CALL_SEND_OTHER;
            break;
        }
    }

    /**
     * Release the servant object so the user has control over its lifetime.
     * Called after receive_request is finished executing.
     */
    void releaseServant() {
        this.servant = null;
    }

    /**
     * Sets the forwardRequestRaisedInEnding flag to true, indicating that
     * a server ending point has raised location forward at some point.
     */
    void setForwardRequestRaisedInEnding() {
        this.forwardRequestRaisedInEnding = true;
    }

    /**
     * Returns true if ForwardRequest was raised by a server ending point
     * or false otherwise.
     */
    boolean isForwardRequestRaisedInEnding() {
        return this.forwardRequestRaisedInEnding;
    }

    /**
     * Returns true if this is a dynamic invocation, or false if not
     */
    boolean isDynamic() {
      return this.isDynamic;
    }

    /**
     * See description for RequestInfoImpl.checkAccess
     */
    protected void checkAccess( int methodID )
    {
        // Make sure currentPoint matches the appropriate index in the
        // validCall table:
        int validCallIndex = 0;
        switch( currentExecutionPoint ) {
        case EXECUTION_POINT_STARTING:
            validCallIndex = 0;
            break;
        case EXECUTION_POINT_INTERMEDIATE:
            validCallIndex = 1;
            break;
        case EXECUTION_POINT_ENDING:
            switch( endingPointCall ) {
            case CALL_SEND_REPLY:
                validCallIndex = 2;
                break;
            case CALL_SEND_EXCEPTION:
                validCallIndex = 3;
                break;
            case CALL_SEND_OTHER:
                validCallIndex = 4;
                break;
            }
            break;
        }

        // Check the validCall table:
        if( !validCall[methodID][validCallIndex] ) {
            throw stdWrapper.invalidPiCall2() ;
        }
    }

}

Other Java examples (source code examples)

Here is a short list of links related to this Java ServerRequestInfoImpl.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.