26 package org.nexusformat.nxvalidate;
29 import java.util.ArrayList;
30 import java.util.Enumeration;
31 import java.util.NoSuchElementException;
32 import javax.swing.tree.MutableTreeNode;
33 import javax.swing.tree.TreeNode;
34 import org.w3c.dom.Document;
35 import org.w3c.dom.Element;
36 import org.w3c.dom.NamedNodeMap;
37 import org.w3c.dom.Node;
38 import org.w3c.dom.NodeList;
46 private Node domNode = null;
47 private String nodeName = null;
48 private boolean isRoot =
false;
49 private boolean isLeaf =
false;
51 private boolean allowsChildren =
false;
52 private ArrayList<NXNodeMapper> documents = null;
53 static final int ELEMENT_TYPE = Node.ELEMENT_NODE;
54 private int childCount = 0;
55 private ArrayList<Node>
children = null;
57 private File nxsFile = null;
58 private File nxdlFile = null;
59 private File reducedFile = null;
60 private File resultsFile = null;
61 private Document reducedDoc = null;
62 private Document resultsDoc = null;
63 private boolean badNode =
false;
64 private boolean warnNode =
false;
65 private boolean validatedNode =
false;
66 private Object userObject = null;
74 allowsChildren =
true;
75 if (node.getNodeType() != ELEMENT_TYPE) {
79 this.nxsFile = nxsFile;
80 nodeName = nxsFile.getAbsolutePath();
90 allowsChildren =
true;
91 if (node.getNodeType() != ELEMENT_TYPE) {
95 this.nodeName = nodeName;
100 this.nodeName = nodeName;
102 allowsChildren =
true;
103 documents =
new ArrayList<NXNodeMapper>();
164 this.nxdlFile = nxdlFile;
183 this.reducedFile = reducedFile;
201 this.resultsFile = resultsFile;
219 this.resultsDoc = resultsDoc;
239 this.reducedDoc = reducedDoc;
249 domNode.setUserData(
"bad",
new Boolean(badNode),null);
250 this.badNode = badNode;
271 domNode.setUserData(
"warn",
new Boolean(warnNode),null);
272 this.warnNode = warnNode;
292 domNode.setUserData(
"validated",
new Boolean(validatedNode),null);
293 this.validatedNode = validatedNode;
303 return validatedNode;
320 Boolean bad = (Boolean) domNode.getUserData(
"bad");
322 this.badNode = bad.booleanValue();
333 Boolean warn = (Boolean) domNode.getUserData(
"warn");
335 this.warnNode = warn.booleanValue();
346 Boolean validated = (Boolean) domNode.getUserData(
"validated");
347 if (validated != null) {
348 this.validatedNode = validated.booleanValue();
360 boolean result =
false;
366 for (
int i = 0; i < domNode.getChildNodes().getLength(); i++) {
367 Node node = domNode.getChildNodes().item(i);
368 bad = (Boolean) node.getUserData(
"bad");
374 bad = (Boolean) checkChildren(node);
390 private boolean checkChildren(Node node) {
391 boolean result =
false;
392 for (
int i = 0; i < node.getChildNodes().getLength(); i++) {
393 Node tmpNode = node.getChildNodes().item(i);
394 if (tmpNode.hasChildNodes()) {
395 checkChildren(tmpNode);
397 Boolean bad = (Boolean) tmpNode.getUserData(
"bad");
412 domNode.setUserData(
"texts", null, null);
413 domNode.setUserData(
"tests", null, null);
414 domNode.setUserData(
"diags", null, null);
415 domNode.setUserData(
"diagatts", null, null);
416 domNode.setUserData(
"bad",
new Boolean(
false), null);
426 return (ArrayList<String>) domNode.getUserData(
"texts");
440 return (ArrayList<String>) domNode.getUserData(
"tests");
454 return (ArrayList<String>) domNode.getUserData(
"diags");
462 return (ArrayList<String>) domNode.getUserData(
"diagatts");
480 if (documents.contains(child)) {
482 return documents.indexOf(child);
490 if (child.domNode == n.domNode) {
502 return documents.get(searchIndex);
506 Node node = domNode.getChildNodes().item(searchIndex);
509 int elementNodeIndex = 0;
514 < domNode.getChildNodes().getLength(); i++) {
515 node = domNode.getChildNodes().item(i);
517 if ((node.getNodeType() == ELEMENT_TYPE)
518 && (elementNodeIndex++ == searchIndex)) {
522 return new NXNodeMapper(node,
false, node.getNodeName());
531 return documents.size();
553 return allowsChildren;
564 }
else if (domNode.getParentNode() != null) {
566 if (domNode.getParentNode().getNodeType() == domNode.DOCUMENT_NODE) {
568 Document doc = (Document) domNode.getParentNode();
571 ((File) doc.getUserData(
"file")).getAbsolutePath());
576 domNode.getParentNode().getNodeName());
590 Node tempNode = domNode.getParentNode();
592 boolean gotRoot =
false;
601 }
else if (tempNode != null) {
605 if (tempNode.getNodeType() == domNode.DOCUMENT_NODE) {
607 Document doc = (Document) tempNode;
610 ((File) doc.getUserData(
"file")).getAbsolutePath());
614 tempNode = tempNode.getParentNode();
635 return new String[0];
640 ArrayList<String> atts =
new ArrayList<String>();
644 if (domNode.hasAttributes()) {
646 NamedNodeMap att = domNode.getAttributes();
649 int na = domNode.getAttributes().getLength();
656 atts.add(att.item(i).getNodeName() +
" = "
657 + att.item(i).getNodeValue());
663 return atts.toArray(
new String[0]);
679 if (domNode.getNodeType() == ELEMENT_TYPE) {
680 return getTextValue(domNode);
685 if (domNode.getTextContent() != null) {
686 return domNode.getTextContent().trim();
697 private ArrayList<Node> getElements() {
699 ArrayList<Node> nodes =
new ArrayList<Node>();
704 < domNode.getChildNodes().getLength(); i++) {
705 Node node = domNode.getChildNodes().item(i);
709 if (node.getNodeType() == ELEMENT_TYPE) {
723 private String getTextValue(Node node) {
725 if (node.hasChildNodes()) {
727 NodeList nodes = node.getChildNodes();
734 if (nodes.item(i).getNodeType() == Node.TEXT_NODE) {
735 return nodes.item(i).getTextContent().trim();
779 private class children implements Enumeration {
781 private int count = 0;
782 private boolean more =
true;
783 private Node node = null;
786 public boolean hasMoreElements() {
790 if (documents == null) {
795 if (count < documents.size()) {
817 public Object nextElement() {
821 if (count < documents.size()) {
822 nxNode = documents.get(count);
826 throw new NoSuchElementException();
834 return new NXNodeMapper(node,
false, node.getNodeName());
836 throw new NoSuchElementException();
843 public void insert(MutableTreeNode child,
int index) {
850 documents.add(index, childNode);
854 NodeList list = domNode.getChildNodes();
862 domNode.insertBefore(childNode.domNode, list.item(i));
870 public void remove(
int index) {
873 documents.remove(index);
879 NodeList list = domNode.getChildNodes();
887 domNode.removeChild(list.item(index));
896 public void remove(MutableTreeNode node) {
907 NodeList list = domNode.getChildNodes();
914 if (list.item(i).isSameNode(childNode.domNode)) {
915 domNode.removeChild(childNode.domNode);