OSDN Git Service

キャンセル要求が成功した場合は一旦キャンセル表示を行う(cancelledイベントが飛ばない場合があるので)
[coroid/inqubus.git] / frontend / src / yukihane / inqubus / manager / TaskManage.java
index c517e05..67c219b 100644 (file)
@@ -32,18 +32,20 @@ public class TaskManage {
     private final Map<Integer, ManageTarget<DownloadResult>> downloadTargets = new HashMap<>();
     private final Map<Integer, ManageTarget<ConvertResult>> 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;
     }
 
@@ -53,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<DownloadResult> future = downloadExecutorService.submit(task);
             downloadTargets.put(request.getRowId(), new ManageTarget<>(request, future));
             return true;
@@ -68,6 +70,20 @@ public class TaskManage {
         return false;
     }
 
+    public synchronized boolean cancel(int rowId) {
+        // FIXME 実行前にキャンセルした場合にはcancelledイベントが飛ばないのでMapからリクエストを削除できない
+        final ManageTarget<DownloadResult> down = downloadTargets.get(rowId);
+        if (down != null) {
+            return down.getFuture().cancel(true);
+        }
+        final ManageTarget<ConvertResult> conv = convertTargets.get(rowId);
+        if (conv != null) {
+            return conv.getFuture().cancel(true);
+        }
+
+        return false;
+    }
+
     private class DownloadListener extends TaskManageInnerListener<DownloadResult, DownloadProgress> {
 
         private DownloadListener(int rowId) {
@@ -78,7 +94,7 @@ public class TaskManage {
         public void done(DownloadResult result) {
             super.done(result);
             synchronized (TaskManage.this) {
-                final ManageTarget<DownloadResult> mt = downloadTargets.remove(Integer.valueOf(getRowId()));
+                final ManageTarget<DownloadResult> mt = removeRequest(getRowId());
                 final RequestProcess request = mt.getRequest();
                 if (request.getConvertProfile().isConvert()) {
                     final DownloadProfile dp = request.getDownloadProfile();
@@ -100,6 +116,11 @@ public class TaskManage {
         protected TaskKind getKind() {
             return TaskKind.DOWNLOAD;
         }
+
+        @Override
+        protected ManageTarget<DownloadResult> removeRequest(int rowId) {
+            return downloadTargets.remove(rowId);
+        }
     }
 
     private class ConvertListener extends TaskManageInnerListener<ConvertResult, ConvertProgress> {
@@ -117,9 +138,14 @@ public class TaskManage {
         public void done(ConvertResult result) {
             super.done(result);
             synchronized (TaskManage.this) {
-                convertTargets.remove(getRowId());
+                removeRequest(getRowId());
             }
         }
+
+        @Override
+        protected ManageTarget<ConvertResult> removeRequest(int rowId) {
+            return convertTargets.remove(rowId);
+        }
     }
 
     abstract class TaskManageInnerListener<T, V extends PercentageReportable & MessageReportable> implements WorkerListener<T, V> {
@@ -135,7 +161,7 @@ public class TaskManage {
         }
 
         private void notify(TaskStatus status) {
-            notify(status, 0.0, "");
+            notify(status, -1.0, "");
         }
 
         private void notify(TaskStatus status, double percentage, String message) {
@@ -158,11 +184,18 @@ public class TaskManage {
         }
 
         @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);
@@ -170,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<T> removeRequest(int rowId);
     }
 
     class ManageTarget<T> {