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