package org.jacorb.test.notification;
import org.omg.CORBA.Any;
import org.omg.CORBA.BooleanHolder;
import org.omg.CORBA.ORB;
import org.omg.CosEventChannelAdmin.AlreadyConnected;
import org.omg.CosEventChannelAdmin.ConsumerAdmin;
import org.omg.CosEventChannelAdmin.EventChannel;
import org.omg.CosEventChannelAdmin.EventChannelHelper;
import org.omg.CosEventChannelAdmin.ProxyPullSupplier;
import org.omg.CosEventComm.Disconnected;
import org.omg.CosEventComm.PullConsumerPOA;
/**
* @author Alphonse Bendt
*/
public class CosEventPullReceiver extends PullConsumerPOA implements Runnable, TestClientOperations
{
ProxyPullSupplier mySupplier_;
Any event_ = null;
long timeout_ = 1000;
boolean error_ = false;
boolean connected_;
ORB orb_;
public CosEventPullReceiver(ORB orb)
{
orb_ = orb;
}
public void disconnect_pull_consumer()
{
connected_ = false;
}
public boolean isError()
{
return error_;
}
public boolean isConnected()
{
return connected_;
}
public boolean isEventHandled()
{
return (event_ != null);
}
public void run()
{
long _startTime = System.currentTimeMillis();
long _stopTime = _startTime + timeout_;
BooleanHolder _success = new BooleanHolder();
try
{
while (connected_ && System.currentTimeMillis() < _stopTime)
{
event_ = mySupplier_.try_pull(_success);
if (_success.value)
{
break;
}
Thread.yield();
}
} catch (Disconnected d)
{
d.printStackTrace();
error_ = true;
}
}
public void connect(org.omg.CosNotifyChannelAdmin.EventChannel channel, boolean useOrSemantic)
throws AlreadyConnected
{
EventChannel _channel = EventChannelHelper.narrow(channel);
ConsumerAdmin _admin = _channel.for_consumers();
mySupplier_ = _admin.obtain_pull_supplier();
mySupplier_.connect_pull_consumer(_this(orb_));
connected_ = true;
}
public void shutdown()
{
mySupplier_.disconnect_pull_supplier();
}
}