[Markups]
[aprog.git] / Markups / src / net / sourceforge / aprog / markups / MarkupsXMLTools.java
blob25fe0c44cc438fd805d325a70ebff64f4b10bc97
1 /*
2 * The MIT License
3 *
4 * Copyright 2010 Codist Monk.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
25 package net.sourceforge.aprog.markups;
27 import static net.sourceforge.aprog.tools.Tools.*;
29 import net.sourceforge.aprog.tools.IllegalInstantiationException;
30 import net.sourceforge.aprog.xml.XMLTools;
31 import org.w3c.dom.Node;
32 import org.w3c.dom.NodeList;
34 /**
36 * @author codistmonk (creation 2010-07-04)
38 public final class MarkupsXMLTools {
40 /**
41 * @throws IllegalInstantiationException To prevent instantiation
43 private MarkupsXMLTools() {
44 throw new IllegalInstantiationException();
47 /**
49 * @param node
50 * <br>Maybe null
51 * @return
52 * <br>Not null
54 public static final String getIdentifyingXPath(final Node node) {
55 if (node == null || node.getNodeType() == Node.DOCUMENT_NODE) {
56 return "/";
59 final String selector = getXPathSelector(node);
61 // debugPrint("../" + selector);
63 if (set(Node.ATTRIBUTE_NODE, Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE,
64 Node.ENTITY_NODE, Node.NOTATION_NODE).contains(node.getNodeType())) {
65 return getIdentifyingXPath(XMLTools.getNode(node, "..")) +
66 "/" + selector;
69 final NodeList siblings = XMLTools.getNodes(node, "../" + selector);
71 return getIdentifyingXPath(node.getParentNode()) +
72 "/" + selector + "[" + (indexOf(siblings, node) + 1) + "]";
75 /**
76 * Returns a XPath expression that can be used to selects nodes like {@code node}.
78 * @param node
79 * <br>Not null
80 * @return
81 * <br>Not null
83 public static final String getXPathSelector(final Node node) {
84 if (node.getNodeName().startsWith("#")) {
85 return node.getNodeName().toLowerCase().substring(1) + "()";
88 if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
89 return "@" + node.getNodeName();
92 return node.getNodeName();
95 /**
97 * @param nodes
98 * <br>Not null
99 * @param node
100 * <br>Maybe null
101 * @return {@code -1} if {@code nodes} doesn't contain {@code node}
102 * <br>Range: {@code [-1 .. nodes.getLength() - 1]}
104 public static final int indexOf(final NodeList nodes, final Node node) {
105 for (int i = 0; i < nodes.getLength(); ++i) {
106 if (nodes.item(i) == node) {
107 return i;
111 return -1;