/*
* 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.util.Iterator;
import java.util.Vector;
import org.omg.dds.ContentFilteredTopic;
import org.omg.dds.DomainParticipantListener;
import org.omg.dds.DomainParticipantPOA;
import org.omg.dds.DomainParticipantQos;
import org.omg.dds.DomainParticipantQosHolder;
import org.omg.dds.Duration_t;
import org.omg.dds.MultiTopic;
import org.omg.dds.Publisher;
import org.omg.dds.PublisherListener;
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.RETCODE_UNSUPPORTED;
import org.omg.dds.StatusCondition;
import org.omg.dds.Subscriber;
import org.omg.dds.SubscriberListener;
import org.omg.dds.SubscriberQos;
import org.omg.dds.SubscriberQosHolder;
import org.omg.dds.Topic;
import org.omg.dds.TopicDescription;
import org.omg.dds.TopicListener;
import org.omg.dds.TopicQos;
import org.omg.dds.TopicQosHolder;
/**
* The DomainParticipant object plays several roles:
* - It acts as a container for all other Entity objects
* - It acts as factory for the Publisher, Subscriber, Topic and MultiTopic Entity objects.
* - It represents the participation of the application on a communication plane that
* isolates applications running on the same set of physical computers from each other.
* A domain establishes a 'virtual network' linking all applications that share the
* same domainId9 and isolating them from applications running on different domains.
* In this way, several independent distributed applications can coexist in the same
* physical network without interfering, or even being aware of each other.
* - It provides administration services in the domain, offering operations that allow the
* application to 'ignore' locally any information about a given participant
*/
public class DomainParticipantImpl extends DomainParticipantPOA {
private org.omg.CORBA.ORB orb ;
private org.omg.PortableServer.POA poa ;
private int domainId ;
private org.omg.dds.DomainParticipantQos qos;
private org.omg.dds.DomainParticipantListener a_listener;
private Vector Vector_Publisher ;
private Vector Vector_Subscriber ;
private Vector Vector_Topic ;
/**
* @param domainId
* @param qos
* @param a_listener
*/
public DomainParticipantImpl(int domainId , org.omg.dds.DomainParticipantQos qos , org.omg.dds.DomainParticipantListener a_listener){
this.domainId = domainId ;
this.qos = qos ;
this.a_listener = a_listener ;
Vector_Publisher = new Vector() ;
Vector_Subscriber = new Vector();
Vector_Topic = new Vector();
}
/**
* @param Pub
*/
public void addPublisher(Publisher Pub){
Vector_Publisher.add(Pub);
}
/**
* @param Pub
*/
public void deletePublisher(Publisher Pub){
Vector_Publisher.remove(Pub);
}
/**
* @param Sub
*/
public void addsubscriber(Subscriber Sub){
Vector_Subscriber.add(Sub);
}
/**
* @param Sub
*/
public void deleteSubscriber(Subscriber Sub){
Vector_Subscriber.remove(Sub);
}
/**
* @param Top
*/
public void addTopic(Topic Top){
Vector_Topic.add(Top);
}
/**
* @param Top
*/
public void deleteTopic(Topic Top){
Vector_Topic.remove( Top);
}
/**
* Sets the pOA attribute of the RepertoryImpl object
*
*@param poa The new pOA value
*/
public void setPOA(org.omg.PortableServer.POA poa) {
this.poa = poa;
}
/**
* Sets the oRB attribute of the RepertoryImpl object
*
*@param orb The new oRB value
*/
public void setORB(org.omg.CORBA.ORB orb) {
this.orb = orb;
}
/**
* @param qos
* @param a_listener
* @return
*/
public Publisher create_publisher(PublisherQos qos,PublisherListener a_listener) {
org.omg.dds.Publisher ref = null ;
PublisherImpl impl= new PublisherImpl( qos, a_listener , _this() );
impl.setORB(orb);
impl.setPOA(poa);
try{
org.omg.CORBA.Object oref = poa.servant_to_reference(impl);
ref = org.omg.dds.PublisherHelper.narrow(oref);
addPublisher(ref);
}
catch(Exception e){
}
return ref ;
}
/**
* @param p
* @return
*/
public int delete_publisher(Publisher p) {
try{
boolean delete_ok = ((PublisherImpl) poa.reference_to_servant(p)).isDeletable();
if(delete_ok ){
deletePublisher(p);
}
else {
return RETCODE_PRECONDITION_NOT_MET.value ;
}
}
catch(Exception e){
}
return RETCODE_OK.value ;
}
/**
* @param qos
* @param a_listener
* @return
*/
public Subscriber create_subscriber(SubscriberQos qos,
SubscriberListener a_listener) {
org.omg.dds.Subscriber ref = null ;
org.jacorb.dds.SubscriberImpl impl= new org.jacorb.dds.SubscriberImpl( qos, a_listener , _this());
impl.setORB(orb);
impl.setPOA(poa);
try{
org.omg.CORBA.Object oref = poa.servant_to_reference(impl);
ref = org.omg.dds.SubscriberHelper.narrow(oref);
addsubscriber(ref);
}
catch(Exception e){
}
return ref ;
}
/**
* @param s
* @return
*/
public int delete_subscriber(Subscriber s) {
try{
boolean delete_ok = ((SubscriberImpl) poa.reference_to_servant(s)).isDeletable();
if(delete_ok ){
deleteSubscriber(s);
}
else {
return RETCODE_PRECONDITION_NOT_MET.value ;
}
}
catch(Exception e){
}
return RETCODE_OK.value ;
}
/**
* Not Implemented
* @return
*/
public Subscriber get_builtin_subscriber() {
return null;
}
/**
* @param topic_name
* @param type_name
* @param qos
* @param a_listener
* @return
*/
public Topic create_topic(String topic_name, String type_name,
TopicQos qos, TopicListener a_listener) {
org.omg.dds.Topic ref = null ;
org.jacorb.dds.TopicImpl impl= new org.jacorb.dds.TopicImpl( topic_name,type_name, qos, a_listener,_this());
impl.setORB(orb);
impl.setPOA(poa);
try{
ref = (Topic)lookup_topicdescription(topic_name);
//not exist another topic has same name
if(ref == null){
org.omg.CORBA.Object oref = poa.servant_to_reference(impl);
ref = org.omg.dds.TopicHelper.narrow(oref);
addTopic(ref);
}
else {
if(!(ref.get_type_name().equals(type_name))){
ref = null ;
}
}
}
catch(Exception e){
}
return ref ;
}
/**
* @param a_topic
* @return
*/
public int delete_topic(Topic a_topic) {
Iterator It = Vector_Subscriber.iterator() ;
Subscriber temp ;
while(It.hasNext()){
temp = (Subscriber)It.next() ;
if (temp.lookup_datareader(a_topic.get_name())!= null){
return RETCODE_PRECONDITION_NOT_MET.value ;
}
}
It = Vector_Publisher.iterator() ;
Publisher pub ;
while(It.hasNext()){
pub = (Publisher)It.next() ;
if (pub.lookup_datawriter(a_topic.get_name())!= null){
return RETCODE_PRECONDITION_NOT_MET.value ;
}
}
delete_topic(a_topic );
return RETCODE_OK.value ;
}
public Topic find_topic(String topic_name, Duration_t timeout) {
return null;
}
/**
* @param name
* @return
*/
public TopicDescription lookup_topicdescription(String name) {
TopicDescription topic = null ,temp;
Iterator Iter = Vector_Topic.iterator();
while(Iter.hasNext()){
temp = (TopicDescription)Iter.next();
if(temp.get_name().equals(name)) topic = temp ;
}
return topic;
}
/**
* Not Implemented
* @return
*/
public ContentFilteredTopic create_contentfilteredtopic(String name,
Topic related_topic, String filter_expression,
String[] filter_parameters) {
return null;
}
/**
* Not Implemented
* @return
*/
public int delete_contentfilteredtopic(
ContentFilteredTopic a_contentfilteredtopic) {
return 0;
}
/**
* Not Implemented
* @return
*/
public MultiTopic create_multitopic(String name, String type_name,
String subscription_expression, String[] expression_parameters) {
return null;
}
/**
* Not Implemented
* @return
*/
public int delete_multitopic(MultiTopic a_multitopic) {
return 0;
}
/**
* Not Implemented
* @return
*/
public int delete_contained_entities() {
return 0;
}
/**
* @param qos
* @return
*/
public int set_qos(DomainParticipantQos qos) {
this.qos = qos ;
return 0;
}
/**
* @param qos
*/
public void get_qos(DomainParticipantQosHolder qos) {
qos.value = this.qos ;
}
/**
* @param a_listener
* @param mask
* @return
*/
public int set_listener(DomainParticipantListener a_listener, int mask) {
// TODO Auto-generated method stub
return 0;
}
/**
* Not Implemented
* @return
*/
public DomainParticipantListener get_listener() {
return null;
}
/**
* Not Implemented
* @return
*/
public int ignore_participant(int handle) {
return 0;
}
/**
* Not Implemented
* @return
*/
public int ignore_topic(int handle) {
return 0;
}
/**
* Not Implemented
* @return
*/
public int ignore_publication(int handle) {
return 0;
}
/**
* Not Implemented
* @return
*/
public int ignore_subscription(int handle) {
return 0;
}
/**
* Not Implemented
* @return
*/
public int get_domain_id() {
return this.domainId ;
}
/**
* Not Implemented
* @return
*/
public void assert_liveliness() {
}
/**
* Not Implemented
* @return
*/
public int set_default_publisher_qos(PublisherQos qos) {
return 0;
}
/**
* Not Implemented
* @return
*/
public void get_default_publisher_qos(PublisherQosHolder qos) {
}
/**
* Not Implemented
* @return
*/
public int set_default_subscriber_qos(SubscriberQos qos) {
return 0;
}
/**
* Not Implemented
* @return
*/
public void get_default_subscriber_qos(SubscriberQosHolder qos) {
}
/**
* Not Implemented
* @return
*/
public int set_default_topic_qos(TopicQos qos) {
return 0;
}
/**
* Not Implemented
* @return
*/
public void get_default_topic_qos(TopicQosHolder qos) {
}
/**
* 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 RETCODE_UNSUPPORTED.value ;
}
/**
* @return Returns the vector_Publisher.
*/
public Vector getVector_Publisher() {
return Vector_Publisher;
}
/**
* @return Returns the vector_Subscriber.
*/
public Vector getVector_Subscriber() {
return Vector_Subscriber;
}
/**
* @return Returns the vector_Topic.
*/
public Vector getVector_Topic() {
return Vector_Topic;
}
/**
* @return
*/
public boolean isDeletable(){
return getVector_Publisher().isEmpty() && getVector_Subscriber().isEmpty()&& getVector_Topic().isEmpty() ;
}
}