19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: StylesheetPIHandler.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.utils; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.StringTokenizer; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.Source; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.URIResolver; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.sax.SAXSource; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.SystemIDResolver; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.Attributes; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.InputSource; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.DefaultHandler; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Search for the xml-stylesheet processing instructions in an XML document. 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xml-stylesheet/">Associating Style Sheets with XML documents, Version 1.0</a> 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class StylesheetPIHandler extends DefaultHandler 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The baseID of the document being processed. */ 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String m_baseID; 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The desired media criteria. */ 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String m_media; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The desired title criteria. */ 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String m_title; 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The desired character set criteria. */ 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String m_charset; 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** A list of SAXSource objects that match the criteria. */ 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Vector m_stylesheets = new Vector(); 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Add code to use a URIResolver. Patch from Dmitri Ilyin. 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The object that implements the URIResolver interface, 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or null. 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson URIResolver m_uriResolver; 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the object that will be used to resolve URIs in href 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in xml-stylesheet processing instruction. 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param resolver An object that implements the URIResolver interface, 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or null. 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setURIResolver(URIResolver resolver) 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_uriResolver = resolver; 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the object that will be used to resolve URIs in href 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in xml-stylesheet processing instruction. 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The URIResolver that was set with setURIResolver. 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public URIResolver getURIResolver() 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_uriResolver; 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a StylesheetPIHandler instance that will search 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for xml-stylesheet PIs based on the given criteria. 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param baseID The base ID of the XML document, needed to resolve 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * relative IDs. 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param media The desired media criteria. 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param title The desired title criteria. 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param charset The desired character set criteria. 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetPIHandler(String baseID, String media, String title, 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String charset) 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_baseID = baseID; 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_media = media; 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_title = title; 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_charset = charset; 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the last stylesheet found that match the constraints. 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Source object that references the last stylesheet reference 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * that matches the constraints. 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Source getAssociatedStylesheet() 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int sz = m_stylesheets.size(); 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (sz > 0) 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Source source = (Source) m_stylesheets.elementAt(sz-1); 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return source; 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Handle the xml-stylesheet processing instruction. 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param target The processing instruction target. 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param data The processing instruction data, or null if 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * none is supplied. 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws org.xml.sax.SAXException Any SAX exception, possibly 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * wrapping another exception. 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.xml.sax.ContentHandler#processingInstruction 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xml-stylesheet/">Associating Style Sheets with XML documents, Version 1.0</a> 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void processingInstruction(String target, String data) 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (target.equals("xml-stylesheet")) 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String href = null; // CDATA #REQUIRED 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String type = null; // CDATA #REQUIRED 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String title = null; // CDATA #IMPLIED 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String media = null; // CDATA #IMPLIED 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String charset = null; // CDATA #IMPLIED 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean alternate = false; // (yes|no) "no" 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StringTokenizer tokenizer = new StringTokenizer(data, " \t=\n", true); 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean lookedAhead = false; 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Source source = null; 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String token = ""; 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens()) 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!lookedAhead) 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lookedAhead = false; 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (tokenizer.hasMoreTokens() && 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" ") || token.equals("\t") || token.equals("="))) 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson continue; 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String name = token; 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (name.equals("type")) 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson type = token.substring(1, token.length() - 1); 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (name.equals("href")) 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson href = token; 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (tokenizer.hasMoreTokens()) 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If the href value has parameters to be passed to a 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // servlet(something like "foobar?id=12..."), 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // we want to make sure we get them added to 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the href value. Without this check, we would move on 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to try to process another attribute and that would be 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // wrong. 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // We need to set lookedAhead here to flag that we 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // already have the next token. 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while ( token.equals("=") && tokenizer.hasMoreTokens()) 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson href = href + token + tokenizer.nextToken(); 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (tokenizer.hasMoreTokens()) 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lookedAhead = true; 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson href = href.substring(1, href.length() - 1); 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Add code to use a URIResolver. Patch from Dmitri Ilyin. 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_uriResolver != null) 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson source = m_uriResolver.resolve(href, m_baseID); 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson href = SystemIDResolver.getAbsoluteURI(href, m_baseID); 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson source = new SAXSource(new InputSource(href)); 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch(TransformerException te) 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new org.xml.sax.SAXException(te); 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (name.equals("title")) 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson title = token.substring(1, token.length() - 1); 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (name.equals("media")) 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson media = token.substring(1, token.length() - 1); 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (name.equals("charset")) 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson charset = token.substring(1, token.length() - 1); 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (name.equals("alternate")) 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (tokenizer.hasMoreTokens() && 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (token.equals(" " ) || token.equals("\t") || token.equals("="))) 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson token = tokenizer.nextToken(); 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson alternate = token.substring(1, token.length() 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson - 1).equals("yes"); 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null != type) 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (type.equals("text/xsl") || type.equals("text/xml") || type.equals("application/xml+xslt")) 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (null != href)) 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_media) 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != media) 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!media.equals(m_media)) 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_charset) 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != charset) 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!charset.equals(m_charset)) 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_title) 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != title) 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!title.equals(m_title)) 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_stylesheets.addElement(source); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The spec notes that "The xml-stylesheet processing instruction is allowed only in the prolog of an XML document.", 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * so, at least for right now, I'm going to go ahead an throw a TransformerException 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in order to stop the parse. 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param namespaceURI The Namespace URI, or an empty string. 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param localName The local name (without prefix), or empty string if not namespace processing. 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param qName The qualified name (with prefix). 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param atts The specified or defaulted attributes. 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws StopParseException since there can be no valid xml-stylesheet processing 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * instructions past the first element. 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void startElement( 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String namespaceURI, String localName, String qName, Attributes atts) 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws org.xml.sax.SAXException 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new StopParseException(); 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Added additional getter and setter methods for the Base Id 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to fix bugzilla bug 24187 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setBaseId(String baseId) { 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_baseID = baseId; 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getBaseId() { 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_baseID ; 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 341