package com.chamago.bison.util.xml;
import com.chamago.bison.util.StringUtil;
import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.jdom2.Attribute;
import org.jdom2.Element;
public class JXmlWapper
implements Serializable
{
private static final long serialVersionUID = 1965559298207194831L;
private Element xmlroot;
public JXmlWapper(String base)
{
this.xmlroot = new Element(base);
}
public JXmlWapper(Element element) {
this.xmlroot = element;
}
public Element getXmlRoot() {
return getXmlRoot(false);
}
public Element getXmlRoot(boolean top) {
if (!top) {
return this.xmlroot;
}
Element tmpnode = this.xmlroot;
while (tmpnode.getParentElement() != null) {
tmpnode = tmpnode.getParentElement();
}
return tmpnode;
}
public String toXmlString()
{
return toXmlString("gbk");
}
public String toXmlString(String charset) {
return toXmlString(this, charset);
}
public static JXmlWapper parse(String xml) {
Element element = JXmlUtil.string2Xml(xml);
if (element != null) {
return new JXmlWapper(element);
}
return null;
}
public static JXmlWapper parse(File xmlFile)
{
Element element = JXmlUtil.file2Xml(xmlFile);
if (element != null) {
return new JXmlWapper(element);
}
return null;
}
public static JXmlWapper parseUrl(String url) throws Exception
{
return parseUrl(url, 10);
}
public static JXmlWapper parseUrl(String url, int timeout) throws Exception {
Element element = JXmlUtil.url2Xml(url, timeout);
if (element != null) {
return new JXmlWapper(element);
}
return null;
}
public static JXmlWapper parseUrl(String url, String data) throws Exception
{
return parseUrl(url, data, 10);
}
public static JXmlWapper parseUrl(String url, String data, int timeout) throws Exception {
Element element = JXmlUtil.url2Xml(url, data, timeout);
if (element != null) {
return new JXmlWapper(element);
}
return null;
}
public static String toXmlString(JXmlWapper wapper, String charset)
{
return JXmlUtil.xml2String(wapper.getXmlRoot(), charset);
}
public void addValue(String path, int value)
{
addValue(path, String.valueOf(value));
}
public void addValue(String path, long value) {
addValue(path, String.valueOf(value));
}
public void addValue(String path, double value) {
addValue(path, String.valueOf(value));
}
public void addValue(String path, Date date) {
addValue(path, TimeUtil.customDateTime(date));
}
public void addValue(String path, boolean value) {
addValue(path, String.valueOf(value));
}
public void addStringValue(String path, String value) {
addValue(path, value);
}
public void addValue(String path, String value) {
PHelper helper = pathDecode(path);
Element element = makeXmlElement(helper);
if (element == null) {
throw new RuntimeException("指定路径" + path + "的节点创建失败");
}
if (helper.check) {
element.setAttribute(helper.attr, value);
} else {
List list = element.removeContent();
element.setText(value);
for (int idx = 0; idx < list.size(); idx++)
if ((list.get(idx) instanceof Element))
element.addContent((Element)list.get(idx));
}
}
public void setValue(String path, int value)
{
setValue(path, String.valueOf(value));
}
public void setValue(String path, long value) {
setValue(path, String.valueOf(value));
}
public void setValue(String path, double value) {
setValue(path, String.valueOf(value));
}
public void setValue(String path, Date date) {
setValue(path, TimeUtil.customDateTime(date));
}
public void setValue(String path, boolean value) {
setValue(path, String.valueOf(value));
}
public void setValue(String path, String value) {
PHelper helper = pathDecode(path);
Element element = findXmlElement(helper, 0);
if (element == null) {
throw new RuntimeException("指定路径" + path + "的节点未找到");
}
if (helper.check) {
element.setAttribute(helper.attr, value);
} else {
List list = element.removeContent();
element.setText(value);
for (int idx = 0; idx < list.size(); idx++)
if ((list.get(idx) instanceof Element))
element.addContent((Element)list.get(idx));
}
}
public int getIntValue(String path)
{
return Integer.parseInt(getStringValue(path));
}
public long getLongValue(String path) {
return Long.parseLong(getStringValue(path));
}
public short getShortValue(String path) {
return Short.parseShort(getStringValue(path));
}
public double getDoubleValue(String path) {
return Double.parseDouble(getStringValue(path));
}
public Date getDateValue(String path) {
return TimeUtil.parserDateTime(getStringValue(path));
}
public boolean getBoolValue(String path) {
return Boolean.parseBoolean(getStringValue(path));
}
public int getIntValue(String path, int defvalue) {
String value = getStringValue(path, String.valueOf(defvalue));
if ((value == null) || (value.length() == 0)) {
return defvalue;
}
return Integer.parseInt(value);
}
public long getLongValue(String path, long defvalue)
{
String value = getStringValue(path, String.valueOf(defvalue));
if ((value == null) || (value.length() == 0)) {
return defvalue;
}
return Long.parseLong(value);
}
public short getShortValue(String path, short defvalue)
{
String value = getStringValue(path, String.valueOf(defvalue));
if ((value == null) || (value.length() == 0)) {
return defvalue;
}
return Short.parseShort(value);
}
public double getDoubleValue(String path, double defvalue)
{
String value = getStringValue(path, String.valueOf(defvalue));
if ((value == null) || (value.length() == 0)) {
return defvalue;
}
return Double.parseDouble(value);
}
public Date getDateValue(String path, String defvalue)
{
String value = getStringValue(path, defvalue);
if ((value == null) || (value.length() == 0)) {
value = defvalue;
}
return TimeUtil.parserDateTime(value);
}
public boolean getBoolValue(String path, boolean defvalue) {
String value = getStringValue(path, String.valueOf(defvalue));
if ((value == null) || (value.length() == 0)) {
return defvalue;
}
return Boolean.parseBoolean(value);
}
public String getStringValue(String path)
{
return getStringValue(path, null);
}
public String getStringValue(String path, String defvalue) {
PHelper helper = pathDecode(path);
Element element = findXmlElement(helper, 0);
if (element != null) {
if (helper.check) {
Attribute attr = element.getAttribute(helper.attr);
if (attr != null)
return attr.getValue();
}
else {
return element.getText();
}
}
return defvalue;
}
public Map<String, String> getXmlAttrs(String path)
{
PHelper helper = pathDecode(path);
if (helper.check) {
throw new RuntimeException("当前路径<" + path + ">为属性路径");
}
Element element = findXmlElement(helper, 0);
if (element == null) {
throw new RuntimeException("指定路径" + path + "的节点未找到");
}
Map table = new Hashtable();
List attrs = element.getAttributes();
for (int idx = 0; idx < attrs.size(); idx++) {
table.put(((Attribute)attrs.get(idx)).getName(), ((Attribute)attrs.get(idx)).getValue());
}
return table;
}
public JXmlWapper getXmlNode(String path) {
PHelper helper = pathDecode(path);
if (helper.check) {
throw new RuntimeException("当前路径<" + path + ">为属性路径");
}
Element element = findXmlElement(helper, 0);
if (element == null)
{
return null;
}
if (element == this.xmlroot) {
return this;
}
return new JXmlWapper(element);
}
public JXmlWapper addXmlNode(String path)
{
PHelper helper = pathDecode(path);
if (helper.check) {
throw new RuntimeException("当前路径<" + path + ">为属性路径");
}
Element element = makeXmlElement(helper);
if (element == null) {
throw new RuntimeException("指定路径" + path + "的节点未创建成功");
}
if (element == this.xmlroot) {
return this;
}
return new JXmlWapper(element);
}
public List<JXmlWapper> getXmlNodeList(String path)
{
PHelper helper = pathDecode(path);
if (helper.check) {
throw new RuntimeException("当前路径<" + path + ">为属性路径");
}
Element element = findXmlElement(helper, 1);
if (element == null) {
throw new RuntimeException("指定路径" + path + "的节点未找到");
}
List volist = new ArrayList();
List elmlist = element.getChildren(helper.last());
for (int idx = 0; idx < elmlist.size(); idx++) {
volist.add(new JXmlWapper((Element)elmlist.get(idx)));
}
return volist;
}
public int countXmlNodes(String path) {
PHelper helper = pathDecode(path);
if (helper.check) {
throw new RuntimeException("当前路径<" + path + ">为属性路径");
}
Element element = findXmlElement(helper, 1);
if (element == null) {
return 0;
}
return element.getChildren(helper.last()).size();
}
public boolean remove(String path) {
PHelper helper = pathDecode(path);
Element element = findXmlElement(helper, 0);
if (element == null) {
return true;
}
if (helper.check) {
return element.removeAttribute(helper.attr);
}
Element elmParent = element.getParentElement();
if (elmParent != null) {
List lst = elmParent.getChildren();
if ((lst != null) && (lst.size() > 0)) {
lst.remove(element);
return true;
}
return false;
}
return false;
}
private Element findXmlElement(PHelper phelp, int left)
{
Element curnode = getXmlRoot();
for (int idx = 0; idx < phelp.nodes.length - left; idx++) {
NHelper nhelp = nodeDecode(phelp.nodes[idx]);
List subs = curnode.getChildren(nhelp.node);
if (subs.size() == 0) {
return null;
}
if (nhelp.check) {
if (nhelp.index >= subs.size()) {
return null;
}
curnode = (Element)subs.get(nhelp.index);
}
else {
if (subs.size() > 1) {
return null;
}
curnode = (Element)subs.get(0);
}
}
return curnode;
}
private Element makeXmlElement(PHelper phelp)
{
Element curnode = getXmlRoot();
for (int idx = 0; idx < phelp.nodes.length; idx++) {
NHelper nhelp = nodeDecode(phelp.nodes[idx]);
List subs = curnode.getChildren(nhelp.node);
if (nhelp.check) {
if (nhelp.index == subs.size()) {
Element newnode = new Element(nhelp.node);
curnode.addContent(newnode);
curnode = newnode;
} else if (nhelp.index < subs.size()) {
curnode = (Element)subs.get(nhelp.index);
} else {
return null;
}
}
else if (subs.size() == 0) {
Element newnode = new Element(nhelp.node);
curnode.addContent(newnode);
curnode = newnode;
}
else if (idx < phelp.nodes.length - 1) {
if (subs.size() == 1)
curnode = (Element)subs.get(0);
else
return null;
}
else {
Element newnode = new Element(nhelp.node);
curnode.addContent(newnode);
curnode = newnode;
}
}
return curnode;
}
private NHelper nodeDecode(String path) {
NHelper helper = new NHelper();
if (path.endsWith("]")) {
int pos = path.indexOf("[");
helper.check = true;
helper.node = path.substring(0, pos);
helper.index = Integer.parseInt(path.substring(pos + 1, path.length() - 1));
} else {
helper.node = path;
helper.check = false;
}
return helper;
}
private PHelper pathDecode(String path)
{
PHelper helper = new PHelper();
if (path.equals(".")) {
helper.check = false;
helper.nodes = new String[0];
}
else {
String[] nodes = StringUtil.splitter(path, ".");
int acount = nodes.length; int ncount = nodes.length - 1;
if (nodes[ncount].startsWith("@")) {
helper.check = true;
helper.attr = nodes[ncount].substring(1);
helper.nodes = new String[ncount];
System.arraycopy(nodes, 0, helper.nodes, 0, ncount);
} else {
helper.check = false;
helper.nodes = new String[acount];
System.arraycopy(nodes, 0, helper.nodes, 0, acount);
}
}
return helper;
}
class NHelper
{
public int index;
public String node;
public boolean check;
NHelper()
{
}
}
class PHelper
{
public String attr;
public boolean check;
public String[] nodes;
PHelper()
{
}
public String last()
{
return this.nodes[(this.nodes.length - 1)];
}
}
}