xref: /aosp_15_r20/external/apache-xml/test/tests/bugzilla/Bugzilla6181.java (revision 1212f9a0ffdc28482b8821715d2222bf16dc14e2)
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.BufferedReader;
24*1212f9a0SAndroid Build Coastguard Worker import java.io.File;
25*1212f9a0SAndroid Build Coastguard Worker import java.io.InputStreamReader;
26*1212f9a0SAndroid Build Coastguard Worker import java.io.IOException;
27*1212f9a0SAndroid Build Coastguard Worker import java.util.Date;
28*1212f9a0SAndroid Build Coastguard Worker import java.util.HashSet;
29*1212f9a0SAndroid Build Coastguard Worker import java.util.Properties;
30*1212f9a0SAndroid Build Coastguard Worker 
31*1212f9a0SAndroid Build Coastguard Worker import javax.xml.transform.*;
32*1212f9a0SAndroid Build Coastguard Worker import javax.xml.transform.stream.*;
33*1212f9a0SAndroid Build Coastguard Worker 
34*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.Node;
35*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.NodeList;
36*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.DocumentFragment;
37*1212f9a0SAndroid Build Coastguard Worker import org.w3c.dom.traversal.NodeIterator;
38*1212f9a0SAndroid Build Coastguard Worker 
39*1212f9a0SAndroid Build Coastguard Worker import org.apache.xalan.extensions.XSLProcessorContext;
40*1212f9a0SAndroid Build Coastguard Worker import org.apache.xalan.templates.ElemExtensionCall;
41*1212f9a0SAndroid Build Coastguard Worker 
42*1212f9a0SAndroid Build Coastguard Worker /**
43*1212f9a0SAndroid Build Coastguard Worker  * Testlet for reproducing Bugzilla reported bugs.
44*1212f9a0SAndroid Build Coastguard Worker  * @author [email protected]
45*1212f9a0SAndroid Build Coastguard Worker  * @author [email protected]
46*1212f9a0SAndroid Build Coastguard Worker  */
47*1212f9a0SAndroid Build Coastguard Worker public class Bugzilla6181 extends TestletImpl
48*1212f9a0SAndroid Build Coastguard Worker {
49*1212f9a0SAndroid Build Coastguard Worker 
50*1212f9a0SAndroid Build Coastguard Worker     // Initialize our classname for TestletImpl's main() method - must be updated!
51*1212f9a0SAndroid Build Coastguard Worker     static { thisClassName = "Bugzilla6181"; }
52*1212f9a0SAndroid Build Coastguard Worker 
53*1212f9a0SAndroid Build Coastguard Worker     /** Cheap-o validation for extension call */
54*1212f9a0SAndroid Build Coastguard Worker     static int extCounter = 0;
55*1212f9a0SAndroid Build Coastguard Worker 
56*1212f9a0SAndroid Build Coastguard Worker     /**
57*1212f9a0SAndroid Build Coastguard Worker      * Write Minimal code to reproduce your Bugzilla bug report.
58*1212f9a0SAndroid Build Coastguard Worker      * Many Bugzilla tests won't bother with a datalet; they'll
59*1212f9a0SAndroid Build Coastguard Worker      * just have the data to reproduce the bug encoded by default.
60*1212f9a0SAndroid Build Coastguard Worker      * @param d (optional) Datalet to use as data point for the test.
61*1212f9a0SAndroid Build Coastguard Worker      */
execute(Datalet d)62*1212f9a0SAndroid Build Coastguard Worker     public void execute(Datalet d)
63*1212f9a0SAndroid Build Coastguard Worker 	{
64*1212f9a0SAndroid Build Coastguard Worker         // Use logger.logMsg(...) instead of System.out.println(...)
65*1212f9a0SAndroid Build Coastguard Worker         logger.logMsg(Logger.STATUSMSG, "Reproducing Bugzilla#6181");
66*1212f9a0SAndroid Build Coastguard Worker 
67*1212f9a0SAndroid Build Coastguard Worker         logger.logMsg(logger.STATUSMSG, "extCounter(before) = " + extCounter);
68*1212f9a0SAndroid Build Coastguard Worker         try
69*1212f9a0SAndroid Build Coastguard Worker         {
70*1212f9a0SAndroid Build Coastguard Worker             TransformerFactory factory = TransformerFactory.newInstance();
71*1212f9a0SAndroid Build Coastguard Worker 
72*1212f9a0SAndroid Build Coastguard Worker             // Simply transform our stylesheet..
73*1212f9a0SAndroid Build Coastguard Worker             Transformer transformer = factory.newTransformer(new StreamSource("Bugzilla6181.xsl"));
74*1212f9a0SAndroid Build Coastguard Worker             transformer.transform(new StreamSource("Bugzilla6181.xml"),
75*1212f9a0SAndroid Build Coastguard Worker                     new StreamResult("Bugzilla6181.output"));
76*1212f9a0SAndroid Build Coastguard Worker             logger.checkPass("Crash test: produced unvalidated output into: Bugzilla6181.output");
77*1212f9a0SAndroid Build Coastguard Worker         }
78*1212f9a0SAndroid Build Coastguard Worker         catch (Throwable t)
79*1212f9a0SAndroid Build Coastguard Worker         {
80*1212f9a0SAndroid Build Coastguard Worker             logger.logThrowable(logger.ERRORMSG, t, "Unexpected exception");
81*1212f9a0SAndroid Build Coastguard Worker             logger.checkErr("Unexpected exception: " + t.toString());
82*1212f9a0SAndroid Build Coastguard Worker         }
83*1212f9a0SAndroid Build Coastguard Worker         // Then see how many times we've been called
84*1212f9a0SAndroid Build Coastguard Worker         logger.logMsg(logger.STATUSMSG, "extCounter(after) = " + extCounter);
85*1212f9a0SAndroid Build Coastguard Worker 
86*1212f9a0SAndroid Build Coastguard Worker 	}
87*1212f9a0SAndroid Build Coastguard Worker 
88*1212f9a0SAndroid Build Coastguard Worker     /**
89*1212f9a0SAndroid Build Coastguard Worker      * <a href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6181">
90*1212f9a0SAndroid Build Coastguard Worker      * Link to Bugzilla report</a>
91*1212f9a0SAndroid Build Coastguard Worker      * @return Problems with value-of and extension function.
92*1212f9a0SAndroid Build Coastguard Worker      */
getDescription()93*1212f9a0SAndroid Build Coastguard Worker     public String getDescription()
94*1212f9a0SAndroid Build Coastguard Worker     {
95*1212f9a0SAndroid Build Coastguard Worker         return "Problems with value-of and extension function";
96*1212f9a0SAndroid Build Coastguard Worker     }
97*1212f9a0SAndroid Build Coastguard Worker 
makeString( NodeIterator it )98*1212f9a0SAndroid Build Coastguard Worker   private String makeString( NodeIterator it ) {
99*1212f9a0SAndroid Build Coastguard Worker     String source = null;
100*1212f9a0SAndroid Build Coastguard Worker     StringBuffer sourceBuf = new StringBuffer();
101*1212f9a0SAndroid Build Coastguard Worker 	Node n;
102*1212f9a0SAndroid Build Coastguard Worker 	while((n = it.nextNode()) != null) {
103*1212f9a0SAndroid Build Coastguard Worker       sourceBuf.append( n.getNodeValue() );
104*1212f9a0SAndroid Build Coastguard Worker     }
105*1212f9a0SAndroid Build Coastguard Worker     return sourceBuf.toString();
106*1212f9a0SAndroid Build Coastguard Worker   }
107*1212f9a0SAndroid Build Coastguard Worker 
108*1212f9a0SAndroid Build Coastguard Worker   //  initcap
109*1212f9a0SAndroid Build Coastguard Worker   //  Handles function nn:initcap(<XPath-Expr>)
110*1212f9a0SAndroid Build Coastguard Worker   //
initcap( NodeIterator it )111*1212f9a0SAndroid Build Coastguard Worker   public String initcap( NodeIterator it ) {
112*1212f9a0SAndroid Build Coastguard Worker     String source = makeString( it );
113*1212f9a0SAndroid Build Coastguard Worker     extCounter++;
114*1212f9a0SAndroid Build Coastguard Worker     logger.logMsg(logger.INFOMSG, "initcap(ni) called with: " + source);
115*1212f9a0SAndroid Build Coastguard Worker     //  Now do the initcap thing and return it...
116*1212f9a0SAndroid Build Coastguard Worker     if( source.length() > 1 ) {
117*1212f9a0SAndroid Build Coastguard Worker       return source.substring(0,1).toUpperCase() + source.substring( 1 );
118*1212f9a0SAndroid Build Coastguard Worker     }
119*1212f9a0SAndroid Build Coastguard Worker     return "";
120*1212f9a0SAndroid Build Coastguard Worker   }
121*1212f9a0SAndroid Build Coastguard Worker 
makeString( DocumentFragment fragment )122*1212f9a0SAndroid Build Coastguard Worker   private String makeString( DocumentFragment fragment ) {
123*1212f9a0SAndroid Build Coastguard Worker       NodeList nodes = fragment.getChildNodes();
124*1212f9a0SAndroid Build Coastguard Worker       StringBuffer sourceBuf = new StringBuffer();
125*1212f9a0SAndroid Build Coastguard Worker       for( int i = 0; i < nodes.getLength(); ++i ) {
126*1212f9a0SAndroid Build Coastguard Worker         String s = nodes.item(i).getNodeValue();
127*1212f9a0SAndroid Build Coastguard Worker         if( s != null ) sourceBuf.append( s );
128*1212f9a0SAndroid Build Coastguard Worker       }
129*1212f9a0SAndroid Build Coastguard Worker       return sourceBuf.toString();
130*1212f9a0SAndroid Build Coastguard Worker   }
131*1212f9a0SAndroid Build Coastguard Worker 
132*1212f9a0SAndroid Build Coastguard Worker   //  initcap
133*1212f9a0SAndroid Build Coastguard Worker   //  Handles function nn:initcap(<XPath-Expr>)
134*1212f9a0SAndroid Build Coastguard Worker   //
initcap( DocumentFragment fragment )135*1212f9a0SAndroid Build Coastguard Worker   public String initcap( DocumentFragment fragment ) {
136*1212f9a0SAndroid Build Coastguard Worker     try {
137*1212f9a0SAndroid Build Coastguard Worker       String source = makeString( fragment );
138*1212f9a0SAndroid Build Coastguard Worker       extCounter++;
139*1212f9a0SAndroid Build Coastguard Worker       logger.logMsg(logger.INFOMSG, "initcap(f) called with: " + source);
140*1212f9a0SAndroid Build Coastguard Worker       //  Now do the initcap thing and return it...
141*1212f9a0SAndroid Build Coastguard Worker       if( source.length() > 1 ) {
142*1212f9a0SAndroid Build Coastguard Worker         return source.substring(0,1).toUpperCase() + source.substring( 1 );
143*1212f9a0SAndroid Build Coastguard Worker       }
144*1212f9a0SAndroid Build Coastguard Worker     } catch( Exception e ) {
145*1212f9a0SAndroid Build Coastguard Worker       e.printStackTrace();
146*1212f9a0SAndroid Build Coastguard Worker     }
147*1212f9a0SAndroid Build Coastguard Worker     return "";
148*1212f9a0SAndroid Build Coastguard Worker   }
149*1212f9a0SAndroid Build Coastguard Worker 
150*1212f9a0SAndroid Build Coastguard Worker }
151