package com.alibaba.tamper.core.config;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import com.alibaba.tamper.core.BeanMappingException;
import com.alibaba.tamper.core.helper.ReflectionHelper;
import com.alibaba.tamper.core.introspect.Uberspect;
import com.alibaba.tamper.core.introspect.UberspectImpl;
import com.alibaba.tamper.core.process.ValueProcess;
/**
* mapping的一些环境变量配置
*
* @author jianghang 2012-1-30 下午03:59:21
*/
public class BeanMappingEnvironment {
private static final String config = "mapping.properties";
private static final String BEANMAP_VPS = "beanMap.valueProcess.list";
private static final String BEANMAPPING_VPS = "beanMapping.valueProcess.list";
private static final String BEANCOPY_VPS = "beanCopy.valueProcess.list";
private static final String VALUEPROCESS_PREFIX = "valueProcess.";
private static final String UBERSPECTOR_IMPL = "uberspect.impl";
private static Properties properties = new Properties(System.getProperties());
private static List<ValueProcess> beanMappingVps;
private static List<ValueProcess> beanMapVps;
private static List<ValueProcess> beanCopyVps;
private static Class uberspectClazz;
private static boolean isBeanMappingSupportScript = false;
static {
InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(config);
try {
properties.load(stream);
} catch (IOException e) {
throw new BeanMappingException("can't found " + config);
}
try {
// 解析value process
String vps = properties.getProperty(BEANMAPPING_VPS, StringUtils.EMPTY);
beanMappingVps = parseVps(vps);
isBeanMappingSupportScript = StringUtils.containsIgnoreCase(vps, "script");
beanMapVps = parseVps(properties.getProperty(BEANMAP_VPS, StringUtils.EMPTY));
beanCopyVps = parseVps(properties.getProperty(BEANCOPY_VPS, StringUtils.EMPTY));
// 解析uberspect
String uberspectClazzName = properties.getProperty(UBERSPECTOR_IMPL, UberspectImpl.class.getName());
uberspectClazz = Class.forName(uberspectClazzName);
} catch (Exception e) {
throw new BeanMappingException(e);
}
}
public static boolean isBeanMappingSupportScript() {
return isBeanMappingSupportScript;
}
public static List<ValueProcess> getBeanMappingVps() {
return beanMappingVps;
}
public static List<ValueProcess> getBeanMapVps() {
return beanMapVps;
}
public static List<ValueProcess> getBeanCopyVps() {
return beanCopyVps;
}
public static Uberspect getUberspect() {
return (Uberspect) ReflectionHelper.newInstance(uberspectClazz);
}
public static void setBeanMappingVps(String vps) {
beanMappingVps = parseVps(vps);
isBeanMappingSupportScript = StringUtils.containsIgnoreCase(vps, "script");
}
public static void setBeanMapVps(String vps) {
beanMapVps = parseVps(vps);
}
public static void setBeanCopyVps(String vps) {
beanCopyVps = parseVps(vps);
}
public static void setValueProcess(String vp, Class clazz) {
properties.put(vp, clazz.getName());
}
public static void setUberspect(Class uberspectClazz) {
BeanMappingEnvironment.uberspectClazz = uberspectClazz;
}
// =================== help method =======================
private static List<ValueProcess> parseVps(String vps) {
String[] strs = StringUtils.split(vps, ",");
List<ValueProcess> result = new ArrayList<ValueProcess>();
for (String str : strs) {
result.add(initValueProcess(str));
}
return result;
}
private static ValueProcess initValueProcess(String name) {
String className = (String) properties.get(VALUEPROCESS_PREFIX + name);
try {
Class clazz = Class.forName(className);
if (ValueProcess.class.isAssignableFrom(clazz) == false) {
throw new BeanMappingException(className + " is not assign From ValueProcess!");
}
return (ValueProcess) ReflectionHelper.newInstance(clazz);
} catch (ClassNotFoundException e) {
throw new BeanMappingException(e);
}
}
}