1. /*
  2. * $Id: SAXParserFactoryImpl.java,v 1.4 2001/03/30 23:32:03 edwingo Exp $
  3. *
  4. * The Apache Software License, Version 1.1
  5. *
  6. *
  7. * Copyright (c) 2000 The Apache Software Foundation. All rights
  8. * reserved.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions
  12. * are met:
  13. *
  14. * 1. Redistributions of source code must retain the above copyright
  15. * notice, this list of conditions and the following disclaimer.
  16. *
  17. * 2. Redistributions in binary form must reproduce the above copyright
  18. * notice, this list of conditions and the following disclaimer in
  19. * the documentation and/or other materials provided with the
  20. * distribution.
  21. *
  22. * 3. The end-user documentation included with the redistribution,
  23. * if any, must include the following acknowledgment:
  24. * "This product includes software developed by the
  25. * Apache Software Foundation (http://www.apache.org/)."
  26. * Alternately, this acknowledgment may appear in the software itself,
  27. * if and wherever such third-party acknowledgments normally appear.
  28. *
  29. * 4. The names "Crimson" and "Apache Software Foundation" must
  30. * not be used to endorse or promote products derived from this
  31. * software without prior written permission. For written
  32. * permission, please contact apache@apache.org.
  33. *
  34. * 5. Products derived from this software may not be called "Apache",
  35. * nor may "Apache" appear in their name, without prior written
  36. * permission of the Apache Software Foundation.
  37. *
  38. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  39. * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  40. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  41. * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  42. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  43. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  44. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  45. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  46. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  47. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  48. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  49. * SUCH DAMAGE.
  50. * ====================================================================
  51. *
  52. * This software consists of voluntary contributions made by many
  53. * individuals on behalf of the Apache Software Foundation and was
  54. * originally based on software copyright (c) 1999, Sun Microsystems, Inc.,
  55. * http://www.sun.com. For more information on the Apache Software
  56. * Foundation, please see <http://www.apache.org/>.
  57. */
  58. package org.apache.crimson.jaxp;
  59. import javax.xml.parsers.SAXParserFactory;
  60. import javax.xml.parsers.SAXParser;
  61. import javax.xml.parsers.ParserConfigurationException;
  62. import org.xml.sax.SAXException;
  63. import org.xml.sax.SAXNotRecognizedException;
  64. import org.xml.sax.SAXNotSupportedException;
  65. import org.xml.sax.XMLReader;
  66. import java.util.Hashtable;
  67. /**
  68. * @author Rajiv Mordani
  69. * @author Edwin Goei
  70. * @version $Revision: 1.4 $
  71. */
  72. /**
  73. * This is the implementation specific class for the
  74. * <code>javax.xml.parsers.SAXParserFactory</code>. This is the platform
  75. * default implementation for the platform.
  76. */
  77. public class SAXParserFactoryImpl extends SAXParserFactory {
  78. private Hashtable features;
  79. /**
  80. * Creates a new instance of <code>SAXParser</code> using the currently
  81. * configured factory parameters.
  82. * @return javax.xml.parsers.SAXParser
  83. */
  84. public SAXParser newSAXParser()
  85. throws ParserConfigurationException
  86. {
  87. SAXParser saxParserImpl;
  88. try {
  89. saxParserImpl = new SAXParserImpl(this, features);
  90. } catch (SAXException se) {
  91. // Translate to ParserConfigurationException
  92. throw new ParserConfigurationException(se.getMessage());
  93. }
  94. return saxParserImpl;
  95. }
  96. /**
  97. * Common code for translating exceptions
  98. */
  99. private SAXParserImpl newSAXParserImpl()
  100. throws ParserConfigurationException, SAXNotRecognizedException,
  101. SAXNotSupportedException
  102. {
  103. SAXParserImpl saxParserImpl;
  104. try {
  105. saxParserImpl = new SAXParserImpl(this, features);
  106. } catch (SAXNotSupportedException e) {
  107. throw e;
  108. } catch (SAXNotRecognizedException e) {
  109. throw e;
  110. } catch (SAXException se) {
  111. throw new ParserConfigurationException(se.getMessage());
  112. }
  113. return saxParserImpl;
  114. }
  115. /**
  116. * Sets the particular feature in the underlying implementation of
  117. * org.xml.sax.XMLReader.
  118. */
  119. public void setFeature(String name, boolean value)
  120. throws ParserConfigurationException, SAXNotRecognizedException,
  121. SAXNotSupportedException
  122. {
  123. // XXX This is ugly. We have to collect the features and then
  124. // later create an XMLReader to verify the features.
  125. if (features == null) {
  126. features = new Hashtable();
  127. }
  128. features.put(name, new Boolean(value));
  129. // Test the feature by possibly throwing SAX exceptions
  130. try {
  131. newSAXParserImpl();
  132. } catch (SAXNotSupportedException e) {
  133. features.remove(name);
  134. throw e;
  135. } catch (SAXNotRecognizedException e) {
  136. features.remove(name);
  137. throw e;
  138. }
  139. }
  140. /**
  141. * returns the particular property requested for in the underlying
  142. * implementation of org.xml.sax.XMLReader.
  143. */
  144. public boolean getFeature(String name)
  145. throws ParserConfigurationException, SAXNotRecognizedException,
  146. SAXNotSupportedException
  147. {
  148. // Check for valid name by creating a dummy XMLReader to get
  149. // feature value
  150. return newSAXParserImpl().getXMLReader().getFeature(name);
  151. }
  152. }