    001    /* $Id: FinderFromFile.java 729125 2008-12-23 21:21:07Z rahul $
    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    import java.io.FileInputStream;
    024    import java.io.IOException;
    025
    026    import org.apache.commons.digester.Digester;
    027    import org.apache.commons.digester.plugins.RuleFinder;
    028    import org.apache.commons.digester.plugins.RuleLoader;
    029    import org.apache.commons.digester.plugins.PluginException;
    030
    031    /**
    032     * A rule-finding algorithm which expects the user to specify an absolute
    033     * or relative path in the plugin declaration.
    034     * <p>
    035     * The file is expected to contain Digester rules in xmlrules format.
    036     *
    037     * @since 1.6
    038     */
    039
    040    public class FinderFromFile extends RuleFinder {
    041        /**
    042         * Xml attribute that needs to be present on a plugin declaration
    043         * in order to specify the file to load rules from.
    044         */
    045        public static String DFLT_FILENAME_ATTR = "file";
    046
    047        /** See {@link #findLoader}. */
    048        private String filenameAttr;
    049
    050        /** See {@link #findLoader}. */
    051        public FinderFromFile() {
    052            this(DFLT_FILENAME_ATTR);
    053        }
    054
    055        /** See {@link #findLoader}. */
    056        public FinderFromFile(String filenameAttr) {
    057            this.filenameAttr = filenameAttr;
    058        }
    059
    060        /**
    061         * If there exists a property with the name specified in the constructor,
    062         * then load that file, run it through the xmlrules module and return an
    063         * object encapsulating those rules.
    064         * <p>
    065         * If there is no matching property provided, then just return null.
    066         * <p>
    067         * The returned object (when non-null) will add the selected rules to
    068         * the digester whenever its addRules method is invoked.
    069         */
    070        public RuleLoader findLoader(Digester d, Class<?> pluginClass, Properties p)
    071                            throws PluginException {
    072
    073            String rulesFileName = p.getProperty(filenameAttr);
    074            if (rulesFileName == null) {
    075                // nope, user hasn't requested dynamic rules to be loaded
    076                // from a specific file.
    077                return null;
    078            }
    079
    080            InputStream is = null;
    081            try {
    082                is = new FileInputStream(rulesFileName);
    083            } catch(IOException ioe) {
    084                throw new PluginException(
    085                    "Unable to process file [" + rulesFileName + "]", ioe);
    086            }
    087
    088            try {
    089                RuleLoader loader = new LoaderFromStream(is);
    090                return loader;
    091            } catch(Exception e) {
    092                throw new PluginException(
    093                    "Unable to load xmlrules from file [" +
    094                    rulesFileName + "]", e);
    095            } finally {
    096                try {
    097                    is.close();
    098                } catch(java.io.IOException ioe) {
    099                    throw new PluginException(
    100                        "Unable to close stream for file [" +
    101                        rulesFileName + "]", ioe);
    102                }
    103            }
    104        }
    105    }
    106