1 /*
2 * $Header: /home/projects/jaxen/scm/jaxen/src/java/main/org/jaxen/saxpath/helpers/XPathReaderFactory.java,v 1.9 2006/09/15 20:41:38 elharo Exp $
3 * $Revision: 1.9 $
4 * $Date: 2006/09/15 20:41:38 $
5 *
6 * ====================================================================
7 *
8 * Copyright 2000-2002 bob mcwhirter & James Strachan.
9 * All rights reserved.
10 *
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are
14 * met:
15 *
16 * * Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * * Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
22 *
23 * * Neither the name of the Jaxen Project nor the names of its
24 * contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
28 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
30 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
31 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 *
39 * ====================================================================
40 * This software consists of voluntary contributions made by many
41 * individuals on behalf of the Jaxen Project and was originally
42 * created by bob mcwhirter <bob@werken.com> and
43 * James Strachan <jstrachan@apache.org>. For more information on the
44 * Jaxen Project, please see <http://www.jaxen.org/>.
45 *
46 * $Id: XPathReaderFactory.java,v 1.9 2006/09/15 20:41:38 elharo Exp $
47 */
48
49
50
51
52 package org.jaxen.saxpath.helpers;
53
54 import org.jaxen.saxpath.SAXPathException;
55 import org.jaxen.saxpath.XPathReader;
56
57 /*** Create an {@link org.jaxen.saxpath.XPathReader} from
58 * either a system property, or a named class.
59 *
60 * <p>
61 * Similar to the SAX API, the <code>XPathReaderFactory</code>
62 * can create an <code>XPathReader</code> from a name of a
63 * class passed in directly, or by inspecting the system
64 * property <code>org.saxpath.driver</code>.
65 *
66 * @author bob mcwhirter (bob@werken.com)
67 */
68 public class XPathReaderFactory
69 {
70 /*** The <code>org.saxpath.driver</code> property name. */
71 public static final String DRIVER_PROPERTY = "org.saxpath.driver";
72
73 /*** The default driver to use if none is configured. */
74 protected static final String DEFAULT_DRIVER = "org.jaxen.saxpath.base.XPathReader";
75
76 private XPathReaderFactory() {}
77
78
79 /*** Create an <code>XPathReader</code> using the value of
80 * the <code>org.saxpath.driver</code> system property.
81 *
82 * @return an instance of the <code>XPathReader</code> specified
83 * by the <code>org.saxpath.driver</code> property
84 *
85 * @throws SAXPathException if the property is not set, or if
86 * the class can not be instantiated for some reason,
87 * or if the class doesn't implement the <code>XPathReader</code>
88 * interface
89 */
90 public static XPathReader createReader() throws SAXPathException
91 {
92 String className = null;
93
94 try
95 {
96 className = System.getProperty( DRIVER_PROPERTY );
97 }
98 catch (SecurityException e)
99 {
100 // we'll use the default
101 }
102
103 if ( className == null
104 ||
105 className.length() == 0 )
106 {
107 className = DEFAULT_DRIVER;
108 }
109
110 return createReader( className );
111 }
112
113 /*** Create an <code>XPathReader</code> using the passed
114 * in class name.
115 *
116 * @param className the name of the class that implements
117 * the <code>XPathReader</code> interface.
118 *
119 * @return an XPathReader
120 *
121 * @throws SAXPathException if the class cannot be
122 * instantiated for some reason, or if the
123 * class doesn't implement the <code>XPathReader</code>
124 * interface
125 */
126 public static XPathReader createReader(String className) throws SAXPathException
127 {
128 Class readerClass = null;
129 XPathReader reader = null;
130
131 try
132 {
133 // Use the full version of Class.forName(), so as to
134 // work better in sandboxed environments, such as
135 // servlet containers and applets.
136
137 readerClass = Class.forName( className,
138 true,
139 XPathReaderFactory.class.getClassLoader() );
140
141 // Double-check that it's actually the right kind of class
142 // before attempting instantiation.
143
144 if ( ! XPathReader.class.isAssignableFrom( readerClass ) )
145 {
146 throw new SAXPathException( "Class [" + className
147 + "] does not implement the org.jaxen.saxpath.XPathReader interface." );
148 }
149 }
150 catch (ClassNotFoundException e)
151 {
152 throw new SAXPathException( e );
153 }
154
155 try
156 {
157 reader = (XPathReader) readerClass.newInstance();
158 }
159 catch (IllegalAccessException e)
160 {
161 throw new SAXPathException( e );
162 }
163 catch (InstantiationException e)
164 {
165 throw new SAXPathException( e );
166 }
167
168 return reader;
169 }
170 }