# BinaryRelayBuilder.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.om.*;
    import org.apache.axiom.soap.SOAPEnvelope;
    import org.apache.axiom.soap.SOAPFactory;
    import org.apache.axiom.soap.SOAPProcessingException;
    import org.apache.axis2.AxisFault;
    import org.apache.axis2.Constants;
    import org.apache.axis2.builder.Builder;
    import org.apache.axis2.context.MessageContext;

    import javax.activation.DataHandler;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;

    public class BinaryRelayBuilder implements Builder{

    	public static byte[] readAllFromInputSteam(InputStream in) throws IOException{
    		ByteArrayOutputStream out = new ByteArrayOutputStream();
    		byte[] buf = new byte[1024];
    		int read = in.read(buf);

    		while(read != -1){
    			out.write(buf,0,read);
    			read = in.read(buf);
    		}
    		return out.toByteArray();
    	}

    	public OMElement processDocument(InputStream inputStream,
    			String contentType, MessageContext messageContext) throws AxisFault {
    		try {
                //Fix for https://wso2.org/jira/browse/CARBON-7256
                messageContext.setProperty(Constants.Configuration.CONTENT_TYPE, contentType);

    			//We will create a SOAP message, which holds the input message as a blob
    			SOAPFactory factory = OMAbstractFactory.getSOAP12Factory();
    			SOAPEnvelope env = factory.getDefaultEnvelope();
                if (inputStream != null) {
                    OMNamespace ns = factory.createOMNamespace(
                            RelayConstants.BINARY_CONTENT_QNAME.getNamespaceURI(), "ns");
                    OMElement omEle = factory.createOMElement(
                            RelayConstants.BINARY_CONTENT_QNAME.getLocalPart(), ns);

                    StreamingOnRequestDataSource ds = new StreamingOnRequestDataSource(inputStream);
                    DataHandler dataHandler = new DataHandler(ds);

                    //create an OMText node with the above DataHandler and set optimized to true
                    OMText textData = factory.createOMText(dataHandler, true);
                    omEle.addChild(textData);
                    env.getBody().addChild(omEle);
                }

    			return env;
    		} catch (SOAPProcessingException e) {
    			throw AxisFault.makeFault(e);
    		} catch (OMException e) {
    			throw AxisFault.makeFault(e);
    		}
    	}

    }