// Path: commons/src/main/java/com/dataagg/util/collection/StrMap.java
// public class StrMap extends LinkedHashMap<String, String> {
// 	private static final long serialVersionUID = -2822103329782602109L;
// 
// 	public StrMap() {
// 		super();
// 	}
// 
// 	public StrMap(String... allkv) {
// 		super();
// 		this.addAll(allkv);
// 	}
// 
// 	public void addAll(String... allkv) {
// 		if (allkv != null && allkv.length % 2 == 0) {
// 			for (int i = 0; i + 1 < allkv.length; i += 2) {
// 				put(allkv[i], allkv[i + 1]);
// 			}
// 		}
// 	}
// 
// 	public void putWithoutNull(String key, String value) {
// 		if (value != null) {
// 			put(key, value);
// 		}
// 	}
// 
// 	public void put(String key, String value, String defaultValue) {
// 		if (value == null && defaultValue != null) {
// 			put(key, defaultValue);
// 			return;
// 		}
// 		put(key, value);
// 	}
// 
// 	public String eval(String text) {
// 		String out = text;
// 		for (String key : keySet()) {
// 			out = StringUtil.replace(out, "${" + key + "}", get(key));
// 		}
// 		return out;
// 	}
// }
// 
// Path: commons/src/main/java/com/dataagg/util/lang/ArgCheck.java
// public class ArgCheck {
// 	public static void checkState(boolean b, String msg) {
// 		if (!b) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkState(boolean b) {
// 		if (!b) {
// 			throw new IllegalArgumentException();
// 		}
// 	}
// 
// 	public static void checkNotNull(Object object) {
// 		if (object == null) {
// 			throw new IllegalArgumentException();
// 		}
// 	}
// 
// 	public static void checkNotNull(Object object, String msg) {
// 		if (object == null) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkNotContains(String possibleValues, String value) {
// 		checkNotContains(StringUtil.split(possibleValues, ","), value);
// 	}
// 
// 	public static void checkNotContains(String possibleValues, String value, String msg) {
// 		checkNotContains(StringUtil.split(possibleValues, ","), value, msg);
// 	}
// 
// 	public static void checkNotContains(String[] possibleValues, String value, String msg) {
// 		if (!ArraysUtil.contains(possibleValues, value)) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkNotContains(String[] possibleValues, String value) {
// 		checkNotContains(possibleValues, value, "possible values are [" + possibleValues + "], but value=" + value);
// 	}
// }
// 
// Path: commons/src/main/java/com/dataagg/util/lang/TextUtils.java
// public static String prefix(String key) {
// 	return StringUtil.isBlank(key) ? "" : (key + ".");
// }


import jodd.typeconverter.Convert;
import jodd.util.StringUtil;
import com.dataagg.util.collection.StrMap;
import com.dataagg.util.lang.ArgCheck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import static com.dataagg.util.lang.TextUtils.prefix;

	private static Document parseDocument(InputStream is) {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setValidating(false);
			DocumentBuilder builder = factory.newDocumentBuilder();
			return builder.parse(is);
		} catch (Throwable e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}

	public static Element parseRootElement(InputStream is) {
		try {
			Document doc = parseDocument(is);
			return doc.getDocumentElement();
		} catch (Throwable e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}

	public static StrMap parseNameSpaces(Node doc) {
		StrMap ns = new StrMap();
		String rootNodeName = doc.getNodeName();
		//parse namespaces
		StrMap attrs = XmlUtil.getAttributes(doc);
		for (String attrName : attrs.keySet()) {
			if (attrName.trim().startsWith(NamespacePrefix)) {
// Path: commons/src/main/java/com/dataagg/util/collection/StrMap.java
// public class StrMap extends LinkedHashMap<String, String> {
// 	private static final long serialVersionUID = -2822103329782602109L;
// 
// 	public StrMap() {
// 		super();
// 	}
// 
// 	public StrMap(String... allkv) {
// 		super();
// 		this.addAll(allkv);
// 	}
// 
// 	public void addAll(String... allkv) {
// 		if (allkv != null && allkv.length % 2 == 0) {
// 			for (int i = 0; i + 1 < allkv.length; i += 2) {
// 				put(allkv[i], allkv[i + 1]);
// 			}
// 		}
// 	}
// 
// 	public void putWithoutNull(String key, String value) {
// 		if (value != null) {
// 			put(key, value);
// 		}
// 	}
// 
// 	public void put(String key, String value, String defaultValue) {
// 		if (value == null && defaultValue != null) {
// 			put(key, defaultValue);
// 			return;
// 		}
// 		put(key, value);
// 	}
// 
// 	public String eval(String text) {
// 		String out = text;
// 		for (String key : keySet()) {
// 			out = StringUtil.replace(out, "${" + key + "}", get(key));
// 		}
// 		return out;
// 	}
// }
// 
// Path: commons/src/main/java/com/dataagg/util/lang/ArgCheck.java
// public class ArgCheck {
// 	public static void checkState(boolean b, String msg) {
// 		if (!b) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkState(boolean b) {
// 		if (!b) {
// 			throw new IllegalArgumentException();
// 		}
// 	}
// 
// 	public static void checkNotNull(Object object) {
// 		if (object == null) {
// 			throw new IllegalArgumentException();
// 		}
// 	}
// 
// 	public static void checkNotNull(Object object, String msg) {
// 		if (object == null) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkNotContains(String possibleValues, String value) {
// 		checkNotContains(StringUtil.split(possibleValues, ","), value);
// 	}
// 
// 	public static void checkNotContains(String possibleValues, String value, String msg) {
// 		checkNotContains(StringUtil.split(possibleValues, ","), value, msg);
// 	}
// 
// 	public static void checkNotContains(String[] possibleValues, String value, String msg) {
// 		if (!ArraysUtil.contains(possibleValues, value)) {
// 			throw new IllegalArgumentException(msg);
// 		}
// 	}
// 
// 	public static void checkNotContains(String[] possibleValues, String value) {
// 		checkNotContains(possibleValues, value, "possible values are [" + possibleValues + "], but value=" + value);
// 	}
// }
// 
// Path: commons/src/main/java/com/dataagg/util/lang/TextUtils.java
// public static String prefix(String key) {
// 	return StringUtil.isBlank(key) ? "" : (key + ".");
// }


// Path: commons/src/main/java/com/dataagg/util/xml/XmlUtil.java
import jodd.typeconverter.Convert;
import jodd.util.StringUtil;
import com.dataagg.util.collection.StrMap;
import com.dataagg.util.lang.ArgCheck;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.InputStream;
import static com.dataagg.util.lang.TextUtils.prefix;


	private static Document parseDocument(InputStream is) {
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setValidating(false);
			DocumentBuilder builder = factory.newDocumentBuilder();
			return builder.parse(is);
		} catch (Throwable e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}

	public static Element parseRootElement(InputStream is) {
		try {
			Document doc = parseDocument(is);
			return doc.getDocumentElement();
		} catch (Throwable e) {
			LOG.error(e.getMessage(), e);
		}
		return null;
	}

	public static StrMap parseNameSpaces(Node doc) {
		StrMap ns = new StrMap();
		String rootNodeName = doc.getNodeName();
		//parse namespaces
		StrMap attrs = XmlUtil.getAttributes(doc);
		for (String attrName : attrs.keySet()) {
			if (attrName.trim().startsWith(NamespacePrefix)) {
				String value = Convert.toString(attrs.get(attrName));