Configuration的主要是加载配置文件,并储存在properties中。
细节内容不重复了,主要参考Hadoop技术内幕,Hadoop源代码,以及:
http://blog.csdn.net/zhoubangtao/article/details/25977561
- 整个资源的加载流程如下:
- 过程中遇到的问题:
- Java Io 学习:
- http://blog.csdn.net/yczz/article/details/38761237
- Document Builder使用:
- http://blog.csdn.net/redarmy_chen/article/details/12912065
- http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html
- Java Io 学习:
package com.baidu.configuration; import java.io.IOException; import java.io.InputStream; import java.io.File; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.lang.System; import java.util.Objects; import java.util.Properties; import java.net.URL; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.SAXException; public class Configuration { private Properties properties; /** * 判断参数是否为空,并对url进行处理 * @param builder * @param url * @return * @throws IOException * @throws SAXException */ private Document parse(DocumentBuilder builder, URL url) throws IOException, SAXException { if (url == null) { return null; } return parse(builder, url.openStream(), url.toString()); } /** * 判断参数是否为空,实际调用Documentbuilder parse 函数 * @param builder * @param is * @param systemId * @return * @throws IOException * @throws SAXException */ private Document parse(DocumentBuilder builder, InputStream is, String systemId) throws IOException, SAXException { if (is == null) { return null; } try { return (systemId == null) ? builder.parse(is) : builder.parse(is, systemId); } finally { is.close(); } } /** * 获取 properties 对应key的value * @param key * @return */ public String get(String key) { return properties.getProperty(key); } public void addResource(String source_name) { properties = new Properties(); loadResource(properties, source_name); } /** * 通过DocumentBuilder来解析xml文件, resource 直接使用了 Object 来代替, * 实际就是一个字符串 * @param properties 储存的prpoerties * @param resource xml文件的绝对路径 */ public void loadResource(Properties properties, Object resource) { try { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); //ignore all comments inside the xml file docBuilderFactory.setIgnoringComments(true); //allow includes in the xml file docBuilderFactory.setNamespaceAware(true); try { docBuilderFactory.setXIncludeAware(true); } catch (UnsupportedOperationException e) { System.out.println("Failed to set setXIncludeAware(true) for parser"); } DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(); Document doc = null; Element root = null; if (resource instanceof String) { // a file resource // Can't use FileSystem API or we get an infinite loop // since FileSystem uses Configuration AP // //I. Use java.io.File instead. File file = new File(((String)resource)).getAbsoluteFile(); if (file.exists()) { doc = parse(builder, new BufferedInputStream( new FileInputStream(file)), ((String)resource).toString()); } } root = doc.getDocumentElement(); NodeList props = root.getChildNodes(); for (int i = 0; i < props.getLength(); i++) { Node propNode = props.item(1); Element prop = (Element)propNode; if ("configuration".equals(prop.getTagName())) { loadResource(properties, prop.getTagName()); } NodeList fields = prop.getChildNodes(); String attr = null; String value = null; for (int j = 0; j < fields.getLength(); j++) { Node fieldNode = fields.item(j); if (!(fieldNode instanceof Element)) continue; Element field = (Element)fieldNode; if ("name".equals(field.getTagName()) && field.hasChildNodes()) attr = ((Text)field.getFirstChild()).getData().trim(); if ("value".equals(field.getTagName()) && field.hasChildNodes()) value = ((Text)field.getFirstChild()).getData().trim(); } //System.out.println("name is " + attr); //System.out.println("value is " + value); properties.setProperty(attr, value); } } catch (IOException e) { e.printStackTrace(); } catch (DOMException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } public static void main(String args[]) { //System.out.println("Hello"); Configuration c = new Configuration(); c.addResource("test.xml"); String value = c.get("yarn.nodemanager.aux-services"); System.out.println(value); } }