001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.edl.impl;
017    
018    import static org.junit.Assert.assertTrue;
019    
020    import javax.xml.parsers.DocumentBuilder;
021    import javax.xml.parsers.DocumentBuilderFactory;
022    import javax.xml.transform.Source;
023    import javax.xml.transform.Templates;
024    import javax.xml.transform.Transformer;
025    import javax.xml.transform.TransformerFactory;
026    import javax.xml.transform.stream.StreamResult;
027    import javax.xml.transform.stream.StreamSource;
028    import javax.xml.xpath.XPath;
029    import javax.xml.xpath.XPathConstants;
030    import javax.xml.xpath.XPathFactory;
031    
032    import org.apache.log4j.Logger;
033    import org.junit.Ignore;
034    import org.junit.Test;
035    import org.kuali.rice.kew.test.KEWTestCase;
036    import org.kuali.rice.kew.xml.XPathTest;
037    import org.w3c.dom.Document;
038    import org.w3c.dom.Node;
039    import org.w3c.dom.NodeList;
040    
041    /**
042     * This class is used to test edoc lite xml xpath operations
043     * 
044     * @author Kuali Rice Team (rice.collab@kuali.org)
045     *
046     */
047    @Ignore
048    public class EDocLiteXPathTest extends KEWTestCase {
049        private static final Logger LOG = Logger.getLogger(XPathTest.class);
050    
051        private static final String STYLESHEET_RESOURCE = "org/kuali/rice/kew/edoclite/DefaultStyle.xsl";
052        private static final String INITIAL_EDOC_XML = "initial_edldoc.xml";
053        private static final String SAMPLE_EDOC_XML = "sample_edldoc.xml";
054    
055        @Test public void testTransformInitialDoc() throws Exception {
056            TransformerFactory factory = TransformerFactory.newInstance();
057            Source styleSheet = new StreamSource(this.getClass().getClassLoader().getResourceAsStream(STYLESHEET_RESOURCE));
058            Templates templates = templates = factory.newTemplates(styleSheet);
059            Transformer transformer = templates.newTransformer();
060            transformer.setOutputProperty("indent", "yes");
061            transformer.setParameter("readOnly", "false");
062            //transformer.setParameter("docType", docType);
063            //transformer.setParameter("schema", schema);
064    
065            Source input = new StreamSource(this.getClass().getResourceAsStream(INITIAL_EDOC_XML));
066            transformer.transform(input, new StreamResult(System.out));
067        }
068    
069        @Test public void testFieldHasMatchingUserValues() throws Exception {
070            LOG.info("testFieldHasMatchingUserValues");
071            DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
072    
073            XPath xpath = XPathFactory.newInstance().newXPath();
074            Document doc = db.parse(this.getClass().getResourceAsStream(SAMPLE_EDOC_XML));
075            // enumerate all fields
076            final String fieldDefs = "/edlContent/edl/field/display/values";
077            NodeList nodes = (NodeList) xpath.evaluate(fieldDefs, doc, XPathConstants.NODESET);
078    
079            for (int i = 0; i < nodes.getLength(); i++) {
080                Node node = nodes.item(i);
081                String name = (String) xpath.evaluate("../../@name", node, XPathConstants.STRING);
082                LOG.debug("Name: " + name);
083                LOG.debug("Value: " + node.getFirstChild().getNodeValue());
084                final String expr = "/edlContent/data/version[@current='true']/fieldEntry[@name=current()/../../@name and value=current()]";
085                NodeList matchingUserValues = (NodeList) xpath.evaluate(expr, node, XPathConstants.NODESET);
086                LOG.debug(matchingUserValues + "");
087                LOG.debug(matchingUserValues.getLength() + "");
088                if ("gender".equals(name)) {
089                    assertTrue("Matching values > 0", matchingUserValues.getLength() > 0);
090                }
091                for (int j = 0; j < matchingUserValues.getLength(); j++) {
092                    LOG.debug(matchingUserValues.item(j).getFirstChild().getNodeValue());    
093                }
094            }
095        }
096    
097    /*
098        @Test public void testUpdateEDLDocument() throws Exception {
099            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    }