Swtich off GA by default
[jabaws.git] / engine / compbio / engine / local / AsyncLocalRunner.java
1 /* Copyright (c) 2009 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 \r
19 package compbio.engine.local;\r
20 \r
21 import java.util.concurrent.ExecutionException;\r
22 import java.util.concurrent.Future;\r
23 \r
24 import org.apache.log4j.Logger;\r
25 \r
26 import compbio.engine.AsyncExecutor;\r
27 import compbio.engine.Configurator;\r
28 import compbio.engine.SubmissionManager;\r
29 import compbio.engine.client.ConfiguredExecutable;\r
30 import compbio.engine.client.EngineUtil;\r
31 import compbio.metadata.JobStatus;\r
32 import compbio.metadata.JobSubmissionException;\r
33 import compbio.metadata.ResultNotAvailableException;\r
34 \r
35 public final class AsyncLocalRunner implements AsyncExecutor {\r
36 \r
37         private static final Logger log = Logger.getLogger(AsyncLocalRunner.class);\r
38 \r
39         @Override\r
40         public String getWorkDirectory(String jobId) {\r
41                 return Configurator.getWorkDirectory(jobId);\r
42         }\r
43 \r
44         @Override\r
45         public boolean cancelJob(String jobId) {\r
46                 Future<ConfiguredExecutable<?>> future = SubmissionManager.getTask(jobId);\r
47                 // The job has already finished or cancelled.\r
48                 if (future == null) {\r
49                         log.debug("Did not find future for local job "\r
50                                         + jobId\r
51                                         + " will not cancel it. Perhaps it has finished or cancelled already.");\r
52                         return false;\r
53                 }\r
54                 LocalEngineUtil.cancelJob(future, getWorkDirectory(jobId));\r
55                 return future.cancel(true);\r
56         }\r
57 \r
58         @Override\r
59         public JobStatus getJobStatus(String jobId) {\r
60                 Future<ConfiguredExecutable<?>> future = SubmissionManager.getTask(jobId);\r
61                 if (future == null) {\r
62                         return LocalEngineUtil.getRecordedJobStatus(jobId);\r
63                 }\r
64                 return LocalEngineUtil.getJobStatus(future);\r
65         }\r
66 \r
67         @Override\r
68         public String submitJob(ConfiguredExecutable<?> executable)\r
69                         throws JobSubmissionException {\r
70                 if (executable == null) {\r
71                         throw new NullPointerException("Executable expected!");\r
72                 }\r
73                 LocalRunner lrunner = new LocalRunner(executable);\r
74                 lrunner.executeJob();\r
75                 Future<ConfiguredExecutable<?>> future = lrunner.getFuture();\r
76 \r
77                 if (future == null) {\r
78                         throw new RuntimeException("Future is NULL for executable " + executable);\r
79                 }\r
80                 SubmissionManager.addTask(executable, future);\r
81                 return executable.getTaskId();\r
82         }\r
83 \r
84         /**\r
85          * \r
86          * @param jobId\r
87          * @return true if all files were removed, false otherwise\r
88          */\r
89         @Override\r
90         public boolean cleanup(String jobId) {\r
91                 Future<ConfiguredExecutable<?>> future = SubmissionManager\r
92                                 .getTask(jobId);\r
93                 ConfiguredExecutable<?> cexec = null;\r
94                 try {\r
95                         cexec = future.get();\r
96                 } catch (InterruptedException e) {\r
97                         log.error("Cannot clean up as calculation was not completed!" + e.getLocalizedMessage());\r
98                 } catch (ExecutionException e) {\r
99                         log.error("Cannot clean up due to ExecutionException " + e.getLocalizedMessage());\r
100                 }\r
101                 if (cexec == null) {\r
102                         return false;\r
103                 }\r
104                 return LocalEngineUtil.cleanup(cexec);\r
105         }\r
106 \r
107         @Override\r
108         public ConfiguredExecutable<?> getResults(String taskId)\r
109                         throws ResultNotAvailableException {\r
110                 if (!EngineUtil.isValidJobId(taskId)) {\r
111                         // TODO should I be throwing something else?\r
112                         throw new IllegalArgumentException(taskId);\r
113                 }\r
114                 Future<ConfiguredExecutable<?>> futureExec = SubmissionManager\r
115                                 .getTask(taskId);\r
116                 if (futureExec == null) {\r
117                         // If task was not find in the list of jobs, than it must have been\r
118                         // collected already\r
119                         // Resurrect the job to find out there the output is\r
120                         ConfiguredExecutable<?> exec = EngineUtil.loadExecutable(taskId);\r
121                         return exec;\r
122                 }\r
123                 return LocalEngineUtil.getResults(futureExec, taskId);\r
124         }\r
125 \r
126 }\r