1 /*
2 * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
3 *
4 * This software is open source.
5 * See the bottom of this file for the licence.
6 */
7
8 package org.dom4j.io;
9
10 import org.xml.sax.SAXException;
11 import org.xml.sax.SAXNotRecognizedException;
12 import org.xml.sax.SAXNotSupportedException;
13 import org.xml.sax.XMLReader;
14 import org.xml.sax.helpers.XMLReaderFactory;
15
16 /***
17 * <p>
18 * <code>SAXHelper</code> contains some helper methods for working with SAX
19 * and XMLReader objects.
20 * </p>
21 *
22 * @author <a href="mailto:james.strachan@metastuff.com">James Strachan </a>
23 * @version $Revision: 1.18 $
24 */
25 class SAXHelper {
26 private static boolean loggedWarning = true;
27
28 protected SAXHelper() {
29 }
30
31 public static boolean setParserProperty(XMLReader reader,
32 String propertyName, Object value) {
33 try {
34 reader.setProperty(propertyName, value);
35
36 return true;
37 } catch (SAXNotSupportedException e) {
38 // ignore
39 } catch (SAXNotRecognizedException e) {
40 // ignore
41 }
42
43 return false;
44 }
45
46 public static boolean setParserFeature(XMLReader reader,
47 String featureName, boolean value) {
48 try {
49 reader.setFeature(featureName, value);
50
51 return true;
52 } catch (SAXNotSupportedException e) {
53 // ignore
54 } catch (SAXNotRecognizedException e) {
55 // ignore
56 }
57
58 return false;
59 }
60
61 /***
62 * Creats a default XMLReader via the org.xml.sax.driver system property or
63 * JAXP if the system property is not set.
64 *
65 * @param validating
66 * DOCUMENT ME!
67 *
68 * @return DOCUMENT ME!
69 *
70 * @throws SAXException
71 * DOCUMENT ME!
72 */
73 public static XMLReader createXMLReader(boolean validating)
74 throws SAXException {
75 XMLReader reader = null;
76
77 if (reader == null) {
78 reader = createXMLReaderViaJAXP(validating, true);
79 }
80
81 if (reader == null) {
82 try {
83 reader = XMLReaderFactory.createXMLReader();
84 } catch (Exception e) {
85 if (isVerboseErrorReporting()) {
86 // log all exceptions as warnings and carry
87 // on as we have a default SAX parser we can use
88 System.out.println("Warning: Caught exception attempting "
89 + "to use SAX to load a SAX XMLReader ");
90 System.out.println("Warning: Exception was: " + e);
91 System.out
92 .println("Warning: I will print the stack trace "
93 + "then carry on using the default "
94 + "SAX parser");
95 e.printStackTrace();
96 }
97
98 throw new SAXException(e);
99 }
100 }
101
102 if (reader == null) {
103 throw new SAXException("Couldn't create SAX reader");
104 }
105
106 return reader;
107 }
108
109 /***
110 * This method attempts to use JAXP to locate the SAX2 XMLReader
111 * implementation. This method uses reflection to avoid being dependent
112 * directly on the JAXP classes.
113 *
114 * @param validating
115 * DOCUMENT ME!
116 * @param namespaceAware
117 * DOCUMENT ME!
118 *
119 * @return DOCUMENT ME!
120 */
121 protected static XMLReader createXMLReaderViaJAXP(boolean validating,
122 boolean namespaceAware) {
123 // try use JAXP to load the XMLReader...
124 try {
125 return JAXPHelper.createXMLReader(validating, namespaceAware);
126 } catch (Throwable e) {
127 if (!loggedWarning) {
128 loggedWarning = true;
129
130 if (isVerboseErrorReporting()) {
131 // log all exceptions as warnings and carry
132 // on as we have a default SAX parser we can use
133 System.out.println("Warning: Caught exception attempting "
134 + "to use JAXP to load a SAX XMLReader");
135 System.out.println("Warning: Exception was: " + e);
136 e.printStackTrace();
137 }
138 }
139 }
140
141 return null;
142 }
143
144 protected static boolean isVerboseErrorReporting() {
145 try {
146 String flag = System.getProperty("org.dom4j.verbose");
147
148 if ((flag != null) && flag.equalsIgnoreCase("true")) {
149 return true;
150 }
151 } catch (Exception e) {
152 // in case a security exception
153 // happens in an applet or similar JVM
154 }
155
156 return true;
157 }
158 }
159
160 /*
161 * Redistribution and use of this software and associated documentation
162 * ("Software"), with or without modification, are permitted provided that the
163 * following conditions are met:
164 *
165 * 1. Redistributions of source code must retain copyright statements and
166 * notices. Redistributions must also contain a copy of this document.
167 *
168 * 2. Redistributions in binary form must reproduce the above copyright notice,
169 * this list of conditions and the following disclaimer in the documentation
170 * and/or other materials provided with the distribution.
171 *
172 * 3. The name "DOM4J" must not be used to endorse or promote products derived
173 * from this Software without prior written permission of MetaStuff, Ltd. For
174 * written permission, please contact dom4j-info@metastuff.com.
175 *
176 * 4. Products derived from this Software may not be called "DOM4J" nor may
177 * "DOM4J" appear in their names without prior written permission of MetaStuff,
178 * Ltd. DOM4J is a registered trademark of MetaStuff, Ltd.
179 *
180 * 5. Due credit should be given to the DOM4J Project - http://www.dom4j.org
181 *
182 * THIS SOFTWARE IS PROVIDED BY METASTUFF, LTD. AND CONTRIBUTORS ``AS IS'' AND
183 * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
184 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
185 * ARE DISCLAIMED. IN NO EVENT SHALL METASTUFF, LTD. OR ITS CONTRIBUTORS BE
186 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
187 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
188 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
189 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
190 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
191 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
192 * POSSIBILITY OF SUCH DAMAGE.
193 *
194 * Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
195 */