/**
   * Erstellt ein neues KExDavObject
   *
   * @param objectSpecification Objekt-Spezifikation
   * @param connection Datenverteiler-Verbindung
   * @param manager KExDaV-Manager-Objekt, an das Benachrichtigungen gesendet werden können
   */
  public KExDaVObject(
      final ObjectSpecification objectSpecification,
      final ClientDavInterface connection,
      final ManagerInterface manager) {
    _manager = manager;
    if (objectSpecification == null)
      throw new IllegalArgumentException("objectSpecification ist null");
    if (connection == null) throw new IllegalArgumentException("connection ist null");

    _objectSpecification = objectSpecification;
    _connection = connection;

    final SystemObject object = objectSpecification.getObject(_connection.getDataModel());
    setWrappedObject(object);

    // Anmeldung auf Erstellung/Löschung des Objektes (nicht nötig bei schon vorhandenen
    // Konfigurationsobjekten)
    if (object == null || object.getType() instanceof DynamicObjectType) {
      /**
       * Direkt beim typ.dynamischesObject anmelden. Das Anmelden beim eigentlichen Typ dieses
       * Objektes funktioniert nicht immer zuverlässig, weil unter Umständen dieses Objekt noch gar
       * nicht vorhanden und deshalb kein Typ ermittelbar ist, oder weil evtl. jemand das Objekt mit
       * diesem Typ löschen könnte und ein anderes Objekt mit der gleichen Pid von einem anderen Typ
       * erstellen könnte
       */
      final DynamicObjectType dynamicObjectType =
          (DynamicObjectType) connection.getDataModel().getType(Constants.Pids.TypeDynamicObject);
      if (dynamicObjectType == null)
        throw new IllegalStateException(
            Constants.Pids.TypeDynamicObject + " konnte nicht gefunden werden");
      final Listener objectCreateDeleteListener = new Listener();
      dynamicObjectType.addInvalidationListener(objectCreateDeleteListener);
      dynamicObjectType.addObjectCreationListener(objectCreateDeleteListener);
    }
  }
  @Override
  public boolean equals(final Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    final KExDaVObject other = (KExDaVObject) o;

    if (!_objectSpecification.equals(other._objectSpecification)) return false;

    return true;
  }
 @Override
 public int hashCode() {
   return _objectSpecification.hashCode();
 }
 @Override
 public String toString() {
   final SystemObject wrappedObject = getWrappedObject();
   if (wrappedObject != null) return wrappedObject.getPidOrNameOrId();
   return _objectSpecification.toString();
 }