package org.jacorb.test.notification;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
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.CosNotification.StructuredEvent;
import org.omg.CosNotifyChannelAdmin.AdminLimitExceeded;
import org.omg.CosNotifyChannelAdmin.ClientType;
import org.omg.CosNotifyChannelAdmin.ConsumerAdmin;
import org.omg.CosNotifyChannelAdmin.EventChannel;
import org.omg.CosNotifyChannelAdmin.ProxyType;
import org.omg.CosNotifyChannelAdmin.SequenceProxyPushSupplier;
import org.omg.CosNotifyChannelAdmin.SequenceProxyPushSupplierHelper;
import org.omg.CosNotifyComm.InvalidEventType;
import org.omg.CosNotifyComm.SequencePushConsumerHelper;
import org.omg.CosNotifyComm.SequencePushConsumerOperations;
import org.omg.CosNotifyComm.SequencePushConsumerPOATie;
class SequencePushReceiver extends Thread implements SequencePushConsumerOperations,
TestClientOperations
{
SequenceProxyPushSupplier pushSupplier_;
boolean connected_ = false;
long timeout_ = 2000;
final ORB orb_;
private int expected = -1;
final List received = new ArrayList();
public SequencePushReceiver(ORB orb)
{
orb_ = orb;
}
public void setExpected(int expected)
{
this.expected = expected;
}
public SequenceProxyPushSupplier getPushSupplier()
{
return pushSupplier_;
}
public void run()
{
final long start = System.currentTimeMillis();
synchronized (this)
{
while (!isDone() && (System.currentTimeMillis() < start + timeout_))
{
try
{
wait(timeout_);
} catch (InterruptedException e)
{
// ignored
}
}
}
}
private boolean isDone()
{
boolean done;
done = (expected != -1) ? received.size() == expected : received.size() > 0;
return done;
}
public void push_structured_events(StructuredEvent[] event) throws Disconnected
{
synchronized (this)
{
received.addAll(Arrays.asList(event));
notifyAll();
}
}
public void disconnect_sequence_push_consumer()
{
connected_ = false;
}
public void offer_change(EventType[] type1, EventType[] type2) throws InvalidEventType
{
// ignored
}
public void connect(EventChannel channel, boolean useOrSemantic) throws AdminLimitExceeded,
AlreadyConnected, TypeError
{
SequencePushConsumerPOATie receiverTie = new SequencePushConsumerPOATie(this);
ConsumerAdmin _consumerAdmin = channel.default_consumer_admin();
IntHolder _proxyIdHolder = new IntHolder();
pushSupplier_ = SequenceProxyPushSupplierHelper.narrow(_consumerAdmin
.obtain_notification_push_supplier(ClientType.SEQUENCE_EVENT, _proxyIdHolder));
Assert.assertEquals(ProxyType._PUSH_SEQUENCE, pushSupplier_.MyType().value());
pushSupplier_.connect_sequence_push_consumer(SequencePushConsumerHelper.narrow(receiverTie
._this(orb_)));
connected_ = true;
}
public boolean isEventHandled()
{
return isDone();
}
public boolean isConnected()
{
return connected_;
}
public boolean isError()
{
return false;
}
public void shutdown()
{
pushSupplier_.disconnect_sequence_push_supplier();
}
public List getResult()
{
return received;
}
}