/**
  * Erstellt dieses Objekt
  *
  * @param configurationArea Konfigurationsbereich
  * @param pid
  * @param typePid Objekt-Typ-Pid
  * @param objectName Objekt-name falls vorhanden
  * @param allConfigurationData Konfigurationsdaten
  * @param origId
  * @param origConfigAuthority
  * @throws MissingObjectException Falls der angegebene Typ nicht existiert oder nicht vom Typ
  *     DynamicObjectType ist.
  * @throws ConfigurationChangeException Falls die Konfigurationsänderung nicht durchgeführt werden
  *     konnte
  */
 public void create(
     final ConfigurationArea configurationArea,
     final String pid,
     final String typePid,
     final String objectName,
     final Map<PidAttributeGroupUsage, Data> allConfigurationData,
     final long origId,
     final String origConfigAuthority)
     throws MissingObjectException, ConfigurationChangeException,
         MissingKExDaVAttributeGroupException {
   final SystemObject type = _connection.getDataModel().getObject(typePid);
   if (type == null) throw new MissingObjectException(type + " konnte nicht gefunden werden");
   if (!(type instanceof DynamicObjectType)) {
     throw new MissingObjectException(type + " ist kein Typ für dynamische Objekte");
   }
   final Map<PidAttributeGroupUsage, Data> map =
       new HashMap<PidAttributeGroupUsage, Data>(allConfigurationData);
   if (_connection.getDataModel().getAttributeGroup(Constants.Pids.AttributeGroupKExDaVConfigData)
       == null) {
     throw new MissingKExDaVAttributeGroupException();
   }
   if (origConfigAuthority != null) {
     map.put(
         new PidAttributeGroupUsage(
             Constants.Pids.AttributeGroupKExDaVConfigData, Constants.Pids.AspectProperties),
         createProperties(origId, origConfigAuthority));
   }
   final Collection<DataAndATGUsageInformation> dataList = convertConfigurationData(map);
   _manager.addMessage(
       Message.newInfo("Erstelle Objekt: " + (pid.length() == 0 ? '[' + origId + ']' : pid)));
   final DynamicObject dynamicObject =
       configurationArea.createDynamicObject((DynamicObjectType) type, pid, objectName, dataList);
   setWrappedObject(dynamicObject);
 }
 /**
  * Sendet Daten an das Objekt
  *
  * @param senderObject Sender-Objekt
  * @param data Daten
  * @param dataTime Zeit des Datensatzes
  */
 public void sendData(final KExDaVSender senderObject, final Data data, final long dataTime) {
   final SystemObject systemObject = getWrappedObject();
   if (systemObject == null) return;
   try {
     final InnerSender sender = _senders.get(senderObject);
     if (sender == null) throw new IllegalStateException("Sender wurde noch nicht angemeldet");
     sender.sendData(systemObject, data, dataTime);
   } catch (SendSubscriptionNotConfirmed sendSubscriptionNotConfirmed) {
     _manager.addMessage(
         Message.newMajor("Kann derzeit nicht senden", sendSubscriptionNotConfirmed));
   }
 }
 private void registerSender(final InnerSender innerSender, final SystemObject systemObject) {
   try {
     if (innerSender.getSenderRole() != SenderRole.source()) {
       // Quellen werden verzögert beim ersten Datensatz angemeldet
       _connection.subscribeSender(
           innerSender,
           systemObject,
           innerSender.getDataDescription(),
           innerSender.getSenderRole());
     }
   } catch (OneSubscriptionPerSendData oneSubscriptionPerSendData) {
     _manager.addMessage(
         Message.newMajor("Kann nicht als Sender anmelden", oneSubscriptionPerSendData));
   }
 }
 /**
  * Löscht dieses Objekt
  *
  * @param force Soll das Objekt auch gelöscht werden, wenn es nicht von KExDaV kopiert wurde?
  * @return true wenn das Objekt nicht mehr existiert, sonst false
  * @throws ConfigurationChangeException Falls das Ändern der Konfiguration fehlschlägt (z.B. keine
  *     Berechtigung)
  */
 public boolean invalidate(final boolean force)
     throws ConfigurationChangeException, MissingKExDaVAttributeGroupException {
   final SystemObject wrappedObject = getWrappedObject();
   if (wrappedObject == null || !wrappedObject.isValid()) {
     return true; // Objekt existiert nicht mehr, es braucht nicht nochmal gelöscht zu werden.
                  // Daher ist auch eine Warnung unnötig.
   }
   if (wrappedObject instanceof ConfigurationObject) {
     throw new IllegalArgumentException("Versuch, ein Konfigurationsobjekt zu löschen.");
   }
   if (!force && !isCopy()) return false;
   _manager.addMessage(Message.newInfo("Lösche Objekt: " + _objectSpecification));
   wrappedObject.invalidate();
   setWrappedObject(null);
   return true;
 }