All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.digidoc4j.ContainerOpener Maven / Gradle / Ivy

Go to download

DigiDoc4j is a Java library for digitally signing documents and creating digital signature containers of signed documents

There is a newer version: 6.0.1
Show newest version
/* DigiDoc4J library
*
* This software is released under either the GNU Library General Public
* License (see LICENSE.LGPL).
*
* Note that the only valid version of the LGPL license as far as this
* project is concerned is the original GNU Library General Public License
* Version 2.1, February 1999
*/

package org.digidoc4j;

import java.io.BufferedInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.digidoc4j.exceptions.DigiDoc4JException;
import org.digidoc4j.impl.asic.asice.AsicEContainer;
import org.digidoc4j.impl.asic.asice.bdoc.BDocContainer;
import org.digidoc4j.impl.asic.asics.AsicSContainer;
import org.digidoc4j.impl.ddoc.DDocOpener;
import org.digidoc4j.impl.pades.PadesContainer;
import org.digidoc4j.utils.Helper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Helper class for opening containers. The proper way of opening containers would be using {@link ContainerBuilder},
 * for example using {@link ContainerBuilder#fromExistingFile(String)} and {@link ContainerBuilder#fromStream(InputStream)}.
 *
 * @see ContainerBuilder
 */
public class ContainerOpener {

  private static final Logger logger = LoggerFactory.getLogger(ContainerOpener.class);

  /**
   * Open container from a file. Use {@link ContainerBuilder#fromExistingFile(String)} instead.
   *
   * @param path          file name and path.
   * @param configuration configuration settings
   * @return container new container of the specified format
   * @throws DigiDoc4JException when the file is not found or empty
   * @see ContainerBuilder
   */
  public static Container open(String path, Configuration configuration) throws DigiDoc4JException {
    logger.debug("Opening container from path: " + path);
    try {
      if (Helper.isPdfFile(path)){
        return openPadesContainer(path, configuration);
      } else if (Helper.isZipFile(new File(path))) {
        return openBDocContainer(path, configuration);
      } else {
        return new DDocOpener().open(path, configuration);
      }
    } catch (EOFException eof) {
      throw new DigiDoc4JException("File is invalid");
    } catch (IOException e) {
      throw new DigiDoc4JException(e);
    }
  }

  /**
   * Open container from a file. Use {@link ContainerBuilder#fromExistingFile(String)} instead.
   *
   * @param path file name and path.
   * @return container
   * @throws DigiDoc4JException when the file is not found or empty
   * @see ContainerBuilder
   */
  public static Container open(String path) throws DigiDoc4JException {
    return open(path, Configuration.getInstance());
  }

  /**
   * Open container from a stream. Use {@link ContainerBuilder#fromStream(InputStream)} instead.
   *
   * @param stream                      input stream
   * @param actAsBigFilesSupportEnabled acts as configuration parameter
   * @return container
   * @see Configuration#isBigFilesSupportEnabled() returns true used for BDOC
   * @see ContainerBuilder
   */
  public static Container open(InputStream stream, boolean actAsBigFilesSupportEnabled) {
    logger.debug("Opening container from stream");
    BufferedInputStream bufferedInputStream = new BufferedInputStream(stream);
    try {
      if (Helper.isZipFile(bufferedInputStream)) {
        if (Helper.isAsicSContainer(bufferedInputStream)){
          return new  AsicSContainer(bufferedInputStream);
        } else if (Helper.isAsicEContainer(bufferedInputStream)) {
          return new AsicEContainer(bufferedInputStream);
        }
        return new BDocContainer(bufferedInputStream);
      } else {
        return new DDocOpener().open(bufferedInputStream);
      }
    } catch (IOException e) {
      throw new DigiDoc4JException(e);
    } finally {
      IOUtils.closeQuietly(bufferedInputStream);
    }
  }

  /**
   * Open container from a stream. Use {@link ContainerBuilder#fromStream(InputStream)} instead.
   *
   * @param stream stream of a container to open.
   * @param configuration configuration settings.
   * @return opened container.
   * @see ContainerBuilder
   */
  public static Container open(InputStream stream, Configuration configuration) {
    logger.debug("Opening container from stream");
    BufferedInputStream bufferedInputStream = new BufferedInputStream(stream);
    try {
      if (Helper.isZipFile(bufferedInputStream)) {
        if (Helper.isAsicSContainer(bufferedInputStream)){
          return new  AsicSContainer(bufferedInputStream, configuration);
        } else if (Helper.isAsicEContainer(bufferedInputStream)) {
          return new AsicEContainer(bufferedInputStream, configuration);
        }
        return new BDocContainer(bufferedInputStream, configuration);
      } else {
        return new DDocOpener().open(bufferedInputStream, configuration);
      }
    } catch (IOException e) {
      throw new DigiDoc4JException(e);
    } finally {
      IOUtils.closeQuietly(bufferedInputStream);
    }
  }

  private static Container openBDocContainer(String path, Configuration configuration) {
    configuration.loadConfiguration("digidoc4j.yaml", false);
    if (Helper.isAsicSContainer(path)){
      return new AsicSContainer(path, configuration);
    } else if (Helper.isAsicEContainer(path)) {
      return new AsicEContainer(path, configuration);
    }
    return new BDocContainer(path, configuration);
  }

  private static Container openPadesContainer(String path, Configuration configuration) {
    configuration.loadConfiguration("digidoc4j.yaml", false);
    return new PadesContainer(configuration, path);
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy