/**
   * Anmeldung als Sender oder Quelle
   *
   * @param atg Attributgruppe
   * @param asp Aspekt
   * @param simulationVariant Simulationsvariante
   * @param senderRole Sender oder Quelle
   * @param senderObject Beliebiges Objekt das zu diesem Sender gespeichert wird. Jedes Objekt ist
   *     einer Datenidentifikation fest zugeordnet und kann nur einmal angemeldet werden.
   * @throws MissingObjectException Falls Attributgruppe oder Aspekt nicht vorhanden sind
   * @return true wenn das Objekt angemeldet wurde, sonst false.
   */
  public boolean registerSender(
      final String atg,
      final String asp,
      final short simulationVariant,
      final SenderRole senderRole,
      final KExDaVSender senderObject)
      throws MissingObjectException {
    if (atg == null) throw new IllegalArgumentException("atg ist null");
    if (asp == null) throw new IllegalArgumentException("asp ist null");
    if (senderRole == null) throw new IllegalArgumentException("senderRole ist null");
    if (senderObject == null) throw new IllegalArgumentException("senderObject ist null");

    if (_senders.containsKey(senderObject))
      throw new IllegalArgumentException("Der Sender " + senderObject + " ist bereits angemeldet.");

    final DataDescription dataDescription = makeDataDescription(atg, asp, simulationVariant);

    final InnerSender innerSender = new InnerSender(senderObject, dataDescription, senderRole);

    final SystemObject systemObject = getWrappedObject();
    if (systemObject == null) return true;

    if (!checkType(systemObject.getType(), dataDescription.getAttributeGroup())) return false;

    registerSender(innerSender, systemObject);
    return true;
  }
  /**
   * Anmeldung als Empfänger/Senke
   *
   * @param atg Attributgruppe
   * @param asp Aspekt
   * @param simulationVariant Simulationsvariante
   * @param receiverRole (Empfänger oder Senke)
   * @param receiveOptions (Delta oder Nachgeliefert oder Normal)
   * @param receiver Objekt an das Empfangene Daten gesendet werden. Jedes Objekt ist einer
   *     Datenidentifikation fest zugeordnet und kann nur einmal angemeldet werden.
   * @throws MissingObjectException Falls Attributgruppe oder Aspekt nicht vorhanden sind
   */
  public boolean registerReceiver(
      final String atg,
      final String asp,
      final short simulationVariant,
      final ReceiverRole receiverRole,
      final ReceiveOptions receiveOptions,
      final KExDaVReceiver receiver)
      throws MissingObjectException {
    if (atg == null) throw new IllegalArgumentException("atg ist null");
    if (asp == null) throw new IllegalArgumentException("asp ist null");
    if (receiverRole == null) throw new IllegalArgumentException("receiverRole ist null");
    if (receiver == null) throw new IllegalArgumentException("receiver ist null");

    if (_receivers.containsKey(receiver))
      throw new IllegalArgumentException("Der Empfänger " + receiver + " ist bereits angemeldet.");

    final DataDescription dataDescription = makeDataDescription(atg, asp, simulationVariant);
    final InnerReceiver innerReceiver =
        new InnerReceiver(receiver, receiverRole, dataDescription, receiveOptions);

    final SystemObject systemObject = getWrappedObject();
    if (systemObject == null) return true;

    if (!checkType(systemObject.getType(), dataDescription.getAttributeGroup())) return false;

    registerReceiver(innerReceiver, systemObject);
    return true;
  }
 @Override
 public String toString() {
   return KExDaVObject.this
       + ":"
       + _dataDescription.getAttributeGroup().getPidOrNameOrId()
       + ":"
       + _dataDescription.getAspect().getPidOrNameOrId()
       + ":"
       + _dataDescription.getSimulationVariant();
 }
  /**
   * Vergleicht die Datenbeschreibung mit einer anderen Datenbeschreibung. Zwei Datenbeschreibungen
   * sind gleich, wenn die Attributgruppen, die Aspekte und die Simulationsvarianten gleich sind.
   *
   * @param other Andere Datenbeschreibung mit der diese Datenbeschreibung verglichen werden soll.
   * @return <code>true</code>, wenn die Datenbeschreibungen gleich sind, sonst <code>false</code>.
   */
  public final boolean equals(Object other) {
    if (this == other) return true;

    if (!(other instanceof DataDescription)) {
      return false;
    }
    DataDescription o = (DataDescription) other;

    return (_attributeGroup == null
            ? o._attributeGroup == null
            : _attributeGroup.equals(o._attributeGroup))
        && (_aspect == null ? o._aspect == null : _aspect.equals(o._aspect))
        && (o.getSimulationVariant() == getSimulationVariant());
  }