public RepositoryFileDto updateFile(
     RepositoryFileDto file, NodeRepositoryFileDataDto data, String versionMessage) {
   return repositoryFileAdapter.marshal(
       repo.updateFile(
           repositoryFileAdapter.unmarshal(file),
           nodeRepositoryFileDataAdapter.unmarshal(data),
           versionMessage));
 }
  /**
   * Copies the file bundle into the repository
   *
   * @param bundle
   * @param bundlePath
   * @param bundlePathName
   * @param file
   * @param comment
   */
  protected boolean copyFileToRepository(
      final ImportSource.IRepositoryFileBundle bundle,
      final String bundlePathName,
      final String repositoryPath,
      final RepositoryFile file,
      final String comment) {
    // Compute the file extension
    final String name = bundle.getFile().getName();
    final String ext = RepositoryFilenameUtils.getExtension(name);
    if (StringUtils.isEmpty(ext)) {
      log.debug("Skipping file without extension: " + bundlePathName);
      return false;
    }

    // Check the mime type
    final String mimeType = bundle.getMimeType();
    if (mimeType == null) {
      log.debug("Skipping file without mime-type: " + bundlePathName);
      return false;
    }

    // Find the converter
    final Converter converter = converters.get(ext);
    if (converter == null) {
      log.debug("Skipping file without converter: " + bundlePathName);
      return false;
    }

    // Copy the file into the repository
    try {
      log.trace("copying file to repository: " + bundlePathName);
      IRepositoryFileData data =
          converter.convert(bundle.getInputStream(), bundle.getCharset(), mimeType);
      if (null == file) {
        final boolean hidden = !executableTypes.contains(ext.toLowerCase());
        log.trace("\tsetting hidden=" + hidden + " for file with extension " + ext.toLowerCase());
        createFile(bundle, repositoryPath, hidden, data, comment);
      } else {
        repository.updateFile(file, data, comment);
      }
      return true;
    } catch (IOException e) {
      log.warn(
          messages.getString("DefaultImportHandler.WARN_0003_IOEXCEPTION", name),
          e); // TODO make sure string
      // exists
      return false;
    }
  }
  @Override
  public void addLocalizationFile(
      final String domainId,
      final String locale,
      final InputStream inputStream,
      final boolean overwrite)
      throws DomainStorageException {
    if (logger.isDebugEnabled()) {
      logger.debug("addLocalizationFile(" + domainId + ", " + locale + ", inputStream)");
    }
    if (null != inputStream) {
      if (StringUtils.isEmpty(domainId) || StringUtils.isEmpty(locale)) {
        throw new IllegalArgumentException(
            messages.getErrorString(
                "PentahoMetadataDomainRepository.ERROR_0004_DOMAIN_ID_INVALID", domainId));
      }

      lock.writeLock().lock();
      try {
        // Check for duplicates
        final RepositoryFile localeFile = metadataMapping.getLocaleFile(domainId, locale);
        if (!overwrite && localeFile != null) {
          throw new DomainStorageException(
              messages.getErrorString(
                  "PentahoMetadataDomainRepository.ERROR_0009_LOCALE_ALREADY_EXISTS",
                  domainId,
                  locale),
              null);
        }

        final SimpleRepositoryFileData data =
            new SimpleRepositoryFileData(inputStream, DEFAULT_ENCODING, LOCALE_MIME_TYPE);
        if (localeFile == null) {
          final RepositoryFile newLocaleFile = createUniqueFile(domainId, locale, data);
          metadataMapping.addLocale(domainId, locale, newLocaleFile);
        } else {
          repository.updateFile(localeFile, data, null);
        }
        // This invalidates any cached information
        flushDomains();
      } finally {
        lock.writeLock().unlock();
      }
    }
  }
  @Override
  public void storeDomain(
      InputStream inputStream, String domainId, boolean overwrite, RepositoryFileAcl acl)
      throws DomainIdNullException, DomainAlreadyExistsException, DomainStorageException {
    if (logger.isDebugEnabled()) {
      logger.debug(String.format("storeDomain(inputStream, %s, %s, %s)", domainId, overwrite, acl));
    }
    if (null == inputStream) {
      throw new IllegalArgumentException();
    }
    if (StringUtils.isEmpty(domainId)) {
      throw new DomainIdNullException(
          messages.getErrorString("PentahoMetadataDomainRepository.ERROR_0001_DOMAIN_ID_NULL"));
    }

    // Check to see if the domain already exists
    final RepositoryFile domainFile = getMetadataRepositoryFile(domainId);
    if (!overwrite && domainFile != null) {
      final String errorString =
          messages.getErrorString(
              "PentahoMetadataDomainRepository.ERROR_0002_DOMAIN_ALREADY_EXISTS", domainId);
      logger.error(errorString);
      throw new DomainAlreadyExistsException(errorString);
    }

    // Check if this is valid xml
    InputStream inputStream2;
    String xmi;
    try {
      // try to see if the xmi can be parsed (ie, check if it's valid xmi)
      // first, convert our input stream to a string
      StringBuilder stringBuilder = new StringBuilder();
      BufferedReader reader =
          new BufferedReader(new InputStreamReader(inputStream, DEFAULT_ENCODING));
      try {
        while ((xmi = reader.readLine()) != null) {
          stringBuilder.append(xmi);
        }
      } finally {
        inputStream.close();
      }

      if (!isDomainIdXmiEqualsOrNotPresent(domainId, getDomainIdFromXmi(stringBuilder))) {
        domainId = replaceDomainId(stringBuilder, domainId);
      }

      xmi = stringBuilder.toString();
      // now, try to see if the xmi can be parsed (ie, check if it's valid xmi)
      byte[] xmiBytes = xmi.getBytes(DEFAULT_ENCODING);
      inputStream2 = new java.io.ByteArrayInputStream(xmiBytes);
      xmiParser.parseXmi(inputStream2);
      // xmi is valid. Create a new inputstream for the actual import action.
      inputStream2.reset();
    } catch (Exception ex) {
      logger.error(ex.getMessage());
      // throw new
      // DomainStorageException(messages.getErrorString("PentahoMetadataDomainRepository.ERROR_0010_ERROR_PARSING_XMI"),
      // ex);
      java.io.ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      ex.printStackTrace(new java.io.PrintStream(byteArrayOutputStream));
      throw new DomainStorageException(byteArrayOutputStream.toString(), ex);
    }

    final SimpleRepositoryFileData data =
        new SimpleRepositoryFileData(inputStream2, DEFAULT_ENCODING, DOMAIN_MIME_TYPE);
    final RepositoryFile newDomainFile;
    if (domainFile == null) {
      newDomainFile = createUniqueFile(domainId, null, data);
    } else {
      newDomainFile = repository.updateFile(domainFile, data, null);
    }

    // This invalidates any caching
    flushDomains();

    getAclHelper().setAclFor(newDomainFile, acl);
  }