package org.jacorb.test.bugs.bug1012;
import java.util.concurrent.atomic.AtomicBoolean;
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.NO_PERMISSIONHelper;
import org.omg.CORBA.ORB;
import org.omg.IOP.Codec;
import org.omg.IOP.ServiceContext;
import org.omg.IOP.CodecPackage.InvalidTypeForEncoding;
import org.omg.PortableInterceptor.ClientRequestInfo;
import org.omg.PortableInterceptor.ClientRequestInterceptor;
import org.omg.PortableInterceptor.ForwardRequest;
final public class DoorClientRequestInterceptorImpl extends LocalObject implements ClientRequestInterceptor
{
private String name;
private ORB orb;
private Codec codec;
public DoorClientRequestInterceptorImpl(String string, ORB orb, Codec codec)
{
this.name = string;
this.orb = orb;
this.codec = codec;
}
private String getSecret(String op)
{
int i = 1;
if (op.equals("canIComeIn"))
{
i = Bug1012Test.comeIn++;
// this is a workaround to the "ExtraCall" case.
if (i % 3 == 0)
{
return "Any wrong secret";
}
else
{
return CORRECT_SECRET.value;
}
// END workaround
}
else if (op.equals("itsMe"))
{
i = Bug1012Test.itsMe++;
}
if (i % 2 == 0)
{
return "Any wrong secret";
}
else
{
return CORRECT_SECRET.value;
}
}
@Override public void send_request(ClientRequestInfo ri) throws ForwardRequest
{
String operation = ri.operation();
TestUtils.getLogger().debug("send_request: " + operation);
Bug1012Test.numberOfCallsToServer++;
if(operation.equals("canIComeIn")) {
Bug1012Test.numberOfCanIComeInCalls++;
} else if(operation.equals("itsMe")) {
Bug1012Test.numberOfItsMeCalls++;
}
TestUtils.getLogger().debug("total calls: " + Bug1012Test.numberOfCallsToServer +
" canIcomeIn: " + Bug1012Test.numberOfCanIComeInCalls + " itsMe " + Bug1012Test.numberOfItsMeCalls);
if (Bug1012Test.introduce.compareAndSet(true, false))
{
switch (Bug1012Test.tcase)
{
case WorkJustFine:
TestUtils.getLogger().debug("calling knock_knock");
Bug1012Test.server.knock_knock("Penny");
break;
case DequePop:
Bug1012Test.server.knock_knock("Penny");
// 2 or more knock knock causes the bug
Bug1012Test.server.knock_knock("Penny");
Bug1012Test.server.knock_knock("Penny");
break;
case ExtraCall:
// this cause an "extra" send_request execution.
// cannot understand what happened to the previous one.
Bug1012Test.server.itsMe("Sheldon");
break;
}
}
Any anyCredential = orb.create_any();
String secret = getSecret(operation);
TestUtils.getLogger().debug(operation + " -> secret = " + secret);
Credential credential = new Credential(secret);
CredentialHelper.insert(anyCredential, credential);
byte[] encodedCredential;
try
{
encodedCredential = codec.encode_value(anyCredential);
}
catch (InvalidTypeForEncoding e)
{
String message = "Unexpected error encoding credential";
throw new INTERNAL(message);
}
ServiceContext requestServiceContext = new ServiceContext(CredentialContextId.value, encodedCredential);
ri.add_request_service_context(requestServiceContext, false);
}
@Override public void receive_exception(ClientRequestInfo ri) throws ForwardRequest
{
TestUtils.getLogger().debug("receive_exception: " + ri.operation());
if (ri.operation().equals("canIComeIn"))
{
Bug1012Test.introduce.set(true);
}
if (ri.received_exception_id().equals(NO_PERMISSIONHelper.id()))
{
throw new ForwardRequest(ri.target());
}
}
@Override public void receive_other(ClientRequestInfo ri) throws ForwardRequest
{
}
@Override public void receive_reply(ClientRequestInfo ri)
{
}
@Override public void send_poll(ClientRequestInfo ri)
{
}
@Override public void destroy()
{
}
@Override public String name()
{
return this.name;
}
}