/*
* Copyright (c) 2002, 2003, 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.protocol;
import org.omg.CORBA.SystemException;
import org.omg.CORBA.OBJ_ADAPTER ;
import org.omg.CORBA.UNKNOWN ;
import org.omg.CORBA.CompletionStatus ;
import org.omg.CORBA.portable.ServantObject;
import com.sun.corba.se.pept.protocol.ClientRequestDispatcher;
import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcher;
import com.sun.corba.se.spi.protocol.LocalClientRequestDispatcherFactory;
import com.sun.corba.se.spi.protocol.ForwardException ;
import com.sun.corba.se.spi.oa.ObjectAdapter;
import com.sun.corba.se.spi.oa.OAInvocationInfo ;
import com.sun.corba.se.spi.oa.OADestroyed;
import com.sun.corba.se.spi.orb.ORB;
import com.sun.corba.se.spi.ior.IOR ;
import com.sun.corba.se.spi.logging.CORBALogDomains ;
import com.sun.corba.se.impl.logging.POASystemException ;
import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
public class POALocalCRDImpl extends LocalClientRequestDispatcherBase
{
private ORBUtilSystemException wrapper ;
private POASystemException poaWrapper ;
public POALocalCRDImpl( ORB orb, int scid, IOR ior)
{
super( (com.sun.corba.se.spi.orb.ORB)orb, scid, ior );
wrapper = ORBUtilSystemException.get( orb,
CORBALogDomains.RPC_PROTOCOL ) ;
poaWrapper = POASystemException.get( orb,
CORBALogDomains.RPC_PROTOCOL ) ;
}
private OAInvocationInfo servantEnter( ObjectAdapter oa ) throws OADestroyed
{
oa.enter() ;
OAInvocationInfo info = oa.makeInvocationInfo( objectId ) ;
orb.pushInvocationInfo( info ) ;
return info ;
}
private void servantExit( ObjectAdapter oa )
{
try {
oa.returnServant();
} finally {
oa.exit() ;
orb.popInvocationInfo() ;
}
}
// Look up the servant for this request and return it in a
// ServantObject. Note that servant_postinvoke is always called
// by the stub UNLESS this method returns null. However, in all
// cases we must be sure that ObjectAdapter.getServant and
// ObjectAdapter.returnServant calls are paired, as required for
// Portable Interceptors and Servant Locators in the POA.
// Thus, this method must call returnServant if it returns null.
public ServantObject servant_preinvoke(org.omg.CORBA.Object self,
String operation,
Class expectedType)
{
ObjectAdapter oa = oaf.find( oaid ) ;
OAInvocationInfo info = null ;
try {
info = servantEnter( oa ) ;
info.setOperation( operation ) ;
} catch ( OADestroyed ex ) {
// Destroyed POAs can be recreated by normal adapter activation.
// So just reinvoke this method.
return servant_preinvoke(self, operation, expectedType);
}
try {
try {
oa.getInvocationServant( info );
if (!checkForCompatibleServant( info, expectedType ))
return null ;
} catch (Throwable thr) {
// Cleanup after this call, then throw to allow
// outer try to handle the exception appropriately.
servantExit( oa ) ;
throw thr ;
}
} catch ( ForwardException ex ) {
/* REVISIT
ClientRequestDispatcher csub = (ClientRequestDispatcher)
StubAdapter.getDelegate( ex.forward_reference ) ;
IOR ior = csub.getIOR() ;
setLocatedIOR( ior ) ;
*/
RuntimeException runexc = new RuntimeException("deal with this.");
runexc.initCause( ex ) ;
throw runexc ;
} catch ( ThreadDeath ex ) {
// ThreadDeath on the server side should not cause a client
// side thread death in the local case. We want to preserve
// this behavior for location transparency, so that a ThreadDeath
// has the same affect in either the local or remote case.
// The non-colocated case is handled in iiop.ORB.process, which
// throws the same exception.
throw wrapper.runtimeexception( ex ) ;
} catch ( Throwable t ) {
if (t instanceof SystemException)
throw (SystemException)t ;
throw poaWrapper.localServantLookup( t ) ;
}
if (!checkForCompatibleServant( info, expectedType )) {
servantExit( oa ) ;
return null ;
}
return info;
}
public void servant_postinvoke(org.omg.CORBA.Object self,
ServantObject servantobj)
{
ObjectAdapter oa = orb.peekInvocationInfo().oa() ;
servantExit( oa ) ;
}
}
// End of file.