/**
   * Adds content to a space.
   *
   * @return the checksum of the content as computed by the storage provider
   */
  @Override
  public String addContent(
      String spaceID,
      String contentID,
      InputStream content,
      String contentMimeType,
      Map<String, String> userProperties,
      long contentSize,
      String checksum,
      String storeID)
      throws ResourceException, InvalidIdException {
    IdUtil.validateContentId(contentID);

    try {
      StorageProvider storage = storageProviderFactory.getStorageProvider(storeID);

      try {
        // overlay new properties on top of older extended properties
        // so that old tags and custom properties are preserved.
        // c.f. https://jira.duraspace.org/browse/DURACLOUD-757
        Map<String, String> oldUserProperties = storage.getContentProperties(spaceID, contentID);
        // remove all non extended properties
        if (userProperties != null) {
          oldUserProperties.putAll(userProperties);
          // use old mimetype if none specified.
          String oldMimetype =
              oldUserProperties.remove(StorageProvider.PROPERTIES_CONTENT_MIMETYPE);
          if (contentMimeType == null || contentMimeType.trim() == "") {
            contentMimeType = oldMimetype;
          }

          oldUserProperties = StorageProviderUtil.removeCalculatedProperties(oldUserProperties);
        }

        userProperties = oldUserProperties;
      } catch (NotFoundException ex) {
        // do nothing - no properties to update
        // since file did not previous exist.
      }

      return storage.addContent(
          spaceID, contentID, contentMimeType, userProperties, contentSize, checksum, content);
    } catch (NotFoundException e) {
      throw new ResourceNotFoundException("add content", spaceID, contentID, e);
    } catch (ChecksumMismatchException e) {
      throw new ResourceChecksumException("add content", spaceID, contentID, e);
    } catch (Exception e) {
      storageProviderFactory.expireStorageProvider(storeID);
      throw new ResourceException("add content", spaceID, contentID, e);
    }
  }
 protected Map<String, String> removeCalculatedProperties(Map<String, String> properties) {
   return StorageProviderUtil.removeCalculatedProperties(properties);
 }