package org.jacorb.test.bugs.bugjac192;
import org.jacorb.orb.CDRInputStream;
import org.jacorb.orb.ORB;
import org.omg.CORBA.Any;
import org.omg.CORBA.BAD_PARAM;
import org.omg.CORBA.INTERNAL;
import org.omg.IOP.ServiceContext;
import org.omg.PortableInterceptor.ForwardRequest;
import org.omg.PortableInterceptor.InvalidSlot;
import org.omg.PortableInterceptor.ServerRequestInfo;
import org.omg.PortableInterceptor.ServerRequestInterceptor;
/**
* <code>SInterceptor</code> tries to examine the service context sent from
* the client interceptor. It then stores an Any in a slot within PICurrent
* for the server to analyse and return the ServiceContext propagation result.
*
* @author Nick Cross
*/
public class SInterceptor
extends org.omg.CORBA.LocalObject
implements ServerRequestInterceptor
{
private final ORB orb;
public SInterceptor(ORB orb)
{
this.orb = orb;
}
/**
* <code>receive_request</code> tests whether a service context has been sent.
*
* @param ri a <code>ServerRequestInfo</code> value
* @exception ForwardRequest if an error occurs
*/
public void receive_request( ServerRequestInfo ri )
throws ForwardRequest
{
ServiceContext sc = null;
try
{
sc = ri.get_request_service_context (BugJac192Test.svcID);
}
catch (Exception e)
{
throw new RuntimeException();
}
addResult (ri, sc);
}
/**
* <code>receive_request_service_contexts</code> tests whether a service
* context has been sent.
*
* @param ri a <code>ServerRequestInfo</code> value
* @exception ForwardRequest if an error occurs
*/
public void receive_request_service_contexts( ServerRequestInfo ri )
throws ForwardRequest
{
ServiceContext sc = null;
try
{
sc = ri.get_request_service_context (BugJac192Test.svcID);
}
catch (BAD_PARAM e)
{
throw new RuntimeException();
}
addResult (ri, sc);
}
/**
* <code>addResult</code> stores the result of the service context propagation into
* the .
*
* @param ri a <code>ServerRequestInfo</code> value
* @param sc a <code>ServiceContext</code> value
*/
private void addResult(ServerRequestInfo ri, ServiceContext sc)
{
boolean result = false;
if (sc != null)
{
byte []data = sc.context_data;
// This part is proprietary code to unmarshal the service context data
CDRInputStream is = new CDRInputStream(orb, data);
result = is.read_boolean();
is.close();
// End
}
Any nameAny = orb.create_any();
nameAny.insert_boolean(result);
try
{
ri.set_slot(SInitializer.slotID, nameAny);
}
catch (InvalidSlot e)
{
throw new INTERNAL (e.toString());
}
}
/**
* <code>name</code> (default impl).
*
* @return a <code>String</code> value
*/
public String name()
{
return "SInterceptor";
}
/**
* <code>destroy</code> (default impl).
*/
public void destroy()
{
}
/**
* <code>send_reply</code> (default impl).
*
* @param ri a <code>ServerRequestInfo</code> value
*/
public void send_reply( ServerRequestInfo ri )
{
}
/**
* <code>send_exception</code> (default impl).
*
* @param ri a <code>ServerRequestInfo</code> value
* @exception ForwardRequest if an error occurs
*/
public void send_exception( ServerRequestInfo ri )
throws ForwardRequest
{
}
/**
* <code>send_other</code> (default impl).
*
* @param ri a <code>ServerRequestInfo</code> value
* @exception ForwardRequest if an error occurs
*/
public void send_other( ServerRequestInfo ri )
throws ForwardRequest
{
}
}