/* 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.bdoc.ExistingBDocContainer; import org.digidoc4j.impl.ddoc.DDocOpener; 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 final static 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.isZipFile(new File(path))) { return openBDocContainer(path, configuration); } else { return new DDocOpener().open(path, configuration); } } catch (EOFException eof) { String msg = "File is not valid."; logger.error(msg); throw new DigiDoc4JException(msg); } catch (IOException e) { logger.error(e.getMessage()); 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 { logger.debug(""); 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)) { //TODO support big file support flag return new ExistingBDocContainer(bufferedInputStream); } else { return new DDocOpener().open(bufferedInputStream); } } catch (IOException e) { logger.error(e.getMessage()); 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)) { return new ExistingBDocContainer(bufferedInputStream, configuration); } else { return new DDocOpener().open(bufferedInputStream, configuration); } } catch (IOException e) { logger.error(e.getMessage()); throw new DigiDoc4JException(e); } finally { IOUtils.closeQuietly(bufferedInputStream); } } private static Container openBDocContainer(String path, Configuration configuration) { configuration.loadConfiguration("digidoc4j.yaml"); return new ExistingBDocContainer(path, configuration); } }