package org.jacorb.test.bugs.bug927;
import org.jacorb.orb.ORB;
import org.omg.CORBA.Any;
import org.omg.IOP.Codec;
import org.omg.IOP.ServiceContext;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.omg.PortableInterceptor.ClientRequestInterceptor;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.ServerRequestInfo;
import org.omg.PortableInterceptor.ServerRequestInterceptor;
import org.omg.CORBA.INTERNAL;
import org.slf4j.Logger;
public class MyInterceptor
extends org.omg.CORBA.LocalObject
implements ClientRequestInterceptor, ServerRequestInterceptor
{
public static final int SERVICE_ID = 100003;
private int slot_id;
private Codec codec;
private Logger logger;
public MyInterceptor(ORB orb, int slot_id, Codec codec)
{
this.slot_id = slot_id;
this.codec = codec;
logger = orb.getConfiguration ().getLogger("org.jacorb.test");
}
public String name()
{
return "MyInterceptor";
}
public void destroy()
{
}
public void send_request(ClientRequestInfo ri)
throws ForwardRequest
{
try
{
org.omg.CORBA.Any any = ri.get_slot( slot_id );
if( any.type().kind().value() == org.omg.CORBA.TCKind._tk_null ) {
logger.debug("tid="+Thread.currentThread().getName()+","+"ClientInterceptor.send_request, slot is empty");
} else {
logger.debug("tid="+Thread.currentThread().getName()+","+"ClientInterceptor.send_request, adding ServiceContext");
ServiceContext ctx =
new ServiceContext(SERVICE_ID, codec.encode( any ));
ri.add_request_service_context( ctx, false );
}
}
catch (Exception e)
{
throw new INTERNAL ("Caught " + e);
}
}
public void send_poll(ClientRequestInfo ri)
{
}
public void receive_reply(ClientRequestInfo ri)
{
}
public void receive_exception(ClientRequestInfo ri) throws ForwardRequest
{
}
public void receive_other(ClientRequestInfo ri) throws ForwardRequest
{
}
public void receive_request_service_contexts(ServerRequestInfo ri)
{
ServiceContext ctx;
try {
ctx = ri.get_request_service_context(SERVICE_ID);
} catch (org.omg.CORBA.BAD_PARAM e) {
logger.debug("tid="+Thread.currentThread().getName()+","+"**Service context was not specified");
return;
}
if (null == ctx) {
logger.debug("tid="+Thread.currentThread().getName()+","+"**Service context is null");
return;
}
try
{
Any slotDataAsAny = codec.decode( ctx.context_data );
// Get the slot data as a string
String slotDataAsStr;
if (null == (slotDataAsStr = slotDataAsAny.extract_string())) {
logger.debug("slotDataAsStr=<null>");
} else {
logger.debug("slotDataAsStr=" + slotDataAsStr);
}
slotDataAsStr += ":receive_request_service_contexts";
slotDataAsAny.insert_string(slotDataAsStr);
ri.set_slot( slot_id, slotDataAsAny);
}
catch (Exception e)
{
throw new INTERNAL ("Caught " + e);
}
}
public void receive_request(ServerRequestInfo ri)
{
logger.debug("tid="+Thread.currentThread().getName()+","+"receive_request " + ri.operation());
addStringToSlotId("receive_request:"+ri.operation(), ri);
}
public void send_reply(ServerRequestInfo ri)
{
logger.debug("tid="+Thread.currentThread().getName()+","+"send_reply " + ri.operation());
addStringToSlotId("send_reply", ri);
}
public void send_exception(ServerRequestInfo ri)
{
logger.debug("tid="+Thread.currentThread().getName()+","+"send_exception " + ri.operation());
addStringToSlotId("send_exception", ri);
}
public void send_other(ServerRequestInfo ri)
{
logger.debug("tid="+Thread.currentThread().getName()+","+"send_other " + ri.operation());
addStringToSlotId("send_other", ri);
}
private void addStringToSlotId(String methodName, ServerRequestInfo ri)
{
try
{
Any slotDataAsAny = ri.get_slot(slot_id);
// Get the slot data as a string
String s = null;
String slotDataAsStr = "<no_slot_data>";
if( slotDataAsAny.type().kind().value() != org.omg.CORBA.TCKind._tk_null
&& null != (s = slotDataAsAny.extract_string())) {
slotDataAsStr = s;
}
slotDataAsStr += ":" + methodName;
slotDataAsAny.insert_string(slotDataAsStr);
ri.set_slot( slot_id, slotDataAsAny);
}
catch (Exception e)
{
throw new INTERNAL ("Caught " + e);
}
}
} // MyInterceptor