# StreamingOnRequestDataSource.java

    /*
     * Copyright 2005,2006 WSO2, Inc. http://www.wso2.org
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    package org.apache.synapse.transport.passthru.util;

    import org.apache.axiom.attachments.ByteArrayDataSource;

    import javax.activation.DataSource;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    /**
     * This class has a special flag, which says this is it's last use and not to cache data
     * if it did not have done so already.
     *
     * @author Srinath Perera (srinath@wso2.com)
     */

    public class StreamingOnRequestDataSource implements DataSource {
        private InputStream in;

        public StreamingOnRequestDataSource(InputStream in) {
            super();
            this.in = in;
        }

        private boolean lastUse = false;

        private ByteArrayDataSource cachedData = null;

        public String getContentType() {
            return "application/octet-stream";
        }

        public InputStream getInputStream() throws IOException {
            if (cachedData != null) {
                return cachedData.getInputStream();
            } else {
                if (lastUse && in != null) {
                    InputStream returnStram = in;
                    this.in = null;
                    return returnStram;
                } else if (in != null) {
                    byte[] data = BinaryRelayBuilder.readAllFromInputSteam(in);
                    cachedData = new ByteArrayDataSource(data);
                    return cachedData.getInputStream();
                } else {
                    throw new IOException("Input stream has been already consumed");
                }
            }
        }

        public String getName() {
            return "StreamingOnRequestDataSource";
        }

        public OutputStream getOutputStream() throws IOException {
            throw new UnsupportedOperationException();
        }

        /**
         * This flag says that this is the last use of the stream, hence do not
         * need to cache it if it has not
         * already cached.
         *
         * @param lastUse
         */
        public void setLastUse(boolean lastUse) {
            this.lastUse = lastUse;
    	}
    }