class DownloadTransfer extends Transfer {

    @Override
    public List<TransferItem> list(final Session<?> session, final Path directory,
                                   final Local local, final ListProgressListener listener) throws BackgroundException {
        if(log.isDebugEnabled()) {
            log.debug(String.format("List children for %s", directory));
        }
        if(directory.isSymbolicLink()
            && new DownloadSymlinkResolver(roots).resolve(directory)) {
            if(log.isDebugEnabled()) {
                log.debug(String.format("Do not list children for symbolic link %s", directory));
            }
            return Collections.emptyList();
        }
        else {
            final AttributedList<Path> list;
            if(cache.isCached(directory)) {
                list = cache.get(directory);
            }
            else {
                list = session.getFeature(ListService.class).list(directory, listener);
                cache.put(directory, list);
            }
            final List<TransferItem> children = new ArrayList<TransferItem>();
            // Return copy with filtered result only
            for(Path f : new AttributedList<Path>(list.filter(comparator, filter))) {
                children.add(new TransferItem(f, LocalFactory.get(local, f.getName())));
            }
            return children;
        }
    }

    public  DownloadTransfer(final Host host, final Path root, final Local local);
    public  DownloadTransfer(final Host host, final Path root, final Local local, final Filter<Path> f);
    public  DownloadTransfer(final Host host, final List<TransferItem> roots);
    public  DownloadTransfer(final Host host, final List<TransferItem> roots, final Filter<Path> f);
    public  DownloadTransfer(final Host host, final List<TransferItem> roots, final Filter<Path> f, final Comparator<Path> comparator);

}