001    /** 
002     * 
003     * Copyright 2004 Hiram Chirino
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.activemq.util;
019    
020    import java.io.ByteArrayInputStream;
021    import java.io.FilterInputStream;
022    import java.io.InputStream;
023    import java.lang.reflect.Constructor;
024    
025    /**
026     * This provides InputStream that delegates to com.sleepycat.util.FastInputStream 
027     * if it is available and if it is not it delegates to java.io.ByteArrayInputStream.
028     * 
029     * This class allows ActiveMQ to not be dependent on the bdb lib.  It might 
030     * be worth it to just fully implement a FastInputStream ourselfs.  I think
031     * it's just a ByteArrayInputStream what is not thread safe.
032     * 
033     * @version $Revision: 1.1.1.1 $
034     */
035    public class FastInputStream extends FilterInputStream {
036    
037            public FastInputStream(byte data[]) {
038                    super(createInputStream(data));
039            }
040    
041            /**
042             * @return
043             */
044            private static InputStream createInputStream(byte data[]) {
045                    try {
046                            Class c = FastInputStream.class.getClassLoader().loadClass("com.sleepycat.util.FastInputStream");
047                            Constructor constructor = c.getConstructor(new Class[]{byte[].class});
048                            return (InputStream)constructor.newInstance(new Object[]{data});
049                    } catch (Throwable e) {
050                            return new ByteArrayInputStream(data); 
051                    }
052            }
053    
054    }