package org.zstack.core.beansetting;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.zstack.header.exception.CloudRuntimeException;
import org.zstack.utils.Utils;
import org.zstack.utils.gson.JSONObjectUtil;
import org.zstack.utils.logging.CLogger;
import org.zstack.utils.path.PathUtil;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: frank
* Time: 7:09 PM
* To change this template use File | Settings | File Templates.
*/
public class BeanSettingFacadeImpl implements BeanSettingFacade, BeanPostProcessor {
private static final CLogger logger = Utils.getLogger(BeanSettingFacadeImpl.class);
private Map<String, Map> settings = new HashMap<String, Map>();
private BeanSettingFacadeImpl() {
List<String> paths = PathUtil.scanFolderOnClassPath("settings");
for (String p : paths) {
if (!p.endsWith(".json")) {
logger.warn(String.format("ignore %s which is not ending with .json", p));
continue;
}
File cfg = new File(p);
try {
String content = FileUtils.readFileToString(cfg);
Map setting = JSONObjectUtil.toObject(content, HashMap.class);
String beanName = (String) setting.get("beanName");
if (beanName == null) {
throw new IllegalArgumentException(String.format("Setting file[%s] doesn't have mandatory field 'beanName' which matches Spring bean that this setting file applies to", p));
}
setting.put(beanName, setting);
} catch (IOException e) {
throw new CloudRuntimeException(e);
}
}
}
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
Map setting = settings.get(s);
if (setting == null) {
return o;
}
return o;
}
}