import org.apache.axis2.Constants;
import org.apache.axis2.addressing.AddressingConstants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.attachments.ImageDataSource;
import org.apache.axis2.attachments.JDK13IO;
import org.apache.axis2.clientapi.Call;
import org.apache.axis2.om.OMAbstractFactory;
import org.apache.axis2.om.OMElement;
import org.apache.axis2.om.OMFactory;
import org.apache.axis2.om.OMNamespace;
import org.apache.axis2.om.OMText;

import javax.activation.DataHandler;
import javax.xml.namespace.QName;
import java.awt.*;
import java.io.File;
import java.io.FileInputStream;

public class StockService {
    private File inputFile = null;
    private EndpointReference targetEPR = new EndpointReference(AddressingConstants.WSA_TO,
            "http://localhost/StockService/Part3/After/StockService.asmx");
    private QName operationName = new QName("echoAttachment");

    public static void main(String[] args) throws Exception {
        StockService service = new StockService();
        service.setInputFile(new File("gears.gif"));
        service.testEchoXMLSync("gears.gif");
    }

    public void setTargetEPR(String targetEPR) {
        this.targetEPR = new EndpointReference(AddressingConstants.WSA_TO,
                targetEPR);
    }

    public void setInputFile(File inputFile) {
        this.inputFile = inputFile;
    }

    private OMElement createEnvelope(String fileName) throws Exception {
        DataHandler expectedDH;
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://stockservice.contoso.com/wse/samples", "");
        OMElement data = fac.createOMElement("echoAttachment", omNs);
        OMElement image = fac.createOMElement("bytes", omNs);
        Image expectedImage;
        expectedImage = new JDK13IO()
                .loadImage(new FileInputStream(inputFile));
        ImageDataSource dataSource = new ImageDataSource("gears.gif",
                expectedImage);
        expectedDH = new DataHandler(dataSource);
        OMText textData = fac.createText(expectedDH, true);
        image.addChild(textData);
        data.addChild(image);
        return data;
    }

    public OMElement testEchoXMLSync(String fileName) throws Exception {
        OMElement payload = createEnvelope(fileName);
        Call call = new Call();
        call.setTo(targetEPR);
        call.setSoapAction("http://stockservice.contoso.com/wse/samples/echoAttachment");
        call.set(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
        call.setTransportInfo(Constants.TRANSPORT_COMMONS_HTTP, Constants.TRANSPORT_HTTP, false);

        // enabling MTOM in the client side
        OMElement result = (OMElement) call.invokeBlocking(operationName
                .getLocalPart(), payload);
        return result;
    }
}