/**
  * Schreiben eines Datensatzes in den übergegebenen DataOutputStream
  *
  * @param out DataOutputStream
  * @throws IOException, wenn ein Fehler beim Schreiben in den Ausgabestream auftritt.
  */
 public final void write(DataOutputStream out) throws IOException {
   _baseSubscriptionInfo.write(out);
   out.writeBoolean(_receiveOptions.withDelayed());
   out.writeBoolean(_receiveOptions.withDelta());
   out.writeBoolean(_receiverRole.isDrain());
   // Ein Byte Länge des nicht mehr benötigten Indikatorbitfelds
   out.writeByte(0);
 }
  /**
   * Aktualisiert diese Empfangsanmeldeinformationen durch Vereinigung mit einer weiteren
   * Empfangsanmeldeinformation
   *
   * @param receiveSubscriptionInfo Weitere Empfangsanmeldeinformation
   * @return <code>true<code> bei Änderung dieser Empfangsanmeldeinformation, </code>false</code>
   *     sonst
   */
  public final boolean updateSubscriptionInfo(ReceiveSubscriptionInfo receiveSubscriptionInfo) {
    BaseSubscriptionInfo _baseSubscriptionInfo = receiveSubscriptionInfo.getBaseSubscriptionInfo();
    ReceiveOptions options = receiveSubscriptionInfo.getReceiveOptions();
    ReceiverRole role = receiveSubscriptionInfo.getReceiverRole();

    boolean changed = false;
    if ((_baseSubscriptionInfo == null) || (options == null) || (role == null)) {
      return false;
    }
    if (_baseSubscriptionInfo.getObjectID() != this._baseSubscriptionInfo.getObjectID()) {
      return false;
    }
    boolean delayed = getDelayedDataFlag();
    boolean delta = getDeltaDataFlag();
    if (!delayed) {
      if (options.withDelayed()) {
        delayed = true;
        changed = true;
      }
    }
    if (delta) {
      if (!options.withDelta()) {
        delta = false;
        changed = true;
      }
    }
    if (changed) {
      _receiveOptions = new ReceiveOptions(delta, delayed);
    }
    // wenn receiverRole Empfänger ist, dann darf keine Senke angemeldet werden
    // wenn receiverRole Senke ist, dann darf keine weitere Senke angemeldet werden
    if (_receiverRole.isReceiver() || _receiverRole.isDrain()) {
      if (role.isDrain()) {
        // zu einem Empfänger oder einer Senke soll noch eine Senke angemeldet werden
        throw new IllegalStateException(
            "Ungültige Anmeldung. Zu einem Empfänger oder einer Senke darf keine weitere Senke angemeldet werden.");
      }
    }
    return changed;
  }
 /**
  * Gibt an, ob die Applikation als Senke für dieses Datum angemeldet ist oder nicht.
  *
  * @return <code>true:</code>Applikation ist als Senke angemeldet, <code>false:</code>Applikation
  *     ist nicht als Senke angemeldet.
  */
 public final boolean isDrain() {
   return _receiverRole.isDrain();
 }