package org.jacorb.test.notification;
import org.junit.Assert;
import org.omg.CORBA.Any;
import org.omg.CORBA.BooleanHolder;
import org.omg.CORBA.IntHolder;
import org.omg.CORBA.ORB;
import org.omg.CosEventChannelAdmin.AlreadyConnected;
import org.omg.CosEventChannelAdmin.TypeError;
import org.omg.CosEventComm.Disconnected;
import org.omg.CosNotification.EventType;
import org.omg.CosNotifyChannelAdmin.AdminLimitExceeded;
import org.omg.CosNotifyChannelAdmin.AdminNotFound;
import org.omg.CosNotifyChannelAdmin.ClientType;
import org.omg.CosNotifyChannelAdmin.EventChannel;
import org.omg.CosNotifyChannelAdmin.InterFilterGroupOperator;
import org.omg.CosNotifyChannelAdmin.ProxyPullConsumer;
import org.omg.CosNotifyChannelAdmin.ProxyPullConsumerHelper;
import org.omg.CosNotifyChannelAdmin.ProxyType;
import org.omg.CosNotifyChannelAdmin.SupplierAdmin;
import org.omg.CosNotifyComm.PullSupplierPOA;
/**
* @author Alphonse Bendt
*/
public class AnyPullSender extends PullSupplierPOA implements TestClientOperations
{
Any event_;
Any invalidAny_;
ProxyPullConsumer myConsumer_;
boolean connected_ = false;
boolean available_ = false;
SupplierAdmin myAdmin_;
private ORB orb_;
public AnyPullSender(ORB orb, Any event)
{
event_ = event;
orb_ = orb;
}
void reset()
{
event_ = null;
}
public boolean isConnected()
{
return connected_;
}
public void connect(EventChannel channel, boolean useOrSemantic) throws AdminLimitExceeded,
AlreadyConnected, TypeError, AdminNotFound
{
IntHolder _proxyId = new IntHolder();
IntHolder _adminId = new IntHolder();
invalidAny_ = orb_.create_any();
if (useOrSemantic)
{
myAdmin_ = channel.new_for_suppliers(InterFilterGroupOperator.OR_OP, _adminId);
Assert.assertEquals(InterFilterGroupOperator.OR_OP, myAdmin_.MyOperator());
}
else
{
myAdmin_ = channel.new_for_suppliers(InterFilterGroupOperator.AND_OP, _adminId);
Assert.assertEquals(InterFilterGroupOperator.AND_OP, myAdmin_.MyOperator());
}
Assert.assertEquals(myAdmin_, channel.get_supplieradmin(_adminId.value));
myConsumer_ = ProxyPullConsumerHelper.narrow(myAdmin_.obtain_notification_pull_consumer(
ClientType.ANY_EVENT, _proxyId));
Assert.assertEquals(ProxyType._PULL_ANY, myConsumer_.MyType().value());
myConsumer_.connect_any_pull_supplier(_this(orb_));
connected_ = true;
}
public void shutdown()
{
myConsumer_.disconnect_pull_consumer();
}
public void run()
{
available_ = true;
}
public boolean isEventHandled()
{
return sent_;
}
boolean sent_ = false;
public boolean isError()
{
return false;
}
public void subscription_change(EventType[] e1, EventType[] e2)
{
// ignored
}
public Any pull() throws Disconnected
{
BooleanHolder _b = new BooleanHolder();
Any _event;
while (true)
{
_event = try_pull(_b);
if (_b.value)
{
return _event;
}
}
}
public Any try_pull(BooleanHolder success) throws Disconnected
{
try
{
Any _event = invalidAny_;
success.value = false;
synchronized (this)
{
if (available_)
{
_event = event_;
event_ = null;
success.value = true;
sent_ = true;
available_ = false;
}
}
return _event;
} catch (Throwable t)
{
t.printStackTrace();
throw new RuntimeException();
}
}
public void disconnect_pull_supplier()
{
connected_ = false;
}
}