1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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 /*** Should the default driver be used */
90 private static boolean USE_DEFAULT = true;
91
92
93 /*** Create an <code>XPathReader</code> using the value of
94 * the <code>org.saxpath.driver</code> system property.
95 *
96 * @return an instance of the <code>XPathReader</code> specified
97 * by the <code>org.saxpath.driver</code> property
98 *
99 * @throws SAXPathException if the property is not set, or if
100 * the class can not be instantiated for some reason,
101 * or if the class doesn't implement the <code>XPathReader</code>
102 * interface
103 */
104 public static XPathReader createReader() throws SAXPathException
105 {
106 String className = null;
107
108 boolean securityException = false;
109
110 try
111 {
112 className = System.getProperty( DRIVER_PROPERTY );
113 }
114 catch (SecurityException e)
115 {
116 securityException = true;
117 }
118
119 if ( className == null
120 ||
121 className.length() == 0 )
122 {
123 if ( USE_DEFAULT )
124 {
125 className = DEFAULT_DRIVER;
126 }
127 else
128 {
129 if ( securityException )
130 {
131 throw new SAXPathException( "Reading of property " + DRIVER_PROPERTY + " disallowed." );
132 }
133 else
134 {
135 throw new SAXPathException( "Property " + DRIVER_PROPERTY + " not set" );
136 }
137 }
138 }
139
140 return createReader( className );
141 }
142
143 /*** Create an <code>XPathReader</code> using the passed
144 * in class name.
145 *
146 * @param className the name of the class that implements
147 * the <code>XPathReader</code> interface.
148 *
149 * @throws SAXPathException if the class can not be
150 * instantiated for some reason, or if the
151 * class doesn't implement the <code>XPathReader</code>
152 * interface
153 */
154 public static XPathReader createReader(String className) throws SAXPathException
155 {
156 Class readerClass = null;
157 XPathReader reader = null;
158
159 try
160 {
161
162
163
164
165 readerClass = Class.forName( className,
166 true,
167 XPathReaderFactory.class.getClassLoader() );
168
169
170
171
172 if ( ! XPathReader.class.isAssignableFrom( readerClass ) )
173 {
174 throw new SAXPathException( "Class [" + className
175 + "] does not implement the org.jaxen.saxpath.XPathReader interface." );
176 }
177 }
178 catch (ClassNotFoundException e)
179 {
180 throw new SAXPathException( e );
181 }
182
183 try
184 {
185 reader = (XPathReader) readerClass.newInstance();
186 }
187 catch (IllegalAccessException e)
188 {
189 throw new SAXPathException( e );
190 }
191 catch (InstantiationException e)
192 {
193 throw new SAXPathException( e );
194 }
195
196 if ( reader == null )
197 {
198 throw new SAXPathException( "Unable to create XPathReader" );
199 }
200
201 return reader;
202 }
203 }