package org.jacorb.test.notification; import org.jacorb.test.notification.common.NotificationTestCase; import org.junit.Assert; import org.omg.CORBA.BooleanHolder; import org.omg.CORBA.IntHolder; import org.omg.CORBA.ORB; import org.omg.CosEventChannelAdmin.AlreadyConnected; 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.ProxyPullSupplier; import org.omg.CosNotifyChannelAdmin.ProxyPullSupplierHelper; import org.omg.CosNotifyChannelAdmin.ProxyType; import org.omg.CosNotifyComm.PullConsumerPOA; /** * @author Alphonse Bendt */ public class AnyPullReceiver extends PullConsumerPOA implements Runnable, TestClientOperations { boolean received_ = false; boolean error_ = false; ORB orb_; ProxyPullSupplier mySupplier_; long TIMEOUT = 5000; boolean connected_; ConsumerAdmin myAdmin_; NotificationTestCase testCase_; public AnyPullReceiver(ORB orb) { orb_ = orb; } public void connect(EventChannel channel, boolean useOrSemantic) throws AdminNotFound, AlreadyConnected, AdminLimitExceeded { 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_ = ProxyPullSupplierHelper.narrow(myAdmin_. obtain_notification_pull_supplier(ClientType.ANY_EVENT, _proxyId)); Assert.assertEquals(ProxyType._PULL_ANY, mySupplier_.MyType().value()); mySupplier_.connect_any_pull_consumer(_this(orb_)); connected_ = true; } public void shutdown() { mySupplier_.disconnect_pull_supplier(); mySupplier_ = null; if (myAdmin_ != null) { myAdmin_.destroy(); myAdmin_ = null; } } void reset() { error_ = false; received_ = false; } public boolean isConnected() { return connected_; } public boolean isEventHandled() { return received_; } public boolean isError() { return error_; } public void run() { BooleanHolder _success = new BooleanHolder(); _success.value = false; long _startTime = System.currentTimeMillis(); try { while (true) { mySupplier_.try_pull(_success); if (_success.value) { received_ = true; break; } if (System.currentTimeMillis() < _startTime + TIMEOUT) { Thread.yield(); } else { received_ = false; break; } } } catch (Disconnected d) { d.printStackTrace(); error_ = true; } } public void offer_change(EventType[] e1, EventType[] e2) { // ignored } public void disconnect_pull_consumer() { connected_ = false; } }