package at.gv.egiz.pdfas.utils; import java.io.File; 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.lang.StringUtils; import org.apache.commons.lang.SystemUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.log4j.PropertyConfigurator; import at.gv.egiz.pdfas.api.commons.Constants; import at.gv.egiz.pdfas.api.exceptions.ConfigUtilsException; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; import at.knowcenter.wag.egov.egiz.pdf.Utils; /** * @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 { if (!overwriteExisting) { if (configurationAlreadyExists(destination)) { logger_.debug("There is at least one file or folder that would be overwritten at destination path \"" + destination + "\". Skipping extraction."); 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 + "\"."); } return deployFromZIP(in, destination, overwriteExisting); } catch (IOException e) { throw new ConfigUtilsException(e); } } /** * Deploys the contents of a ZIP file to a certain location. * * @param inputStream The inputStream of a ZIP container. * @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 deployFromZIP(InputStream inputStream, String destination, boolean overwriteExisting) throws ConfigUtilsException { try { if (!overwriteExisting) { if (configurationAlreadyExists(destination)) { logger_.debug("There is at least one file or folder that would be overwritten at destination path \"" + destination + "\". Skipping extraction."); return false; } } if (inputStream == null) { throw new ConfigUtilsException("Unable to deploy ZIP file. InputStream is null."); } ZipInputStream zis = new ZipInputStream(inputStream); ZipEntry ze; File destinationFolder = new File(destination); destinationFolder.mkdirs(); logger_.debug("Extracting ZIP contents 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() + "\"."); PDFASUtils.toFile(zis, destFile); } zis.closeEntry(); } zis.close(); return true; } catch (IOException e) { throw new ConfigUtilsException(e); } } private static boolean configurationAlreadyExists(String destination) throws ConfigUtilsException, IOException { logger_.debug("Checking configuration \"" + destination + "\" already exists (resp. if there are any directories or files that would be overwritten)."); File destinationFolder = new File(destination); if (destinationFolder == null || !destinationFolder.exists()) { 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; while ((ze = zis.getNextEntry()) != null) { if (ze.isDirectory()) { File newFolder = new File(destinationFolder, ze.getName()); logger_.debug("Checking if folder \"" + newFolder.getPath() + "\" already exists."); if (newFolder.exists()) { logger_.debug("YES !"); return true; } else { logger_.debug("no"); } } else { File destFile = new File(destinationFolder, ze.getName()); logger_.trace("Checking if file \"" + destFile.getName() + "\" already exists."); if (destFile.exists()) { logger_.trace("YES !"); return true; } else { logger_.trace("no"); } } zis.closeEntry(); } zis.close(); return false; } /** * 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 The folder the configuration has been extracted to or null if the configuration has NOT been deployed. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. */ public static String 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) ? destination : null; } /** * 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 The folder the configuration has been extracted to or null if the configuration has NOT been deployed. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. * @see Constants#USERHOME_CONFIG_FOLDER */ public static String deployDefaultConfiguration(boolean overwriteExisting) throws ConfigUtilsException { String configdir = System.getProperty(Constants.CONFIG_DIR_SYSTEM_PROPERTY); if (configdir == null) { configdir = System.getProperty("user.home"); if (configdir != null) { configdir = configdir + File.separator + Constants.USERHOME_CONFIG_FOLDER; } } if (configdir == null || configdir.length() == 0) { return null; } return deployDefaultConfiguration(configdir, overwriteExisting); } /** * Deploys the default configuration to the user's home directory to the subdirectory specified by * Constants.Constants.USERHOME_CONFIG_FOLDER. * * @return The folder the configuration has been extracted to or null if the configuration has NOT been deployed. * @throws ConfigUtilsException Thrown if there was an error during the deployment of the configuration. * @see Constants#USERHOME_CONFIG_FOLDER */ public static String deployDefaultConfiguration() throws ConfigUtilsException { return deployDefaultConfiguration(false); } 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(); } public static String assertFileSeparator(String path) { if (path == null) { throw new NullPointerException("Path must not be null."); } if (path.endsWith(File.separator) || path.endsWith("/") || path.endsWith("\\")) { return path; } else { return (path + File.separator); } } public static void initializeLogger() { String loggerConfiguration = System.getProperty("log4j.configuration"); if (loggerConfiguration != null) { logger_.info("No PDF-AS logger configured because a configuration has already been set via system property \"log4j.configuration\" (=\"" + loggerConfiguration + "\")."); return; } loggerConfiguration = assertFileSeparator(SettingsReader.CONFIG_PATH) + "log4j.properties"; File loggerConfigFile = new File(loggerConfiguration); if (!loggerConfigFile.exists()) { logger_.info("No PDF-AS logger configured because there is no log4j.properties within the pdf-as work dir. Maybe the logger configuration is handled by an outside application (e.g. a web application)."); return; } logger_.info("Initializing PDF-AS logger (configuration = \"" + loggerConfiguration + "\")."); PropertyConfigurator.configure(loggerConfiguration); } public static void printConfigInfo(Log logger) { int length = Utils.max(new int[] { SettingsReader.RESOURCES_PATH.length(), SettingsReader.TMP_PATH.length(), SettingsReader.CONFIG_PATH.length(), SettingsReader.CERT_PATH.length() }); String separator = StringUtils.repeat("*", length + 25); String infoResources = " resources path = \"" + SettingsReader.RESOURCES_PATH + "\""; String infoConfiguration = " configuration path = \"" + SettingsReader.CONFIG_PATH + "\""; String infoCertStore = " certstore path = \"" + SettingsReader.CERT_PATH + "\""; String infoTempPath = " temporary path = \"" + SettingsReader.TMP_PATH + "\""; String encoding = " file.encoding = \"" + System.getProperty("file.encoding") + "\""; if (logger != null) { logger.info(separator); logger.info(infoResources); logger.info(infoConfiguration); logger.info(infoCertStore); logger.info(infoTempPath); logger.info(encoding); logger.info(separator); } else { StringBuffer buffer = new StringBuffer(); buffer.append(separator).append(SystemUtils.LINE_SEPARATOR); buffer.append(infoResources).append(SystemUtils.LINE_SEPARATOR); buffer.append(infoConfiguration).append(SystemUtils.LINE_SEPARATOR); buffer.append(infoCertStore).append(SystemUtils.LINE_SEPARATOR); buffer.append(infoTempPath).append(SystemUtils.LINE_SEPARATOR); buffer.append(encoding).append(SystemUtils.LINE_SEPARATOR); buffer.append(separator); System.out.println(buffer.toString()); } } public static void printConfigInfo() { printConfigInfo(null); } }