package org.jacorb.test.notification; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicInteger; import org.junit.Assert; import org.omg.CORBA.Any; 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.ConsumerAdmin; import org.omg.CosNotifyChannelAdmin.EventChannel; import org.omg.CosNotifyChannelAdmin.InterFilterGroupOperator; import org.omg.CosNotifyChannelAdmin.ProxyPushSupplier; import org.omg.CosNotifyChannelAdmin.ProxyPushSupplierHelper; import org.omg.CosNotifyChannelAdmin.ProxyType; import org.omg.CosNotifyComm.PushConsumerPOA; import org.omg.CosNotifyFilter.Filter; import org.omg.CosNotifyFilter.FilterNotFound; public class AnyPushReceiver extends PushConsumerPOA implements Runnable, TestClientOperations { ORB orb_; long receiveTime_; CyclicBarrier barrier_; ProxyPushSupplier mySupplier_; boolean connected_; int numberOfExpectedEvents_ = 1; private final AtomicInteger received_ = new AtomicInteger(0); long timeout_ = 8000L; int filterId_ = Integer.MIN_VALUE; ConsumerAdmin myAdmin_; private final Object lock_ = new Object(); public AnyPushReceiver(ORB orb) { orb_ = orb; } public void setNumberOfExpectedEvents(int number) { numberOfExpectedEvents_ = number; } public void setFilter(Filter filter) { filterId_ = mySupplier_.add_filter(filter); } public void addAdminFilter(Filter filter) { Assert.assertNotNull(myAdmin_); myAdmin_.add_filter(filter); } public void addProxyFilter(Filter filter) { Assert.assertNotNull(mySupplier_); mySupplier_.add_filter(filter); } public boolean isEventHandled() { if (numberOfExpectedEvents_ > 0) { return received_.get() == numberOfExpectedEvents_; } return received_.get() > 0; } public void setTimeOut(long timeout) { timeout_ = timeout; } public void setBarrier(CyclicBarrier barrier) { barrier_ = barrier; } public void shutdown() throws FilterNotFound { if (filterId_ != Integer.MIN_VALUE) { mySupplier_.remove_filter(filterId_); } mySupplier_.disconnect_push_supplier(); myAdmin_.destroy(); } public void connect(EventChannel channel, boolean useOrSemantic) throws AdminLimitExceeded, TypeError, AlreadyConnected, AdminNotFound { IntHolder _proxyId = new IntHolder(); IntHolder _adminId = new IntHolder(); if (useOrSemantic) { myAdmin_ = channel.new_for_consumers(InterFilterGroupOperator.OR_OP, _adminId); Assert.assertEquals(InterFilterGroupOperator.OR_OP, myAdmin_.MyOperator()); } else { myAdmin_ = channel.new_for_consumers(InterFilterGroupOperator.AND_OP, _adminId); Assert.assertEquals(InterFilterGroupOperator.AND_OP, myAdmin_.MyOperator()); } Assert.assertEquals(myAdmin_, channel.get_consumeradmin(_adminId.value)); mySupplier_ = ProxyPushSupplierHelper.narrow(myAdmin_.obtain_notification_push_supplier( ClientType.ANY_EVENT, _proxyId)); Assert.assertEquals(ProxyType._PUSH_ANY, mySupplier_.MyType().value()); mySupplier_.connect_any_push_consumer(_this(orb_)); connected_ = true; } public int getReceived() { return received_.get(); } public void run() { if (!isEventHandled()) { try { synchronized (lock_) { lock_.wait(timeout_); } } catch (InterruptedException e) { // ignored } } if (barrier_ != null) { try { barrier_.await(); } catch (Exception e) { // ignored } } } public void push(Any any) throws Disconnected { received_.incrementAndGet(); if (numberOfExpectedEvents_ > 0 && (received_.get() == numberOfExpectedEvents_)) { synchronized (lock_) { lock_.notifyAll(); } } } public long calcTotalTime(long start) { return (receiveTime_ - start); } public boolean isConnected() { return connected_; } public boolean isError() { return false; } public void disconnect_push_consumer() { connected_ = false; } public void offer_change(EventType[] e1, EventType[] e2) { // ignored } }