40 * URI in which the link to the new resource is defined and the baseURI of the |
40 * URI in which the link to the new resource is defined and the baseURI of the |
41 * file/entity in which the URI occurs (the baseURI is the same as the SystemId). |
41 * file/entity in which the URI occurs (the baseURI is the same as the SystemId). |
42 */ |
42 */ |
43 public class ResourceResolver { |
43 public class ResourceResolver { |
44 |
44 |
45 /** {@link org.apache.commons.logging} logging facility */ |
45 private static final com.sun.org.slf4j.internal.Logger LOG = |
46 private static java.util.logging.Logger log = |
46 com.sun.org.slf4j.internal.LoggerFactory.getLogger(ResourceResolver.class); |
47 java.util.logging.Logger.getLogger(ResourceResolver.class.getName()); |
|
48 |
47 |
49 /** these are the system-wide resolvers */ |
48 /** these are the system-wide resolvers */ |
50 private static List<ResourceResolver> resolverList = new ArrayList<ResourceResolver>(); |
49 private static final List<ResourceResolver> resolverList = new ArrayList<>(); |
51 |
50 |
52 /** Field resolverSpi */ |
51 /** Field resolverSpi */ |
53 private final ResourceResolverSpi resolverSpi; |
52 private final ResourceResolverSpi resolverSpi; |
54 |
53 |
55 /** |
54 /** |
98 for (ResourceResolver resolver : resolverList) { |
83 for (ResourceResolver resolver : resolverList) { |
99 ResourceResolver resolverTmp = resolver; |
84 ResourceResolver resolverTmp = resolver; |
100 if (!resolver.resolverSpi.engineIsThreadSafe()) { |
85 if (!resolver.resolverSpi.engineIsThreadSafe()) { |
101 try { |
86 try { |
102 @SuppressWarnings("deprecation") |
87 @SuppressWarnings("deprecation") |
103 ResourceResolver tmp = new ResourceResolver(resolver.resolverSpi.getClass().newInstance()); |
88 ResourceResolver tmp = |
|
89 new ResourceResolver(resolver.resolverSpi.getClass().newInstance()); |
104 resolverTmp = tmp; |
90 resolverTmp = tmp; |
105 ; |
|
106 } catch (InstantiationException e) { |
91 } catch (InstantiationException e) { |
107 throw new ResourceResolverException("", e, context.attr, context.baseUri); |
92 throw new ResourceResolverException(e, context.uriToResolve, context.baseUri, ""); |
108 } catch (IllegalAccessException e) { |
93 } catch (IllegalAccessException e) { |
109 throw new ResourceResolverException("", e, context.attr, context.baseUri); |
94 throw new ResourceResolverException(e, context.uriToResolve, context.baseUri, ""); |
110 } |
95 } |
111 } |
96 } |
112 |
97 |
113 if (log.isLoggable(java.util.logging.Level.FINE)) { |
98 LOG.debug("check resolvability by class {}", resolverTmp.getClass().getName()); |
114 log.log(java.util.logging.Level.FINE, |
99 |
115 "check resolvability by class " + resolverTmp.getClass().getName() |
100 if (resolverTmp != null && resolverTmp.canResolve(context)) { |
116 ); |
|
117 } |
|
118 |
|
119 if ((resolverTmp != null) && resolverTmp.canResolve(context)) { |
|
120 // Check to see whether the Resolver is allowed |
101 // Check to see whether the Resolver is allowed |
121 if (context.secureValidation |
102 if (context.secureValidation |
122 && (resolverTmp.resolverSpi instanceof ResolverLocalFilesystem |
103 && (resolverTmp.resolverSpi instanceof ResolverLocalFilesystem |
123 || resolverTmp.resolverSpi instanceof ResolverDirectHTTP)) { |
104 || resolverTmp.resolverSpi instanceof ResolverDirectHTTP)) { |
124 Object exArgs[] = { resolverTmp.resolverSpi.getClass().getName() }; |
105 Object exArgs[] = { resolverTmp.resolverSpi.getClass().getName() }; |
125 throw new ResourceResolverException( |
106 throw new ResourceResolverException( |
126 "signature.Reference.ForbiddenResolver", exArgs, context.attr, context.baseUri |
107 "signature.Reference.ForbiddenResolver", exArgs, context.uriToResolve, context.baseUri |
127 ); |
108 ); |
128 } |
109 } |
129 return resolverTmp; |
110 return resolverTmp; |
130 } |
111 } |
131 } |
112 } |
132 } |
113 } |
133 |
114 |
134 Object exArgs[] = { ((context.uriToResolve != null) |
115 Object exArgs[] = { context.uriToResolve != null |
135 ? context.uriToResolve : "null"), context.baseUri }; |
116 ? context.uriToResolve : "null", context.baseUri }; |
136 |
117 |
137 throw new ResourceResolverException("utils.resolver.noClass", exArgs, context.attr, context.baseUri); |
118 throw new ResourceResolverException("utils.resolver.noClass", exArgs, context.uriToResolve, context.baseUri); |
138 } |
119 } |
139 |
120 |
140 /** |
121 /** |
141 * Method getInstance |
122 * Method getInstance |
142 * |
123 * |
148 * @throws ResourceResolverException |
129 * @throws ResourceResolverException |
149 */ |
130 */ |
150 public static ResourceResolver getInstance( |
131 public static ResourceResolver getInstance( |
151 Attr uri, String baseURI, List<ResourceResolver> individualResolvers |
132 Attr uri, String baseURI, List<ResourceResolver> individualResolvers |
152 ) throws ResourceResolverException { |
133 ) throws ResourceResolverException { |
153 return getInstance(uri, baseURI, individualResolvers, false); |
134 return getInstance(uri, baseURI, individualResolvers, true); |
154 } |
135 } |
155 |
136 |
156 /** |
137 /** |
157 * Method getInstance |
138 * Method getInstance |
158 * |
139 * |
165 * @throws ResourceResolverException |
146 * @throws ResourceResolverException |
166 */ |
147 */ |
167 public static ResourceResolver getInstance( |
148 public static ResourceResolver getInstance( |
168 Attr uri, String baseURI, List<ResourceResolver> individualResolvers, boolean secureValidation |
149 Attr uri, String baseURI, List<ResourceResolver> individualResolvers, boolean secureValidation |
169 ) throws ResourceResolverException { |
150 ) throws ResourceResolverException { |
170 if (log.isLoggable(java.util.logging.Level.FINE)) { |
151 LOG.debug( |
171 log.log(java.util.logging.Level.FINE, |
152 "I was asked to create a ResourceResolver and got {}", |
172 "I was asked to create a ResourceResolver and got " |
153 (individualResolvers == null ? 0 : individualResolvers.size()) |
173 + (individualResolvers == null ? 0 : individualResolvers.size()) |
154 ); |
174 ); |
|
175 } |
|
176 |
155 |
177 ResourceResolverContext context = new ResourceResolverContext(uri, baseURI, secureValidation); |
156 ResourceResolverContext context = new ResourceResolverContext(uri, baseURI, secureValidation); |
178 |
157 |
179 // first check the individual Resolvers |
158 // first check the individual Resolvers |
180 if (individualResolvers != null) { |
159 if (individualResolvers != null) { |
181 for (int i = 0; i < individualResolvers.size(); i++) { |
160 for (int i = 0; i < individualResolvers.size(); i++) { |
182 ResourceResolver resolver = individualResolvers.get(i); |
161 ResourceResolver resolver = individualResolvers.get(i); |
183 |
162 |
184 if (resolver != null) { |
163 if (resolver != null) { |
185 if (log.isLoggable(java.util.logging.Level.FINE)) { |
164 String currentClass = resolver.resolverSpi.getClass().getName(); |
186 String currentClass = resolver.resolverSpi.getClass().getName(); |
165 LOG.debug("check resolvability by class {}", currentClass); |
187 log.log(java.util.logging.Level.FINE, "check resolvability by class " + currentClass); |
|
188 } |
|
189 |
166 |
190 if (resolver.canResolve(context)) { |
167 if (resolver.canResolve(context)) { |
191 return resolver; |
168 return resolver; |
192 } |
169 } |
193 } |
170 } |
196 |
173 |
197 return internalGetInstance(context); |
174 return internalGetInstance(context); |
198 } |
175 } |
199 |
176 |
200 /** |
177 /** |
201 * Registers a ResourceResolverSpi class. This method logs a warning if |
178 * Registers a ResourceResolverSpi class. This method LOGs a warning if |
202 * the class cannot be registered. |
179 * the class cannot be registered. |
203 * |
180 * |
204 * @param className the name of the ResourceResolverSpi class to be registered |
181 * @param className the name of the ResourceResolverSpi class to be registered |
205 * @throws SecurityException if a security manager is installed and the |
182 * @throws SecurityException if a security manager is installed and the |
206 * caller does not have permission to register a resource resolver |
183 * caller does not have permission to register a resource resolver |
208 @SuppressWarnings("unchecked") |
185 @SuppressWarnings("unchecked") |
209 public static void register(String className) { |
186 public static void register(String className) { |
210 JavaUtils.checkRegisterPermission(); |
187 JavaUtils.checkRegisterPermission(); |
211 try { |
188 try { |
212 Class<ResourceResolverSpi> resourceResolverClass = |
189 Class<ResourceResolverSpi> resourceResolverClass = |
213 (Class<ResourceResolverSpi>) Class.forName(className); |
190 (Class<ResourceResolverSpi>) |
|
191 ClassLoaderUtils.loadClass(className, ResourceResolver.class); |
214 register(resourceResolverClass, false); |
192 register(resourceResolverClass, false); |
215 } catch (ClassNotFoundException e) { |
193 } catch (ClassNotFoundException e) { |
216 log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it"); |
194 LOG.warn("Error loading resolver " + className + " disabling it"); |
217 } |
195 } |
218 } |
196 } |
219 |
197 |
220 /** |
198 /** |
221 * Registers a ResourceResolverSpi class at the beginning of the provider |
199 * Registers a ResourceResolverSpi class at the beginning of the provider |
222 * list. This method logs a warning if the class cannot be registered. |
200 * list. This method LOGs a warning if the class cannot be registered. |
223 * |
201 * |
224 * @param className the name of the ResourceResolverSpi class to be registered |
202 * @param className the name of the ResourceResolverSpi class to be registered |
225 * @throws SecurityException if a security manager is installed and the |
203 * @throws SecurityException if a security manager is installed and the |
226 * caller does not have permission to register a resource resolver |
204 * caller does not have permission to register a resource resolver |
227 */ |
205 */ |
228 @SuppressWarnings("unchecked") |
206 @SuppressWarnings("unchecked") |
229 public static void registerAtStart(String className) { |
207 public static void registerAtStart(String className) { |
230 JavaUtils.checkRegisterPermission(); |
208 JavaUtils.checkRegisterPermission(); |
231 try { |
209 try { |
232 Class<ResourceResolverSpi> resourceResolverClass = |
210 Class<ResourceResolverSpi> resourceResolverClass = |
233 (Class<ResourceResolverSpi>) Class.forName(className); |
211 (Class<ResourceResolverSpi>) |
|
212 ClassLoaderUtils.loadClass(className, ResourceResolver.class); |
234 register(resourceResolverClass, true); |
213 register(resourceResolverClass, true); |
235 } catch (ClassNotFoundException e) { |
214 } catch (ClassNotFoundException e) { |
236 log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it"); |
215 LOG.warn("Error loading resolver " + className + " disabling it"); |
237 } |
216 } |
238 } |
217 } |
239 |
218 |
240 /** |
219 /** |
241 * Registers a ResourceResolverSpi class. This method logs a warning if the class |
220 * Registers a ResourceResolverSpi class. This method LOGs a warning if the class |
242 * cannot be registered. |
221 * cannot be registered. |
243 * @param className |
222 * @param className |
244 * @param start |
223 * @param start |
245 * @throws SecurityException if a security manager is installed and the |
224 * @throws SecurityException if a security manager is installed and the |
246 * caller does not have permission to register a resource resolver |
225 * caller does not have permission to register a resource resolver |
250 try { |
229 try { |
251 @SuppressWarnings("deprecation") |
230 @SuppressWarnings("deprecation") |
252 ResourceResolverSpi resourceResolverSpi = className.newInstance(); |
231 ResourceResolverSpi resourceResolverSpi = className.newInstance(); |
253 register(resourceResolverSpi, start); |
232 register(resourceResolverSpi, start); |
254 } catch (IllegalAccessException e) { |
233 } catch (IllegalAccessException e) { |
255 log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it"); |
234 LOG.warn("Error loading resolver " + className + " disabling it"); |
256 } catch (InstantiationException e) { |
235 } catch (InstantiationException e) { |
257 log.log(java.util.logging.Level.WARNING, "Error loading resolver " + className + " disabling it"); |
236 LOG.warn("Error loading resolver " + className + " disabling it"); |
258 } |
237 } |
259 } |
238 } |
260 |
239 |
261 /** |
240 /** |
262 * Registers a ResourceResolverSpi instance. This method logs a warning if the class |
241 * Registers a ResourceResolverSpi instance. This method LOGs a warning if the class |
263 * cannot be registered. |
242 * cannot be registered. |
264 * @param resourceResolverSpi |
243 * @param resourceResolverSpi |
265 * @param start |
244 * @param start |
266 * @throws SecurityException if a security manager is installed and the |
245 * @throws SecurityException if a security manager is installed and the |
267 * caller does not have permission to register a resource resolver |
246 * caller does not have permission to register a resource resolver |