package org.jacorb.test.bugs.bug976;
import org.jacorb.test.harness.TestUtils;
import org.omg.CORBA.Any;
import org.omg.CORBA.INTERNAL;
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.ORB;
import org.omg.CORBA.TCKind;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.omg.PortableInterceptor.ClientRequestInterceptor;
import org.omg.PortableInterceptor.Current;
import org.omg.PortableInterceptor.CurrentHelper;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.InvalidSlot;
final public class ClientRequestInterceptorImpl extends LocalObject implements
ClientRequestInterceptor
{
private String name;
private ORB orb;
private int slot;
public ClientRequestInterceptorImpl(String string, ORB orb, int slot)
{
this.name = string;
this.orb = orb;
this.slot = slot;
}
@Override
public void send_request(ClientRequestInfo ri) throws ForwardRequest
{
Current current = getPICurrent(orb);
Any any = orb.create_any();
any.insert_string("Some Information to other interception point");
try
{
current.set_slot(slot, any);
}
catch (InvalidSlot e)
{
throw new INTERNAL("Invalid Slot access");
}
}
@Override
public void receive_exception(ClientRequestInfo ri) throws ForwardRequest
{
Current current = getPICurrent(orb);
Any any;
try
{
any = current.get_slot(slot);
}
catch (InvalidSlot e)
{
throw new INTERNAL("Invalid Slot access");
}
if (any.type().kind().value() == TCKind._tk_null)
{
throw new INTERNAL("Information from send_request is not there!");
}
else
{
TestUtils.getLogger().debug("receive_exception working as expected!");
TestUtils.getLogger().debug("Info: " + any.extract_string());
}
}
@Override
public void receive_other(ClientRequestInfo ri) throws ForwardRequest
{
}
@Override
public void receive_reply(ClientRequestInfo ri)
{
Current current = getPICurrent(orb);
Any any;
try
{
any = current.get_slot(slot);
}
catch (InvalidSlot e)
{
throw new INTERNAL("Invalid Slot access");
}
if (any.type().kind().value() == TCKind._tk_null)
{
throw new INTERNAL("Information from send_request is not there!");
}
else
{
TestUtils.getLogger().debug("receive_reply working as expected!");
TestUtils.getLogger().debug("Info: " + any.extract_string());
}
}
@Override
public void send_poll(ClientRequestInfo ri)
{
}
@Override
public void destroy()
{
}
@Override
public String name()
{
return this.name;
}
/**
* Recupera o {@link Current} da thread em execu��o do ORB associado.
*
* @param orb
* o orb utilizado.
* @return o {@link Current}.
*/
private Current getPICurrent(ORB orb)
{
org.omg.CORBA.Object obj;
try
{
obj = orb.resolve_initial_references("PICurrent");
}
catch (InvalidName e)
{
throw new INTERNAL(e.toString ());
}
return CurrentHelper.narrow(obj);
}
}