package at.gv.egiz.pdfas.utils; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.pdfas.api.commons.Constants; import at.gv.egiz.pdfas.api.exceptions.ConfigUtilsException; /** * @author Thomas Knall */ public final class ConfigUtils { private ConfigUtils() { } /** * The log. */ private static final Log logger_ = LogFactory.getLog(ConfigUtils.class); /** * Deploys the default configuration with apache commons vfs. * * @param destination The destination folder. * @param overwriteExisting If set true an already existing configuration is overwritten. If false nothing is being copied if the destination folder already exists. * @return true if the configuration has been deployed, false if not. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. */ /* private static boolean deployWithCommonsVFS(String destination, boolean overwriteExisting) throws ConfigUtilsException { try { FileSystemManager fsManager = VFS.getManager(); FileObject defaultConfigurationFile = fsManager.resolveFile("res:DefaultConfiguration"); FileObject destinationFile = fsManager.resolveFile(destination); if (destinationFile.exists() && !overwriteExisting) { return false; } destinationFile.copyFrom(defaultConfigurationFile, new AllFileSelector()); return true; } catch (FileSystemException e) { throw new ConfigUtilsException(e); } } */ /** * Deploys the default configuration from an included zip file. * * @param destination The destination folder. * @param overwriteExisting If set true an already existing configuration is overwritten. If false nothing is being copied if the destination folder already exists. * @return true if the configuration has been deployed, false if not. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. */ private static boolean deployFromZIP(String destination, boolean overwriteExisting) throws ConfigUtilsException { try { File destinationFolder = new File(destination); if (destinationFolder.exists() && !overwriteExisting) { return false; } InputStream in = ConfigUtils.class.getClassLoader().getResourceAsStream(Constants.DEFAULT_CONFIGURATION_ZIP_RESOURCE); if (in == null) { throw new ConfigUtilsException("Unable to find default configuration resource \"" + Constants.DEFAULT_CONFIGURATION_ZIP_RESOURCE + "\"."); } ZipInputStream zis = new ZipInputStream(in); ZipEntry ze; destinationFolder.mkdirs(); logger_.debug("Extracting default configuration to folder \"" + destinationFolder.getCanonicalPath() + "\"."); while ((ze = zis.getNextEntry()) != null) { if (ze.isDirectory()) { File newFolder = new File(destinationFolder, ze.getName()); logger_.debug("Extracting folder \"" + newFolder.getPath() + "\"."); newFolder.mkdirs(); } else { File destFile = new File(destinationFolder, ze.getName()); logger_.trace("Extracting file \"" + destFile.getName() + "\"."); toFile(zis, destFile); } zis.closeEntry(); } zis.close(); return true; } catch (IOException e) { throw new ConfigUtilsException(e); } } /** * Deploys the default configuration to the given destination folder. * * @param destination The destination folder. * @param overwriteExisting If set true an already existing configuration is overwritten. If false nothing is being copied if the destination folder already exists. * @return true if the configuration has been deployed, false if not. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. */ public static boolean deployDefaultConfiguration(String destination, boolean overwriteExisting) throws ConfigUtilsException { if (destination == null) { throw new NullPointerException("Destination must not be null."); } if (destination.length() == 0) { throw new IllegalArgumentException("Destination must not be empty."); } return deployFromZIP(destination, overwriteExisting); } /** * Deploys the default configuration to the user's home directory to the subdirectory specified by * Constants.Constants.USERHOME_CONFIG_FOLDER. * * @param overwriteExisting If set true an already existing configuration is overwritten. If false nothing is being copied if the destination folder already exists. * @return true if the configuration has been deployed, false if not. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. * @see Constants#USERHOME_CONFIG_FOLDER */ public static boolean deployDefaultConfiguration(boolean overwriteExisting) throws ConfigUtilsException { String userHome = System.getProperty("user.home"); if (userHome == null || userHome.length() == 0) { return false; } return deployDefaultConfiguration(userHome + File.separator + Constants.USERHOME_CONFIG_FOLDER, overwriteExisting); } /** * Deploys the default configuration to the user's home directory to the subdirectory specified by * Constants.Constants.USERHOME_CONFIG_FOLDER. * * @return true if the configuration has been deployed, false if not. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. * @see Constants#USERHOME_CONFIG_FOLDER */ public static boolean deployDefaultConfiguration() throws ConfigUtilsException { return deployDefaultConfiguration(false); } public static boolean toFile(InputStream inputStream, File file) throws IOException { boolean result = false; BufferedOutputStream bufferedOutputStream = null; try { bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file)); writeInputStreamToOutputStream(inputStream, bufferedOutputStream); } finally { if (bufferedOutputStream != null) { try { bufferedOutputStream.close(); result = true; } catch (IOException e) { result = false; } } } return result; } public static void writeInputStreamToOutputStream(InputStream inputStream, OutputStream outputStream) throws IOException { final int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int len = -1; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } outputStream.flush(); } }