From 0a1f4e4735cd6cbfe1fd0f075b3d6fe2518fa3aa Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Tue, 17 Jun 2014 13:41:51 +0200 Subject: Fixed properties inclusion to support wildcards (issue: #22) --- pdf-as-common/build.gradle | 1 + .../at/gv/egiz/pdfas/common/settings/Settings.java | 296 +++++++++++++-------- 2 files changed, 191 insertions(+), 106 deletions(-) (limited to 'pdf-as-common') diff --git a/pdf-as-common/build.gradle b/pdf-as-common/build.gradle index 22c25e14..1ef6b6c8 100644 --- a/pdf-as-common/build.gradle +++ b/pdf-as-common/build.gradle @@ -15,6 +15,7 @@ dependencies { compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.5' compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '1.8.5' compile group: 'commons-collections', name: 'commons-collections', version: '3.2' + compile group: 'commons-io', name: 'commons-io', version: '2.4' compile group: 'ognl', name: 'ognl', version: '3.0.6' testCompile group: 'junit', name: 'junit', version: '4.+' } diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/Settings.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/Settings.java index abeba8b2..4eda8254 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/Settings.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/Settings.java @@ -25,123 +25,207 @@ package at.gv.egiz.pdfas.common.settings; import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOCase; +import org.apache.commons.io.filefilter.WildcardFileFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.util.*; -public class Settings implements ISettings, IProfileConstants{ - - private static final Logger logger = LoggerFactory.getLogger(Settings.class); - - protected Properties properties = new Properties(); - - protected File workDirectory; - - public Settings(File workDirectory) { - try { - this.workDirectory = workDirectory; - loadSettings(workDirectory); - } catch (PdfAsSettingsException e) { - logger.error(e.getMessage(), e); - } - } - - public void loadSettings(File workDirectory) throws PdfAsSettingsException { - try { - - String configDir = workDirectory.getAbsolutePath() + File.separator + CFG_DIR; - String configFile = configDir + File.separator + CFG_FILE; - logger.debug("Loading cfg file: " + configFile); - properties.load(new FileInputStream(configFile)); - - Map includes = this.getValuesPrefix(INCLUDE); - - if(includes != null) { - Iterator includeIterator = includes.values().iterator(); - while(includeIterator.hasNext()) { - String includeFile = configDir + File.separator + includeIterator.next(); - logger.debug("Loading included cfg file: " + includeFile); - try { - properties.load(new FileInputStream(includeFile)); - } catch(Throwable e) { - logger.error("Failed to load cfg file " + includeFile, e); - } - } - } - - logger.debug("Configured Properties:"); - /*if(logger.isDebugEnabled()) { - properties.list(System.out); - }*/ - - } catch (IOException e) { - throw new PdfAsSettingsException("Failed to read settings!", e); - } - } - - public String getValue(String key) { - return properties.getProperty(key); - } - - public boolean hasValue(String key) { - return properties.containsKey(key); - } - - public Map getValuesPrefix(String prefix) { - Iterator keyIterator = properties.keySet().iterator(); - Map valueMap = new HashMap(); - while(keyIterator.hasNext()) { - String key = keyIterator.next().toString(); - - if(key.startsWith(prefix)) { - valueMap.put(key, properties.getProperty(key)); - } - } - - if(valueMap.isEmpty()) { - return null; - } - - return valueMap; - } - - public Vector getFirstLevelKeys(String prefix) { - String mPrefix = prefix.endsWith(".")?prefix:prefix+"."; - Iterator keyIterator = properties.keySet().iterator(); - Vector valueMap = new Vector(); - while(keyIterator.hasNext()) { - String key = keyIterator.next().toString(); - - if(key.startsWith(prefix)) { - int keyIdx = key.indexOf('.', mPrefix.length()) > 0 ? key.indexOf('.', mPrefix.length()) : key.length(); - String firstLevels = key.substring(0, keyIdx); - if(!valueMap.contains(firstLevels)) { - valueMap.add(firstLevels); - } - } - } - - if(valueMap.isEmpty()) { - return null; - } - - return valueMap; - } +public class Settings implements ISettings, IProfileConstants { + + private static final Logger logger = LoggerFactory + .getLogger(Settings.class); + + protected Properties properties = new Properties(); + + protected File workDirectory; + + public Settings(File workDirectory) { + try { + this.workDirectory = workDirectory; + loadSettings(workDirectory); + } catch (PdfAsSettingsException e) { + logger.error(e.getMessage(), e); + } + } + + private void loadSettingsRecursive(File workDirectory, File file) + throws PdfAsSettingsException { + try { + String configDir = workDirectory.getAbsolutePath() + File.separator + + CFG_DIR; + Properties tmpProps = new Properties(); + logger.info("Loading: " + file.getName()); + tmpProps.load(new FileInputStream(file)); + + properties.putAll(tmpProps); + + Map includes = this.getValuesPrefix(INCLUDE, + tmpProps); + File contextFolder = new File(configDir); + if (includes != null) { + Iterator includeIterator = includes.values().iterator(); + while (includeIterator.hasNext()) { + String includeFileName = includeIterator.next(); + + File includeInstruction = new File(contextFolder, includeFileName); + contextFolder = includeInstruction.getParentFile(); + String includeName = includeInstruction.getName(); + + WildcardFileFilter fileFilter = new WildcardFileFilter( + includeName, IOCase.SENSITIVE); + Collection includeFiles = null; + + if (contextFolder != null && contextFolder.exists() + && contextFolder.isDirectory()) { + includeFiles = FileUtils.listFiles(contextFolder, + fileFilter, null); + } + if (includeFiles != null && !includeFiles.isEmpty()) { + logger.info("Including '" + includeFileName + "'."); + for (File includeFile : includeFiles) { + loadSettingsRecursive(workDirectory, includeFile); + } + } + } + } + + } catch (IOException e) { + throw new PdfAsSettingsException("Failed to read settings!", e); + } + } + + public void loadSettings(File workDirectory) throws PdfAsSettingsException { + //try { + String configDir = workDirectory.getAbsolutePath() + File.separator + + CFG_DIR; + String configFile = configDir + File.separator + CFG_FILE; + loadSettingsRecursive(workDirectory, new File(configFile)); + + /* + logger.debug("Loading cfg file: " + configFile); + + + properties.load(new FileInputStream(configFile)); + + Map includes = this.getValuesPrefix(INCLUDE); + File contextFolder = new File(configDir); + if (includes != null) { + Iterator includeIterator = includes.values().iterator(); + while (includeIterator.hasNext()) { + String includeFileName = includeIterator.next(); + if (includeFileName.contains("*")) { + WildcardFileFilter fileFilter = new WildcardFileFilter( + includeFileName, IOCase.SENSITIVE); + Collection includeFiles = null; + + if (contextFolder != null && contextFolder.exists() + && contextFolder.isDirectory()) { + includeFiles = FileUtils.listFiles(contextFolder, + fileFilter, null); + } + if (includeFiles != null && !includeFiles.isEmpty()) { + logger.info("Including '" + includeFileName + "'."); + for (File includeFile : includeFiles) { + properties + .load(new FileInputStream(includeFile)); + } + } + } else { + String includeFile = configDir + File.separator + + includeFileName; + logger.debug("Loading included cfg file: " + + includeFile); + try { + properties.load(new FileInputStream(includeFile)); + } catch (Throwable e) { + logger.error("Failed to load cfg file " + + includeFile, e); + } + } + } + } + */ + logger.debug("Configured Properties:"); + /* + * if(logger.isDebugEnabled()) { properties.list(System.out); } + */ + + //} catch (IOException e) { + // throw new PdfAsSettingsException("Failed to read settings!", e); + //} + } + + public String getValue(String key) { + return properties.getProperty(key); + } + + public boolean hasValue(String key) { + return properties.containsKey(key); + } + + private Map getValuesPrefix(String prefix, Properties props) { + Iterator keyIterator = props.keySet().iterator(); + Map valueMap = new HashMap(); + while (keyIterator.hasNext()) { + String key = keyIterator.next().toString(); + + if (key.startsWith(prefix)) { + valueMap.put(key, props.getProperty(key)); + } + } + + if (valueMap.isEmpty()) { + return null; + } + + return valueMap; + } + + public Map getValuesPrefix(String prefix) { + return getValuesPrefix(prefix, properties); + } + + public Vector getFirstLevelKeys(String prefix) { + String mPrefix = prefix.endsWith(".") ? prefix : prefix + "."; + Iterator keyIterator = properties.keySet().iterator(); + Vector valueMap = new Vector(); + while (keyIterator.hasNext()) { + String key = keyIterator.next().toString(); + + if (key.startsWith(prefix)) { + int keyIdx = key.indexOf('.', mPrefix.length()) > 0 ? key + .indexOf('.', mPrefix.length()) : key.length(); + String firstLevels = key.substring(0, keyIdx); + if (!valueMap.contains(firstLevels)) { + valueMap.add(firstLevels); + } + } + } + + if (valueMap.isEmpty()) { + return null; + } + + return valueMap; + } public boolean hasPrefix(String prefix) { Iterator keyIterator = properties.keySet().iterator(); - while(keyIterator.hasNext()) { - String key = keyIterator.next().toString(); - - if(key.startsWith(prefix)) { - return true; - } - } - return false; + while (keyIterator.hasNext()) { + String key = keyIterator.next().toString(); + + if (key.startsWith(prefix)) { + return true; + } + } + return false; } public String getWorkingDirectory() { -- cgit v1.2.3