package org.exist.xquery.modules.ftpclient; import java.io.IOException; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.exist.dom.QName; import org.exist.xquery.BasicFunction; import org.exist.xquery.Cardinality; import org.exist.xquery.FunctionSignature; import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.value.FunctionParameterSequenceType; import org.exist.xquery.value.FunctionReturnSequenceType; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceType; import org.exist.xquery.value.Type; import org.exist.xquery.value.BinaryValueFromInputStream; import org.exist.xquery.value.Base64BinaryValueType; import org.exist.xquery.value.IntegerValue; /** * * @author WStarcev * @author Adam Retter <adam@existsolutions.com> */ public class GetFileFunction extends BasicFunction { private static final FunctionParameterSequenceType CONNECTION_HANDLE_PARAM = new FunctionParameterSequenceType("connection-handle", Type.LONG, Cardinality.EXACTLY_ONE, "The connection handle"); private static final FunctionParameterSequenceType REMOTE_DIRECTORY_PARAM = new FunctionParameterSequenceType("remote-directory", Type.STRING, Cardinality.EXACTLY_ONE, "The remote directory"); private static final FunctionParameterSequenceType FILE_NAME_PARAM = new FunctionParameterSequenceType("file-name", Type.STRING, Cardinality.EXACTLY_ONE, "File name"); private static final Logger log = LogManager.getLogger(GetFileFunction.class); public final static FunctionSignature signature = new FunctionSignature( new QName("get-binary-file", FTPClientModule.NAMESPACE_URI, FTPClientModule.PREFIX), "Get binary file from the FTP Server.", new SequenceType[] { CONNECTION_HANDLE_PARAM, REMOTE_DIRECTORY_PARAM, FILE_NAME_PARAM }, new FunctionReturnSequenceType(Type.BASE64_BINARY, Cardinality.ZERO_OR_ONE, "File retrieved from the server.") ); public GetFileFunction(XQueryContext context){ super(context, signature); } @Override public Sequence eval(Sequence[] args, Sequence contextSequence) throws XPathException { Sequence result = Sequence.EMPTY_SEQUENCE; long connectionUID = ((IntegerValue)args[0].itemAt(0)).getLong(); FTPClient ftp = FTPClientModule.retrieveConnection(context, connectionUID); if(ftp != null) { String remoteDirectory = args[1].getStringValue(); String fileName = args[2].getStringValue(); result = getBinaryFile(ftp, remoteDirectory, fileName); } return result; } private Sequence getBinaryFile(FTPClient ftp, String remoteDirectory, String fileName) throws XPathException { Sequence result = Sequence.EMPTY_SEQUENCE; try { ftp.changeWorkingDirectory(remoteDirectory); ftp.setFileType(FTP.BINARY_FILE_TYPE); result = BinaryValueFromInputStream.getInstance(context, new Base64BinaryValueType(), ftp.retrieveFileStream(fileName)); } catch(IOException ioe) { log.error(ioe.getMessage(), ioe); } return result; } }