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