package org.jacorb.test.bugs.bug983;
import org.jacorb.test.bugs.bug979.CredentialContextId;
import org.jacorb.test.harness.TestUtils;
import org.omg.CORBA.Any;
import org.omg.CORBA.LocalObject;
import org.omg.CORBA.NO_PERMISSIONHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.TCKind;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.IOP.ServiceContext;
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;
static Current getPICurrent(ORB orb)
{
org.omg.CORBA.Object obj = null;
try
{
obj = orb.resolve_initial_references("PICurrent");
}
catch (InvalidName e)
{
throw new RuntimeException("Falha inesperada ao obter o PICurrent: " + e);
}
return CurrentHelper.narrow(obj);
}
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
{
try
{
Any flag = ri.get_slot(this.slot);
TestUtils.getLogger().debug("SLOT VALUE TYPE: " + flag.type().kind());
if (flag.type().kind().value() != TCKind._tk_null)
{
ServiceContext requestServiceContext = new ServiceContext(
CredentialContextId.value, new byte[0]);
ri.add_request_service_context(requestServiceContext, false);
Current current = getPICurrent(orb);
current.set_slot(this.slot, orb.create_any());
}
}
catch (InvalidSlot e)
{
throw new RuntimeException("Falha inesperada ao obter acessar slot: " + e);
}
TestUtils.getLogger().debug("send request: " + ri.operation());
}
@Override
public void receive_exception(ClientRequestInfo ri) throws ForwardRequest
{
TestUtils.getLogger().debug("receive exception: " + ri.operation());
try
{
if (ri.received_exception_id().equals(NO_PERMISSIONHelper.id()))
{
Current current = getPICurrent(orb);
Any flag = orb.create_any();
flag.insert_boolean(true);
current.set_slot(this.slot, flag);
TestUtils.getLogger().debug("doing ForwardRequest: " + ri.operation());
throw new ForwardRequest(ri.target());
}
}
catch (InvalidSlot e)
{
throw new RuntimeException("Falha inesperada ao salvar no slot: " + e);
}
}
@Override
public void receive_other(ClientRequestInfo ri) throws ForwardRequest
{
}
@Override
public void receive_reply(ClientRequestInfo ri)
{
TestUtils.getLogger().debug("receive reply: " + ri.operation());
}
@Override
public void send_poll(ClientRequestInfo ri)
{
}
@Override
public void destroy()
{
}
@Override
public String name()
{
return this.name;
}
}