package org.jacorb.events; /* * JacORB - a free Java ORB * * Copyright (C) 1997-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ import org.omg.CORBA.OBJECT_NOT_EXIST; import org.omg.CosEventComm.Disconnected; import org.omg.CosEventComm.PushConsumer; /** * Implementation of COSEventChannelAdmin interface; ProxyPushSupplier. * This defines connect_push_consumer() and disconnect_push_supplier(). Helper * method will push a method to the registered consumer. * * 2002/23/08 JFC OMG EventService Specification 1.1 page 2-7 states: * "Registration is a two step process. An event-generating application * first obtains a proxy consumer from a channel, then 'connects' to the * proxy consumer by providing it with a supplier. ... The reason for * the two step registration process..." * Modifications to support the above have been made as well as to support * section 2.1.5 "Disconnection Behavior" on page 2-4. * * @author Jeff Carlson, Joerg v. Frantzius, Rainer Lischetzki, Gerald Brose */ public class ProxyPushSupplierImpl extends org.omg.CosEventChannelAdmin.ProxyPushSupplierPOA { private EventChannelImpl myEventChannel; private PushConsumer myPushConsumer; private org.omg.PortableServer.POA myPoa; private boolean connected; /** * Constructor - to be called by EventChannel */ protected ProxyPushSupplierImpl ( EventChannelImpl ec, org.omg.CORBA.ORB orb, org.omg.PortableServer.POA poa ) { myEventChannel = ec; myPoa = poa; connected = false; _this_object( orb ); } /** * fuers ProxyPushSupplier Interface. * As stated by the EventService specification 1.1 section 2.3.7: * "If a ProxyPushSupplier is already connected to a PushConsumer, then the * AlreadyConnected exception is raised." * and * "Implementations shall raise the CORBA standard BAD_PARAM exception if * a nil object reference is passed to the connect_push_consumer." */ public void connect_push_consumer ( PushConsumer pushConsumer ) throws org.omg.CosEventChannelAdmin.AlreadyConnected, org.omg.CORBA.BAD_PARAM { if ( connected ) { throw new org.omg.CosEventChannelAdmin.AlreadyConnected(); } if ( pushConsumer == null ) { throw new org.omg.CORBA.BAD_PARAM(); } myPushConsumer = pushConsumer; connected = true; } /** * fuers PushSupplier Interface * See EventService v 1.1 specification section 2.1.2. * 'disconnect_push_supplier terminates the event communication; it releases * resources used at the supplier to support event communication. Calling * this causes the implementation to call disconnect_push_consumer operation * on the corresponding PushSupplier interface (if that iterface is known).' * See EventService v 1.1 specification section 2.1.5. This method should * adhere to the spec as it a) causes a call to the corresponding disconnect * on the connected supplier, b) 'If a consumer or supplier has received a * disconnect call and subsequently receives another disconnect call, it * shall raise a CORBA::OBJECT_NOT_EXIST exception. */ public void disconnect_push_supplier() { if ( connected ) { if ( myPushConsumer != null ) { myPushConsumer.disconnect_push_consumer(); myPushConsumer = null; } connected = false; } else { throw new OBJECT_NOT_EXIST(); } } /** * Methoden, die von unserem EventChannel aufgerufen werden */ protected void push_to_consumer(org.omg.CORBA.Any event ) { if ( connected ) { try { myPushConsumer.push ( event ); } catch( Disconnected e ) { connected = false; } } } /** * Override this method from the Servant baseclass. Fintan Bolton * in his book "Pure CORBA" suggests that you override this method to * avoid the risk that a servant object (like this one) could be * activated by the <b>wrong</b> POA object. */ public org.omg.PortableServer.POA _default_POA() { return myPoa; } }