package download; import java.io.File; import java.util.ArrayList; import java.util.List; import javafx.concurrent.Task; import model.IliasFile; import model.IliasFolder; import model.IliasTreeNode; import model.persistance.Settings; import utils.DirectoryUtils; /** * This task recursively downloads the complete structure of all passed * {@link IliasFolder}s inside the {@linkplain #iliasTreeNodes list}. * * @author deoldsax * */ public class IliasFolderDownloaderTask extends Task<Void> { private List<IliasTreeNode> iliasTreeNodes; public IliasFolderDownloaderTask(List<IliasTreeNode> iliasTreeNodes) { this.iliasTreeNodes = iliasTreeNodes; } public IliasFolderDownloaderTask(IliasTreeNode iliasTreeNode) { this.iliasTreeNodes = new ArrayList<IliasTreeNode>(); iliasTreeNodes.add(iliasTreeNode); } @Override protected Void call() throws Exception { String localIliasFolderPath = Settings.getInstance().getIliasFolderSettings() .getLocalIliasFolderPath(); new Thread(new Downloader(iliasTreeNodes, localIliasFolderPath)).start(); return null; } private class Downloader implements Runnable { private List<IliasTreeNode> iliasTreeNodes; private String currentLevelDownloadPath; public Downloader(List<IliasTreeNode> iliasTreeNodes, String currentLevelDownloadPath) { this.iliasTreeNodes = iliasTreeNodes; this.currentLevelDownloadPath = currentLevelDownloadPath; } @Override public void run() { for (IliasTreeNode node : iliasTreeNodes) { if (node instanceof IliasFolder) { createFolder(node); String newDownloadPath = appendDownloadPath(node); new Thread( new Downloader(((IliasFolder) node).getChildNodes(), newDownloadPath)) .start(); } else if (node instanceof IliasFile) { downloadFile((IliasFile) node); } } } private void createFolder(IliasTreeNode node) { String newDownloadPath = appendDownloadPath(node); File file = new File(newDownloadPath); if (!file.exists()) { file.mkdir(); } } private void downloadFile(IliasFile node) { IliasFile file = node; String validName = DirectoryUtils.getInstance().makeDirectoryNameValid(file.getName()); String path = currentLevelDownloadPath + "/" + validName + "." + node.getExtension(); new Thread(new IliasFileDownloaderTask(file, path)).start(); } private String appendDownloadPath(IliasTreeNode node) { String validDirectoryString = DirectoryUtils.getInstance().makeDirectoryNameValid( node.getName()); String newDownloadPath = currentLevelDownloadPath + "/" + validDirectoryString; return newDownloadPath; } } }