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