/*
* Copyright (c) 2003, 2004, 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 org.jboss.com.sun.corba.se.spi.presentation.rmi;
import javax.rmi.CORBA.Tie;
import org.omg.CORBA.ORB;
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.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
import org.jboss.com.sun.corba.se.impl.logging.ORBUtilSystemException;
import org.jboss.com.sun.corba.se.impl.oa.poa.POAManagerImpl;
import org.jboss.com.sun.corba.se.spi.logging.CORBALogDomains;
import org.jboss.com.sun.corba.se.spi.presentation.rmi.DynamicStub;
/**
* 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 ((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(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();
}
}