/* * DDS (Data Distribution Service) for JacORB * * Copyright (C) 2005-2014 Gerald Brose / The JacORB Team. * allaoui <fouad.allaoui@gmail.com>, Didier Donsez (didier.donsez@ieee.org) * * This program 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 program 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 program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. * * Coontact: Ahmed yehdih <ahmed.yehdih@gmail.com>, fouad allaoui * <fouad.allaoui@gmail.com>, Didier Donsez (didier.donsez@ieee.org) * Contributor(s) * **/ package org.jacorb.dds; import java.lang.reflect.Method; import java.util.Iterator; import java.util.Vector; import org.jacorb.util.ObjectUtil; import org.omg.PortableServer.Servant; import org.omg.dds.DataWriter; import org.omg.dds.DataWriterListener; import org.omg.dds.DataWriterQos; import org.omg.dds.DataWriterQosHolder; import org.omg.dds.DomainParticipant; import org.omg.dds.Publisher; import org.omg.dds.PublisherListener; import org.omg.dds.PublisherPOA; import org.omg.dds.PublisherQos; import org.omg.dds.PublisherQosHolder; import org.omg.dds.RETCODE_OK; import org.omg.dds.RETCODE_PRECONDITION_NOT_MET; import org.omg.dds.StatusCondition; import org.omg.dds.Topic; import org.omg.dds.TopicQos; /** * A Publisher is the object responsible for the actual dissemination of publications. * The Publisher acts on the behalf of one or several DataWriter objects that belong to * it. When it is informed of a change to the data associated with one of its DataWriter * objects, it decides when it is appropriate to actually send the data-update message. * In making this decision, it considers any extra information that goes with the data * (timestamp, writer, etc.) as well as the QoS of the Publisher and the DataWriter. */ public class PublisherImpl extends PublisherPOA { private org.omg.CORBA.ORB orb ; private org.omg.PortableServer.POA poa ; private Vector Vector_DataWriter ; private PublisherQos qos ; private DomainParticipant DP_Parent ; private DataWriterQos Default_DataWriterqos ; //put message of publisher in channel event private PublisherListener listner ; public PublisherImpl(PublisherQos qos ,PublisherListener listner , DomainParticipant DP ){ this.qos = qos ; this.listner = listner ; Vector_DataWriter = new Vector() ; this.DP_Parent = DP ; } /** * @param a_topic * @param qos * @param a_listener * @return */ public DataWriter create_datawriter(Topic a_topic, DataWriterQos qos, DataWriterListener a_listener) { DataWriter DW = null ; Servant impl; try{ Class type = ObjectUtil.classForName(a_topic.get_type_name()+"DataWriterImpl") ; Class typehelper = ObjectUtil.classForName(a_topic.get_type_name()+"DataWriterHelper") ; Class type_param_constructor [] = new Class[6] ; Object valu_param_constructor [] = new Object[6] ; type_param_constructor[0] = DataWriterQos.class ; type_param_constructor[1] = DataWriterListener.class ; type_param_constructor[2] = Publisher.class ; type_param_constructor[3] = Topic.class ; type_param_constructor[4] = org.omg.CORBA.ORB .class ; type_param_constructor[5] = org.omg.PortableServer.POA.class ; valu_param_constructor[0] = qos ; valu_param_constructor[1] = a_listener ; valu_param_constructor[2] = this._this(); valu_param_constructor[3] = a_topic; valu_param_constructor[4] = orb ; valu_param_constructor[5] = poa ; impl = (Servant)type.getConstructor(type_param_constructor).newInstance(valu_param_constructor); org.omg.CORBA.Object oref = poa.servant_to_reference(impl); Class type_param_narrow [] = new Class [1 ]; org.omg.CORBA.Object valu_param_narrow [] = new org.omg.CORBA.Object[1]; valu_param_narrow[0] = oref ; type_param_narrow[0] = ObjectUtil.classForName("org.omg.CORBA.Object") ; Method Narrow = typehelper.getMethod("narrow",type_param_narrow ); DW = (DataWriter) Narrow.invoke(null, (Object[])valu_param_narrow); add( DW); } catch(Exception e){ System.out.println(e); e.printStackTrace(); } return DW; } /** * @param a_datawriter * @return */ public int delete_datawriter(DataWriter a_datawriter) { if(_this() == a_datawriter.get_publisher()){ remove(a_datawriter); return RETCODE_OK.value ; } else return RETCODE_PRECONDITION_NOT_MET.value ; } /** * @param topic_name * @return */ public DataWriter lookup_datawriter(String topic_name) { Iterator It = Vector_DataWriter.iterator(); DataWriter temp ; while(It.hasNext()){ temp = (DataWriter)It.next() ; if(temp.get_topic().get_name().equals(topic_name)) return temp ; } return null ; } /** * Not Implemented * @return */ public int delete_contained_entities() { return 0; } /** * @param qos * @return */ public int set_qos(PublisherQos qos) { this.qos = qos ; return RETCODE_OK.value ; } /** * @param qos */ public void get_qos(PublisherQosHolder qos) { qos.value = this.qos ; } /** * @param a_listener * @param mask * @return */ public int set_listener(PublisherListener a_listener, int mask) { this.listner = a_listener ; return RETCODE_OK.value ; } /** * @return */ public PublisherListener get_listener() { return listner ; } /** * Not Implemented * @return */ public int suspend_publications() { return 0; } /** * Not Implemented * @return */ public int resume_publications() { return 0; } /** * Not Implemented * @return */ public int begin_coherent_changes() { return 0; } /** * Not Implemented * @return */ public int end_coherent_changes() { return 0; } /** * @return */ public DomainParticipant get_participant() { return DP_Parent; } /** * @param qos * @return */ public int set_default_datawriter_qos(DataWriterQos qos) { this.Default_DataWriterqos = qos ; return RETCODE_OK.value; } /** * @param qos */ public void get_default_datawriter_qos(DataWriterQosHolder qos) { qos.value = this.Default_DataWriterqos ; } /** * @param a_datawriter_qos * @param a_topic_qos * @return */ public int copy_from_topic_qos(DataWriterQosHolder a_datawriter_qos, TopicQos a_topic_qos) { a_datawriter_qos.value.deadline = a_topic_qos.deadline ; a_datawriter_qos.value.destination_order = a_topic_qos.destination_order ; a_datawriter_qos.value.durability = a_topic_qos.durability ; a_datawriter_qos.value.history = a_topic_qos.history ; a_datawriter_qos.value.latency_budget = a_topic_qos.latency_budget ; a_datawriter_qos.value.liveliness = a_topic_qos.liveliness ; a_datawriter_qos.value.reliability = a_topic_qos.reliability ; a_datawriter_qos.value.resource_limits = a_topic_qos.resource_limits ; return RETCODE_OK.value; } /** * Not Implemented * @return */ public int enable() { return 0; } /** * Not Implemented * @return */ public StatusCondition get_statuscondition() { return null; } /** * Not Implemented * @return */ public int get_status_changes() { return 0; } /** * @param orb The orb to set. */ public void setORB(org.omg.CORBA.ORB orb) { this.orb = orb; } /** * @param poa The poa to set. */ public void setPOA(org.omg.PortableServer.POA poa) { this.poa = poa; } /** * @return Returns the vector_DataWriter. */ public Vector getVector_DataWriter() { return Vector_DataWriter; } /** * @param arg0 * @return */ public boolean add(Object arg0) { return Vector_DataWriter.add(arg0); } /** * @param arg0 * @return */ public boolean remove(Object arg0) { return Vector_DataWriter.remove(arg0); } /** * @return */ public boolean isDeletable(){ return getVector_DataWriter().isEmpty(); } }