/*******************************************************************************
 * Copyright (c) 2004, 20079 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.Vector;
import org.eclipse.osee.ote.messaging.dds.ReturnCode;
import org.eclipse.osee.ote.messaging.dds.StatusKind;
import org.eclipse.osee.ote.messaging.dds.listener.TopicListener;
import org.eclipse.osee.ote.messaging.dds.service.TopicDescription;
import org.eclipse.osee.ote.messaging.dds.service.TypeSignature;
import org.eclipse.osee.ote.messaging.dds.status.InconsistentTopicStatus;

/**
 * Created on May 16, 2005 Provides a basic implementation of the <code>TopicDescription</code> interface for basic
 * topic support in the DDS system.
 * 
 * @see org.eclipse.osee.ote.messaging.dds.service.TopicDescription
 * @author Robert A. Fisher
 * @author David Diepenbrock
 */
public class Topic extends DomainEntity implements TopicDescription {

   private int count; // Keeps track of the number of times this Topic was "created"
   private InconsistentTopicStatus inconsistentTopicStatus;
   private final Collection<DataReader> dataReaders;
   private final Collection<DataWriter> dataWriters;

   // Local variables to implement the TopicDescription interface
   private final DomainParticipant participant;
   private final TypeSignature typeSignature;
   private final String name;
   private final String namespace;

   /**
    * Creates a topic with all of the necessary information. This constructor is only visible to the DDS system,
    * applications should use {@link DomainParticipant#createTopic(String, String, TopicListener)} to create a Topic.
    */
   Topic(DomainParticipant participant, TypeSignature typeName, String name, String namespace, boolean enabled, TopicListener listener, EntityFactory parentFactory) {
      super(enabled, listener, parentFactory);

      this.participant = participant;
      this.typeSignature = typeName;
      this.name = name;
      this.namespace = namespace;

      dataReaders = new Vector<>();
      dataWriters = new Vector<>();
      count = 1;
   }

   /**
    * @return Returns the name.
    */
   @Override
   public String getName() {
      return name;
   }

   /**
    * @return Returns the participant.
    */
   @Override
   public DomainParticipant getParticipant() {
      return participant;
   }

   /**
    * @return Returns the typeName.
    */
   @Override
   public String getTypeName() {
      return typeSignature.getTypeName();
   }

   /**
    * @return Returns the typeSignature.
    */
   public TypeSignature getTypeSignature() {
      return typeSignature;
   }

   /**
    * This method is here for future functionality that is described in the DDS specification but has not been
    * implemented or used.
    */
   public InconsistentTopicStatus getInconsistentTopicStatus() {
      return inconsistentTopicStatus;
   }

   /**
    * Returns the count for how many times this topic has been "created". This is done to meet the requirement of the
    * DDS specification that a <code>Topic</code> must be deleted as many times as it was created or found via (@link
    * DomainParticipant#findTopic(String, Duration)}.
    * 
    * @return integer count of the creations of this topic.
    */
   int getCount() {
      return count;
   }

   /**
    * Increment the creation count for this topic. The DDS system calls this internally each time this is necessary per
    * the DDS specification.
    */
   void incrementCount() {
      count++;
   }

   /**
    * Decrement the creation count for this topic. The DDS system calls this internally each time this
    * <code>Topic</code> is passed to {@link DomainParticipant#deleteTopic(Topic)}. When the count reaches zero, then
    * the DDS system knows it can be deleted.
    */
   void decrementCount() {
      count--;
   }

   /**
    * Retrieve access to the listener assigned to this <code>Topic</code>. The topic is not guaranteed to have a
    * listener, so this method may return <b>null</b>, and the user of this method should handle that appropriately.
    */
   public TopicListener getListener() {
      return (TopicListener) super.getBaseListener();
   }

   /**
    * Set the listener for this <code>Topic</code>. If another listener was already assigned then it will be overridden
    * with out any error. Additionally, <b>null</b> may be passed as the listener to remove the current listener from
    * this topic.
    * 
    * @param listener - The listener to invoke when events occur.
    * @param mask - Not implemented, <b>null</b> is acceptable.
    * @return {@link ReturnCode#OK}
    */
   public ReturnCode setListener(TopicListener listener, StatusKind mask) {
      return super.setBaseListener(listener, mask);
   }

   /**
    * @return true if this Topic is being used by a DataReader
    */
   boolean hasDataReaders() {
      return !dataReaders.isEmpty();
   }

   /**
    * @return true if this Topic is being used by a DataWriter
    */
   boolean hasDataWriters() {
      return !dataWriters.isEmpty();
   }

   /**
    * Used so the topic can keep track of the DataReaders that are created using this Topic. When the DataReader is
    * deleted, it should call removeDataReader.
    * 
    * @param reader The DataReader that added this topic
    */
   void addDataReader(DataReader reader) {
      dataReaders.add(reader);
   }

   /**
    * Used so the topic can keep track of the DataWriters that are created using this Topic. When the DataReader is
    * deleted, it should call removeDataWriter.
    * 
    * @param writer The DataWriter that added this topic
    */
   void addDataWriter(DataWriter writer) {
      dataWriters.add(writer);
   }

   /**
    * Used so the topic can keep track of the DataReaders that are created using this Topic.
    * 
    * @param reader The DataReader that was deleted and used this Topic
    */
   void removeDataReader(DataReader reader) {
      dataReaders.remove(reader);
   }

   /**
    * Used so the topic can keep track of the DataWriters that are created using this Topic.
    * 
    * @param writer The DataWriter that was deleted and used this Topic
    */
   void removeDataWriter(DataWriter writer) {
      dataWriters.remove(writer);
   }

   @Override
   public boolean equals(Object obj) {
      if (obj instanceof Topic) {
         Topic topic = (Topic) obj;
         return name.equals(topic.getName()) && namespace.equals(topic.getNamespace());
      }
      return false;
   }

   @Override
   public int hashCode() {
      return name.hashCode() ^ namespace.hashCode();
   }

   @Override
   public String getNamespace() {
      return this.namespace;
   }

   public void clearDataWriters() {
      dataWriters.clear();
   }

   public void clearDataReaders() {
      dataReaders.clear();
   }
}
