/**
   * Registers topic with QoS for test cases
   *
   * @param name topic name
   * @param typeName type for topic
   * @param reliable reliable (true) or best effort (false) QoS
   * @return DDS topic object
   * @throws IOException
   */
  public Topic registerTopic(final String name, final String typeName, final boolean reliable)
      throws IOException {
    TopicQos reliableTopicQos = new TopicQos();

    participant.get_default_topic_qos(reliableTopicQos);

    if (reliable) {
      reliableTopicQos.reliability.kind = ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
    } else {
      reliableTopicQos.reliability.kind = ReliabilityQosPolicyKind.BEST_EFFORT_RELIABILITY_QOS;
    }

    reliableTopicQos.history.kind = HistoryQosPolicyKind.KEEP_ALL_HISTORY_QOS;

    reliableTopicQos.resource_limits.max_samples = 50000;

    reliableTopicQos.durability.kind = DurabilityQosPolicyKind.VOLATILE_DURABILITY_QOS;

    participant.set_default_topic_qos(reliableTopicQos);

    Topic topic =
        participant.create_topic(
            name, typeName, reliableTopicQos, null, StatusKind.STATUS_MASK_NONE);

    if (topic == null) {
      throw new IOException("Could not create Topic");
    }

    return topic;
  }
  private static void subscriberMain(int domainId, int sampleCount) {

    DomainParticipant participant = null;
    Subscriber subscriber = null;
    Topic topic = null;
    DataReaderListener listener = null;
    DoubleArrayDataDataReader reader = null;

    try {

      // --- Create participant --- //

      /* To customize participant QoS, use
      the configuration file
      USER_QOS_PROFILES.xml */

      participant =
          DomainParticipantFactory.TheParticipantFactory.create_participant(
              domainId,
              DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT,
              null /* listener */,
              StatusKind.STATUS_MASK_NONE);
      if (participant == null) {
        System.err.println("create_participant error\n");
        return;
      }

      // --- Create subscriber --- //

      /* To customize subscriber QoS, use
      the configuration file USER_QOS_PROFILES.xml */

      subscriber =
          participant.create_subscriber(
              DomainParticipant.SUBSCRIBER_QOS_DEFAULT,
              null /* listener */,
              StatusKind.STATUS_MASK_NONE);
      if (subscriber == null) {
        System.err.println("create_subscriber error\n");
        return;
      }

      // --- Create topic --- //

      /* Register type before creating topic */
      String typeName = DoubleArrayDataTypeSupport.get_type_name();
      DoubleArrayDataTypeSupport.register_type(participant, typeName);

      /* To customize topic QoS, use
      the configuration file USER_QOS_PROFILES.xml */

      topic =
          participant.create_topic(
              "Example DoubleArrayData",
              typeName,
              DomainParticipant.TOPIC_QOS_DEFAULT,
              null /* listener */,
              StatusKind.STATUS_MASK_NONE);
      if (topic == null) {
        System.err.println("create_topic error\n");
        return;
      }

      // --- Create reader --- //

      listener = new DoubleArrayDataListener();

      /* To customize data reader QoS, use
      the configuration file USER_QOS_PROFILES.xml */

      reader =
          (DoubleArrayDataDataReader)
              subscriber.create_datareader(
                  topic, Subscriber.DATAREADER_QOS_DEFAULT, listener, StatusKind.STATUS_MASK_ALL);
      if (reader == null) {
        System.err.println("create_datareader error\n");
        return;
      }

      // --- Wait for data --- //

      final long receivePeriodSec = 4;

      for (int count = 0; (sampleCount == 0) || (count < sampleCount); ++count) {
        System.out.println(
            "DoubleArrayData subscriber sleeping for " + receivePeriodSec + " sec...");
        try {
          Thread.sleep(receivePeriodSec * 1000); // in millisec
        } catch (InterruptedException ix) {
          System.err.println("INTERRUPTED");
          break;
        }
      }
    } finally {

      // --- Shutdown --- //

      if (participant != null) {
        participant.delete_contained_entities();

        DomainParticipantFactory.TheParticipantFactory.delete_participant(participant);
      }
      /* RTI Data Distribution Service provides the finalize_instance()
      method for users who want to release memory used by the
      participant factory singleton. Uncomment the following block of
      code for clean destruction of the participant factory
      singleton. */
      // DomainParticipantFactory.finalize_instance();
    }
  }