package net.sf.jasperreports.engine.util; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Properties; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRPropertiesHolder; import net.sf.jasperreports.engine.JRPropertiesMap; import net.sf.jasperreports.engine.JRRuntimeException; public class JRProperties { protected static final String DEFAULT_PROPERTIES_FILE = "jasperreports.properties"; public static final String PROPERTY_PREFIX = "net.sf.jasperreports."; public static final String PROPERTIES_FILE = "net.sf.jasperreports.properties"; public static final String COMPILER_CLASS = "net.sf.jasperreports.compiler.class"; public static final String COMPILER_XML_VALIDATION = "net.sf.jasperreports.compiler.xml.validation"; public static final String COMPILER_KEEP_JAVA_FILE = "net.sf.jasperreports.compiler.keep.java.file"; public static final String COMPILER_TEMP_DIR = "net.sf.jasperreports.compiler.temp.dir"; public static final String COMPILER_CLASSPATH = "net.sf.jasperreports.compiler.classpath"; public static final String EXPORT_XML_VALIDATION = "net.sf.jasperreports.export.xml.validation"; public static final String PDF_FONT_FILES_PREFIX = "net.sf.jasperreports.export.pdf.font."; public static final String PDF_FONT_DIRS_PREFIX = "net.sf.jasperreports.export.pdf.fontdir."; public static final String QUERY_EXECUTER_FACTORY_PREFIX = "net.sf.jasperreports.query.executer.factory."; public static final String SUBREPORT_RUNNER_FACTORY = "net.sf.jasperreports.subreport.runner.factory"; public static final String PDF_FORCE_LINEBREAK_POLICY = "net.sf.jasperreports.export.pdf.force.linebreak.policy"; protected static Properties props; protected static Properties savedProps; static { initProperties(); } protected static void initProperties() { try { Properties defaults = getDefaults(); String propFile = getSystemProperty("net.sf.jasperreports.properties"); if (propFile == null) { props = loadProperties("jasperreports.properties", defaults); if (props == null) props = new Properties(defaults); } else { props = loadProperties(propFile, defaults); if (props == null) throw new JRRuntimeException("Could not load properties file \"" + propFile + "\""); } loadSystemProperties(); } catch (JRException e) { throw new JRRuntimeException("Error loading the properties", e); } } protected static void loadSystemProperties() { loadSystemProperty("jasper.reports.compiler.class", "net.sf.jasperreports.compiler.class"); loadSystemProperty("jasper.reports.compile.xml.validation", "net.sf.jasperreports.compiler.xml.validation"); loadSystemProperty("jasper.reports.export.xml.validation", "net.sf.jasperreports.export.xml.validation"); loadSystemProperty("jasper.reports.compile.keep.java.file", "net.sf.jasperreports.compiler.keep.java.file"); loadSystemProperty("jasper.reports.compile.temp", "net.sf.jasperreports.compiler.temp.dir"); loadSystemProperty("jasper.reports.compile.class.path", "net.sf.jasperreports.compiler.classpath"); } protected static Properties getDefaults() throws JRException { Properties defaults = new Properties(); InputStream is = JRProperties.class.getResourceAsStream("/default.jasperreports.properties"); if (is == null) throw new JRException("Default properties file not found."); try { defaults.load(is); } catch (IOException e) { throw new JRException("Failed to load default properties.", e); } finally { try { is.close(); } catch (IOException e) {} } String userDir = getSystemProperty("user.dir"); if (userDir != null) defaults.setProperty("net.sf.jasperreports.compiler.temp.dir", userDir); String classPath = getSystemProperty("java.class.path"); if (classPath != null) defaults.setProperty("net.sf.jasperreports.compiler.classpath", classPath); return defaults; } protected static String getSystemProperty(String propertyName) { try { return System.getProperty(propertyName); } catch (SecurityException e) { return null; } } protected static void loadSystemProperty(String sysKey, String propKey) { String val = getSystemProperty(sysKey); if (val != null) props.setProperty(propKey, val); } public static Properties loadProperties(String name, Properties defaults) throws JRException { Properties properties = null; InputStream is = null; try { is = JRLoader.getLocationInputStream(name); } catch (SecurityException e) {} if (is != null) { properties = new Properties(defaults); try { properties.load(is); } catch (IOException e) { throw new JRException("Failed to load properties file \"" + name + "\"", e); } finally { try { is.close(); } catch (IOException e) {} } } return properties; } public static String getProperty(String key) { return props.getProperty(key); } public static boolean getBooleanProperty(String key) { return asBoolean(props.getProperty(key)); } public static int getIntegerProperty(String key) { return asInteger(props.getProperty(key)); } public static boolean asBoolean(String value) { return Boolean.valueOf(value).booleanValue(); } public static int asInteger(String value) { return Integer.parseInt(value); } public static void setProperty(String key, String value) { props.setProperty(key, value); } public static void setProperty(String key, boolean value) { props.setProperty(key, String.valueOf(value)); } public static void backupProperties() { savedProps = (Properties)props.clone(); } public static void restoreProperties() { if (savedProps != null) try { props.clear(); props.putAll(savedProps); } finally { savedProps = null; } } public static class PropertySuffix { protected final String key; protected final String suffix; protected final String value; public PropertySuffix(String key, String suffix, String value) { this.key = key; this.suffix = suffix; this.value = value; } public String getKey() { return this.key; } public String getSuffix() { return this.suffix; } public String getValue() { return this.value; } } public static List getProperties(String prefix) { int prefixLength = prefix.length(); List values = new ArrayList(); for (Enumeration names = props.propertyNames(); names.hasMoreElements(); ) { String name = (String)names.nextElement(); if (name.startsWith(prefix)) { String suffix = name.substring(prefixLength); String value = props.getProperty(name); values.add(new PropertySuffix(name, suffix, value)); } } return values; } public static List getProperties(JRPropertiesHolder propertiesHolder, String prefix) { return getProperties(getOwnProperties(propertiesHolder), prefix); } public static List getProperties(JRPropertiesMap propertiesMap, String prefix) { int prefixLength = prefix.length(); List values = new ArrayList(); if (propertiesMap != null) { String[] propertyNames = propertiesMap.getPropertyNames(); for (int i = 0; i < propertyNames.length; i++) { String name = propertyNames[i]; if (name.startsWith(prefix)) { String suffix = name.substring(prefixLength); String value = propertiesMap.getProperty(name); values.add(new PropertySuffix(name, suffix, value)); } } } return values; } public static String getProperty(JRPropertiesHolder propertiesHolder, String key) { String value = null; while (propertiesHolder != null && value == null) { if (propertiesHolder.hasProperties()) value = propertiesHolder.getPropertiesMap().getProperty(key); propertiesHolder = propertiesHolder.getParentProperties(); } if (value == null) value = props.getProperty(key); return value; } public static String getProperty(JRPropertiesMap propertiesMap, String key) { String value = null; if (propertiesMap != null) value = propertiesMap.getProperty(key); if (value == null) value = props.getProperty(key); return value; } public static boolean getBooleanProperty(JRPropertiesHolder propertiesHolder, String key, boolean defaultValue) { String value = getProperty(propertiesHolder, key); return (value == null) ? defaultValue : asBoolean(value); } public static boolean getBooleanProperty(JRPropertiesMap propertiesMap, String key, boolean defaultValue) { String value = getProperty(propertiesMap, key); return (value == null) ? defaultValue : asBoolean(value); } public static int getIntegerProperty(JRPropertiesHolder propertiesHolder, String key, int defaultValue) { String value = getProperty(propertiesHolder, key); return (value == null) ? defaultValue : asInteger(value); } public static int getIntegerProperty(JRPropertiesMap propertiesMap, String key, int defaultValue) { String value = getProperty(propertiesMap, key); return (value == null) ? defaultValue : asInteger(value); } public static int getIntegerProperty(String key, int defaultValue) { String value = getProperty(key); return (value == null) ? defaultValue : asInteger(value); } public static long asLong(String value) { return Long.parseLong(value); } public static long getLongProperty(String key) { return asLong(props.getProperty(key)); } public static long getLongProperty(JRPropertiesMap propertiesMap, String key, int defaultValue) { String value = getProperty(propertiesMap, key); return (value == null) ? defaultValue : asLong(value); } protected static JRPropertiesMap getOwnProperties(JRPropertiesHolder propertiesHolder) { return propertiesHolder.hasProperties() ? propertiesHolder.getPropertiesMap() : null; } public static void transferProperties(JRPropertiesHolder source, JRPropertiesHolder destination, String tranferPropertiesPrefix) { if (!source.hasProperties()) return; transfer(source.getPropertiesMap(), destination, tranferPropertiesPrefix); } public static void transferProperties(JRPropertiesMap source, JRPropertiesHolder destination, String tranferPropertiesPrefix) { if (source == null || !source.hasProperties()) return; transfer(source, destination, tranferPropertiesPrefix); } protected static void transfer(JRPropertiesMap source, JRPropertiesHolder destination, String tranferPropertiesPrefix) { List transferPrefixProps = getProperties(tranferPropertiesPrefix); for (Iterator prefixIt = transferPrefixProps.iterator(); prefixIt.hasNext(); ) { PropertySuffix transferPrefixProp = prefixIt.next(); String transferPrefix = transferPrefixProp.getValue(); if (transferPrefix != null && transferPrefix.length() > 0) { List transferProps = getProperties(source, transferPrefix); for (Iterator propIt = transferProps.iterator(); propIt.hasNext(); ) { PropertySuffix property = propIt.next(); String value = property.getValue(); destination.getPropertiesMap().setProperty(property.getKey(), value); } } } } }