Package sample.mtom.filetransfer.client

Source Code of sample.mtom.filetransfer.client.MTOMClientModel

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* 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 sample.mtom.filetransfer.client;

import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Iterator;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.xml.namespace.QName;

import org.apache.axiom.attachments.Attachments;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMText;
import org.apache.axiom.soap.SOAP11Constants;
import org.apache.axiom.soap.SOAP12Constants;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.OperationClient;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.wsdl.WSDLConstants;


public class MTOMClientModel {
    private ArrayList fileList = null;

    private String cacheFolder;

    private int cacheThreshold;

    private EndpointReference targetEPR = new EndpointReference("http://localhost:8080/axis2/services/mtomSample");

    public MTOMClientModel() {

    }

    /**
     * @param cacheThreshold Threshold value in bytes
     */
    public void setCacheThreshold(int cacheThreshold) {
        this.cacheThreshold = cacheThreshold;
    }

    /**
     * @param cacheFolder Absolute path of the cache folder
     */
    public void setCacheFolder(String cacheFolder) {
        this.cacheFolder = cacheFolder;
    }

    /**
     * @param folderName Absolute path of the destination folder
     * @param operation  Name of the appropriate operation on the server
     * @return The payload
     * @throws Exception
     */
    private OMElement buildPayloadForMTOM(String folderName, String operation) throws Exception {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://localhost/my", "my");

        OMElement data = fac.createOMElement(operation, omNs);
        OMElement folder = fac.createOMElement("folderName", omNs);
        if (folderName != null) {
            folder.setText(folderName);
        }
        data.addChild(folder);

        OMElement files = fac.createOMElement("files", omNs);
        data.addChild(files);

        DataHandler dataHandler;

        for (int i = 0; i < fileList.size(); i++) {
            OMElement file = fac.createOMElement("file" + (i + 1), omNs);
            file.addAttribute(fac.createOMAttribute("type", omNs, ((File)fileList.get(i)).getName()));
            FileDataSource dataSource = new FileDataSource((File)fileList.get(i));
            dataHandler = new DataHandler(dataSource);
            OMText textData = fac.createOMText(dataHandler, true);
            file.addChild(textData);
            files.addChild(file);
        }
        return data;

    }

    /**
     * @param folderName Absolute path of the destination folder
     * @param operation  Name of the appropriate operation on the server
     * @return The message context
     * @throws Exception
     */
    private MessageContext createMessageContextForSwA(String folderName, String operation) throws Exception {

        MessageContext mc = new MessageContext();
        SOAPFactory fac = OMAbstractFactory.getSOAP11Factory();
        SOAPEnvelope soapEnvelope = fac.createSOAPEnvelope();

        OMNamespace omNs = fac.createOMNamespace("http://localhost/my", "my");
        OMElement data = fac.createOMElement(operation, omNs);
        OMElement folder = fac.createOMElement("folderName", omNs);
        if (folderName != null) {
            folder.setText(folderName);
        }
        data.addChild(folder);
        OMElement files = fac.createOMElement("files", omNs);
        data.addChild(files);

        DataHandler dataHandler;
        for (int i = 0; i < fileList.size(); i++) {
            OMElement file = fac.createOMElement("file" + (i + 1), omNs);
            file.addAttribute(fac.createOMAttribute("type", omNs,((File)fileList.get(i)).getName()));
            FileDataSource dataSource = new FileDataSource((File)fileList.get(i));
            dataHandler = new DataHandler(dataSource);
            String contentID = mc.addAttachment(dataHandler);

            file.setText(contentID);
            files.addChild(file);
        }
        SOAPBody body = fac.createSOAPBody(soapEnvelope);
        body.addChild(data);
        mc.setEnvelope(soapEnvelope);
        return mc;

    }

    /**
     * @param folderName Absolute path of the destination folder
     * @return The response from the server
     * @throws Exception
     */
    public OMElement sendFilesUsingSwA(String folderName) throws Exception {

        Options options = new Options();
        options.setTo(targetEPR);
        options.setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
        options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);

        ServiceClient sender = new ServiceClient(null, null);
        sender.setOptions(options);
        OperationClient mepClient = sender.createClient(ServiceClient.ANON_OUT_IN_OP);

        MessageContext mc = createMessageContextForSwA(folderName, "uploadFileUsingSwA");
        mepClient.addMessageContext(mc);
        mepClient.execute(true);
        MessageContext response = mepClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
        return (OMElement) (response.getEnvelope().getBody().getChildren().next());
    }

    /**
     * @param folderName Absolute path of the destination folder
     * @return The response from the server
     * @throws Exception
     */
    public OMElement sendFilesUsingMTOM(String folderName) throws Exception {

        OMElement payload = buildPayloadForMTOM(folderName, "uploadFileUsingMTOM");
        Options options = new Options();
        options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
        options.setTo(targetEPR);
        // enabling MTOM in the client side
        options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

        ServiceClient sender = new ServiceClient();
        sender.setOptions(options);
        return sender.sendReceive(payload);
    }

    public OMElement sendReceiveUsingMTOM(String folderName, boolean cacheEnable) throws Exception {
        OMElement payload = buildPayloadForMTOM(folderName, "sendReceiveUsingMTOM");
        Options options = new Options();
        options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
        options.setTo(targetEPR);

        // enabling MTOM in the client side
        options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

        // enabling file caching in the client side
        if (cacheEnable) {
            options.setProperty(Constants.Configuration.CACHE_ATTACHMENTS,
                    Constants.VALUE_TRUE);
            options.setProperty(Constants.Configuration.ATTACHMENT_TEMP_DIR, cacheFolder);
            options.setProperty(Constants.Configuration.FILE_SIZE_THRESHOLD, ("" + cacheThreshold));
        }
        ServiceClient sender = new ServiceClient();
        sender.setOptions(options);
        OMElement response = sender.sendReceive(payload);
        response.buildWithAttachments();
        return handleMTOMResponse(response);
    }

    public OMElement sendReceiveUsingSwA(String folderName, boolean cacheEnable) throws Exception {
        Options options = new Options();
        options.setTo(targetEPR);
        options.setProperty(Constants.Configuration.ENABLE_SWA, Constants.VALUE_TRUE);
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
        options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);

        // enabling file caching in the client side
        if (cacheEnable) {
            options.setProperty(Constants.Configuration.CACHE_ATTACHMENTS,
                    Constants.VALUE_TRUE);
            options.setProperty(Constants.Configuration.ATTACHMENT_TEMP_DIR, cacheFolder);
            options.setProperty(Constants.Configuration.FILE_SIZE_THRESHOLD, ("" + cacheThreshold));
        }

        ServiceClient sender = new ServiceClient(null, null);
        sender.setOptions(options);
        OperationClient mepClient = sender.createClient(ServiceClient.ANON_OUT_IN_OP);

        MessageContext mc = createMessageContextForSwA(folderName, "sendReceiveUsingSwA");
        mepClient.addMessageContext(mc);
        mepClient.execute(true);
        MessageContext response = mepClient.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
        return handleSwAResponse(response);

    }


    private OMElement handleMTOMResponse(OMElement element) throws Exception {
        OMElement folder;
        OMElement files;
        OMElement file;
        String folderName;

        Iterator itr = element.getChildElements();
        folder = (OMElement) itr.next();
        if (folder == null) throw new AxisFault("Destination Folder is null");
        folderName = folder.getText();
        File destFolder = new File(folderName);
        if (!destFolder.exists()) {
            destFolder.mkdirs();
        }

        files = (OMElement) itr.next();
        itr = files.getChildElements();

        int i = 1;
        String fileName = null;
        while (itr.hasNext()) {
            file = (OMElement) itr.next();
            if (file == null) throw new AxisFault("File " + i + " is null");
            OMText binaryNode = (OMText) file.getFirstOMChild();
            DataHandler dataHandler;
            dataHandler = (DataHandler) binaryNode.getDataHandler();
            fileName = createFileName(folderName, file, i);
            writeData(dataHandler.getDataSource().getInputStream(), fileName);
            i++;
        }
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace ns = fac.createOMNamespace("urn://fakenamespace", "ns");
        OMElement ele = fac.createOMElement("handledResponse", ns);
        ele.setText("" + (i - 1) + " Files(s) Saved Successfully on Client at " + folderName);
        return ele;
    }

    private OMElement handleSwAResponse(MessageContext mc) throws Exception {
        String folderName;
        OMElement folder;
        OMElement files;
        OMElement file;

        OMElement element = (OMElement) (mc.getEnvelope().getBody().getChildren().next());

        Iterator itr = element.getChildElements();
        folder = (OMElement) itr.next();
        if (folder == null) throw new AxisFault("Destination Folder is null");
        folderName = folder.getText();
        File destFolder = new File(folderName);
        if (!destFolder.exists()) {
            destFolder.mkdirs();
        }

        files = (OMElement) itr.next();
        itr = files.getChildElements();

        Attachments attachment = mc.getAttachmentMap();

        int i = 1;
        String fileName;
        DataHandler dataHandler;
        while (itr.hasNext()) {
            file = (OMElement) itr.next();
            if (file == null) throw new AxisFault("File " + i + " is null");
            dataHandler = attachment.getDataHandler(file.getText());
            fileName = createFileName(folderName, file, i);
            writeData(dataHandler.getDataSource().getInputStream(), fileName);
            i++;
        }
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace ns = fac.createOMNamespace("urn://fakenamespace", "ns");
        OMElement ele = fac.createOMElement("response", ns);
        ele.setText("" + (i - 1) + " File(s) Saved Successfully on Client at " + folderName);
        return ele;

    }


    /**
     * @param inStrm   An input stream linking to the data
     * @param fileName The absolute path of the file to which the data should be written
     * @throws Exception
     */
    private void writeData(InputStream inStrm, String fileName) throws Exception {
        RandomAccessFile raf = new RandomAccessFile(fileName, "rw");
        int b;
        while (true) {
            b = inStrm.read();
            if (b == -1) {
                break;
            }
            raf.writeByte(b);
        }
        inStrm.close();
        raf.close();
    }

    private String createFileName(String folderName, OMElement file, int count) {
        String fileName;
        fileName = folderName + "/" + file.getAttributeValue(
                new QName(file.getNamespace().getNamespaceURI(), "type"));

        if (new File(fileName).exists()) {
            fileName = folderName + "/copy(" + (count - 1) + ")" + file.getAttributeValue(
                    new QName(file.getNamespace().getNamespaceURI(), "type"));
            while (new File(fileName).exists()) {
                count ++;
                fileName = folderName + "/copy(" + (count - 1) + ")" + file.getAttributeValue(
                        new QName(file.getNamespace().getNamespaceURI(), "type"));
            }
        }

        return fileName;
    }


    public void setTargetEPR(String targetEPR) {
        this.targetEPR = new EndpointReference(targetEPR);

    }


    public void setFileList(ArrayList fileList) {
        this.fileList = fileList;
    }
}
TOP

Related Classes of sample.mtom.filetransfer.client.MTOMClientModel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.