- /*
 - * @(#)ORBInitInfoImpl.java 1.23 03/01/23
 - *
 - * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 - */
 - package com.sun.corba.se.internal.Interceptors;
 - import org.omg.PortableInterceptor.ORBInitInfo;
 - import org.omg.IOP.CodecFactory;
 - import org.omg.PortableInterceptor.ClientRequestInterceptor;
 - import org.omg.PortableInterceptor.IORInterceptor;
 - import org.omg.PortableInterceptor.PolicyFactory;
 - import org.omg.PortableInterceptor.ServerRequestInterceptor;
 - import org.omg.PortableInterceptor.ORBInitInfoPackage.DuplicateName;
 - import org.omg.PortableInterceptor.ORBInitInfoPackage.InvalidName;
 - import org.omg.CORBA.BAD_PARAM;
 - import org.omg.CORBA.BAD_INV_ORDER;
 - import org.omg.CORBA.CompletionStatus;
 - import org.omg.CORBA.NO_IMPLEMENT;
 - import org.omg.CORBA.OBJECT_NOT_EXIST;
 - import org.omg.CORBA.ORB;
 - import org.omg.CORBA.LocalObject;
 - import org.omg.CORBA.portable.Delegate;
 - import org.omg.CORBA.portable.ObjectImpl;
 - import com.sun.corba.se.internal.core.ClientSubcontract;
 - import com.sun.corba.se.internal.core.IOR;
 - /**
 - * ORBInitInfoImpl is the implementation of the ORBInitInfo class to be
 - * passed to ORBInitializers, as described in orbos/99-12-02.
 - */
 - public final class ORBInitInfoImpl
 - extends org.omg.CORBA.LocalObject
 - implements ORBInitInfo
 - {
 - // The ORB we are initializing
 - private PIORB orb;
 - // The arguments passed to ORB_init
 - private String[] args;
 - // The ID of the ORB being initialized
 - private String orbId;
 - // The CodecFactory
 - private CodecFactory codecFactory;
 - // The current stage of initialization
 - private int stage = STAGE_PRE_INIT;
 - // The pre-initialization stage (pre_init() being called)
 - public static final int STAGE_PRE_INIT = 0;
 - // The post-initialization stage (post_init() being called)
 - public static final int STAGE_POST_INIT = 1;
 - // Reject all calls - this object should no longer be around.
 - public static final int STAGE_CLOSED = 2;
 - // The description for the OBJECT_NOT_EXIST exception in STAGE_CLOSED
 - private static final String MESSAGE_ORBINITINFO_INVALID =
 - "ORBInitInfo object is only valid during ORB_init";
 - /**
 - * Creates a new ORBInitInfoImpl object (scoped to package)
 - *
 - * @param args The arguments passed to ORB_init.
 - */
 - ORBInitInfoImpl( PIORB orb, String[] args, String orbId,
 - CodecFactory codecFactory )
 - {
 - this.orb = orb;
 - this.args = args;
 - this.orbId = orbId;
 - this.codecFactory = codecFactory;
 - }
 - /**
 - * Sets the current stage we are in. This limits access to certain
 - * functionality.
 - */
 - void setStage( int stage ) {
 - this.stage = stage;
 - }
 - /**
 - * Throws an exception if the current stage is STAGE_CLOSED.
 - * This is called before any method is invoked to ensure that
 - * no method invocations are attempted after all calls to post_init()
 - * are completed.
 - */
 - private void checkStage() {
 - if( stage == STAGE_CLOSED ) {
 - throw new OBJECT_NOT_EXIST( MESSAGE_ORBINITINFO_INVALID );
 - }
 - }
 - /*
 - *******************************************************************
 - * The following are implementations of the ORBInitInfo operations.
 - *******************************************************************/
 - /**
 - * This attribute contains the arguments passed to ORB_init. They may
 - * or may not contain the ORB's arguments
 - */
 - public String[] arguments () {
 - checkStage();
 - return args;
 - }
 - /**
 - * This attribute is the ID of the ORB being initialized
 - */
 - public String orb_id () {
 - checkStage();
 - return orbId;
 - }
 - /**
 - * This attribute is the IOP::CodecFactory. The CodecFactory is normally
 - * obtained via a call to ORB::resolve_initial_references( "CodecFactory" )
 - * but since the ORB is not yet available and Interceptors, particularly
 - * when processing service contexts, will require a Codec, a means of
 - * obtaining a Codec is necessary during ORB intialization.
 - */
 - public CodecFactory codec_factory () {
 - checkStage();
 - return codecFactory;
 - }
 - /**
 - * See orbos/99-12-02, Chapter 11, Dynamic Initial References on page
 - * 11-81. This operation is identical to ORB::register_initial_reference
 - * described there. This same functionality exists here because the ORB,
 - * not yet fully initialized, is not yet available but initial references
 - * may need to be registered as part of Interceptor registration.
 - * <p>
 - * This method may not be called during post_init.
 - */
 - public void register_initial_reference( String id,
 - org.omg.CORBA.Object obj )
 - throws InvalidName
 - {
 - checkStage();
 - if( id == null ) nullParam();
 - // As per ptc/00-08-06, if null is passed as the obj parameter,
 - // throw BAD_PARAM with minor code MinorCodes.RIR_WITH_NULL_OBJECT.
 - // Though the spec is talking about IDL null, we will address both
 - // Java null and IDL null:
 - // Note: Local Objects can never be nil!
 - boolean isNil = false;
 - if( obj == null ) {
 - isNil = true;
 - }
 - else if( obj instanceof ObjectImpl ) {
 - Delegate delegate = ((ObjectImpl)obj)._get_delegate();
 - ClientSubcontract csub = (ClientSubcontract)delegate;
 - IOR ior = csub.marshal();
 - isNil = ior.is_nil();
 - }
 - if( isNil ) {
 - throw new BAD_PARAM(
 - "register_initial_reference called with nil Object.",
 - MinorCodes.RIR_WITH_NULL_OBJECT,
 - CompletionStatus.COMPLETED_NO );
 - }
 - // Delegate to ORB. If ORB version throws InvalidName, convert to
 - // equivalent Portable Interceptors InvalidName.
 - try {
 - orb.register_initial_reference( id, obj );
 - }
 - catch( org.omg.CORBA.ORBPackage.InvalidName e ) {
 - throw new InvalidName( e.getMessage() );
 - }
 - }
 - /**
 - * This operation is only valid during post_init. It is identical to
 - * ORB::resolve_initial_references. This same functionality exists here
 - * because the ORB, not yet fully initialized, is not yet available,
 - * but initial references may be required from the ORB as part
 - * of Interceptor registration.
 - * <p>
 - * (incorporates changes from errata in orbos/00-01-01)
 - * <p>
 - * This method may not be called during pre_init.
 - */
 - public org.omg.CORBA.Object resolve_initial_references (String id)
 - throws InvalidName
 - {
 - checkStage();
 - if( id == null ) nullParam();
 - if( stage == STAGE_PRE_INIT ) {
 - // Initializer is not allowed to invoke this method during
 - // this stage.
 - // _REVISIT_ Spec issue: What exception should really be
 - // thrown here?
 - throw new BAD_INV_ORDER(
 - "Resolve Initial References cannot be called in pre_init",
 - MinorCodes.RIR_INVALID_PRE_INIT,
 - CompletionStatus.COMPLETED_NO );
 - }
 - org.omg.CORBA.Object objRef = null;
 - try {
 - objRef = orb.resolve_initial_references( id );
 - }
 - catch( org.omg.CORBA.ORBPackage.InvalidName e ) {
 - // Convert PIDL to IDL exception:
 - throw new InvalidName();
 - }
 - return objRef;
 - }
 - /**
 - * This operation is used to add a client-side request Interceptor to
 - * the list of client-side request Interceptors.
 - * <p>
 - * If a client-side request Interceptor has already been registered
 - * with this Interceptor's name, DuplicateName is raised.
 - */
 - public void add_client_request_interceptor (
 - ClientRequestInterceptor interceptor)
 - throws DuplicateName
 - {
 - checkStage();
 - if( interceptor == null ) nullParam();
 - orb.register_interceptor( interceptor,
 - InterceptorList.INTERCEPTOR_TYPE_CLIENT );
 - }
 - /**
 - * This operation is used to add a server-side request Interceptor to
 - * the list of server-side request Interceptors.
 - * <p>
 - * If a server-side request Interceptor has already been registered
 - * with this Interceptor's name, DuplicateName is raised.
 - */
 - public void add_server_request_interceptor (
 - ServerRequestInterceptor interceptor)
 - throws DuplicateName
 - {
 - checkStage();
 - if( interceptor == null ) nullParam();
 - orb.register_interceptor( interceptor,
 - InterceptorList.INTERCEPTOR_TYPE_SERVER );
 - }
 - /**
 - * This operation is used to add an IOR Interceptor to
 - * the list of IOR Interceptors.
 - * <p>
 - * If an IOR Interceptor has already been registered
 - * with this Interceptor's name, DuplicateName is raised.
 - */
 - public void add_ior_interceptor (
 - IORInterceptor interceptor )
 - throws DuplicateName
 - {
 - checkStage();
 - if( interceptor == null ) nullParam();
 - orb.register_interceptor( interceptor,
 - InterceptorList.INTERCEPTOR_TYPE_IOR );
 - }
 - /**
 - * A service calls allocate_slot_id to allocate a slot on
 - * PortableInterceptor::Current.
 - *
 - * @return The index to the slot which has been allocated.
 - */
 - public int allocate_slot_id () {
 - checkStage();
 - return orb.getPICurrent().allocateSlotId( );
 - }
 - /**
 - * Register a PolicyFactory for the given PolicyType.
 - * <p>
 - * If a PolicyFactory already exists for the given PolicyType,
 - * BAD_INV_ORDER is raised with a minor code of TBD_BIO+2.
 - */
 - public void register_policy_factory( int type,
 - PolicyFactory policy_factory )
 - {
 - checkStage();
 - if( policy_factory == null ) nullParam();
 - orb.registerPolicyFactory( type, policy_factory );
 - }
 - /**
 - * Called when an invalid null parameter was passed. Throws a
 - * BAD_PARAM with a minor code of 1
 - */
 - private void nullParam()
 - throws BAD_PARAM
 - {
 - throw new BAD_PARAM(
 - com.sun.corba.se.internal.orbutil.MinorCodes.NULL_PARAM,
 - CompletionStatus.COMPLETED_NO );
 - }
 - }