package org.jacorb.test.notification;
import org.jacorb.test.notification.common.NotificationTestUtils;
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.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.AdminNotFound;
import org.omg.CosNotifyChannelAdmin.ClientType;
import org.omg.CosNotifyChannelAdmin.EventChannel;
import org.omg.CosNotifyChannelAdmin.ProxyType;
import org.omg.CosNotifyChannelAdmin.StructuredProxyPullConsumer;
import org.omg.CosNotifyChannelAdmin.StructuredProxyPullConsumerHelper;
import org.omg.CosNotifyChannelAdmin.SupplierAdmin;
import org.omg.CosNotifyComm.InvalidEventType;
import org.omg.CosNotifyComm.StructuredPullSupplierHelper;
import org.omg.CosNotifyComm.StructuredPullSupplierOperations;
import org.omg.CosNotifyComm.StructuredPullSupplierPOATie;
/**
* @author Alphonse Bendt
*/
public class StructuredPullSender extends Thread implements StructuredPullSupplierOperations,
TestClientOperations
{
ORB orb_;
StructuredEvent event_;
StructuredProxyPullConsumer pullConsumer_;
private boolean error_;
boolean connected_;
boolean eventHandled_;
boolean available_;
public boolean isError()
{
return error_;
}
public boolean isEventHandled()
{
return eventHandled_;
}
public StructuredPullSender(ORB orb, StructuredEvent event)
{
event_ = event;
orb_ = orb;
}
public void run()
{
synchronized (this)
{
available_ = true;
}
}
// Implementation of org.omg.CosNotifyComm.NotifySubscribeOperations
public void subscription_change(EventType[] eventType1, EventType[] eventType2)
throws InvalidEventType
{
// ignored
}
// Implementation of org.omg.CosNotifyComm.StructuredPullSupplierOperations
/**
* Describe <code>pull_structured_event</code> method here.
*
* @return a <code>StructuredEvent</code> value
* @exception Disconnected
* if an error occurs
*/
public StructuredEvent pull_structured_event() throws Disconnected
{
BooleanHolder _success = new BooleanHolder();
StructuredEvent _event;
while (true)
{
_event = try_pull_structured_event(_success);
if (_success.value)
{
return _event;
}
Thread.yield();
}
}
/**
* Describe <code>try_pull_structured_event</code> method here.
*
* @param booleanHolder
* a <code>BooleanHolder</code> value
* @return a <code>StructuredEvent</code> value
* @exception Disconnected
* if an error occurs
*/
public StructuredEvent try_pull_structured_event(BooleanHolder booleanHolder)
throws Disconnected
{
booleanHolder.value = false;
StructuredEvent _result = NotificationTestUtils.getInvalidStructuredEvent(orb_);
if (event_ != null)
{
synchronized (this)
{
if (event_ != null && available_)
{
_result = event_;
event_ = null;
booleanHolder.value = true;
eventHandled_ = true;
}
}
}
return _result;
}
/**
* Describe <code>disconnect_structured_pull_supplier</code> method here.
*
*/
public void disconnect_structured_pull_supplier()
{
connected_ = false;
}
public void connect(EventChannel channel, boolean useOrSemantic) throws AdminLimitExceeded,
AlreadyConnected, TypeError, AdminNotFound
{
StructuredPullSupplierPOATie _senderTie = new StructuredPullSupplierPOATie(this);
SupplierAdmin _supplierAdmin = channel.default_supplier_admin();
IntHolder _proxyId = new IntHolder();
pullConsumer_ = StructuredProxyPullConsumerHelper.narrow(_supplierAdmin
.obtain_notification_pull_consumer(ClientType.STRUCTURED_EVENT, _proxyId));
Assert.assertEquals(_supplierAdmin, channel.get_supplieradmin(_supplierAdmin.MyID()));
Assert.assertEquals(pullConsumer_.MyType(), ProxyType.PULL_STRUCTURED);
pullConsumer_.connect_structured_pull_supplier(StructuredPullSupplierHelper
.narrow(_senderTie._this(orb_)));
connected_ = true;
}
public void shutdown()
{
pullConsumer_.disconnect_structured_pull_consumer();
Assert.assertTrue(pullConsumer_._non_existent());
}
public boolean isConnected()
{
return connected_;
}
}