FileDocCategorySizeDatePackage
StubAdapter.javaAPI DocJava SE 5 API5996Fri Aug 26 14:54:40 BST 2005com.sun.corba.se.spi.presentation.rmi

StubAdapter.java

/*
 * @(#)StubAdapter.java	1.4 04/06/21
 *
 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.corba.se.spi.presentation.rmi ;

import javax.rmi.CORBA.Tie ;

import org.omg.CORBA.portable.Delegate ;
import org.omg.CORBA.portable.ObjectImpl ;
import org.omg.CORBA.portable.OutputStream ;

import org.omg.PortableServer.POA ;
import org.omg.PortableServer.POAManager ;
import org.omg.PortableServer.Servant ;

import org.omg.PortableServer.POAPackage.WrongPolicy ;
import org.omg.PortableServer.POAPackage.ServantNotActive ;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive ;

import org.omg.CORBA.ORB ;

import com.sun.corba.se.spi.logging.CORBALogDomains ;
import com.sun.corba.se.impl.logging.ORBUtilSystemException ;

// XXX Getting rid of this requires introducing an ObjectAdapterManager abstraction
// as an interface into the OA framework. 
import com.sun.corba.se.impl.oa.poa.POAManagerImpl ;

/** Provide access to stub delegate and type id information
 * independent of the stub type.  This class exists because
 * ObjectImpl does not have an interface for the 3 delegate and
 * type id methods, so a DynamicStub has a different type.
 * We cannot simply change ObjectImpl as it is a standard API.
 * We also cannot change the code generation of Stubs, as that
 * is also standard.  Hence I am left with this ugly class.
 */ 
public abstract class StubAdapter 
{
    private StubAdapter() {}

    private static ORBUtilSystemException wrapper = 
	ORBUtilSystemException.get( CORBALogDomains.RPC_PRESENTATION ) ;

    public static boolean isStubClass( Class cls )
    {
	return (ObjectImpl.class.isAssignableFrom( cls )) ||
	    (DynamicStub.class.isAssignableFrom( cls )) ;
    }

    public static boolean isStub( Object stub )
    {
	return (stub instanceof DynamicStub) ||
	    (stub instanceof ObjectImpl) ;
    }

    public static void setDelegate( Object stub, Delegate delegate ) 
    {
	if (stub instanceof DynamicStub)
	    ((DynamicStub)stub).setDelegate( delegate ) ;
	else if (stub instanceof ObjectImpl)
	    ((ObjectImpl)stub)._set_delegate( delegate ) ;
	else
	    throw wrapper.setDelegateRequiresStub() ; 
    }

    /** Use implicit activation to get an object reference for the servant.
     */
    public static org.omg.CORBA.Object activateServant( Servant servant ) 
    {
	POA poa = servant._default_POA() ;
	org.omg.CORBA.Object ref = null ;

	try {
	    ref = poa.servant_to_reference( servant ) ;
	} catch (ServantNotActive sna) {
	    throw wrapper.getDelegateServantNotActive( sna ) ;
	} catch (WrongPolicy wp) {
	    throw wrapper.getDelegateWrongPolicy( wp ) ;
	}

	// Make sure that the POAManager is activated if no other
	// POAManager state management has taken place.
	POAManager mgr = poa.the_POAManager() ;
	if (mgr instanceof POAManagerImpl) {
	    POAManagerImpl mgrImpl = (POAManagerImpl)mgr ;
	    mgrImpl.implicitActivation() ;
	}

	return ref ;
    }

    /** Given any Tie, return the corresponding object refernce, activating
     * the Servant if necessary.
     */
    public static org.omg.CORBA.Object activateTie( Tie tie )
    {
	/** Any implementation of Tie should be either a Servant or an ObjectImpl,
	 * depending on which style of code generation is used.  rmic -iiop by
	 * default results in an ObjectImpl-based Tie, while rmic -iiop -poa
	 * results in a Servant-based Tie.  Dynamic RMI-IIOP also uses Servant-based
	 * Ties (see impl.presentation.rmi.ReflectiveTie).
	 */
	if (tie instanceof ObjectImpl) {
	    return tie.thisObject() ;
	} else if (tie instanceof Servant) {
	    Servant servant = (Servant)tie ;
	    return activateServant( servant ) ;
	} else {
	    throw wrapper.badActivateTieCall() ;
	}
    }


    /** This also gets the delegate from a Servant by
     * using Servant._this_object()
     */
    public static Delegate getDelegate( Object stub ) 
    {
	if (stub instanceof DynamicStub)
	    return ((DynamicStub)stub).getDelegate() ;
	else if (stub instanceof ObjectImpl)
	    return ((ObjectImpl)stub)._get_delegate() ;
	else if (stub instanceof Tie) {
	    Tie tie = (Tie)stub ;
	    org.omg.CORBA.Object ref = activateTie( tie ) ;
	    return getDelegate( ref ) ;
	} else
	    throw wrapper.getDelegateRequiresStub() ; 
    }
    
    public static ORB getORB( Object stub ) 
    {
	if (stub instanceof DynamicStub)
	    return ((DynamicStub)stub).getORB() ;
	else if (stub instanceof ObjectImpl)
	    return (ORB)((ObjectImpl)stub)._orb() ;
	else
	    throw wrapper.getOrbRequiresStub() ; 
    }

    public static String[] getTypeIds( Object stub )
    {
	if (stub instanceof DynamicStub)
	    return ((DynamicStub)stub).getTypeIds() ;
	else if (stub instanceof ObjectImpl)
	    return ((ObjectImpl)stub)._ids() ;
	else
	    throw wrapper.getTypeIdsRequiresStub() ; 
    }

    public static void connect( Object stub, 
	ORB orb ) throws java.rmi.RemoteException 
    {
	if (stub instanceof DynamicStub)
	    ((DynamicStub)stub).connect( 
		(com.sun.corba.se.spi.orb.ORB)orb ) ;
	else if (stub instanceof javax.rmi.CORBA.Stub) 
	    ((javax.rmi.CORBA.Stub)stub).connect( orb ) ;
	else if (stub instanceof ObjectImpl)
	    orb.connect( (org.omg.CORBA.Object)stub ) ;
	else
	    throw wrapper.connectRequiresStub() ; 
    }

    public static boolean isLocal( Object stub )
    {
	if (stub instanceof DynamicStub)
	    return ((DynamicStub)stub).isLocal() ;
	else if (stub instanceof ObjectImpl)
	    return ((ObjectImpl)stub)._is_local() ;
	else
	    throw wrapper.isLocalRequiresStub() ; 
    }

    public static OutputStream request( Object stub, 
	String operation, boolean responseExpected ) 
    {
	if (stub instanceof DynamicStub)
	    return ((DynamicStub)stub).request( operation,
		responseExpected ) ;
	else if (stub instanceof ObjectImpl)
	    return ((ObjectImpl)stub)._request( operation,
		responseExpected ) ;
	else
	    throw wrapper.requestRequiresStub() ; 
    }
}