X-Git-Url: http://git.sourceforge.jp/view?p=coroid%2Finqubus.git;a=blobdiff_plain;f=frontend%2Fsrc%2Fyukihane%2Finqubus%2Fmanager%2FTaskManage.java;h=67c219bfffbeaff01789330553c14b63ea2f011e;hp=35a719ed5177749b39f89da650b7cde30eb4b961;hb=298a3a720e02728806333350c85cf4dc9e0e13b1;hpb=933745f16080b24e20889dd934b29af9d696070d diff --git a/frontend/src/yukihane/inqubus/manager/TaskManage.java b/frontend/src/yukihane/inqubus/manager/TaskManage.java index 35a719e..67c219b 100644 --- a/frontend/src/yukihane/inqubus/manager/TaskManage.java +++ b/frontend/src/yukihane/inqubus/manager/TaskManage.java @@ -1,5 +1,6 @@ package yukihane.inqubus.manager; +import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; @@ -8,12 +9,14 @@ import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import saccubus.worker.WorkerListener; -import saccubus.worker.convert.Convert; -import saccubus.worker.convert.ConvertProgress; -import saccubus.worker.convert.ConvertResult; -import saccubus.worker.download.Download; -import saccubus.worker.download.DownloadProgress; -import saccubus.worker.download.DownloadResult; +import saccubus.worker.impl.MessageReportable; +import saccubus.worker.impl.PercentageReportable; +import saccubus.worker.impl.convert.Convert; +import saccubus.worker.impl.convert.ConvertProgress; +import saccubus.worker.impl.convert.ConvertResult; +import saccubus.worker.impl.download.Download; +import saccubus.worker.impl.download.DownloadProgress; +import saccubus.worker.impl.download.DownloadResult; import saccubus.worker.profile.ConvertProfile; import saccubus.worker.profile.DownloadProfile; @@ -22,24 +25,27 @@ import saccubus.worker.profile.DownloadProfile; * @author yuki */ public class TaskManage { + private static final Logger logger = Logger.getLogger(TaskManage.class.getName()); private final ExecutorService downloadExecutorService; private final ExecutorService convertExecutorService; private final Map> downloadTargets = new HashMap<>(); private final Map> convertTargets = new HashMap<>(); private final TaskManageListener clientListener; + private final int waitDownload; public TaskManage() { - this(1, 1, null); + this(1, 30, 1, null); } public TaskManage(int maxDownload, int maxConvert) { - this(maxDownload, maxConvert, null); + this(maxDownload, 30, maxConvert, null); } - public TaskManage(int maxDownload, int maxConvert, TaskManageListener listener) { + public TaskManage(int maxDownload, int waitDownload, int maxConvert, TaskManageListener listener) { downloadExecutorService = Executors.newFixedThreadPool(maxDownload); convertExecutorService = Executors.newFixedThreadPool(maxConvert); + this.waitDownload = waitDownload; this.clientListener = listener; } @@ -49,7 +55,7 @@ public class TaskManage { if (dp != null && (dp.getVideoProfile().isDownload() || dp.getCommentProfile().isDownload())) { // ダウンロードするものがあればまずダウンロード処理 final Download task = new Download(dp, request.getVideoId(), - new DownloadListener(request.getRowId())); + new DownloadListener(request.getRowId()), waitDownload); final Future future = downloadExecutorService.submit(task); downloadTargets.put(request.getRowId(), new ManageTarget<>(request, future)); return true; @@ -64,6 +70,20 @@ public class TaskManage { return false; } + public synchronized boolean cancel(int rowId) { + // FIXME 実行前にキャンセルした場合にはcancelledイベントが飛ばないのでMapからリクエストを削除できない + final ManageTarget down = downloadTargets.get(rowId); + if (down != null) { + return down.getFuture().cancel(true); + } + final ManageTarget conv = convertTargets.get(rowId); + if (conv != null) { + return conv.getFuture().cancel(true); + } + + return false; + } + private class DownloadListener extends TaskManageInnerListener { private DownloadListener(int rowId) { @@ -73,13 +93,34 @@ public class TaskManage { @Override public void done(DownloadResult result) { super.done(result); - // TODO 変換が必要なら変換キューに入れる + synchronized (TaskManage.this) { + final ManageTarget mt = removeRequest(getRowId()); + final RequestProcess request = mt.getRequest(); + if (request.getConvertProfile().isConvert()) { + final DownloadProfile dp = request.getDownloadProfile(); + final File video = (dp.getVideoProfile().isDownload()) ? result.getDownloadVideo() : dp. + getVideoProfile().getLocalFile(); + final File comment = (dp.getCommentProfile().isDownload()) ? result.getDownloadComment() : dp. + getCommentProfile().getLocalFile(); + final ConvertProfile cp = request.getConvertProfile(); + final Convert task = new Convert(cp, video, comment, new ConvertListener(getRowId())); + final Future future = convertExecutorService.submit(task); + convertTargets.put(request.getRowId(), new ManageTarget<>(request, future)); + } + // TODO 変換が必要なら変換キューに入れる + } + } @Override protected TaskKind getKind() { return TaskKind.DOWNLOAD; } + + @Override + protected ManageTarget removeRequest(int rowId) { + return downloadTargets.remove(rowId); + } } private class ConvertListener extends TaskManageInnerListener { @@ -92,9 +133,22 @@ public class TaskManage { protected TaskKind getKind() { return TaskKind.CONVERT; } + + @Override + public void done(ConvertResult result) { + super.done(result); + synchronized (TaskManage.this) { + removeRequest(getRowId()); + } + } + + @Override + protected ManageTarget removeRequest(int rowId) { + return convertTargets.remove(rowId); + } } - abstract class TaskManageInnerListener implements WorkerListener { + abstract class TaskManageInnerListener implements WorkerListener { private final int rowId; @@ -102,8 +156,12 @@ public class TaskManage { this.rowId = rowId; } + protected int getRowId() { + return rowId; + } + private void notify(TaskStatus status) { - notify(status, 0.0, ""); + notify(status, -1.0, ""); } private void notify(TaskStatus status, double percentage, String message) { @@ -122,16 +180,22 @@ public class TaskManage { @Override public void process(V progress) { logger.log(Level.FINEST, "process: {0}", progress); - // TOOD - notify(TaskStatus.DOING, 0.0, ""); + notify(TaskStatus.DOING, progress.getPercentage(), progress.getMessage()); } @Override - public void cancelled() { + public final void cancelled() { logger.log(Level.FINE, "cancelled: {0}", toString()); + synchronized (TaskManage.this) { + removeRequest(rowId); + } notify(TaskStatus.CANCELLED); } + /** + * この処理をオーバライドしてキューからリクエストを削除する必要があります. + * @param result 処理結果. + */ @Override public void done(T result) { logger.log(Level.FINE, "done: {0}", result); @@ -139,10 +203,15 @@ public class TaskManage { } @Override - public void error(Throwable th) { + public final void error(Throwable th) { logger.log(Level.SEVERE, "error", th); + synchronized (TaskManage.this) { + removeRequest(rowId); + } notify(TaskStatus.ERROR, 0.0, th.getMessage()); } + + protected abstract ManageTarget removeRequest(int rowId); } class ManageTarget {