package com.photon.phresco.tools.config; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.commons.lang.StringUtils; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; public final class ConfigurationFactory { //envname, env dom element private static final Map<String, Element> ENV_MAP = new HashMap<String, Element>(); private static ConfigurationFactory FACTORY = null; private static String defaultEnvironment = null; private ConfigurationFactory(File configXML) { initXML(configXML); } private void initXML(File configXML) { InputStream xmlStream = null; try { if (configXML == null) { xmlStream = this.getClass().getClassLoader().getResourceAsStream("config.xml"); } else { xmlStream = new FileInputStream(configXML); } parseXML(xmlStream); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { xmlStream.close(); } catch (IOException e) { e.printStackTrace(); } } } private void parseXML(InputStream xmlStream) { try { SAXBuilder builder = new SAXBuilder(); Document document = (Document) builder.build(xmlStream); parseDocument(document); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void parseDocument(Document document) { //get the root element Element environments = document.getRootElement(); //get a nodelist of elements List environmentList = environments.getChildren("environment"); for(int i = 0 ; i < environmentList.size();i++) { //get the environment element Element environment = (Element) environmentList.get(i); String envName = environment.getAttributeValue("name"); String attribute = environment.getAttributeValue("default"); if (attribute.equalsIgnoreCase("true")) { defaultEnvironment = envName; } //add environment element to map ENV_MAP.put(envName, environment); } } public static final ConfigurationFactory getInstance(File configXML) { if (FACTORY == null) { FACTORY = new ConfigurationFactory(configXML); } return FACTORY; } private Element getEnvironment(String envName) { return ENV_MAP.get(envName); } private List<Configuration> getConfigByEnv(String envName) { List<Configuration> configurations = new ArrayList<Configuration>(); Element environment = getEnvironment(envName); List configList = environment.getChildren(); for (int i = 0; i < configList.size(); i++) { Element configNode = (Element) configList.get(i); String configType = configNode.getName(); String configName = configNode.getAttributeValue("name"); Properties properties = getProperties(configNode); Configuration config = new Configuration(configName, configType, properties); configurations.add(config); } return configurations; } private List<Configuration> getConfigByType(String envName, String configType) { List<Configuration> configByTypeList = new ArrayList<Configuration>(); List<Configuration> configList = getConfigByEnv(envName); for (Configuration configuration : configList) { if (configuration.getType().equals(configType)) { configByTypeList.add(configuration); } } return configByTypeList; } private List<Configuration> getConfigByName(String envName, String configType, String configName) { List<Configuration> configByNameList = new ArrayList<Configuration>(); List<Configuration> configByTypeList = getConfigByType(envName, configType); for (Configuration configuration : configByTypeList) { if (configuration.getName().equals(configName)) { configByNameList.add(configuration); } } return configByNameList; } public List<Configuration> getConfiguration(String envName, String configType, String configName) { if (StringUtils.isNotEmpty(envName) && StringUtils.isNotEmpty(configType) && StringUtils.isNotEmpty(configName)) { return getConfigByName(envName, configType, configName); } else if (StringUtils.isNotEmpty(envName) && StringUtils.isNotEmpty(configType) && StringUtils.isEmpty(configName)) { return getConfigByType(envName, configType); } else if (StringUtils.isNotEmpty(envName) && StringUtils.isEmpty(configType) && StringUtils.isEmpty(configName)) { return getConfigByEnv(envName); } else { return null; //if all the argument is null or empty then return null } } private Properties getProperties(Element configNode) { Properties props = new Properties(); List propNodes = configNode.getChildren(); for(int i = 0 ; i < propNodes.size(); i++) { //get the environment element Element propNode = (Element) propNodes.get(i); String propName = propNode.getName(); String propValue = getTextValue(propNode); props.put(propName, propValue); } return props; } private String getTextValue(Element ele) { return ele.getValue(); } public List<Configuration> getDefaultEnv() { return getConfigByEnv(defaultEnvironment); } public String getDefaultEnvName() { return defaultEnvironment; } public void saveXml(Document doc, File sourceConfigXML) { try { XMLOutputter xmlOutput = new XMLOutputter(); xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, new FileWriter(sourceConfigXML)); } catch (Exception e) { e.printStackTrace(); } } }