/** {@inheritDoc} */
 @MethodLog
 public void removeLabelType(AbstractStorageLabelType<?> labelType) throws StorageException {
   try {
     storageLabelDataDao.removeLabelType(labelType);
   } catch (Exception e) {
     throw new StorageException("Label type was not removed", e);
   }
 }
 /** {@inheritDoc} */
 @MethodLog
 public void removeLabelsFromCmr(
     Collection<AbstractStorageLabel<?>> storageLabels, boolean removeFromStoragesAlso)
     throws StorageException {
   storageLabelDataDao.removeLabels(storageLabels);
   if (removeFromStoragesAlso) {
     for (StorageData storageData : getExistingStorages()) {
       removeLabelsFromStorage(storageData, new ArrayList<AbstractStorageLabel<?>>(storageLabels));
     }
   }
 }
 /** {@inheritDoc} */
 @MethodLog
 public void removeLabelFromCmr(
     AbstractStorageLabel<?> storageLabel, boolean removeFromStoragesAlso)
     throws StorageException {
   storageLabelDataDao.removeLabel(storageLabel);
   if (removeFromStoragesAlso) {
     for (StorageData storageData : getExistingStorages()) {
       removeLabelFromStorage(storageData, storageLabel);
     }
   }
 }
 /** {@inheritDoc} */
 @MethodLog
 public StorageData addLabelToStorage(
     StorageData storageData, AbstractStorageLabel<?> storageLabel, boolean doOverwrite)
     throws StorageException {
   try {
     storageManager.addLabelToStorage(storageData, storageLabel, doOverwrite);
     storageLabelDataDao.saveLabel(storageLabel);
     return storageManager.getStorageData(storageData.getId());
   } catch (IOException | SerializationException e) {
     throw new StorageException(
         "Exception occurred trying to save storage data changes to disk.", e);
   }
 }
  /**
   * Copies the content of the current CMR buffer to the Storage.
   *
   * @param storageData Storage to copy data to.
   * @param platformIdents List of agent IDs.
   * @param dataProcessors Processors that will be used for data writing.
   * @param autoFinalize If the storage where action is performed should be auto-finalized after the
   *     write.
   * @throws BusinessException If storage is used as a recording storage.
   * @throws SerializationException If storage needs to be created, and serialization fails.
   * @throws IOException If IO exception occurs.
   */
  public void copyBufferToStorage(
      StorageData storageData,
      List<Long> platformIdents,
      Collection<AbstractDataProcessor> dataProcessors,
      boolean autoFinalize)
      throws BusinessException, IOException, SerializationException {
    if (!isStorageExisting(storageData)) {
      this.createStorage(storageData);
    }
    StorageData local = getLocalStorageDataObject(storageData);
    if (!isStorageOpen(local)) {
      this.openStorage(local);
    }

    DefaultData oldestBufferElement = buffer.getOldestElement();
    // only copy if we have smth in the buffer
    if (null != oldestBufferElement) {

      // oldest date is the buffer oldest date, we don't include data from before
      Date fromDate = new Date(oldestBufferElement.getTimeStamp().getTime());
      Date toDate = null;

      // check if we have the time-frame limit
      for (AbstractDataProcessor dataProcessor : dataProcessors) {
        if (dataProcessor instanceof TimeFrameDataProcessor) {
          TimeFrameDataProcessor timeFrameDataProcessor = (TimeFrameDataProcessor) dataProcessor;
          // update dates
          if (timeFrameDataProcessor.getFromDate().after(fromDate)) {
            fromDate = timeFrameDataProcessor.getFromDate();
          }
          toDate = timeFrameDataProcessor.getToDate();
          break;
        }
      }

      for (Long platformId : platformIdents) {
        List<DefaultData> toWriteList =
            storageDataDao.getAllDefaultDataForAgent(platformId.longValue(), fromDate, toDate);
        this.writeToStorage(local, toWriteList, dataProcessors, true);
      }
    }

    if (autoFinalize) {
      this.closeStorage(local);
    }
    updateExistingStorageSize(local);
  }
  /**
   * Copies set of template data to storage. The storage does not have to be opened before action
   * can be executed (storage will be created/opened first in this case)
   *
   * @param storageData {@link StorageData} to copy to.
   * @param elementIds IDs of the elements to be saved.
   * @param platformIdent Platform ident elements belong to.
   * @param dataProcessors Processors to process the data. Can be null, then the data is only copied
   *     with no processing.
   * @param autoFinalize If the storage where action is performed should be auto-finalized after the
   *     write.
   * @throws IOException If {@link IOException} occurs.
   * @throws SerializationException If serialization fails when storage needs to be created/opened.
   * @throws BusinessException If {@link BusinessException} occurs.
   */
  public void copyDataToStorage(
      StorageData storageData,
      Collection<Long> elementIds,
      long platformIdent,
      Collection<AbstractDataProcessor> dataProcessors,
      boolean autoFinalize)
      throws IOException, SerializationException, BusinessException {
    if (!isStorageExisting(storageData)) {
      this.createStorage(storageData);
    }
    StorageData local = getLocalStorageDataObject(storageData);
    if (!isStorageOpen(local)) {
      this.openStorage(local);
    }

    List<DefaultData> toWriteList = storageDataDao.getDataFromIdList(elementIds, platformIdent);
    this.writeToStorage(local, toWriteList, dataProcessors, true);
    if (autoFinalize) {
      this.closeStorage(local);
    }
    updateExistingStorageSize(local);
  }
 /** {@inheritDoc} */
 @MethodLog
 public List<AbstractStorageLabelType<?>> getAllLabelTypes() {
   return storageLabelDataDao.getAllLabelTypes();
 }
 /** {@inheritDoc} */
 @MethodLog
 public <E extends AbstractStorageLabelType<?>> List<E> getLabelTypes(Class<E> labelTypeClass) {
   return storageLabelDataDao.getLabelTypes(labelTypeClass);
 }
 /** {@inheritDoc} */
 @MethodLog
 public void saveLabelType(AbstractStorageLabelType<?> labelType) {
   storageLabelDataDao.saveLabelType(labelType);
 }
 /** {@inheritDoc} */
 @MethodLog
 public void saveLabelsToCmr(Collection<AbstractStorageLabel<?>> storageLabels) {
   for (AbstractStorageLabel<?> label : storageLabels) {
     storageLabelDataDao.saveLabel(label);
   }
 }
 /** {@inheritDoc} */
 @MethodLog
 public void saveLabelToCmr(AbstractStorageLabel<?> storageLabel) {
   storageLabelDataDao.saveLabel(storageLabel);
 }
 /** {@inheritDoc} */
 @MethodLog
 public <E> List<AbstractStorageLabel<E>> getLabelSuggestions(
     AbstractStorageLabelType<E> labeltype) {
   List<AbstractStorageLabel<E>> results = storageLabelDataDao.getAllLabelsForType(labeltype);
   return results;
 }