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