/* * @(#)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() ; } }