package com.alibaba.doris.dataserver.config; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.alibaba.doris.dataserver.config.data.FilterConfigure; import com.alibaba.doris.dataserver.config.data.ModuleConfigure; /** * @author ajun Email:jack.yuj@alibaba-inc.com */ public class XMLDataServerConfigureLoader { public static void main(String[] args) { XMLDataServerConfigureLoader loader = new XMLDataServerConfigureLoader("dataserver.xml"); try { loader.load(); } catch (DocumentException e) { e.printStackTrace(); } } public XMLDataServerConfigureLoader(String fileName) { this.fileName = fileName; } public DataServerConfigure load() throws DocumentException { DataServerConfigure dsConfig = new DataServerConfigure(); Document doc = openDocument(); Element root = doc.getRootElement(); for (Iterator<?> i = root.elementIterator(); i.hasNext();) { Element element = (Element) i.next(); if (ELEMENT_NAME_MODULES.equalsIgnoreCase(element.getName())) { dsConfig.setModuleConfigList(iterateModules(element)); continue; } } return dsConfig; } public Document openDocument() throws DocumentException { Document document = openDocumentFromAbsFileName(); if (null == document) { document = openDocumentFromRelativeFileName(); } return document; } private Document openDocumentFromAbsFileName() throws DocumentException { File f = new File(fileName); if (f.exists()) { try { InputStream inStream = new FileInputStream(f); SAXReader reader = new SAXReader(); Document document = reader.read(inStream); return document; } catch (IOException e) { throw new RuntimeException(e); } } return null; } private Document openDocumentFromRelativeFileName() throws DocumentException { URL url = XMLDataServerConfigureLoader.class.getClassLoader().getResource(fileName); SAXReader reader = new SAXReader(); Document document = reader.read(new File(url.getFile())); return document; } public List<ModuleConfigure> iterateModules(Element element) { List<ModuleConfigure> modulesList = new ArrayList<ModuleConfigure>(); for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); modulesList.add(getModuleConfig(module)); } return modulesList; } public List<FilterConfigure> iterateFilters(Element element) { List<FilterConfigure> filterList = new ArrayList<FilterConfigure>(); for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); if (ELEMENT_NAME_FILTER.equalsIgnoreCase(module.getName())) { filterList.add(getFilterConfigure(module)); continue; } } return filterList; } private ModuleConfigure getModuleConfig(Element element) { if (ELEMENT_NAME_MODULE.endsWith(element.getName())) { ModuleConfigure moduleConfig = new ModuleConfigure(); for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); String name = module.getName(); if (ELEMENT_NAME_PARAMS.equalsIgnoreCase(name)) { readParameters(moduleConfig, module); continue; } if (ELEMENT_NAME_CLASS.equalsIgnoreCase(name)) { moduleConfig.setClassName(element.elementText(ELEMENT_NAME_CLASS)); continue; } if (ELEMENT_NAME_DESCRIPTION.equalsIgnoreCase(name)) { moduleConfig.setDescription(element.elementText(ELEMENT_NAME_DESCRIPTION)); continue; } if (ELEMENT_NAME_FILTERS.equalsIgnoreCase(name)) { moduleConfig.setFilterConfigList(iterateFilters(module)); continue; } if (MODULE_ELEMENT_NAME_NAME.equalsIgnoreCase(name)) { moduleConfig.setName(element.elementText(MODULE_ELEMENT_NAME_NAME)); continue; } } return moduleConfig; } return null; } private void readParameters(ModuleConfigure moduleConfig, Element element) { for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); if (ELEMENT_NAME_PARAM.equalsIgnoreCase(module.getName())) { getParameter(moduleConfig, module); continue; } } } private void getParameter(ModuleConfigure moduleConfig, Element element) { String paramName = null; String paramValue = null; for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); String name = module.getName(); if (ELEMENT_NAME_NAME.equalsIgnoreCase(name)) { paramName = element.elementText(ELEMENT_NAME_NAME); continue; } if (ELEMENT_NAME_VALUE.equalsIgnoreCase(name)) { paramValue = element.elementText(ELEMENT_NAME_VALUE); continue; } } if (paramName != null) { moduleConfig.addParam(paramName, paramValue); } } private FilterConfigure getFilterConfigure(Element element) { FilterConfigure filterConfigure = new FilterConfigure(); for (Iterator<?> i = element.elementIterator(); i.hasNext();) { Element module = (Element) i.next(); String name = module.getName(); if (ELEMENT_NAME_CLASS.equalsIgnoreCase(name)) { filterConfigure.setClassName(element.elementText(ELEMENT_NAME_CLASS)); continue; } } return filterConfigure; } private String fileName; private static String ELEMENT_NAME_DESCRIPTION = "description"; private static String ELEMENT_NAME_MODULES = "modules"; private static String ELEMENT_NAME_MODULE = "module"; private static String ELEMENT_NAME_FILTERS = "filters"; private static String ELEMENT_NAME_FILTER = "filter"; private static String ELEMENT_NAME_PARAMS = "params"; private static String ELEMENT_NAME_PARAM = "param"; private static String ELEMENT_NAME_VALUE = "value"; private static String ELEMENT_NAME_CLASS = "class"; private static String ELEMENT_NAME_NAME = "name"; private static String MODULE_ELEMENT_NAME_NAME = "name"; }