package cn.org.rapid_framework.generator.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Enumeration; import java.util.InvalidPropertiesFormatException; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.Map.Entry; import cn.org.rapid_framework.generator.util.PropertyPlaceholderHelper.PropertyPlaceholderConfigurerResolver; public class PropertiesHelper { boolean isSearchSystemProperty = false; Properties p; public PropertiesHelper(Properties p) { this.p = p; } public PropertiesHelper(Properties p,boolean isSearchSystemProperty) { this.p = resolveProperties(p); this.isSearchSystemProperty = isSearchSystemProperty; } public Properties getProperties() { return p; } public String getProperty(String key, String defaultValue) { String value = null; if(isSearchSystemProperty) { value = System.getProperty(key); } if(value == null || "".equals(value.trim())) { value = getProperties().getProperty(key); } return value == null || "".equals(value.trim()) ? defaultValue : value; } public String getProperty(String key) { return getProperty(key,null); } public String getRequiredProperty(String key) { String value = getProperty(key); if(value == null || "".equals(value.trim())) { throw new IllegalStateException("required property is blank by key="+key); } return value; } public Integer getInt(String key) { if(getProperty(key) == null) { return null; } return Integer.parseInt(getRequiredProperty(key)); } public int getInt(String key,int defaultValue) { if(getProperty(key) == null) { return defaultValue; } return Integer.parseInt(getRequiredProperty(key)); } public int getRequiredInt(String key) { return Integer.parseInt(getRequiredProperty(key)); } public String[] getStringArray(String key) { String v = getProperty(key); if(v == null) { return new String[0]; }else { return StringHelper.tokenizeToStringArray(v, ", \t\n\r\f"); } } public int[] getIntArray(String key) { String[] array = getStringArray(key); int[] result = new int[array.length]; for(int i = 0; i < array.length; i++) { result[i] = Integer.parseInt(array[i]); } return result; } public Boolean getBoolean(String key) { if(getProperty(key) == null) { return null; } return Boolean.parseBoolean(getRequiredProperty(key)); } public boolean getBoolean(String key,boolean defaultValue) { if(getProperty(key) == null) { return defaultValue; } return Boolean.parseBoolean(getRequiredProperty(key)); } public boolean getRequiredBoolean(String key) { return Boolean.parseBoolean(getRequiredProperty(key)); } public String getNullIfBlank(String key) { String value = getProperty(key); if(value == null || "".equals(value.trim())) { return null; } return value; } public PropertiesHelper setProperty(String key,String value) { value = resolveProperty(value,getProperties()); key = resolveProperty(key,getProperties()); p.setProperty(key, value); return this; } public PropertiesHelper putAll(Properties props) { p.putAll(resolveProperties(props)); return this; } public void clear() { p.clear(); } public Set<Entry<Object, Object>> entrySet() { return p.entrySet(); } public Enumeration<?> propertyNames() { return p.propertyNames(); } public static Properties load(String...files) throws InvalidPropertiesFormatException, IOException { Properties properties = new Properties(); for(String f : files) { File file = FileHelper.getFile(f); InputStream input = new FileInputStream(file); try { if(file.getPath().endsWith(".xml")){ properties.loadFromXML(input); }else { properties.load(input); } properties.putAll(properties); }finally { input.close(); } } return properties; } public static String[] loadAllPropertiesFromClassLoader(Properties properties,String... resourceNames) throws IOException { List successLoadProperties = new ArrayList(); for(String resourceName : resourceNames) { Enumeration urls = ClassHelper.getDefaultClassLoader().getResources(resourceName); while (urls.hasMoreElements()) { URL url = (URL) urls.nextElement(); successLoadProperties.add(url.getFile()); InputStream input = null; try { URLConnection con = url.openConnection(); con.setUseCaches(false); input = con.getInputStream(); if(resourceName.endsWith(".xml")){ properties.loadFromXML(input); }else { properties.load(input); } } finally { if (input != null) { input.close(); } } } } return (String[])successLoadProperties.toArray(new String[0]); } private static Properties resolveProperties(Properties props) { Properties result = new Properties(); for(Object s : props.keySet()) { String sourceKey = s.toString(); String key = resolveProperty(sourceKey,props); String value = resolveProperty(props.getProperty(sourceKey),props); result.setProperty(key, value); } return result; } private static String resolveProperty(String v,Properties props) { PropertyPlaceholderConfigurerResolver propertyPlaceholderConfigurerResolver = new PropertyPlaceholderConfigurerResolver(props); return propertyPlaceholderHelper.replacePlaceholders(v, propertyPlaceholderConfigurerResolver); } static PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}", ":", false); }