Hi ,

I have implemented a method to support FTP Over proxy in file connector
version 2, I used Java Client [1](commons-net 3.4) and configured "Squid"
proxy[2].

I am getting the following errors when I invoke a method.

[2016-03-02 10:56:19,535] ERROR - FileFtpOverProxy Error occurred while
uploading:Connection is not open
java.io.IOException: Connection is not open
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:474)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:608)
at org.apache.commons.net.ftp.FTP.user(FTP.java:753)
at org.apache.commons.net.ftp.FTPClient.login(FTPClient.java:1034)
at
org.wso2.carbon.connector.FileFtpOverProxy.ftpOverHttp(FileFtpOverProxy.java:151)
at
org.wso2.carbon.connector.FileFtpOverProxy.connect(FileFtpOverProxy.java:47)
at
org.wso2.carbon.connector.core.AbstractConnector.mediate(AbstractConnector.java:32)
at
org.apache.synapse.mediators.ext.ClassMediator.mediate(ClassMediator.java:78)
at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
at
org.apache.synapse.mediators.template.TemplateMediator.mediate(TemplateMediator.java:97)
at
org.apache.synapse.mediators.template.InvokeMediator.mediate(InvokeMediator.java:129)
at
org.apache.synapse.mediators.template.InvokeMediator.mediate(InvokeMediator.java:78)
at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81)
at
org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48)
at
org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:149)
at
org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:185)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at
org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:317)
at
org.apache.synapse.transport.passthru.ServerWorker.processEntityEnclosingRequest(ServerWorker.java:363)
at
org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:142)
at
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

I have attached a FileFtpOverProxy.java here.

[1] https://commons.apache.org/proper/commons-net/
[2] http://www.tecmint.com/configure-squid-server-in-linux/






*Thank youVivekananthan SivanayagamAssociate Software Engineer |
WSO2E:[email protected] <e%[email protected]>M:+94752786138
<%2B94752786138>*
package org.wso2.carbon.connector;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.ftp.FTPHTTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.synapse.MessageContext;
import org.apache.synapse.commons.json.JsonUtil;
import org.codehaus.jettison.json.JSONException;
import org.wso2.carbon.connector.core.AbstractConnector;
import org.wso2.carbon.connector.core.Connector;
import org.wso2.carbon.connector.core.util.ConnectorUtils;
import org.wso2.carbon.connector.util.FileConstants;
import org.wso2.carbon.connector.util.ResultPayloadCreate;

import javax.xml.stream.XMLStreamException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileFtpOverProxy extends AbstractConnector implements Connector {
    private static final Log log = LogFactory.getLog(FileFtpOverProxy.class);

    public void connect(MessageContext messageContext) {
        String proxyHost = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.PROXY_HOST);
        String proxyPort = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.PROXY_PORT);
        String proxyUsername = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.PROXY_USERNAME);
        String proxyPassword = (String) ConnectorUtils.lookupTemplateParamater
                (messageContext, FileConstants.PROXY_PASSWORD);
        String ftpServer = (String) ConnectorUtils.lookupTemplateParamater
                (messageContext, FileConstants.FTP_SERVER);
        String ftpPort = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.FTP_PORT);
        String ftpUsername = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.FTP_USERNAME);
        String ftpPassword = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.FTP_PASSWORD);

        boolean resultStatus = ftpOverHttp(proxyHost, proxyPort, proxyUsername, proxyPassword,
                ftpServer, ftpPort, ftpUsername, ftpPassword, messageContext);
        generateResult(messageContext, resultStatus);
    }

    /**
     * Generate the result
     *
     * @param messageContext The message context that is generated for processing the file
     * @param resultStatus   true/false
     */
    private void generateResult(MessageContext messageContext, boolean resultStatus) {
        ResultPayloadCreate resultPayload = new ResultPayloadCreate();
        String response = FileConstants.START_TAG + resultStatus + FileConstants.END_TAG;
        OMElement element;
        try {
            element = resultPayload.performSearchMessages(response);
            resultPayload.preparePayload(messageContext, element);
        } catch (XMLStreamException e) {
            handleException(e.getMessage(), e, messageContext);
        } catch (IOException e) {
            handleException(e.getMessage(), e, messageContext);
        } catch (JSONException e) {
            handleException(e.getMessage(), e, messageContext);
        }
    }

    public boolean ftpOverHttp(String proxyHost, String proxyPort, String proxyUsername, String proxyPassword,
                               String ftpServer, String ftpPort, String ftpUsername, String ftpPassword, MessageContext messageContext) {
        String keepAliveTimeout = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.KEEP_ALIVE_TIMEOUT);
        String controlKeepAliveReplyTimeout = (String) ConnectorUtils.lookupTemplateParamater
                (messageContext, FileConstants.CONTROL_KEEP_ALIVE_REPLY_TIMEOUT);
        String contentType = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.CONTENT_TYPE);
        String targetPath = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.TARGET_PATH);
        String targetFile = (String) ConnectorUtils.lookupTemplateParamater(messageContext,
                FileConstants.TARGET_FILE);

        boolean binaryTransfer = false, hidden = false,
                localActive = false;

        boolean resultStatus = false;

        final FTPClient ftp;
        if (StringUtils.isNotEmpty(proxyHost) && StringUtils.isNotEmpty(proxyPort) && StringUtils
                .isNotEmpty(proxyUsername) && StringUtils.isNotEmpty(proxyPassword)) {
            proxyHost = proxyHost.trim();
            proxyPort = proxyPort.trim();
            proxyUsername = proxyUsername.trim();
            proxyPassword = proxyPassword.trim();
            ftp = new FTPHTTPClient(proxyHost, Integer.parseInt(proxyPort), proxyUsername, proxyPassword);
        } else {
            ftp = new FTPClient();
        }
        //Set the time to wait between sending control connection keep alive messages when
        // processing file upload or download.
        keepAliveTimeout = keepAliveTimeout.trim();
        if (StringUtils.isNotEmpty(keepAliveTimeout)) {
            keepAliveTimeout = keepAliveTimeout.trim();
            ftp.setControlKeepAliveTimeout(Long.parseLong(keepAliveTimeout));
        }
        //Set how long to wait for control keep-alive message replies.
        if (StringUtils.isNotEmpty(controlKeepAliveReplyTimeout)) {
            controlKeepAliveReplyTimeout = controlKeepAliveReplyTimeout.trim();
            ftp.setControlKeepAliveReplyTimeout(Integer.parseInt(controlKeepAliveReplyTimeout));
        }
        try {
            int reply;
            ftpPort = ftpPort.trim();
            int IntFtpPort = Integer.parseInt(ftpPort);
            if (IntFtpPort > 0) {
                ftp.connect(ftpServer, IntFtpPort);
            } else {
                ftpServer = ftpServer.trim();
                ftp.connect(ftpServer);
            }
            if (log.isDebugEnabled()) {
                log.debug(" Connected to " + ftpServer + " on " + (IntFtpPort > 0 ? ftpPort : ftp.getDefaultPort()));
            }

            // After connection attempt, should check the reply code to verify success.
            reply = ftp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                log.error("FTP ftpServer refused connection.");
            }
            resultStatus = true;
        } catch (IOException e) {
            handleException("Could not connect to FTP ftpServer: " + e.getMessage(), e, messageContext);
            /*log.error("Could not connect to FTP ftpServer: " + e.getMessage(), e);*/
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException f) {
                    // do nothing
                }
            }
        }
        InputStream inputStream = null;
        try {
            if (!ftp.login(ftpUsername, ftpPassword)) {
                ftp.logout();
                resultStatus = false;
                log.error("Error while login ftp server.");
            } else {
                // log.info("Remote system is " + ftp.getSystemType());
                if (binaryTransfer) {
                    ftp.setFileType(FTP.BINARY_FILE_TYPE);
                } else {
                    // in theory this should not be necessary as servers should
                    // default to ASCII

                    // but they don't all do so - see NET-500
                    ftp.setFileType(FTP.ASCII_FILE_TYPE);
                }
                // Use passive mode as default because most of us are
                // behind firewalls these days.
                if (localActive) {
                    ftp.enterLocalActiveMode();
                } else {
                    ftp.enterLocalPassiveMode();
                }

                String filePath = "/home/vives/Desktop/file/copyPattern/companyhouse.xml/";
                OMElement documentElement = new StAXOMBuilder(filePath).getDocumentElement();

                if (contentType.equals("application/json")) {
                    //inputStream = JsonUtil.toJsonStream(messageContext.getEnvelope().getBody().getFirstElement());
                    inputStream = JsonUtil.toJsonStream(documentElement);
                } else {
                    //inputStream = new ByteArrayInputStream(messageContext.getEnvelope().getBody().getFirstElement().toString().getBytes());
                    inputStream = new ByteArrayInputStream(documentElement.toString().getBytes());
                }
                if (StringUtils.isNotEmpty(targetPath)) {
                    ftp.changeWorkingDirectory(targetPath);
                    ftp.storeFile(targetFile, inputStream);
                    if (log.isDebugEnabled()) {
                        log.debug("Successfully FTPed the File");
                    }
                }
                ftp.noop(); // check that control connection is working OK
                ftp.logout();
            }
        } catch (FTPConnectionClosedException e) {
            log.error("Server closed connection " + e.getMessage(), e);
        } catch (IOException e) {
            log.error("Error occurred while uploading:" + e.getMessage(), e);
        } catch (XMLStreamException e) {
            log.error(" log.error(\"\");\n");
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException f) {
                    // do nothing
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException f) {
                    // do nothing
                }
            }
        }
        return resultStatus;
    }
}
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to