/*
* Copyright (C) 2000 - 2011 TagServlet Ltd
*
* This file is part of Open BlueDragon (OpenBD) CFML Server Engine.
*
* OpenBD is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* Free Software Foundation,version 3.
*
* OpenBD is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenBD. If not, see http://www.gnu.org/licenses/
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with any of the JARS listed in the README.txt (or a modified version of
* (that library), containing parts covered by the terms of that JAR, the
* licensors of this Program grant you additional permission to convey the
* resulting work.
* README.txt @ http://www.openbluedragon.org/license/README.txt
*
* http://www.openbluedragon.org/
*
* $Id: XmlDocumentHashtable.java 2497 2015-02-02 01:53:48Z alan $
*/
package com.naryx.tagfusion.cfm.xml;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.w3c.dom.Comment;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.naryx.tagfusion.cfm.engine.cfData;
import com.naryx.tagfusion.cfm.engine.cfStringData;
public class XmlDocumentHashtable extends XmlNodeHashtable implements Serializable {
private static final long serialVersionUID = 9072585765275017281L;
protected XmlDocumentHashtable(Node n, boolean caseSensitive) {
super(n, caseSensitive);
}
public boolean containsKey(Object key) {
if (key.toString().equalsIgnoreCase("XmlRoot"))
return true;
else if (key.toString().equalsIgnoreCase("XmlComment"))
return true;
else if (key.toString().equalsIgnoreCase("XmlDocType"))
return true;
else
return super.containsKey(key);
}
public Object get(Object key) {
if (key.toString().equalsIgnoreCase("XmlRoot"))
return getXmlRoot();
else if (key.toString().equalsIgnoreCase("XmlComment"))
return getXmlComment();
else if (key.toString().equalsIgnoreCase("XmlDocType"))
return getXmlDocType();
else
return super.get(key);
}
public Object put(Object key, Object value) {
if (key.toString().equalsIgnoreCase("XmlRoot")) {
return super.put(key, value);
} else if (key.toString().equalsIgnoreCase("XmlComment")) {
// Remove all comment nodes, and add 1 new one at the top
remove(key);
if (!((cfData) value).toString().trim().equals("")) {
try {
Comment c = ((Document) nodeData).createComment(((cfData) value).toString());
nodeData.insertBefore(c, nodeData.getFirstChild());
} catch (DOMException ex) {
// Nothing else we can do here
com.nary.Debug.printStackTrace(ex);
}
}
nodeData.normalize();
return null;
} else if (key.toString().equalsIgnoreCase("XMLDocType")) {
// Do nothing
return null;
} else {
return super.put(key, value);
}
}
public Object remove(Object key) {
if (key.toString().equalsIgnoreCase("XmlRoot")) {
Document doc = (Document) nodeData;
if (doc.getDocumentElement() == null) {
return null;
} else {
try {
cfXmlData rtn = new cfXmlData(this, doc.removeChild(doc.getDocumentElement()), isCaseSensitive());
return rtn;
} catch (DOMException ex) {
// Nothing else we can do here
com.nary.Debug.printStackTrace(ex);
return null;
}
}
} else if (key.toString().equalsIgnoreCase("XmlComment")) {
// Remove all comment nodes
List ln = new ArrayList();
NodeList nl = nodeData.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node.getNodeType() == Node.COMMENT_NODE)
ln.add(node);
}
Iterator itr = ln.iterator();
while (itr.hasNext()) {
try {
nodeData.removeChild((Node) itr.next());
} catch (DOMException ex) {
// Nothing else we can do here
com.nary.Debug.printStackTrace(ex);
return null;
}
}
nodeData.normalize();
return null;
} else if (key.toString().equalsIgnoreCase("XMLDocType")) {
return null;
} else {
return super.remove(key);
}
}
// default is a short dump
public void dump(PrintWriter out, String _label, int _top) {
cfData dd = null;
out.write("<table class='cfdump_table_xml'>");
out.write("<th class='cfdump_th_xml' colspan='2'>");
if (_label.length() > 0)
out.write(_label + " - ");
out.write("xml document [short version]</th>");
out.write("<tr><td class='cfdump_td_xml'>");
// XmlRoot.XmlName
Document doc = (Document) nodeData;
if (doc.getDocumentElement() != null)
out.write(doc.getDocumentElement().getNodeName());
else
out.write("");
out.write("</td><td class='cfdump_td_value'>");
dd = getXmlRoot();
if (dd != null)
dd.dump(out);
else
out.write("");
out.write("</td></tr>");
out.write("</table>");
}
public void dumpLong(PrintWriter out, String _label, int _top) {
cfData dd = null;
out.write("<table class='cfdump_table_xml'>");
out.write("<th class='cfdump_th_xml' colspan='2'>");
if (_label.length() > 0)
out.write(_label + " - ");
out.write("xml document [long version]</th>");
out.write("<tr><td class='cfdump_td_xml'>");
out.write("XmlComment");
out.write("</td><td class='cfdump_td_value'>");
dd = getXmlComment();
if (dd != null)
dd.dumpLong(out, "", _top);
else
out.write("");
out.write("</td></tr>");
out.write("<tr><td class='cfdump_td_xml'>");
out.write("XmlRoot");
out.write("</td><td class='cfdump_td_value'>");
dd = getXmlRoot();
if (dd != null)
dd.dumpLong(out, "", _top);
else
out.write("");
out.write("</td></tr>");
out.write("</table>");
}
protected cfData getXmlRoot() {
Document doc = (Document) nodeData;
if (doc.getDocumentElement() != null)
return new cfXmlData(this, doc.getDocumentElement(), isCaseSensitive());
else
return null;
}
protected cfData getXmlDocType() {
Document doc = (Document) nodeData;
if (doc.getDoctype() != null)
return new cfXmlData(this, doc.getDoctype(), isCaseSensitive());
else
return null;
}
protected cfData getXmlComment() {
Document doc = (Document) nodeData;
StringBuilder comments = null;
Node n = null;
NodeList nl = doc.getChildNodes();
boolean cfirst = true;
for (int i = 0; i < nl.getLength(); i++) {
n = nl.item(i);
if (n.getNodeType() == Node.COMMENT_NODE) {
if (cfirst)
comments = new StringBuilder();
else
comments.append(System.getProperty("line.separator"));
String nv = "";
try {
nv = n.getNodeValue();
} catch (DOMException ex) {
// Just log it
com.nary.Debug.printStackTrace(ex);
}
comments.append(nv.trim());
cfirst = false;
}
}
if (comments != null)
return new cfStringData(comments.toString().trim());
else
return new cfStringData("");
}
}