package org.fastcatsearch.env; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Properties; import javax.xml.bind.JAXBException; import org.fastcatsearch.settings.NodeListSettings; import org.fastcatsearch.settings.SettingFileNames; import org.fastcatsearch.settings.Settings; import org.fastcatsearch.util.JAXBConfigs; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 엔진내 conf/하위 셋팅들을 가지고 있다. * system.properties : 시스템 설정. 각 엔진마다 커스터마이징할 수 있고, 고급설정이므로 관리도구에서는 편집기능을 제공하지 않는다. * id.properties : 엔진이 시작시 사용되는 설정 값들. 각 서버마다 수정을 한뒤 엔진을 시작해야한다. * node-list.xml : 분산노드들의 정보를 가지고 있다. admin노드에서 관리가 되며, 타 노드들은 start시에 설정파일을 사용하며, 차후 admin으로 부터 최신 node-list를 전달받게된다. * */ public class SettingManager { private final Logger logger = LoggerFactory.getLogger(SettingManager.class); private Environment environment; private static Map<String, Object> settingCache = new HashMap<String, Object>(); public SettingManager(Environment environment) { this.environment = environment; } public String getConfigFilepath(String filename) { return environment.filePaths().configPath().path(filename).toString(); } private Properties getProperties(String configFilepath) { logger.debug("Read properties = {}", configFilepath); Properties result = new Properties(); InputStream is = null; try { is = new FileInputStream(configFilepath); result.load(is); return result; } catch (FileNotFoundException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } finally { try { if(is != null){ is.close(); } } catch (IOException ignore) { } } return null; } private boolean storeProperties(Properties properties, String filename) { String configFilepath = getConfigFilepath(filename); logger.debug("Store properties = {}", configFilepath); FileOutputStream os = null; try { os = new FileOutputStream(configFilepath); properties.store(os, new Date().toString()); settingCache.put(configFilepath, properties); return true; } catch (IOException e) { logger.error(e.getMessage(), e); } finally { try { if(os != null){ os.close(); } } catch (IOException ignore) { } } return false; } public Settings getIdSettings() { return getSettings(SettingFileNames.idProperties); } public Settings getSystemSettings() { return getSettings(SettingFileNames.systemProperties); } public boolean storeIdSettings(Settings settings) { return storeProperties(settings.properties(), SettingFileNames.idProperties); } public boolean storeSystemSettings(Settings settings) { return storeProperties(settings.properties(), SettingFileNames.systemProperties); } private Settings getSettings(String configFilename) { String configFilepath = getConfigFilepath(configFilename); Object obj = settingCache.get(configFilepath); if(obj != null){ return (Settings) obj; } Properties properties = getProperties(configFilepath); Settings settings = new Settings(properties); settingCache.put(configFilepath, settings); return settings; } public NodeListSettings getNodeListSettings() { String configFilepath = getConfigFilepath(SettingFileNames.nodeListSettings); Object obj = settingCache.get(configFilepath); if(obj != null){ return (NodeListSettings) obj; } File file = new File(configFilepath); if(file.exists()){ NodeListSettings settings = null; try { settings = JAXBConfigs.readConfig(file, NodeListSettings.class); settingCache.put(configFilepath, settings); return settings; } catch (JAXBException e) { logger.error("", e); } } return null; } public boolean storeNodeListSettings(NodeListSettings nodeListSettings) { String configFilepath = getConfigFilepath(SettingFileNames.nodeListSettings); File file = new File(configFilepath); try { JAXBConfigs.writeConfig(file, nodeListSettings, NodeListSettings.class); settingCache.put(configFilepath, nodeListSettings); return true; } catch (JAXBException e) { logger.error("", e); return false; } } }