1 /**
2 * Copyright 2005-2011 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.edl.impl;
17
18 import static org.junit.Assert.assertTrue;
19
20 import javax.xml.parsers.DocumentBuilder;
21 import javax.xml.parsers.DocumentBuilderFactory;
22 import javax.xml.transform.Source;
23 import javax.xml.transform.Templates;
24 import javax.xml.transform.Transformer;
25 import javax.xml.transform.TransformerFactory;
26 import javax.xml.transform.stream.StreamResult;
27 import javax.xml.transform.stream.StreamSource;
28 import javax.xml.xpath.XPath;
29 import javax.xml.xpath.XPathConstants;
30 import javax.xml.xpath.XPathFactory;
31
32 import org.apache.log4j.Logger;
33 import org.junit.Ignore;
34 import org.junit.Test;
35 import org.kuali.rice.kew.test.KEWTestCase;
36 import org.kuali.rice.kew.xml.XPathTest;
37 import org.w3c.dom.Document;
38 import org.w3c.dom.Node;
39 import org.w3c.dom.NodeList;
40
41 /**
42 * This class is used to test edoc lite xml xpath operations
43 *
44 * @author Kuali Rice Team (rice.collab@kuali.org)
45 *
46 */
47 @Ignore
48 public class EDocLiteXPathTest extends KEWTestCase {
49 private static final Logger LOG = Logger.getLogger(XPathTest.class);
50
51 private static final String STYLESHEET_RESOURCE = "org/kuali/rice/kew/edoclite/DefaultStyle.xsl";
52 private static final String INITIAL_EDOC_XML = "initial_edldoc.xml";
53 private static final String SAMPLE_EDOC_XML = "sample_edldoc.xml";
54
55 @Test public void testTransformInitialDoc() throws Exception {
56 TransformerFactory factory = TransformerFactory.newInstance();
57 Source styleSheet = new StreamSource(this.getClass().getClassLoader().getResourceAsStream(STYLESHEET_RESOURCE));
58 Templates templates = templates = factory.newTemplates(styleSheet);
59 Transformer transformer = templates.newTransformer();
60 transformer.setOutputProperty("indent", "yes");
61 transformer.setParameter("readOnly", "false");
62 //transformer.setParameter("docType", docType);
63 //transformer.setParameter("schema", schema);
64
65 Source input = new StreamSource(this.getClass().getResourceAsStream(INITIAL_EDOC_XML));
66 transformer.transform(input, new StreamResult(System.out));
67 }
68
69 @Test public void testFieldHasMatchingUserValues() throws Exception {
70 LOG.info("testFieldHasMatchingUserValues");
71 DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
72
73 XPath xpath = XPathFactory.newInstance().newXPath();
74 Document doc = db.parse(this.getClass().getResourceAsStream(SAMPLE_EDOC_XML));
75 // enumerate all fields
76 final String fieldDefs = "/edlContent/edl/field/display/values";
77 NodeList nodes = (NodeList) xpath.evaluate(fieldDefs, doc, XPathConstants.NODESET);
78
79 for (int i = 0; i < nodes.getLength(); i++) {
80 Node node = nodes.item(i);
81 String name = (String) xpath.evaluate("../../@name", node, XPathConstants.STRING);
82 LOG.debug("Name: " + name);
83 LOG.debug("Value: " + node.getFirstChild().getNodeValue());
84 final String expr = "/edlContent/data/version[@current='true']/fieldEntry[@name=current()/../../@name and value=current()]";
85 NodeList matchingUserValues = (NodeList) xpath.evaluate(expr, node, XPathConstants.NODESET);
86 LOG.debug(matchingUserValues + "");
87 LOG.debug(matchingUserValues.getLength() + "");
88 if ("gender".equals(name)) {
89 assertTrue("Matching values > 0", matchingUserValues.getLength() > 0);
90 }
91 for (int j = 0; j < matchingUserValues.getLength(); j++) {
92 LOG.debug(matchingUserValues.item(j).getFirstChild().getNodeValue());
93 }
94 }
95 }
96
97 /*
98 @Test public void testUpdateEDLDocument() throws Exception {
99 final Map params = new HashMap();
100 params.put("givenname", new String[] { "Frank" });
101 params.put("surname", new String[] { "Miller" });
102 params.put("email", new String[] { "frank@bogus.blah.asdlajsd.co.uk" });
103 params.put("gender", new String[] { "male" });
104 params.put("color", new String[] { "blue" });
105 params.put("food", new String[] { "sandwiches", "soup" });
106
107 DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
108
109 XPath xpath = XPathFactory.newInstance().newXPath();
110 String versionsExpression = "/edlContent/data/version";
111
112 // try an initial empty doc
113 EDLDocument edlDoc = new EDLDocument(db.parse(this.getClass().getResourceAsStream(INITIAL_EDOC_XML)));
114 int numVersionsBefore = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
115 LOG.debug("Initial before:");
116 LOG.debug(edlDoc);
117 edlDoc.update(null, params);
118 LOG.debug("Initial after:");
119 LOG.debug(edlDoc);
120 int numVersionsAfter = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
121 assertEquals(numVersionsBefore + 1, numVersionsAfter);
122
123 numVersionsBefore = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
124 LOG.debug("Initial 2nd time before:");
125 LOG.debug(edlDoc);
126 edlDoc.update(null, params);
127 LOG.debug("Initial 2nd time after:");
128 LOG.debug(edlDoc);
129 numVersionsAfter = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
130 assertEquals(numVersionsBefore + 1, numVersionsAfter);
131
132 // try a sample doc
133 edlDoc = new EDLDocument(db.parse(this.getClass().getResourceAsStream(SAMPLE_EDOC_XML)));
134 numVersionsBefore = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
135 LOG.debug("Sample before:");
136 LOG.debug(edlDoc);
137 edlDoc.update(null, params);
138 LOG.debug("Sample after:");
139 LOG.debug(edlDoc);
140 numVersionsAfter = ((NodeList) xpath.evaluate(versionsExpression, edlDoc.getDocument(), XPathConstants.NODESET)).getLength();
141 assertEquals(numVersionsBefore + 1, numVersionsAfter);
142 }
143
144 @Test public void testXPathStuff() throws Exception {
145 InputStream edlDocContent = new TestUtilities().loadResource(this.getClass(), "edldoccontent.xml");
146 org.w3c.dom.Document w3cDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(edlDocContent);
147 // Document document = new DOMBuilder().build(w3cDocument);
148 // DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
149 // Document routeDocument = builder.parse(new File("ParallelRouting.xml"));
150
151 XPath xpath = XPathFactory.newInstance().newXPath();
152 xpath.getXPathFunctionResolver();
153 // String expression = "//version[@current='true']/fieldEntry[@name='name']/value";
154 // xpath.getXPathFunctionResolver().resolveFunction();s
155 String expression = "//version[@current='true']/fieldEntry[@name=concat('n', 'ame')]/value";
156 String expression2 = "local-name(//field[@name='name']/@name)";
157 String expression3 = "//version[@current='true']/fieldEntry[@name=local-name(//field[@name='name']/@name)]/value";
158 Node node = (Node) xpath.evaluate(expression3, w3cDocument, XPathConstants.NODE);
159 xpath.evaluate(expression3, w3cDocument);
160 node.getNodeValue();
161 node.getNodeType();
162 ((Text)node.getFirstChild()).getNodeValue();
163 int i =1;
164 }
165 */
166 }