All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ars.file.ftp.FTPQuery Maven / Gradle / Ivy

The newest version!
package ars.file.ftp;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.LinkedList;

import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFileFilter;

import ars.file.Describe;
import ars.file.query.Queries;
import ars.file.query.AbstractQuery;
import ars.file.query.Queries.Condition;

/**
 * FTP文件查询集合实现
 *
 * @author wuyongqiang
 */
public class FTPQuery extends AbstractQuery {
    protected final ClientFactory clientFactory;

    public FTPQuery(ClientFactory clientFactory) {
        this(clientFactory, "/");
    }

    public FTPQuery(ClientFactory clientFactory, String workingDirectory) {
        super(workingDirectory);
        if (clientFactory == null) {
            throw new IllegalArgumentException("ClientFactory must not be null");
        }
        this.clientFactory = clientFactory;
    }

    @Override
    protected List execute(final String path, final boolean spread, final Condition... conditions) {
        final List describes = new LinkedList();
        FTPClient client = null;
        try {
            client = this.clientFactory.connect();
            client.listFiles(path == null ? this.workingDirectory : new File(this.workingDirectory, path).getPath(),
                new FTPFileFilter() {

                    @Override
                    public boolean accept(FTPFile file) {
                        Describe describe = new Describe();
                        describe.setPath(new File(path, file.getName()).getPath());
                        describe.setName(file.getName());
                        describe.setSize(file.getSize());
                        describe.setModified(file.getTimestamp().getTime());
                        describe.setDirectory(file.isDirectory());
                        if (Queries.isSatisfy(describe, conditions)) {
                            describes.add(describe);
                        }
                        if (spread && describe.isDirectory()) {
                            describes.addAll(execute(describe.getPath(), spread, conditions));
                        }
                        return false;
                    }

                });
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (client != null) {
                try {
                    this.clientFactory.disconnect(client);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
        return describes;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy