001: /* $Id: FinderFromResource.java 471661 2006-11-06 08:09:25Z skitching $
002: *
003: * Licensed to the Apache Software Foundation (ASF) under one or more
004: * contributor license agreements. See the NOTICE file distributed with
005: * this work for additional information regarding copyright ownership.
006: * The ASF licenses this file to You under the Apache License, Version 2.0
007: * (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: */
018:
019: package org.apache.commons.digester.plugins.strategies;
020:
021: import java.util.Properties;
022: import java.io.InputStream;
023:
024: import org.apache.commons.digester.Digester;
025: import org.apache.commons.digester.plugins.RuleFinder;
026: import org.apache.commons.digester.plugins.RuleLoader;
027: import org.apache.commons.digester.plugins.PluginException;
028:
029: /**
030: * A rule-finding algorithm which expects the user to specify a resource
031: * name (ie a file in the classpath). The file is expected to contain Digester
032: * rules in xmlrules format.
033: *
034: * @since 1.6
035: */
036:
037: public class FinderFromResource extends RuleFinder {
038: /**
039: * Name of xml attribute on the plugin declaration which is used
040: * to configure rule-loading for that declaration.
041: */
042: public static String DFLT_RESOURCE_ATTR = "resource";
043:
044: /** See {@link #findLoader}. */
045: private String resourceAttr;
046:
047: /** Constructor. */
048: public FinderFromResource() {
049: this (DFLT_RESOURCE_ATTR);
050: }
051:
052: /** See {@link #findLoader}. */
053: public FinderFromResource(String resourceAttr) {
054: this .resourceAttr = resourceAttr;
055: }
056:
057: /**
058: * If there exists a property with the name matching constructor param
059: * resourceAttr, then load that file, run it through the xmlrules
060: * module and return an object encapsulating those rules.
061: * <p>
062: * If there is no matching property provided, then just return null.
063: * <p>
064: * The returned object (when non-null) will add the selected rules to
065: * the digester whenever its addRules method is invoked.
066: */
067: public RuleLoader findLoader(Digester d, Class pluginClass,
068: Properties p) throws PluginException {
069:
070: String resourceName = p.getProperty(resourceAttr);
071: if (resourceName == null) {
072: // nope, user hasn't requested dynamic rules to be loaded
073: // from a specific file.
074: return null;
075: }
076:
077: InputStream is = pluginClass.getClassLoader()
078: .getResourceAsStream(resourceName);
079:
080: if (is == null) {
081: throw new PluginException("Resource " + resourceName
082: + " not found.");
083: }
084:
085: return loadRules(d, pluginClass, is, resourceName);
086: }
087:
088: /**
089: * Open the specified resource file (ie a file in the classpath,
090: * including being within a jar in the classpath), run it through
091: * the xmlrules module and return an object encapsulating those rules.
092: *
093: * @param d is the digester into which rules will eventually be loaded.
094: * @param pluginClass is the class whose xml params the rules are parsing.
095: * @param is is where the xmlrules will be read from, and must be non-null.
096: * @param resourceName is a string describing the source of the xmlrules,
097: * for use in generating error messages.
098: */
099: public static RuleLoader loadRules(Digester d, Class pluginClass,
100: InputStream is, String resourceName) throws PluginException {
101:
102: try {
103: RuleLoader loader = new LoaderFromStream(is);
104: return loader;
105: } catch (Exception e) {
106: throw new PluginException(
107: "Unable to load xmlrules from resource ["
108: + resourceName + "]", e);
109: } finally {
110: try {
111: is.close();
112: } catch (java.io.IOException ioe) {
113: throw new PluginException(
114: "Unable to close stream for resource ["
115: + resourceName + "]", ioe);
116: }
117: }
118: }
119: }
|