13 package cz.vutbr.fit.knot.annotations.document;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.Comparator;
20 import java.util.logging.Level;
21 import java.util.logging.Logger;
22 import javax.xml.xpath.XPath;
23 import javax.xml.xpath.XPathConstants;
24 import javax.xml.xpath.XPathExpressionException;
25 import javax.xml.xpath.XPathFactory;
26 import org.w3c.dom.Document;
27 import org.w3c.dom.NamedNodeMap;
28 import org.w3c.dom.Node;
29 import org.w3c.dom.NodeList;
50 XPath xPath = XPathFactory.newInstance().newXPath();
54 nodes = (NodeList)xPath.evaluate(path, doc, XPathConstants.NODESET);
55 }
catch (XPathExpressionException ex) {
56 Logger.getLogger(DocumentUpdateHelper.class.getName()).log(Level.SEVERE, null, ex);
75 StringBuilder sb =
new StringBuilder(xpath.substring(0, xpath.lastIndexOf(
"/")+1));
77 Node child = sourceNode.getParentNode().getFirstChild();
88 if(child.getNodeName().equals(childNodeName)){
94 if(child.getNodeName().equals(childNodeName)){
97 child = child.getNextSibling();
100 if(childNodeName.equals(
"#text")){
101 sb.append(
"text()[").append(counter).append(
"]");
104 sb.append(childNodeName).append(
"[").append(counter).append(
"]");
107 return sb.toString();
119 String rootName = root.getNodeName().toLowerCase();
120 StringBuilder sb =
new StringBuilder();
122 if(root.getNodeType() != Node.TEXT_NODE){
123 if(root.getNodeName().equalsIgnoreCase(
"br")){
126 else if(root.getNodeName().equalsIgnoreCase(
"hr")){
130 if(root.getAttributes() != null && !rootName.equalsIgnoreCase(
"head"))
131 sb.append(
"<").append(rootName)
135 sb.append(
"<").append(rootName).append(
">");
138 NodeList nl = root.getChildNodes();
139 for(
int i = 0; i < nl.getLength(); i++){
141 if(n.getNodeType() == Node.TEXT_NODE){
142 sb.append(n.getNodeValue());
148 sb.append(
"</").append(rootName).append(
">");
151 sb.append(root.getNodeValue());
154 return sb.toString();
165 StringBuilder sb =
new StringBuilder();
167 for(
int i = 0; i < map.getLength(); i++){
168 Node n = map.item(i);
169 sb.append(
" ").append(n.getNodeName()).append(
"=\"").append(n.getNodeValue()).append(
"\"");
172 return sb.toString();
187 Collections.sort(list,
new Comparator<TextModification>() {
192 int pathComp = (mod2.getPath() +
"z").compareTo(mod1.getPath() +
"z");
193 return pathComp == 0 ? mod2.getMode() - mod1.
getMode() : pathComp;
207 ArrayList<TextModification> group1 =
new ArrayList<TextModification>(list.subList(0, start));
208 ArrayList<TextModification> group2 =
new ArrayList<TextModification>(list.subList(end, list.size()));
static Node getDocumentNode(Document doc, String path)
static final int TEXT_MOD_REPLACE
static final int TEXT_MOD_INS_AFTER
static String getNodePathForReversed(String xpath, Node sourceNode, String childNodeName, int mode)
Class representing modification of annotated document text.
static String nodeToString(Node root)
static void sortModifications(ArrayList< TextModification > list)
static void removeListElements(ArrayList< TextModification > list, int start, int end)
static String nodeAttributesToString(NamedNodeMap map)
static final int TEXT_MOD_INS_BEFORE