package cn.org.rapid_framework.generator;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import cn.org.rapid_framework.generator.util.GLogger;
import cn.org.rapid_framework.generator.util.PropertiesHelper;
import cn.org.rapid_framework.generator.util.PropertyPlaceholderHelper;
import cn.org.rapid_framework.generator.util.PropertyPlaceholderHelper.PropertyPlaceholderConfigurerResolver;
/**
* 生成器配置类
* 用于装载generator.properties,generator.xml文件
* @author badqiu
* @email badqiu(a)gmail.com
*/
public class GeneratorProperties {
static PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper("${", "}", ":", false);
static final String PROPERTIES_FILE_NAMES[] = new String[]{"generator.properties","generator.xml","custom-generator.properties","custom-generator.xml"};
static PropertiesHelper props = new PropertiesHelper(new Properties(),true);
private GeneratorProperties(){}
static {
reload();
}
public static void reload() {
try {
GLogger.println("Start Load GeneratorPropeties from classpath:"+Arrays.toString(PROPERTIES_FILE_NAMES));
Properties p = new Properties();
String[] loadedFiles = PropertiesHelper.loadAllPropertiesFromClassLoader(p,PROPERTIES_FILE_NAMES);
GLogger.println("GeneratorPropeties Load Success,files:"+Arrays.toString(loadedFiles));
setProperties(p);
}catch(IOException e) {
throw new RuntimeException("Load "+PROPERTIES_FILE_NAMES+" error",e);
}
}
// 自动替换所有value从 com.company 替换为 com/company,并设置key = key+"_dir"后缀
private static Properties autoReplacePropertiesValue2DirValue(Properties props) {
Properties autoReplaceProperties = new Properties();
for(Object key : getProperties().keySet()) {
String dir_key = key.toString()+"_dir";
// if(props.entrySet().contains(dir_key)) {
// continue;
// }
String value = props.getProperty(key.toString());
String dir_value = value.toString().replace('.', '/');
autoReplaceProperties.put(dir_key, dir_value);
}
return autoReplaceProperties;
}
public static Properties getProperties() {
return getHelper().getProperties();
}
private static PropertiesHelper getHelper() {
return props;
}
public static String getProperty(String key, String defaultValue) {
return getHelper().getProperty(key, defaultValue);
}
public static String getProperty(String key) {
return getHelper().getProperty(key);
}
public static String getRequiredProperty(String key) {
return getHelper().getRequiredProperty(key);
}
public static int getRequiredInt(String key) {
return getHelper().getRequiredInt(key);
}
public static boolean getRequiredBoolean(String key) {
return getHelper().getRequiredBoolean(key);
}
public static String getNullIfBlank(String key) {
return getHelper().getNullIfBlank(key);
}
public static void setProperty(String key,String value) {
value = resolveProperty(value,getProperties());
key = resolveProperty(key,getProperties());
GLogger.println("[setProperty()] "+key+"="+value);
getHelper().setProperty(key, value);
String dir_value = value.toString().replace('.', '/');
getHelper().getProperties().put(key+"_dir", dir_value);
}
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 helper.replacePlaceholders(v, propertyPlaceholderConfigurerResolver);
}
public static void setProperties(Properties inputProps) {
props = new PropertiesHelper(resolveProperties(inputProps),true);
for(Iterator it = props.entrySet().iterator();it.hasNext();) {
Map.Entry entry = (Map.Entry)it.next();
GLogger.println("[Property] "+entry.getKey()+"="+entry.getValue());
}
GLogger.println("");
GLogger.println("[Auto Replace] [.] => [/] on generator.properties, key=source_key+'_dir', For example: pkg=com.company ==> pkg_dir=com/company \n");
Properties dirProperties = autoReplacePropertiesValue2DirValue(props.getProperties());
props.getProperties().putAll(dirProperties);
}
}