/*
* 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.DataReader;
import org.omg.dds.DataReaderListener;
import org.omg.dds.DataReaderQos;
import org.omg.dds.DataReaderQosHolder;
import org.omg.dds.DataReaderSeqHolder;
import org.omg.dds.DomainParticipant;
import org.omg.dds.RETCODE_OK;
import org.omg.dds.RETCODE_PRECONDITION_NOT_MET;
import org.omg.dds.StatusCondition;
import org.omg.dds.Subscriber;
import org.omg.dds.SubscriberListener;
import org.omg.dds.SubscriberPOA;
import org.omg.dds.SubscriberQos;
import org.omg.dds.SubscriberQosHolder;
import org.omg.dds.Topic;
import org.omg.dds.TopicDescription;
import org.omg.dds.TopicHelper;
import org.omg.dds.TopicQos;
/**
* A Subscriber is the object responsible for the actual reception of the data resulting
* from its subscriptions. A Subscriber acts on the behalf of one or several DataReader
* objects that are related to it. When it receives data (from the other parts of the
* system), it builds the list of concerned DataReader objects, and then indicates to
* the application that data is available, through its listener or by enabling related
* conditions. The application can access the list of concerned DataReader objects
* through the operation get_datareaders and then access the data available though
* operations on the DataReader.
*/
public class SubscriberImpl extends SubscriberPOA {
private org.omg.CORBA.ORB orb ;
private org.omg.PortableServer.POA poa ;
private Vector Vector_DataReaders ;
private SubscriberQos qos ;
private DomainParticipant DP_Parent ;
private DataReaderQos Default_DataReaderqos ;
// represent the data wrote by the datawriter
private Object instance ;
private SubscriberListener listner ;
/**
* @param qos
* @param listner
* @param DP
*/
public SubscriberImpl(SubscriberQos qos ,SubscriberListener listner , DomainParticipant DP ){
this.qos = qos ;
this.listner = listner ;
Vector_DataReaders = new Vector() ;
this.DP_Parent = DP ;
}
/**
* @param a_topic
* @param qos
* @param a_listener
* @return
*/
public DataReader create_datareader(TopicDescription a_topic,
DataReaderQos qos, DataReaderListener a_listener) {
DataReader DR = null ;
Servant impl;
try{
Class type = ObjectUtil.classForName(a_topic.get_type_name()+"DataReaderImpl") ;
Class typehelper = ObjectUtil.classForName(a_topic.get_type_name()+"DataReaderHelper") ;
Class type_param_constructor [] = new Class[6] ;
Object valu_param_constructor [] = new Object[6] ;
type_param_constructor[0] = DataReaderQos.class ;
type_param_constructor[1] = DataReaderListener.class ;
type_param_constructor[2] = Subscriber.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] = TopicHelper.narrow(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 );
DR = (DataReader) Narrow.invoke(null, (Object[])valu_param_narrow);
add( DR);
}
catch(Exception e){
System.out.println("Eroor "+e);
e.printStackTrace();
}
return DR;
}
/**
* @param a_datareader
* @return
*/
public int delete_datareader(DataReader a_datareader) {
if(_this() == a_datareader.get_subscriber()){
remove(a_datareader);
return RETCODE_OK.value ;
}
else return RETCODE_PRECONDITION_NOT_MET.value ;
}
/**
* Not Implemented
* @return
*/
public int delete_contained_entities() {
return 0;
}
/**
* @param topic_name
* @return
*/
public DataReader lookup_datareader(String topic_name) {
Iterator It = Vector_DataReaders.iterator();
DataReader temp ;
while(It.hasNext()){
temp = (DataReader)It.next() ;
if(temp.get_topicdescription().get_name().equals(topic_name)) {
return temp ;
}
}
return null ;
}
/**
* @param readers
* @param sample_states
* @param view_states
* @param instance_states
* @return
*/
public int get_datareaders(DataReaderSeqHolder readers, int sample_states,
int view_states, int instance_states) {
readers.value = (DataReader []) getVector_DataReaders().toArray() ;
return RETCODE_OK.value ;
}
/**
* @param
* @return
*/
public void notify_datareaders() {
Iterator It = Vector_DataReaders.iterator();
DataReader temp ;
while(It.hasNext()){
temp = (DataReader)It.next() ;
temp.get_listener().on_data_available(temp);
}
}
/**
* @param qos
* @return
*/
public int set_qos(SubscriberQos qos) {
this.qos = qos ;
return RETCODE_OK.value ;
}
/**
* @param qos
*/
public void get_qos(SubscriberQosHolder qos) {
qos.value = this.qos ;
}
/**
* @param a_listener
* @param mask
* @return
*/
public int set_listener(SubscriberListener a_listener, int mask) {
this.listner = a_listener ;
return RETCODE_OK.value ;
}
/**
* @return
*/
public SubscriberListener get_listener() {
return listner ;
}
/**
* Not Implemented
* @return
*/
public int begin_access() {
return 0;
}
/**
* Not Implemented
* @return
*/
public int end_access() {
return 0;
}
/**
* @return
*/
public DomainParticipant get_participant() {
return getDP_Parent();
}
/**
* @param qos
* @return
*/
public int set_default_datareader_qos(DataReaderQos qos) {
this.Default_DataReaderqos = qos ;
return RETCODE_OK.value ;
}
/**
* @param qos
*/
public void get_default_datareader_qos(DataReaderQosHolder qos) {
qos.value = this.Default_DataReaderqos ;
}
/**
* @param a_datareader_qos
* @param a_topic_qos
* @return
*/
public int copy_from_topic_qos(DataReaderQosHolder a_datareader_qos,
TopicQos a_topic_qos) {
a_datareader_qos.value.deadline = a_topic_qos.deadline ;
a_datareader_qos.value.destination_order = a_topic_qos.destination_order ;
a_datareader_qos.value.durability = a_topic_qos.durability ;
a_datareader_qos.value.history = a_topic_qos.history ;
a_datareader_qos.value.latency_budget = a_topic_qos.latency_budget ;
a_datareader_qos.value.liveliness = a_topic_qos.liveliness ;
a_datareader_qos.value.reliability = a_topic_qos.reliability ;
a_datareader_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;
}
/**
* Not Implemented
* @return
*/
public boolean isDeletable(){
return getVector_DataReaders().isEmpty();
}
/**
* @return Returns the vector_DataReaders.
*/
public Vector getVector_DataReaders() {
return Vector_DataReaders;
}
/**
* @param arg0
* @return
*/
public boolean add(DataReader DR) {
return Vector_DataReaders.add(DR);
}
/**
* @param arg0
* @return
*/
public boolean remove(DataReader DR) {
return Vector_DataReaders.remove(DR);
}
/**
* @return Returns the dP_Parent.
*/
public DomainParticipant getDP_Parent() {
return DP_Parent;
}
/**
* @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 instance.
*/
public Object getInstance() {
return instance;
}
/**
* @param instance The instance to set.
*/
public void setInstance(Object instance) {
this.instance = instance;
}
}