    001    /* $Id: LoaderFromStream.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.io.InputStream;
    022    import java.io.ByteArrayInputStream;
    023    import java.io.ByteArrayOutputStream;
    024    import java.io.IOException;
    025    import org.xml.sax.InputSource;
    026
    027    import org.apache.commons.digester.Digester;
    028    import org.apache.commons.digester.plugins.RuleLoader;
    029    import org.apache.commons.digester.plugins.PluginException;
    030    import org.apache.commons.digester.xmlrules.FromXmlRuleSet;
    031    import org.apache.commons.logging.Log;
    032
    033    /**
    034     * A rule-finding algorithm which loads an xmlplugins-format file.
    035     * <p>
    036     * Note that the "include" feature of xmlrules is not supported.
    037     *
    038     * @since 1.6
    039     */
    040
    041    public class LoaderFromStream extends RuleLoader {
    042
    043        private byte[] input;
    044        private FromXmlRuleSet ruleSet;
    045
    046        /** See {@link #load}. */
    047        public LoaderFromStream(InputStream s) throws Exception {
    048            load(s);
    049        }
    050
    051        /**
    052         * The contents of the input stream are loaded into memory, and
    053         * cached for later use.
    054         * <p>
    055         * The caller is responsible for closing the input stream after this
    056         * method has returned.
    057         */
    058        private void load(InputStream s) throws IOException {
    059            ByteArrayOutputStream baos = new ByteArrayOutputStream();
    060            byte[] buf = new byte[256];
    061            for(;;) {
    062                int i = s.read(buf);
    063                if (i == -1)
    064                    break;
    065                baos.write(buf, 0, i);
    066            }
    067            input = baos.toByteArray();
    068        }
    069
    070        /**
    071         * Add the rules previously loaded from the input stream into the
    072         * specified digester.
    073         */
    074        public void addRules(Digester d, String path) throws PluginException {
    075            Log log = d.getLogger();
    076            boolean debug = log.isDebugEnabled();
    077            if (debug) {
    078                log.debug(
    079                    "LoaderFromStream: loading rules for plugin at path ["
    080                    + path + "]");
    081            }
    082
    083            // Note that this input-source doesn't have any idea of its
    084            // system id, so it has no way of resolving relative URLs
    085            // such as the "include" feature of xmlrules. This is ok,
    086            // because that doesn't work well with our approach of
    087            // caching the input data in memory anyway.
    088
    089            InputSource source = new InputSource(new ByteArrayInputStream(input));
    090            FromXmlRuleSet ruleSet = new FromXmlRuleSet(source);
    091            ruleSet.addRuleInstances(d, path);
    092        }
    093    }
    094