/**
  * 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);
 }
 /**
  * Gibt einen String zurrück, der diesen Datensatz beschreibt.
  *
  * @return String, der diesen Datensatz beschreibt
  */
 public final String parseToString() {
   String str = "Empfangsanmeldeinformationen:\n";
   str += _baseSubscriptionInfo.toString() + "\n";
   str += "Nachgeliefert Flag   : " + getDelayedDataFlag() + "\n";
   str += "Delta Daten Flag     : " + getDeltaDataFlag() + "\n";
   str += "Empfangsapplikation  : " + isReceiver() + "\n";
   str += "Senkeapplikation     : " + isDrain() + "\n";
   return str;
 }
  /**
   * 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;
  }
 /**
  * Lesen eines Datensatzes vom übergegebenen DataInputStream
  *
  * @param in DataInputStream
  * @throws IOException, wenn ein Fehler beim Lesen des Streams auftritt.
  */
 public final void read(DataInputStream in) throws IOException {
   _baseSubscriptionInfo = new BaseSubscriptionInfo();
   _baseSubscriptionInfo.read(in);
   boolean delayedDataFlag = in.readBoolean();
   boolean deltaDataFlag = in.readBoolean();
   _receiveOptions = new ReceiveOptions(deltaDataFlag, delayedDataFlag);
   boolean applikationStatus = in.readBoolean();
   _receiverRole = new ReceiverRole(applikationStatus);
   int size = (int) in.readByte();
   if (size > 0) {
     byte[] ignoredAttributesIndicator = new byte[size];
     for (int i = 0; i < size; ++i) {
       ignoredAttributesIndicator[i] = in.readByte();
     }
   }
 }