1*1212f9a0SAndroid Build Coastguard Worker /* 2*1212f9a0SAndroid Build Coastguard Worker * Licensed to the Apache Software Foundation (ASF) under one 3*1212f9a0SAndroid Build Coastguard Worker * or more contributor license agreements. See the NOTICE file 4*1212f9a0SAndroid Build Coastguard Worker * distributed with this work for additional information 5*1212f9a0SAndroid Build Coastguard Worker * regarding copyright ownership. The ASF licenses this file 6*1212f9a0SAndroid Build Coastguard Worker * to you under the Apache License, Version 2.0 (the "License"); 7*1212f9a0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 8*1212f9a0SAndroid Build Coastguard Worker * You may obtain a copy of the License at 9*1212f9a0SAndroid Build Coastguard Worker * 10*1212f9a0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 11*1212f9a0SAndroid Build Coastguard Worker * 12*1212f9a0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 13*1212f9a0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 14*1212f9a0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*1212f9a0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 16*1212f9a0SAndroid Build Coastguard Worker * limitations under the License. 17*1212f9a0SAndroid Build Coastguard Worker */ 18*1212f9a0SAndroid Build Coastguard Worker // Common Qetest / Xalan testing imports 19*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.Datalet; 20*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.Logger; 21*1212f9a0SAndroid Build Coastguard Worker import org.apache.qetest.TestletImpl; 22*1212f9a0SAndroid Build Coastguard Worker 23*1212f9a0SAndroid Build Coastguard Worker import java.io.ByteArrayInputStream; 24*1212f9a0SAndroid Build Coastguard Worker import org.apache.xpath.CachedXPathAPI; 25*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.*; 26*1212f9a0SAndroid Build Coastguard Worker import javax.xml.parsers.*; 27*1212f9a0SAndroid Build Coastguard Worker 28*1212f9a0SAndroid Build Coastguard Worker /** 29*1212f9a0SAndroid Build Coastguard Worker * Testlet for reproducing Bugzilla reported bugs. 30*1212f9a0SAndroid Build Coastguard Worker * 31*1212f9a0SAndroid Build Coastguard Worker * @author [email protected] 32*1212f9a0SAndroid Build Coastguard Worker * @author [email protected] 33*1212f9a0SAndroid Build Coastguard Worker */ 34*1212f9a0SAndroid Build Coastguard Worker public class Bugzilla6329 extends TestletImpl 35*1212f9a0SAndroid Build Coastguard Worker { 36*1212f9a0SAndroid Build Coastguard Worker // Initialize our classname for TestletImpl's main() method - must be updated! 37*1212f9a0SAndroid Build Coastguard Worker static { thisClassName = "Bugzilla6329"; } 38*1212f9a0SAndroid Build Coastguard Worker 39*1212f9a0SAndroid Build Coastguard Worker /** 40*1212f9a0SAndroid Build Coastguard Worker * The following program tries to select all nodes in the document using an 41*1212f9a0SAndroid Build Coastguard Worker * XPath expression but the XPath misses the CDATA section. 42*1212f9a0SAndroid Build Coastguard Worker * User reported output is: 43*1212f9a0SAndroid Build Coastguard Worker * <PRE> 44*1212f9a0SAndroid Build Coastguard Worker * Xerces-J 2.0.0 45*1212f9a0SAndroid Build Coastguard Worker * Xalan Java 2.2.0 46*1212f9a0SAndroid Build Coastguard Worker * 0 (DOCUMENT): [#document: null] 47*1212f9a0SAndroid Build Coastguard Worker * 1 (ELEMENT): [svg: null] 48*1212f9a0SAndroid Build Coastguard Worker * 2 (ATTRIBUTE): onload="thisInit()" 49*1212f9a0SAndroid Build Coastguard Worker * 3 (ATTRIBUTE): width="106.786pt" 50*1212f9a0SAndroid Build Coastguard Worker * 4 (ATTRIBUTE): xml:space="preserve" 51*1212f9a0SAndroid Build Coastguard Worker * 5 (ATTRIBUTE): org.apache.xml.dtm.ref.dom2dtm.DOM2DTMdefaultNamespaceDeclarationNode@5b699b 52*1212f9a0SAndroid Build Coastguard Worker * 6 (TEXT_NODE): [#text: 53*1212f9a0SAndroid Build Coastguard Worker * ] 54*1212f9a0SAndroid Build Coastguard Worker * 7 (ELEMENT): [style: null] 55*1212f9a0SAndroid Build Coastguard Worker * 8 (ATTRIBUTE): type="text/css" 56*1212f9a0SAndroid Build Coastguard Worker * 9 (ATTRIBUTE): xml:space="" 57*1212f9a0SAndroid Build Coastguard Worker * 10 (TEXT_NODE): [#text: 58*1212f9a0SAndroid Build Coastguard Worker * ] 59*1212f9a0SAndroid Build Coastguard Worker * 11 (TEXT_NODE): [#text: 60*1212f9a0SAndroid Build Coastguard Worker * ] 61*1212f9a0SAndroid Build Coastguard Worker * </PRE> 62*1212f9a0SAndroid Build Coastguard Worker * @param d (optional) Datalet to use as data point for the test. 63*1212f9a0SAndroid Build Coastguard Worker */ execute(Datalet d)64*1212f9a0SAndroid Build Coastguard Worker public void execute(Datalet d) 65*1212f9a0SAndroid Build Coastguard Worker { 66*1212f9a0SAndroid Build Coastguard Worker // Use logger.logMsg(...) instead of System.out.println(...) 67*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(Logger.STATUSMSG, "Reproducing Bugzilla#6329"); 68*1212f9a0SAndroid Build Coastguard Worker 69*1212f9a0SAndroid Build Coastguard Worker String input = 70*1212f9a0SAndroid Build Coastguard Worker "<svg width='106.786pt' xml:space='preserve' onload='thisInit()'>\n" + 71*1212f9a0SAndroid Build Coastguard Worker "<style type='text/css' xml:space=''>\n" + 72*1212f9a0SAndroid Build Coastguard Worker "<![CDATA[\n" + 73*1212f9a0SAndroid Build Coastguard Worker " @font-face{font-family:'RussellSquare-Oblique';src:url(Arial.cef)}\n" + 74*1212f9a0SAndroid Build Coastguard Worker "]]>\n" + 75*1212f9a0SAndroid Build Coastguard Worker "</style>\n" + 76*1212f9a0SAndroid Build Coastguard Worker "</svg>\n"; 77*1212f9a0SAndroid Build Coastguard Worker 78*1212f9a0SAndroid Build Coastguard Worker // Note: please avoid calling these directly, or at least use 79*1212f9a0SAndroid Build Coastguard Worker // reflection to find the classes: they do change with 80*1212f9a0SAndroid Build Coastguard Worker // different Xerces and Xalan builds! -sc 81*1212f9a0SAndroid Build Coastguard Worker //logger.logMsg(logger.STATUSMSG, org.apache.xerces.impl.Version.fVersion); 82*1212f9a0SAndroid Build Coastguard Worker //logger.logMsg(logger.STATUSMSG, org.apache.xalan.processor.XSLProcessorVersion.S_VERSION); 83*1212f9a0SAndroid Build Coastguard Worker 84*1212f9a0SAndroid Build Coastguard Worker try 85*1212f9a0SAndroid Build Coastguard Worker { 86*1212f9a0SAndroid Build Coastguard Worker DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 87*1212f9a0SAndroid Build Coastguard Worker dbf.setNamespaceAware(true); 88*1212f9a0SAndroid Build Coastguard Worker 89*1212f9a0SAndroid Build Coastguard Worker DocumentBuilder db = dbf.newDocumentBuilder(); 90*1212f9a0SAndroid Build Coastguard Worker Document doc = db.parse(new ByteArrayInputStream(input.getBytes())); 91*1212f9a0SAndroid Build Coastguard Worker CachedXPathAPI xp = new CachedXPathAPI(); 92*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.STATUSMSG, "User case: xp.selectNodeList(doc, (//. | //@* | //namespace::*))"); 93*1212f9a0SAndroid Build Coastguard Worker NodeList nl = xp.selectNodeList(doc, "(//. | //@* | //namespace::*)"); 94*1212f9a0SAndroid Build Coastguard Worker 95*1212f9a0SAndroid Build Coastguard Worker for (int i = 0; i < nl.getLength(); i++) 96*1212f9a0SAndroid Build Coastguard Worker { 97*1212f9a0SAndroid Build Coastguard Worker // logger.logMsg(logger.STATUSMSG, i + " parent: " + nl.item(i).getParentNode()); 98*1212f9a0SAndroid Build Coastguard Worker // logger.logMsg(logger.STATUSMSG, i + " ("+org.apache.xml.security.utils.XMLUtils.getNodeTypeString(nl.item(i))+"): " + nl.item(i)); 99*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.STATUSMSG, i + ": " + nl.item(i)); 100*1212f9a0SAndroid Build Coastguard Worker } 101*1212f9a0SAndroid Build Coastguard Worker 102*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.STATUSMSG, "dave case: xp.selectNodeList(doc, (//.))"); 103*1212f9a0SAndroid Build Coastguard Worker nl = xp.selectNodeList(doc, "(//.)"); 104*1212f9a0SAndroid Build Coastguard Worker 105*1212f9a0SAndroid Build Coastguard Worker for (int i = 0; i < nl.getLength(); i++) 106*1212f9a0SAndroid Build Coastguard Worker { 107*1212f9a0SAndroid Build Coastguard Worker // logger.logMsg(logger.STATUSMSG, i + " parent: " + nl.item(i).getParentNode()); 108*1212f9a0SAndroid Build Coastguard Worker // logger.logMsg(logger.STATUSMSG, i + " ("+org.apache.xml.security.utils.XMLUtils.getNodeTypeString(nl.item(i))+"): " + nl.item(i)); 109*1212f9a0SAndroid Build Coastguard Worker logger.logMsg(logger.STATUSMSG, i + ": " + nl.item(i)); 110*1212f9a0SAndroid Build Coastguard Worker } 111*1212f9a0SAndroid Build Coastguard Worker 112*1212f9a0SAndroid Build Coastguard Worker 113*1212f9a0SAndroid Build Coastguard Worker logger.checkAmbiguous("Test needs manual validation! (But Joe hints it may be invalid)"); 114*1212f9a0SAndroid Build Coastguard Worker } 115*1212f9a0SAndroid Build Coastguard Worker catch (Throwable t) 116*1212f9a0SAndroid Build Coastguard Worker { 117*1212f9a0SAndroid Build Coastguard Worker logger.logThrowable(logger.ERRORMSG, t, "Unexpected exception"); 118*1212f9a0SAndroid Build Coastguard Worker logger.checkErr("Unexpected exception: " + t.toString()); 119*1212f9a0SAndroid Build Coastguard Worker } 120*1212f9a0SAndroid Build Coastguard Worker } 121*1212f9a0SAndroid Build Coastguard Worker 122*1212f9a0SAndroid Build Coastguard Worker /** 123*1212f9a0SAndroid Build Coastguard Worker * <a href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6329"> 124*1212f9a0SAndroid Build Coastguard Worker * Link to Bugzilla report</a> 125*1212f9a0SAndroid Build Coastguard Worker * @return XPath does not catch CDATA Nodes. 126*1212f9a0SAndroid Build Coastguard Worker */ getDescription()127*1212f9a0SAndroid Build Coastguard Worker public String getDescription() 128*1212f9a0SAndroid Build Coastguard Worker { 129*1212f9a0SAndroid Build Coastguard Worker return "XPath does not catch CDATA Nodes"; 130*1212f9a0SAndroid Build Coastguard Worker } 131*1212f9a0SAndroid Build Coastguard Worker 132*1212f9a0SAndroid Build Coastguard Worker } // end of class Bugzilla6329 133*1212f9a0SAndroid Build Coastguard Worker 134