Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java')
-rw-r--r--plugins/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java613
1 files changed, 0 insertions, 613 deletions
diff --git a/plugins/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java b/plugins/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
deleted file mode 100644
index 847134a95b8..00000000000
--- a/plugins/org.eclipse.osee.ote.messaging.dds/src/org/eclipse/osee/ote/messaging/dds/entity/DomainParticipant.java
+++ /dev/null
@@ -1,613 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Boeing.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Boeing - initial API and implementation
- *******************************************************************************/
-package org.eclipse.osee.ote.messaging.dds.entity;
-
-import java.util.Collection;
-import java.util.concurrent.CopyOnWriteArrayList;
-import org.eclipse.osee.framework.jdk.core.type.CompositeKeyHashMap;
-import org.eclipse.osee.ote.messaging.dds.DataStoreItem;
-import org.eclipse.osee.ote.messaging.dds.IDestination;
-import org.eclipse.osee.ote.messaging.dds.ISource;
-import org.eclipse.osee.ote.messaging.dds.NotImplementedException;
-import org.eclipse.osee.ote.messaging.dds.ReturnCode;
-import org.eclipse.osee.ote.messaging.dds.StatusKind;
-import org.eclipse.osee.ote.messaging.dds.listener.DataWriterListener;
-import org.eclipse.osee.ote.messaging.dds.listener.DomainParticipantListener;
-import org.eclipse.osee.ote.messaging.dds.listener.Listener;
-import org.eclipse.osee.ote.messaging.dds.listener.PublisherListener;
-import org.eclipse.osee.ote.messaging.dds.listener.SubscriberListener;
-import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
-import org.eclipse.osee.ote.messaging.dds.service.DomainId;
-import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
-import org.eclipse.osee.ote.messaging.dds.service.TypeRegistry;
-import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
-import org.eclipse.osee.ote.messaging.dds.service.TypeSupport;
-
-/**
- * Provides functionality for applications to participate within a domain as described in the DDS specification. The
- * DomainParticipant is a factory used by the application to create {@link Publisher}'s and {@link Subscriber}'s to
- * interact with the system.
- * <p>
- * In addition to the functionality described in the DDS specification, this class provides particular functionality to
- * interact with middleware which could be used to link this with another data system. The middleware is provided a
- * special publisher to inject data into this system, and receives data from all other publishers by means of the
- * {@link DomainParticipantListener}.
- *
- * @author Robert A. Fisher
- * @author David Diepenbrock
- */
-public class DomainParticipant extends Entity implements EntityFactory {
- private final DomainId domainId;
- // These collections REALLY need to be thread safe!!!
- private final CopyOnWriteArrayList<Publisher> publishers;
- private final CopyOnWriteArrayList<Subscriber> subscribers;
- private final CompositeKeyHashMap<String, String, Topic> topics;
-
- private final TypeRegistry typeRegistry;
- private Publisher middlewarePublisher; // Publisher who can send anything
-
- // DONT_NEED The builtinSubscriber is here for future functionality that is described in the DDS specification but has not been implemented or used.
- private final Subscriber builtinSubscriber;
-
- /**
- * @param domainId The domain this participant will belong to
- * @param domain A reference to the collection of all participants in this domain.
- * @param enabled Flag which indicates if this is enabled.
- * @param listener The listener attached to this.
- * @param parentFactory A reference to the factory that is creating this.
- * @param threadedPublishing <code>True</code> if we should create a separate thread for processing published data.
- * If <code>False</code>, the published data will be processed within the thread which makes the call to write data
- * into the system (or resume publications).
- * @param typeCapacity The initial capacity to use when creating the <code>Map</code> for the {@link TypeRegistry}.
- * @param typeFactor The load factor to use when creating the <code>Map</code> for the {@link TypeRegistry}.
- */
- DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing, int typeCapacity, float typeFactor) {
- super(enabled, listener, parentFactory);
-
- this.domainId = domainId;
- this.publishers = new CopyOnWriteArrayList<>(); // Thread Safe
- this.subscribers = new CopyOnWriteArrayList<>(); // Thread Safe
- this.topics = new CompositeKeyHashMap<>(512, true);
- this.middlewarePublisher = null;
- this.typeRegistry = new TypeRegistry(typeCapacity, typeFactor);
-
- this.builtinSubscriber = null;
- }
-
- /**
- * Creates the DomainParticipant with default settings for typeCapacity and typeFactor.
- *
- * @see DomainParticipant#DomainParticipant(DomainId, Collection, boolean, DomainParticipantListener, EntityFactory,
- * boolean, int, float)
- */
- DomainParticipant(DomainId domainId, Collection<DomainParticipant> domain, boolean enabled, DomainParticipantListener listener, EntityFactory parentFactory, boolean threadedPublishing) {
- this(domainId, domain, enabled, listener, parentFactory, threadedPublishing, 256, .75f);
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- *
- * @return Returns the builtinSubscriber.
- */
- public Subscriber getBuiltinSubscriber() {
- // DONT_NEED This method has not been implemented, but is called out in the spec
- if (true) {
- throw new NotImplementedException();
- }
- return builtinSubscriber;
- }
-
- /**
- * Gets the listener attached to this <code>DomainParticipant</code>.
- */
- public DomainParticipantListener getListener() {
- return (DomainParticipantListener) super.getBaseListener();
- }
-
- /**
- * Sets the listener attached to this <code>DomainParticipant</code>. This replaces the existing listener.
- *
- * @param listener The listener to attach.
- * @param mask A mask identifying which communication statuses the listener should be invoked.
- * @return The {@link ReturnCode}returned by {@link Entity#setBaseListener(Listener, StatusKind)}.
- * @see Entity#setBaseListener(Listener, StatusKind)
- */
- public ReturnCode setListener(DomainParticipantListener listener, StatusKind mask) {
- return super.setBaseListener(listener, mask);
- }
-
- /**
- * Creates a publisher with the passed listener attached.
- *
- * @param publisherListener The listener to attach to the newly created Publisher.
- * @return The newly created publisher, or null if an error occurred in creation.
- */
- private Publisher createAPublisher(PublisherListener publisherListener) {
- Publisher publisher = null;
- try {
- publisher = new Publisher(this, this.isEnabled(), publisherListener);
- publishers.add(publisher);
- } catch (OutOfMemoryError er) {
- er.printStackTrace();
- publisher = null;
- }
-
- return publisher;
- }
-
- /**
- * Creates a middlewarePublisher. If a middlewarePublisher has already been created this will return a reference to
- * the existing middlewarePublisher. The middlewarePublisher is provided as a link for an outside system to be able
- * to inject data into this system.
- *
- * @param publisherListener The listener to attach to the newly created <code>Publisher</code>. Note that this can be
- * null.
- * @return A <code>Publisher</code> with the passed in listener assigned to it, or null if an error occurred in
- * creation.
- */
- public Publisher getMiddlewarePublisherInstance(PublisherListener publisherListener) {
- if (middlewarePublisher == null) {
- middlewarePublisher = createAPublisher(publisherListener);
- }
- return middlewarePublisher;
- }
-
- /**
- * Creates a new <code>Publisher</code> with a particular listener assigned to it. The publisher will be created
- * enabled iff this <code>DomainParticipant</code> is enabled. If an OutOfMemoryError is thrown while attempting get
- * the new publisher, <b>null </b> will be returned.
- *
- * @param publisherListener The listener to be attached.
- * @return The newly created <code>Publisher</code>, or null if an error occurred in creation.
- */
- public Publisher createPublisher(PublisherListener publisherListener) {
- Publisher publisher = createAPublisher(publisherListener);
- if (publisher != null) {
- publishers.add(publisher);
- }
- return publisher;
- }
-
- /**
- * Removes the passed <code>Publisher</code> iff the publisher was created by this <code>DomainParticipant</code> and
- * does not have any attached <code>DataWriter</code> 's.
- *
- * @param publisher The publisher to be removed.
- * @return {@link ReturnCode#OK}if the publisher was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
- * the publisher had writers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode deletePublisher(Publisher publisher) {
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- // Check that a publisher was supplied
- if (publisher == null) {
- return ReturnCode.ERROR;
- }
-
- // Check the pre-condition
- if (publisher.hasDataWriters()) {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
-
- // Attempt to remove, if it did not exist in our list then return an error,
- // since it can only be removed from the <code>DomainParticipant</code> which created it.
- if (publishers.remove(publisher)) {
- return ReturnCode.OK;
- } else {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
- }
-
- /**
- * Creates a <code>Subscriber</code> with the provided listener attached.
- *
- * @param subscriberListener The listener to be attached.
- * @return The newly created <code>Subscriber</code>, or null if an error occurred in creation.
- */
- public Subscriber createSubscriber(SubscriberListener subscriberListener) {
- Subscriber subscriber = null;
- try {
- subscriber = new Subscriber(this, this.isEnabled(), subscriberListener);
- subscribers.add(subscriber);
- } catch (OutOfMemoryError er) {
- er.printStackTrace();
- subscriber = null;
- }
- return subscriber;
- }
-
- /**
- * Removes the passed <code>Subscriber</code> iff the subscriber was created by this <code>DomainParticipant</code>
- * and does not have any attached <code>DataReader</code> 's.
- *
- * @param subscriber The subscriber to be removed.
- * @return {@link ReturnCode#OK}if the subscriber was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if
- * the subscriber had readers or was not created by this DomainParticipant, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode deleteSubscriber(Subscriber subscriber) {
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- // Check that a subscriber was supplied
- if (subscriber == null) {
- return ReturnCode.ERROR;
- }
-
- // Check the pre-condition
- if (subscriber.hasDataReaders()) {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
-
- // Attempt to remove, if it did not exist in our list then return an error,
- // since it can only be removed from the <code>DomainParticipant</code> which created it.
- if (subscribers.remove(subscriber)) {
- return ReturnCode.OK;
- } else {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
- }
-
- /**
- * Creates a <code>Topic</code> on this <code>DomainParticipant</code> with the give name. If a <code>Topic</code>
- * already exists with the given name, then the existing topic will be returned IF the typeName matches that of the
- * existing <code>Topic</code>. If the type's do not match, <b>null </b> is returned.
- *
- * @param name The name of the topic to create.
- * @param typeName The name of the type associated with the topic.
- * @param topicListener The listener to be attached to the created topic if it is newly created. If the topic already
- * exists, the provided listener is ignored.
- * @return A new <code>Topic</code> if one does not already exist, or an existing topic with the same
- * <code>name</code> and <code>typeName</code>, otherwise <b>null </b>
- */
- public Topic createTopic(String name, String namespace, String typeName, TopicListener topicListener) {
-
- Topic topic = null;
-
- // Even before that, check that the type was registered
- TypeSignature typeSignature = typeRegistry.lookupSignature(typeName);
- if (typeSignature == null) {
- throw new RuntimeException(String.format("No type signature with name [%s] was found.", typeName));
- } else {
-
- // First check to see if the topic already exists
- TopicDescription topicDescription = lookupTopicDescription(namespace, name);
- if (topicDescription != null && topicDescription instanceof Topic) {
-
- topic = (Topic) topicDescription;
-
- // Make sure that the type name is the same, otherwise it is failure
- if (topic.getTypeName().equals(typeName)) {
- // Track that another create has been called for this topic
- topic.incrementCount();
- } else {
- // There is a violation, and no topic will be returned since a topic
- // with this name already exists, but the types do not match
- throw new RuntimeException(String.format(
- "found topic name:[%s] namespace:[%s] but there was a type incompatibility between [%s] (from topic [%s]) and [%s].",
- name, namespace, topic.getTypeName(), topic.getName(), typeName));
- }
- } else { // Otherwise, the topic did not already exist
- topic = new Topic(this, typeSignature, name, namespace, this.isEnabled(), topicListener, this);
- topics.put(namespace, name, topic);
- }
- }
- return topic;
- }
-
- /**
- * This method deletes a <code>Topic</code> previously created by this <code>DomainParticipant</code>. No action will
- * be taken if the topic still has data readers/writers attached to it, or if it was not created by this
- * <code>DomainParticipant</code>.
- *
- * @param topic The topic to delete.
- * @return {@link ReturnCode#OK}if the topic was successfully removed, {@link ReturnCode#PRECONDITION_NOT_MET}if the
- * topic has readers/writers or was not created by this DomainParticipant, {@link ReturnCode#NOT_ENABLED}if this
- * DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode deleteTopic(Topic topic) {
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- // Check the pre-condition
- if (topic.hasDataReaders()) {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
- // Check the pre-condition
- if (topic.hasDataWriters()) {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
-
- // Attempt to remove, if it did not exist in our list then return an error,
- // since it can only be removed from the <code>DomainParticipant</code> which created it.
- if (topics.containsKey(topic.getNamespace() + topic.getName())) {
- // Reduce the count of creations by 1
- topic.decrementCount();
-
- // If the creation count is zero, then remove it from the list
- if (topic.getCount() <= 0) {
- topics.removeValues(topic.getNamespace() + topic.getName());
- }
-
- return ReturnCode.OK;
- } else {
- return ReturnCode.PRECONDITION_NOT_MET;
- }
- }
-
- /**
- * Get a <code>TopicDescription</code> that matches a particular name. PARTIAL: Since the
- * <code>ContentFilteredTopic</code> and <code>MultiTopic</code> classes are not implemented, this method simply
- * searches the list of <code>Topic</code> classes.
- *
- * @param namespace The name to match against the <code>TopicDescription</code>.
- * @return The <code>TopicDescription</code> that has the specified name, <b>null </b> if no such one exists.
- */
- public TopicDescription lookupTopicDescription(String namespace, String topic) {
- //PARTIAL ContentFilteredTopic and MultiTopic are not implemented, so this only searches Topic.
- return findTopicByName(namespace, topic);
- }
-
- /**
- * Searches the current list of Topics for this DomainParticipant for a topic whose name matches the provided
- * topicName
- *
- * @param topicName The topic name to match
- * @return A reference to the existing topic whose name matches topicName, or null if no such topic exists.
- */
- private Topic findTopicByName(String namespace, String topicName) {
- return topics.get(namespace, topicName);
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- *
- * @return {@link ReturnCode#OK}if the participant was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
- * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode ignoreParticipant() {
- // UNSURE this is stubbed for now, until we determine it's necessity
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- return ReturnCode.ERROR;
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- *
- * @return {@link ReturnCode#OK}if the topic was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}if
- * this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode ignoreTopic() {
- // UNSURE This method has not been implemented, but is called out in the spec
- if (true) {
- throw new NotImplementedException();
- }
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- return ReturnCode.ERROR;
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- *
- * @return {@link ReturnCode#OK}if the publication was successfully set to be ignored, {@link ReturnCode#NOT_ENABLED}
- * if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode ignorePublication() {
- // UNSURE This method has not been implemented, but is called out in the spec
- if (true) {
- throw new NotImplementedException();
- }
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- return ReturnCode.ERROR;
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- *
- * @return {@link ReturnCode#OK}if the subscription was successfully set to be ignored,
- * {@link ReturnCode#NOT_ENABLED}if this DomainParticipant is not enabled, or {@link ReturnCode#ERROR}.
- */
- public ReturnCode ignoreSubscription() {
- // UNSURE This method has not been implemented, but is called out in the spec
- if (true) {
- throw new NotImplementedException();
- }
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- return ReturnCode.ERROR;
- }
-
- /**
- * Gets the <code>DomainId</code> that this <code>DomainParticipant</code> belongs to.
- *
- * @return The <code>DomainId</code> of this participant.
- */
- public DomainId getDomainId() {
- return domainId;
- }
-
- /**
- * Performs a deep deletion of contained entities (Publishers, Subscribers, Topics). This will cause a recursive call
- * of <code>deleteContainedEntities</code> through out all of the contained entities. This can only be performed if
- * the <code>DomainParticipant</code> is enabled.
- *
- * @return {@link ReturnCode#OK}if the all entities were successfully deleted, or {@link ReturnCode#NOT_ENABLED}if
- * this DomainParticipant is not enabled.
- */
- public ReturnCode deleteContainedEntities() {
-
- // Check that the Entity is enabled before proceeding (See description of enable on the Entity object in the DDS spec)
- if (!isEnabled()) {
- return ReturnCode.NOT_ENABLED;
- }
-
- for (Publisher publisher : publishers) {
- publisher.deleteContainedEntities();
- }
- publishers.clear();
-
- for (Subscriber subscriber : subscribers) {
- subscriber.deleteContainedEntities();
- }
-
- subscribers.clear();
-
- this.middlewarePublisher = null;
-
- // Topics do not contain anything else
- topics.clear();
-
- return ReturnCode.OK;
- }
-
- /**
- * This method is here for future functionality that is described in the DDS specification but has not been
- * implemented or used.
- */
- public void assertLiveliness() {
- // UNSURE This method has not been implemented, but is called out in the spec
- if (true) {
- throw new NotImplementedException();
- }
- }
-
- /**
- * Returns true iff this <code>DomainParticipant</code> contains at least one publisher, subscriber or topic.
- *
- * @return <b>true </b> if this contains an entity, <b>false </b> otherwise.
- */
- public boolean hasEntities() {
- return !(publishers.isEmpty() && subscribers.isEmpty() && topics.isEmpty());
- }
-
- /**
- * Propagates the published data to each <code>Subscriber</code> of this <code>DomainParticipant</code>. Notifies the
- * middleware (by means of the {@link DomainParticipantListener}of the new data unless it originated from the
- * middlewarePublisher. The middleware is only notified of data originating from this <code>DomainPariticipant</code>
- * , that is, data published from other participants in the domain will not be sent to the middleware.
- *
- * @param destination TODO
- * @param source TODO
- * @param dataStoreItem The <code>DataStoreItem</code> that was published.
- */
- void processPublishedData(IDestination destination, ISource source, DataStoreItem dataStoreItem) { // package scope since it is a
- // system-level call
-
- // Notify the middleware of new data, unless it was published by the middlewarePublisher
- // When data is published by the middlewarePublisher it does not have an associated DataWriter
-
- DataWriter writer = dataStoreItem.getTheWriter();
- if (writer != null) {
- // Invoke the DomainParticipantListener if available
- DomainParticipantListener domainParticipantListener = getListener();
- if (domainParticipantListener != null) {
- domainParticipantListener.onPublishNotifyMiddleware(destination, source, dataStoreItem);
- }
-
- // If the writer has a listener, then invoke it
- DataWriterListener writerListener = writer.getListener();
- if (writerListener != null) {
- writerListener.onDataSentToMiddleware(writer);
- }
-
- }
-
- if (writer != null && writer.isPublishBackToLocalDDSReaders()) {
- // Notify all of the subscribers in our domain
- for (Subscriber domainSubscribers : subscribers) {
- domainSubscribers.processNewData(dataStoreItem);
- }
- }
- }
-
- /**
- * Gets the <code>TypeRegistry</code> used by {@link TypeSupport}to store the types registered for this
- * <code>DomainParticipant</code>.
- *
- * @return Returns the typeRegistry.
- */
- public TypeRegistry getTypeRegistry() {
- return typeRegistry;
- }
-
- /**
- * Gets the Middleware <code>Publisher</code> if one has been created.
- *
- * @return Returns the <code>Publisher</code> for the middleware, or null if it has not been created.
- * @see DomainParticipant
- */
- public Publisher getMiddlewarePublisher() {
- return middlewarePublisher;
- }
-
- /**
- * Gets the current <code>Collection</code> of <code>Publisher</code>'s for this <code>DomainPariticpant</code>.
- *
- * @return Returns the <code>Collection</code> of <code>Publisher</code> 's.
- */
- public CopyOnWriteArrayList<Publisher> getPublishers() {
- return publishers;
- }
-
- public void dispose() {
- for (Topic topic : topics.values()) {
- topic.clearDataReaders();
- topic.clearDataWriters();
- }
- topics.clear();
- for (Subscriber subscriber : subscribers) {
- if (subscriber.deleteContainedEntities() == ReturnCode.NOT_ENABLED) {
- System.err.println("failed to delete subscriber because it was not enabled");
- }
- }
- subscribers.clear();
-
- for (Publisher publisher : publishers) {
- publisher.dispose();
- }
- publishers.clear();
-
- typeRegistry.clear();
- }
-}

Back to the top