3032 |
12 Dec 14 |
nicklas |
1 |
package net.sf.basedb.reggie.autoconfirm; |
3032 |
12 Dec 14 |
nicklas |
2 |
|
3032 |
12 Dec 14 |
nicklas |
3 |
import java.util.Iterator; |
3032 |
12 Dec 14 |
nicklas |
4 |
import java.util.TimerTask; |
3032 |
12 Dec 14 |
nicklas |
5 |
|
3571 |
30 Oct 15 |
nicklas |
6 |
import net.sf.basedb.clients.web.extensions.service.ServiceControllerAction; |
3032 |
12 Dec 14 |
nicklas |
7 |
import net.sf.basedb.clients.web.extensions.service.Services; |
3032 |
12 Dec 14 |
nicklas |
8 |
import net.sf.basedb.core.Application; |
3032 |
12 Dec 14 |
nicklas |
9 |
import net.sf.basedb.core.DbControl; |
3032 |
12 Dec 14 |
nicklas |
10 |
import net.sf.basedb.core.DerivedBioAssay; |
7221 |
31 May 23 |
nicklas |
11 |
import net.sf.basedb.core.FileServer; |
3032 |
12 Dec 14 |
nicklas |
12 |
import net.sf.basedb.core.Include; |
3032 |
12 Dec 14 |
nicklas |
13 |
import net.sf.basedb.core.ItemQuery; |
3034 |
12 Dec 14 |
nicklas |
14 |
import net.sf.basedb.core.ItemSubtype; |
6021 |
23 Oct 20 |
nicklas |
15 |
import net.sf.basedb.core.Job; |
3032 |
12 Dec 14 |
nicklas |
16 |
import net.sf.basedb.core.RawBioAssay; |
4665 |
31 Jan 18 |
nicklas |
17 |
import net.sf.basedb.core.RawDataType; |
3032 |
12 Dec 14 |
nicklas |
18 |
import net.sf.basedb.core.SessionControl; |
6021 |
23 Oct 20 |
nicklas |
19 |
import net.sf.basedb.core.Type; |
3032 |
12 Dec 14 |
nicklas |
20 |
import net.sf.basedb.core.query.Annotations; |
3032 |
12 Dec 14 |
nicklas |
21 |
import net.sf.basedb.core.query.Expressions; |
3032 |
12 Dec 14 |
nicklas |
22 |
import net.sf.basedb.core.query.Hql; |
3032 |
12 Dec 14 |
nicklas |
23 |
import net.sf.basedb.core.query.Restrictions; |
3033 |
12 Dec 14 |
nicklas |
24 |
import net.sf.basedb.reggie.Reggie; |
3059 |
19 Dec 14 |
nicklas |
25 |
import net.sf.basedb.reggie.counter.CounterService; |
3032 |
12 Dec 14 |
nicklas |
26 |
import net.sf.basedb.reggie.dao.Annotationtype; |
7221 |
31 May 23 |
nicklas |
27 |
import net.sf.basedb.reggie.dao.Fileserver; |
6816 |
26 Aug 22 |
nicklas |
28 |
import net.sf.basedb.reggie.dao.Pipeline; |
4665 |
31 Jan 18 |
nicklas |
29 |
import net.sf.basedb.reggie.dao.Rawdatatype; |
3034 |
12 Dec 14 |
nicklas |
30 |
import net.sf.basedb.reggie.dao.Subtype; |
6021 |
23 Oct 20 |
nicklas |
31 |
import net.sf.basedb.reggie.query.JobParameter; |
3032 |
12 Dec 14 |
nicklas |
32 |
import net.sf.basedb.util.extensions.Extension; |
7077 |
27 Mar 23 |
nicklas |
33 |
import net.sf.basedb.util.extensions.logging.ExtensionsLog; |
7077 |
27 Mar 23 |
nicklas |
34 |
import net.sf.basedb.util.extensions.logging.ExtensionsLogger; |
3032 |
12 Dec 14 |
nicklas |
35 |
|
3032 |
12 Dec 14 |
nicklas |
36 |
import org.slf4j.LoggerFactory; |
3032 |
12 Dec 14 |
nicklas |
37 |
|
3032 |
12 Dec 14 |
nicklas |
38 |
/** |
3032 |
12 Dec 14 |
nicklas |
Service for auto-confirmation of secondary analysis steps. It will |
3032 |
12 Dec 14 |
nicklas |
check the database at regular intervals for derived and raw bioassay |
3032 |
12 Dec 14 |
nicklas |
items that has annotation {@link Annotationtype#AUTO_PROCESSING} == AutoConfirm. |
3032 |
12 Dec 14 |
nicklas |
42 |
|
3032 |
12 Dec 14 |
nicklas |
It will always clear the annotation so that if anything fails later, the |
3032 |
12 Dec 14 |
nicklas |
item will be visible in the manual flow. |
3032 |
12 Dec 14 |
nicklas |
45 |
|
3032 |
12 Dec 14 |
nicklas |
If the items fulfill a given set of rules they will automatically be |
3032 |
12 Dec 14 |
nicklas |
confirmed and the next step is started. |
3032 |
12 Dec 14 |
nicklas |
48 |
|
3032 |
12 Dec 14 |
nicklas |
Note that checks are usually made in 15-minute intervals, but a job handler may |
3032 |
12 Dec 14 |
nicklas |
call {@link #setForceCheck()} when a job has ended to force a check at the next |
3032 |
12 Dec 14 |
nicklas |
timer event (typically within the next 5 seconds). |
3032 |
12 Dec 14 |
nicklas |
52 |
|
3032 |
12 Dec 14 |
nicklas |
@author nicklas |
3045 |
16 Dec 14 |
nicklas |
@since 3.0 |
3032 |
12 Dec 14 |
nicklas |
55 |
*/ |
3032 |
12 Dec 14 |
nicklas |
56 |
public class AutoConfirmService |
3032 |
12 Dec 14 |
nicklas |
57 |
{ |
3032 |
12 Dec 14 |
nicklas |
58 |
|
7077 |
27 Mar 23 |
nicklas |
59 |
public static final String ID = "net.sf.basedb.reggie.auto-confirm-service"; |
3032 |
12 Dec 14 |
nicklas |
60 |
|
7077 |
27 Mar 23 |
nicklas |
61 |
private static final ExtensionsLogger logger = |
7077 |
27 Mar 23 |
nicklas |
62 |
ExtensionsLog.getLogger(ID, true).wrap(LoggerFactory.getLogger(AutoConfirmService.class)); |
7077 |
27 Mar 23 |
nicklas |
63 |
|
3032 |
12 Dec 14 |
nicklas |
// The singleton |
3032 |
12 Dec 14 |
nicklas |
65 |
private static AutoConfirmService instance = null; |
3032 |
12 Dec 14 |
nicklas |
66 |
|
7077 |
27 Mar 23 |
nicklas |
// At most 15 minutes between auto-confirm checks (1 when debugging) |
7077 |
27 Mar 23 |
nicklas |
68 |
private static final long MAX_WAIT_INTERVAL_NORMAL = 15 * 60000; |
7077 |
27 Mar 23 |
nicklas |
69 |
private static final long MAX_WAIT_INTERVAL_DEBUG = 1 * 60000; |
3032 |
12 Dec 14 |
nicklas |
70 |
|
3032 |
12 Dec 14 |
nicklas |
71 |
/** |
3032 |
12 Dec 14 |
nicklas |
Get the singleton instance of the service. If the service has |
3032 |
12 Dec 14 |
nicklas |
not been created yet it is created at this time. |
3032 |
12 Dec 14 |
nicklas |
74 |
*/ |
3032 |
12 Dec 14 |
nicklas |
75 |
public static final AutoConfirmService getInstance() |
3032 |
12 Dec 14 |
nicklas |
76 |
{ |
3032 |
12 Dec 14 |
nicklas |
77 |
if (instance == null) |
3032 |
12 Dec 14 |
nicklas |
78 |
{ |
3032 |
12 Dec 14 |
nicklas |
79 |
synchronized (AutoConfirmService.class) |
3032 |
12 Dec 14 |
nicklas |
80 |
{ |
3032 |
12 Dec 14 |
nicklas |
81 |
if (instance == null) |
3032 |
12 Dec 14 |
nicklas |
82 |
{ |
3032 |
12 Dec 14 |
nicklas |
83 |
AutoConfirmService tmp = new AutoConfirmService(); |
3032 |
12 Dec 14 |
nicklas |
84 |
instance = tmp; |
3032 |
12 Dec 14 |
nicklas |
85 |
} |
3032 |
12 Dec 14 |
nicklas |
86 |
} |
3032 |
12 Dec 14 |
nicklas |
87 |
} |
3032 |
12 Dec 14 |
nicklas |
88 |
return instance; |
3032 |
12 Dec 14 |
nicklas |
89 |
} |
3032 |
12 Dec 14 |
nicklas |
90 |
|
3032 |
12 Dec 14 |
nicklas |
91 |
private volatile boolean isRunning; |
3033 |
12 Dec 14 |
nicklas |
92 |
private SessionControl systemSc; |
3571 |
30 Oct 15 |
nicklas |
93 |
private Extension<ServiceControllerAction> ext; |
3032 |
12 Dec 14 |
nicklas |
94 |
private TimerTask autoConfirmTimer; |
3032 |
12 Dec 14 |
nicklas |
95 |
|
3032 |
12 Dec 14 |
nicklas |
// Time when last check for auto-confirmation was made |
3032 |
12 Dec 14 |
nicklas |
97 |
private volatile long lastAutoConfirmCheck; |
3032 |
12 Dec 14 |
nicklas |
// If flag is set, we force check for auto-confirmation |
5036 |
17 Oct 18 |
nicklas |
99 |
private volatile long forceAutoConfirmCheck; |
3032 |
12 Dec 14 |
nicklas |
100 |
|
3032 |
12 Dec 14 |
nicklas |
101 |
private AutoConfirmService() |
3032 |
12 Dec 14 |
nicklas |
102 |
{} |
3032 |
12 Dec 14 |
nicklas |
103 |
|
3032 |
12 Dec 14 |
nicklas |
104 |
/** |
3032 |
12 Dec 14 |
nicklas |
Is the auto-confirm service running or not? |
3032 |
12 Dec 14 |
nicklas |
106 |
*/ |
3032 |
12 Dec 14 |
nicklas |
107 |
public boolean isRunning() |
3032 |
12 Dec 14 |
nicklas |
108 |
{ |
3032 |
12 Dec 14 |
nicklas |
109 |
return isRunning; |
3032 |
12 Dec 14 |
nicklas |
110 |
} |
3032 |
12 Dec 14 |
nicklas |
111 |
|
3032 |
12 Dec 14 |
nicklas |
112 |
/** |
3032 |
12 Dec 14 |
nicklas |
Start the service if it is not running. |
3032 |
12 Dec 14 |
nicklas |
114 |
*/ |
3571 |
30 Oct 15 |
nicklas |
115 |
public synchronized void start(SessionControl systemSc, Extension<ServiceControllerAction> ext) |
3032 |
12 Dec 14 |
nicklas |
116 |
{ |
3032 |
12 Dec 14 |
nicklas |
117 |
if (!isRunning) |
3032 |
12 Dec 14 |
nicklas |
118 |
{ |
3032 |
12 Dec 14 |
nicklas |
119 |
logger.debug("Starting auto-confirm service"); |
3033 |
12 Dec 14 |
nicklas |
120 |
this.systemSc = systemSc; |
3032 |
12 Dec 14 |
nicklas |
121 |
this.ext = ext; |
3032 |
12 Dec 14 |
nicklas |
122 |
|
3033 |
12 Dec 14 |
nicklas |
123 |
Reggie.getRootSessionControl(systemSc); |
3032 |
12 Dec 14 |
nicklas |
124 |
|
3032 |
12 Dec 14 |
nicklas |
125 |
autoConfirmTimer = Application.getScheduler().scheduleAtFixedRate( |
3033 |
12 Dec 14 |
nicklas |
126 |
new AutoConfirmTimerTask(), 5000, 5000, false); |
3032 |
12 Dec 14 |
nicklas |
127 |
|
3032 |
12 Dec 14 |
nicklas |
128 |
isRunning = true; |
3032 |
12 Dec 14 |
nicklas |
129 |
logger.debug("Auto-confirm service is now running"); |
3032 |
12 Dec 14 |
nicklas |
130 |
} |
3032 |
12 Dec 14 |
nicklas |
131 |
} |
3032 |
12 Dec 14 |
nicklas |
132 |
|
3032 |
12 Dec 14 |
nicklas |
133 |
/** |
3032 |
12 Dec 14 |
nicklas |
Stop the service if it is running. |
3032 |
12 Dec 14 |
nicklas |
135 |
*/ |
3032 |
12 Dec 14 |
nicklas |
136 |
public synchronized void stop() |
3032 |
12 Dec 14 |
nicklas |
137 |
{ |
3032 |
12 Dec 14 |
nicklas |
138 |
if (isRunning) |
3032 |
12 Dec 14 |
nicklas |
139 |
{ |
3032 |
12 Dec 14 |
nicklas |
140 |
logger.debug("Stopping auto-confirm service"); |
3032 |
12 Dec 14 |
nicklas |
141 |
isRunning = false; |
3032 |
12 Dec 14 |
nicklas |
142 |
|
3032 |
12 Dec 14 |
nicklas |
143 |
if (autoConfirmTimer != null) |
3032 |
12 Dec 14 |
nicklas |
144 |
{ |
3032 |
12 Dec 14 |
nicklas |
145 |
autoConfirmTimer.cancel(); |
3032 |
12 Dec 14 |
nicklas |
146 |
autoConfirmTimer = null; |
3032 |
12 Dec 14 |
nicklas |
147 |
} |
3033 |
12 Dec 14 |
nicklas |
148 |
systemSc = null; |
3032 |
12 Dec 14 |
nicklas |
149 |
ext = null; |
3033 |
12 Dec 14 |
nicklas |
150 |
lastAutoConfirmCheck = 0; |
5036 |
17 Oct 18 |
nicklas |
151 |
forceAutoConfirmCheck = 0; |
3033 |
12 Dec 14 |
nicklas |
152 |
Reggie.closeRootSessionControl(); |
3032 |
12 Dec 14 |
nicklas |
153 |
|
3032 |
12 Dec 14 |
nicklas |
154 |
logger.debug("Auto-confirm service has stopped"); |
3032 |
12 Dec 14 |
nicklas |
155 |
} |
3032 |
12 Dec 14 |
nicklas |
156 |
} |
3032 |
12 Dec 14 |
nicklas |
157 |
|
3032 |
12 Dec 14 |
nicklas |
158 |
/** |
3032 |
12 Dec 14 |
nicklas |
Restart the service. |
3032 |
12 Dec 14 |
nicklas |
160 |
*/ |
3032 |
12 Dec 14 |
nicklas |
161 |
public synchronized void restart() |
3032 |
12 Dec 14 |
nicklas |
162 |
{ |
3032 |
12 Dec 14 |
nicklas |
163 |
if (ext != null) Services.restart(ext); |
3032 |
12 Dec 14 |
nicklas |
164 |
} |
3032 |
12 Dec 14 |
nicklas |
165 |
|
3032 |
12 Dec 14 |
nicklas |
166 |
/** |
5036 |
17 Oct 18 |
nicklas |
Set a flag forcing the service to perform a check soon after the given number |
5036 |
17 Oct 18 |
nicklas |
of seconds. This method is intended to be called by job handlers when a job has ended |
5036 |
17 Oct 18 |
nicklas |
and if (only if) the detect that auto-confirm is enabled. |
3032 |
12 Dec 14 |
nicklas |
170 |
*/ |
5036 |
17 Oct 18 |
nicklas |
171 |
public void setForceCheck(int seconds) |
3032 |
12 Dec 14 |
nicklas |
172 |
{ |
5036 |
17 Oct 18 |
nicklas |
173 |
this.forceAutoConfirmCheck = System.currentTimeMillis() + seconds * 1000; |
3032 |
12 Dec 14 |
nicklas |
174 |
} |
3032 |
12 Dec 14 |
nicklas |
175 |
|
3032 |
12 Dec 14 |
nicklas |
176 |
/** |
3032 |
12 Dec 14 |
nicklas |
Perform an auto-confirm check. Note that this method may return without doing |
3032 |
12 Dec 14 |
nicklas |
anything depending on how long time it was since the last check and if |
3032 |
12 Dec 14 |
nicklas |
the {@link #setForceCheck()} has been called or not. |
3032 |
12 Dec 14 |
nicklas |
180 |
*/ |
3033 |
12 Dec 14 |
nicklas |
181 |
void autoConfirm() |
3032 |
12 Dec 14 |
nicklas |
182 |
{ |
3032 |
12 Dec 14 |
nicklas |
183 |
long now = System.currentTimeMillis(); |
3032 |
12 Dec 14 |
nicklas |
184 |
long timeSinceLastCheck = now - lastAutoConfirmCheck; |
3032 |
12 Dec 14 |
nicklas |
185 |
|
3032 |
12 Dec 14 |
nicklas |
// If we have not waited long enough and there there is no recent request we don't have to check |
7077 |
27 Mar 23 |
nicklas |
187 |
long maxWaitInterval = logger.isDebugEnabled() ? MAX_WAIT_INTERVAL_DEBUG : MAX_WAIT_INTERVAL_NORMAL; |
7077 |
27 Mar 23 |
nicklas |
188 |
if (timeSinceLastCheck < maxWaitInterval && (forceAutoConfirmCheck == 0 || forceAutoConfirmCheck > now)) |
3032 |
12 Dec 14 |
nicklas |
189 |
{ |
3049 |
17 Dec 14 |
nicklas |
190 |
logger.trace("No auto-confirm check since no recent request and not long enough wait time [" + (timeSinceLastCheck / 1000) + "]"); |
3032 |
12 Dec 14 |
nicklas |
191 |
return; |
3032 |
12 Dec 14 |
nicklas |
192 |
} |
3032 |
12 Dec 14 |
nicklas |
193 |
|
5036 |
17 Oct 18 |
nicklas |
194 |
forceAutoConfirmCheck = 0; |
3032 |
12 Dec 14 |
nicklas |
195 |
lastAutoConfirmCheck = now; |
3032 |
12 Dec 14 |
nicklas |
196 |
logger.debug("Time for auto-confirm check [" + (timeSinceLastCheck / 1000) + "]"); |
3049 |
17 Dec 14 |
nicklas |
197 |
int numItems = 0; |
3032 |
12 Dec 14 |
nicklas |
198 |
|
3033 |
12 Dec 14 |
nicklas |
199 |
SessionControl sc = Reggie.getRootSessionControl(systemSc); |
3032 |
12 Dec 14 |
nicklas |
200 |
DbControl dc = null; |
3032 |
12 Dec 14 |
nicklas |
201 |
try |
3032 |
12 Dec 14 |
nicklas |
202 |
{ |
6599 |
22 Feb 22 |
nicklas |
203 |
dc = sc.newDbControl("Reggie: Auto-confirm"); |
3032 |
12 Dec 14 |
nicklas |
204 |
|
3034 |
12 Dec 14 |
nicklas |
// Load auto-confirmable types |
3700 |
18 Jan 16 |
nicklas |
206 |
ItemSubtype seqRunType = Subtype.SEQUENCING_RUN.load(dc); |
3034 |
12 Dec 14 |
nicklas |
207 |
ItemSubtype demuxType = Subtype.DEMUXED_SEQUENCES.load(dc); |
6184 |
26 Mar 21 |
nicklas |
208 |
ItemSubtype mergedType = Subtype.MERGED_SEQUENCES.load(dc); |
4600 |
28 Sep 17 |
nicklas |
209 |
ItemSubtype alignType = Subtype.ALIGNED_SEQUENCES.load(dc); |
6184 |
26 Mar 21 |
nicklas |
210 |
ItemSubtype fastqImportType = Subtype.FASTQ_IMPORT_JOB.get(dc); |
4600 |
28 Sep 17 |
nicklas |
211 |
ItemSubtype hisatType = Subtype.HISAT_ALIGN_JOB.load(dc); |
7119 |
19 Apr 23 |
nicklas |
212 |
ItemSubtype bwaMem2Type = Subtype.BWA_MEM2_ALIGN_JOB.get(dc); |
5845 |
26 Feb 20 |
nicklas |
213 |
ItemSubtype mipsAlignType = Subtype.MIPS_ALIGN_JOB.load(dc); |
6881 |
22 Nov 22 |
nicklas |
214 |
ItemSubtype methylationType = Subtype.METHYLATION.get(dc); |
6881 |
22 Nov 22 |
nicklas |
215 |
ItemSubtype methylationBetaJob = Subtype.METHYLATION_BETA_JOB.get(dc); |
6881 |
22 Nov 22 |
nicklas |
216 |
|
4667 |
01 Feb 18 |
nicklas |
217 |
RawDataType cufflinksType = Rawdatatype.CUFFLINKS.getRawDataType(); |
4670 |
05 Feb 18 |
nicklas |
218 |
RawDataType stringTieType = Rawdatatype.STRINGTIE.getRawDataType(); |
5723 |
13 Nov 19 |
nicklas |
219 |
RawDataType variantCallType = Rawdatatype.VARIANT_CALL.getRawDataType(); |
3034 |
12 Dec 14 |
nicklas |
220 |
|
3034 |
12 Dec 14 |
nicklas |
// Collection AutoConfirm actions |
3034 |
12 Dec 14 |
nicklas |
222 |
AutoConfirmManager manager = new AutoConfirmManager(); |
3034 |
12 Dec 14 |
nicklas |
223 |
|
3032 |
12 Dec 14 |
nicklas |
224 |
ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery(); |
3034 |
12 Dec 14 |
nicklas |
225 |
query.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL); |
3032 |
12 Dec 14 |
nicklas |
// AutoProcess==AutoConfirm |
3032 |
12 Dec 14 |
nicklas |
227 |
query.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap")); |
3032 |
12 Dec 14 |
nicklas |
228 |
query.restrict(Restrictions.eq(Hql.alias("ap"), Expressions.string("AutoConfirm"))); |
3032 |
12 Dec 14 |
nicklas |
229 |
|
3032 |
12 Dec 14 |
nicklas |
// The job must be ended |
3032 |
12 Dec 14 |
nicklas |
231 |
query.join(Hql.innerJoin("job", "jb")); |
3032 |
12 Dec 14 |
nicklas |
232 |
query.restrict(Restrictions.neq(Hql.property("jb", "ended"), null)); |
3032 |
12 Dec 14 |
nicklas |
233 |
|
3032 |
12 Dec 14 |
nicklas |
234 |
Iterator<DerivedBioAssay> it = query.iterate(dc); |
3032 |
12 Dec 14 |
nicklas |
235 |
while (it.hasNext()) |
3032 |
12 Dec 14 |
nicklas |
236 |
{ |
3049 |
17 Dec 14 |
nicklas |
237 |
numItems++; |
3032 |
12 Dec 14 |
nicklas |
238 |
DerivedBioAssay dba = it.next(); |
3034 |
12 Dec 14 |
nicklas |
239 |
ItemSubtype itemType = dba.getItemSubtype(); |
4600 |
28 Sep 17 |
nicklas |
240 |
ItemSubtype jobType = dba.getJob().getItemSubtype(); |
6816 |
26 Aug 22 |
nicklas |
241 |
Pipeline pipeline = Pipeline.getByName((String)Annotationtype.PIPELINE.getAnnotationValue(dc, dba)); |
4600 |
28 Sep 17 |
nicklas |
242 |
|
3034 |
12 Dec 14 |
nicklas |
243 |
AutoConfirmer<?> ac = null; |
3032 |
12 Dec 14 |
nicklas |
244 |
|
3700 |
18 Jan 16 |
nicklas |
245 |
if (seqRunType.equals(itemType)) |
3034 |
12 Dec 14 |
nicklas |
246 |
{ |
3700 |
18 Jan 16 |
nicklas |
247 |
ac = new SequencingRunAutoConfirmer(dba); |
3700 |
18 Jan 16 |
nicklas |
248 |
} |
3700 |
18 Jan 16 |
nicklas |
249 |
else if (demuxType.equals(itemType)) |
3700 |
18 Jan 16 |
nicklas |
250 |
{ |
3034 |
12 Dec 14 |
nicklas |
// Since there can be multiple demux items per job, we |
3034 |
12 Dec 14 |
nicklas |
// create one action per job |
3034 |
12 Dec 14 |
nicklas |
253 |
ac = new DemuxAutoConfirmer(dba.getJob()); |
3034 |
12 Dec 14 |
nicklas |
254 |
} |
6184 |
26 Mar 21 |
nicklas |
255 |
else if (mergedType.equals(itemType)) |
6184 |
26 Mar 21 |
nicklas |
256 |
{ |
6184 |
26 Mar 21 |
nicklas |
257 |
if (fastqImportType.equals(jobType)) |
6184 |
26 Mar 21 |
nicklas |
258 |
{ |
6184 |
26 Mar 21 |
nicklas |
259 |
ac = new FastqImportAutoConfirmer(dba); |
6184 |
26 Mar 21 |
nicklas |
260 |
} |
6184 |
26 Mar 21 |
nicklas |
261 |
} |
5845 |
26 Feb 20 |
nicklas |
262 |
else if (alignType.equals(itemType)) |
4600 |
28 Sep 17 |
nicklas |
263 |
{ |
5845 |
26 Feb 20 |
nicklas |
264 |
if (hisatType.equals(jobType)) |
5845 |
26 Feb 20 |
nicklas |
265 |
{ |
6816 |
26 Aug 22 |
nicklas |
266 |
if (pipeline == Pipeline.RNASEQ_HISAT_STRINGTIE) |
6816 |
26 Aug 22 |
nicklas |
267 |
{ |
6816 |
26 Aug 22 |
nicklas |
268 |
ac = new HisatAlignAutoConfirmer(dba); |
6816 |
26 Aug 22 |
nicklas |
269 |
} |
6816 |
26 Aug 22 |
nicklas |
270 |
else if (pipeline == Pipeline.RNASEQ_HISAT_2023) |
6816 |
26 Aug 22 |
nicklas |
271 |
{ |
6816 |
26 Aug 22 |
nicklas |
272 |
ac = new Hisat2023AutoConfirmer(dba); |
6816 |
26 Aug 22 |
nicklas |
273 |
} |
5845 |
26 Feb 20 |
nicklas |
274 |
} |
7119 |
19 Apr 23 |
nicklas |
275 |
else if (bwaMem2Type.equals(jobType)) |
7119 |
19 Apr 23 |
nicklas |
276 |
{ |
7119 |
19 Apr 23 |
nicklas |
277 |
ac = new BwaMem2AutoConfirmer(dba); |
7119 |
19 Apr 23 |
nicklas |
278 |
} |
5845 |
26 Feb 20 |
nicklas |
279 |
else if (mipsAlignType.equals(jobType)) |
5845 |
26 Feb 20 |
nicklas |
280 |
{ |
5845 |
26 Feb 20 |
nicklas |
281 |
ac = new MipsAlignAutoConfirmer(dba); |
5845 |
26 Feb 20 |
nicklas |
282 |
} |
4600 |
28 Sep 17 |
nicklas |
283 |
} |
6881 |
22 Nov 22 |
nicklas |
284 |
else if (methylationType.equals(itemType)) |
6881 |
22 Nov 22 |
nicklas |
285 |
{ |
6881 |
22 Nov 22 |
nicklas |
286 |
if (methylationBetaJob.equals(jobType)) |
6881 |
22 Nov 22 |
nicklas |
287 |
{ |
6881 |
22 Nov 22 |
nicklas |
288 |
ac = new MethylationBetaAutoConfirmer(dba); |
6881 |
22 Nov 22 |
nicklas |
289 |
} |
6881 |
22 Nov 22 |
nicklas |
290 |
} |
3049 |
17 Dec 14 |
nicklas |
291 |
manager.checkRulesAndAdd(dc, ac); |
3049 |
17 Dec 14 |
nicklas |
292 |
|
3049 |
17 Dec 14 |
nicklas |
293 |
logger.debug("Resetting AutoProcessing for " + dba.getName()); |
3049 |
17 Dec 14 |
nicklas |
294 |
manager.resetAutoProcessing(dc, dba); |
3032 |
12 Dec 14 |
nicklas |
295 |
} |
3032 |
12 Dec 14 |
nicklas |
296 |
|
4665 |
31 Jan 18 |
nicklas |
297 |
ItemQuery<RawBioAssay> rawQuery = RawBioAssay.getQuery(); |
4665 |
31 Jan 18 |
nicklas |
298 |
rawQuery.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL); |
3032 |
12 Dec 14 |
nicklas |
// AutoProcess==AutoConfirm |
4665 |
31 Jan 18 |
nicklas |
300 |
rawQuery.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap")); |
4665 |
31 Jan 18 |
nicklas |
301 |
rawQuery.restrict(Restrictions.eq(Hql.alias("ap"), Expressions.string("AutoConfirm"))); |
3032 |
12 Dec 14 |
nicklas |
// The job must be ended |
4665 |
31 Jan 18 |
nicklas |
303 |
rawQuery.join(Hql.innerJoin("job", "jb")); |
4665 |
31 Jan 18 |
nicklas |
304 |
rawQuery.restrict(Restrictions.neq(Hql.property("jb", "ended"), null)); |
4665 |
31 Jan 18 |
nicklas |
305 |
|
4665 |
31 Jan 18 |
nicklas |
306 |
Iterator<RawBioAssay> rawIt = rawQuery.iterate(dc); |
4665 |
31 Jan 18 |
nicklas |
307 |
while (rawIt.hasNext()) |
3032 |
12 Dec 14 |
nicklas |
308 |
{ |
3049 |
17 Dec 14 |
nicklas |
309 |
numItems++; |
4665 |
31 Jan 18 |
nicklas |
310 |
RawBioAssay raw = rawIt.next(); |
4665 |
31 Jan 18 |
nicklas |
311 |
RawDataType rawType = raw.getRawDataType(); |
6823 |
29 Aug 22 |
nicklas |
312 |
Pipeline pipeline = Pipeline.getByName((String)Annotationtype.PIPELINE.getAnnotationValue(dc, raw)); |
4665 |
31 Jan 18 |
nicklas |
313 |
|
4665 |
31 Jan 18 |
nicklas |
314 |
AutoConfirmer<?> ac = null; |
4665 |
31 Jan 18 |
nicklas |
315 |
|
4665 |
31 Jan 18 |
nicklas |
316 |
if (cufflinksType.equals(rawType)) |
4665 |
31 Jan 18 |
nicklas |
317 |
{ |
4665 |
31 Jan 18 |
nicklas |
318 |
ac = new CufflinksAutoConfirmer(raw); |
4665 |
31 Jan 18 |
nicklas |
319 |
} |
4670 |
05 Feb 18 |
nicklas |
320 |
else if (stringTieType.equals(rawType)) |
4670 |
05 Feb 18 |
nicklas |
321 |
{ |
6823 |
29 Aug 22 |
nicklas |
322 |
if (pipeline == Pipeline.RNASEQ_HISAT_STRINGTIE) |
6823 |
29 Aug 22 |
nicklas |
323 |
{ |
6823 |
29 Aug 22 |
nicklas |
324 |
ac = new StringTieAutoConfirmer(raw); |
6823 |
29 Aug 22 |
nicklas |
325 |
} |
6823 |
29 Aug 22 |
nicklas |
326 |
else if (pipeline == Pipeline.RNASEQ_STRINGTIE_2023) |
6823 |
29 Aug 22 |
nicklas |
327 |
{ |
6823 |
29 Aug 22 |
nicklas |
328 |
ac = new StringTie2023AutoConfirmer(raw); |
6823 |
29 Aug 22 |
nicklas |
329 |
} |
4670 |
05 Feb 18 |
nicklas |
330 |
} |
5723 |
13 Nov 19 |
nicklas |
331 |
else if (variantCallType.equals(rawType)) |
5723 |
13 Nov 19 |
nicklas |
332 |
{ |
7438 |
16 Nov 23 |
nicklas |
333 |
if (pipeline == Pipeline.RNASEQ_HISAT_VARIANTCALL) |
7438 |
16 Nov 23 |
nicklas |
334 |
{ |
7438 |
16 Nov 23 |
nicklas |
335 |
ac = new VariantCallAutoConfirmer(raw); |
7438 |
16 Nov 23 |
nicklas |
336 |
} |
7438 |
16 Nov 23 |
nicklas |
337 |
else if (pipeline == Pipeline.DNA_PAIRED_VARIANTCALL) |
7438 |
16 Nov 23 |
nicklas |
338 |
{ |
7438 |
16 Nov 23 |
nicklas |
339 |
ac = new WgsVariantCallAutoConfirmer(raw); |
7438 |
16 Nov 23 |
nicklas |
340 |
} |
5723 |
13 Nov 19 |
nicklas |
341 |
} |
3034 |
12 Dec 14 |
nicklas |
342 |
|
3049 |
17 Dec 14 |
nicklas |
343 |
manager.checkRulesAndAdd(dc, ac); |
3049 |
17 Dec 14 |
nicklas |
344 |
|
3049 |
17 Dec 14 |
nicklas |
345 |
logger.debug("Resetting AutoProcessing for " + raw.getName()); |
3049 |
17 Dec 14 |
nicklas |
346 |
manager.resetAutoProcessing(dc, raw); |
3032 |
12 Dec 14 |
nicklas |
347 |
} |
3032 |
12 Dec 14 |
nicklas |
348 |
|
6021 |
23 Oct 20 |
nicklas |
349 |
ItemQuery<Job> jobQuery = Job.getQuery(); |
6021 |
23 Oct 20 |
nicklas |
350 |
jobQuery.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL); |
6021 |
23 Oct 20 |
nicklas |
// The job must be ended |
6021 |
23 Oct 20 |
nicklas |
352 |
jobQuery.restrict(Restrictions.neq(Hql.property("ended"), null)); |
6021 |
23 Oct 20 |
nicklas |
// A parameter named 'AutoConfirmHandler' should exist |
6021 |
23 Oct 20 |
nicklas |
354 |
JobParameter acHandler = new JobParameter("AutoConfirmHandler", "ach", Type.STRING); |
6021 |
23 Oct 20 |
nicklas |
355 |
jobQuery.join(acHandler.join()); |
6021 |
23 Oct 20 |
nicklas |
356 |
|
6021 |
23 Oct 20 |
nicklas |
357 |
Iterator<Job> jobIt = jobQuery.iterate(dc); |
6021 |
23 Oct 20 |
nicklas |
358 |
while (jobIt.hasNext()) |
6021 |
23 Oct 20 |
nicklas |
359 |
{ |
6021 |
23 Oct 20 |
nicklas |
360 |
numItems++; |
6021 |
23 Oct 20 |
nicklas |
361 |
Job job = jobIt.next(); |
6021 |
23 Oct 20 |
nicklas |
362 |
String handler = job.getParameterValue("AutoConfirmHandler"); |
6021 |
23 Oct 20 |
nicklas |
363 |
|
6023 |
26 Oct 20 |
nicklas |
364 |
logger.debug("Found job with AutoConfirmHandler="+handler + "; job=" + job.getName()); |
6021 |
23 Oct 20 |
nicklas |
365 |
|
6021 |
23 Oct 20 |
nicklas |
366 |
AutoConfirmer<?> ac = null; |
6022 |
26 Oct 20 |
nicklas |
367 |
if ("MBafAutoConfirmer".equals(handler)) |
6021 |
23 Oct 20 |
nicklas |
368 |
{ |
6021 |
23 Oct 20 |
nicklas |
369 |
ac = new MBafAutoConfirmer(job); |
6021 |
23 Oct 20 |
nicklas |
370 |
} |
6022 |
26 Oct 20 |
nicklas |
371 |
else if ("RawOnlyVariantCallingAutoConfirmer".equals(handler)) |
6022 |
26 Oct 20 |
nicklas |
372 |
{ |
6022 |
26 Oct 20 |
nicklas |
373 |
ac = new RawOnlyVariantCallAutoConfirmer(job); |
6022 |
26 Oct 20 |
nicklas |
374 |
} |
6023 |
26 Oct 20 |
nicklas |
375 |
else if ("GeneReportAutoConfirmer".equals(handler)) |
6023 |
26 Oct 20 |
nicklas |
376 |
{ |
6023 |
26 Oct 20 |
nicklas |
377 |
ac = new GeneReportAutoConfirmer(job); |
6023 |
26 Oct 20 |
nicklas |
378 |
} |
6025 |
26 Oct 20 |
nicklas |
379 |
else if ("SspAutoConfirmer".equals(handler)) |
6025 |
26 Oct 20 |
nicklas |
380 |
{ |
6025 |
26 Oct 20 |
nicklas |
381 |
ac = new SspAutoConfirmer(job); |
6025 |
26 Oct 20 |
nicklas |
382 |
} |
6387 |
15 Sep 21 |
nicklas |
383 |
else if ("TargetedGenotypeAutoConfirmer".equals(handler)) |
6387 |
15 Sep 21 |
nicklas |
384 |
{ |
6387 |
15 Sep 21 |
nicklas |
385 |
ac = new TargetedGenotypeAutoConfirmer(job); |
6387 |
15 Sep 21 |
nicklas |
386 |
} |
6021 |
23 Oct 20 |
nicklas |
387 |
|
6023 |
26 Oct 20 |
nicklas |
388 |
if (ac == null) |
6023 |
26 Oct 20 |
nicklas |
389 |
{ |
6023 |
26 Oct 20 |
nicklas |
390 |
logger.warn("No implementation found for AutoConfirmHandler: " + handler); |
6023 |
26 Oct 20 |
nicklas |
391 |
} |
6023 |
26 Oct 20 |
nicklas |
392 |
|
6021 |
23 Oct 20 |
nicklas |
393 |
manager.checkRulesAndAdd(dc, ac); |
6021 |
23 Oct 20 |
nicklas |
394 |
|
6021 |
23 Oct 20 |
nicklas |
395 |
logger.debug("Resetting AutoConfirmHandler for " + job.getName()); |
6021 |
23 Oct 20 |
nicklas |
396 |
manager.resetAutoConfirmHandler(dc, job); |
6021 |
23 Oct 20 |
nicklas |
397 |
} |
6021 |
23 Oct 20 |
nicklas |
398 |
|
7221 |
31 May 23 |
nicklas |
399 |
FileServer importGateway = Fileserver.IMPORT_GATEWAY.get(dc); |
7221 |
31 May 23 |
nicklas |
400 |
if (importGateway != null) |
7221 |
31 May 23 |
nicklas |
401 |
{ |
7223 |
31 May 23 |
nicklas |
402 |
if (!"Disable".equals(Annotationtype.AUTO_PROCESSING.getAnnotationValue(dc, importGateway))) |
7223 |
31 May 23 |
nicklas |
403 |
{ |
7223 |
31 May 23 |
nicklas |
404 |
numItems++; |
7223 |
31 May 23 |
nicklas |
405 |
manager.checkRulesAndAdd(dc, new JsonAutoImporter(importGateway)); |
7223 |
31 May 23 |
nicklas |
406 |
} |
7223 |
31 May 23 |
nicklas |
407 |
else |
7223 |
31 May 23 |
nicklas |
408 |
{ |
7223 |
31 May 23 |
nicklas |
409 |
logger.info("Auto-import from "+importGateway.getName()+" is disabled"); |
7223 |
31 May 23 |
nicklas |
410 |
} |
7221 |
31 May 23 |
nicklas |
411 |
} |
7221 |
31 May 23 |
nicklas |
412 |
|
3049 |
17 Dec 14 |
nicklas |
// Commit now so that all items are reverted to manual flow just in case |
3049 |
17 Dec 14 |
nicklas |
// Actual auto-confirm and starting of next step is done later |
3032 |
12 Dec 14 |
nicklas |
415 |
dc.commit(); |
3034 |
12 Dec 14 |
nicklas |
416 |
|
4547 |
29 Jun 17 |
nicklas |
417 |
manager.autoConfirmAll(sc); |
3055 |
19 Dec 14 |
nicklas |
418 |
manager.startNextStep(sc); |
3059 |
19 Dec 14 |
nicklas |
419 |
|
3059 |
19 Dec 14 |
nicklas |
420 |
if (numItems > 0) |
3059 |
19 Dec 14 |
nicklas |
421 |
{ |
3059 |
19 Dec 14 |
nicklas |
422 |
CounterService.getInstance().setForceCount(); |
3059 |
19 Dec 14 |
nicklas |
423 |
} |
3032 |
12 Dec 14 |
nicklas |
424 |
} |
3032 |
12 Dec 14 |
nicklas |
425 |
finally |
3032 |
12 Dec 14 |
nicklas |
426 |
{ |
3032 |
12 Dec 14 |
nicklas |
427 |
lastAutoConfirmCheck = System.currentTimeMillis(); |
3032 |
12 Dec 14 |
nicklas |
428 |
if (dc != null) dc.close(); |
7077 |
27 Mar 23 |
nicklas |
429 |
logger.info("Processed auto-confirmation for " + numItems + " items"); |
3032 |
12 Dec 14 |
nicklas |
430 |
} |
3032 |
12 Dec 14 |
nicklas |
431 |
} |
3508 |
24 Sep 15 |
nicklas |
432 |
|
5692 |
29 Oct 19 |
nicklas |
433 |
/** |
3032 |
12 Dec 14 |
nicklas |
Timer for auto-confirmation |
3032 |
12 Dec 14 |
nicklas |
435 |
*/ |
3032 |
12 Dec 14 |
nicklas |
436 |
static class AutoConfirmTimerTask |
3032 |
12 Dec 14 |
nicklas |
437 |
extends TimerTask |
3032 |
12 Dec 14 |
nicklas |
438 |
{ |
3032 |
12 Dec 14 |
nicklas |
439 |
|
3033 |
12 Dec 14 |
nicklas |
440 |
public AutoConfirmTimerTask() |
3033 |
12 Dec 14 |
nicklas |
441 |
{} |
3032 |
12 Dec 14 |
nicklas |
442 |
|
3032 |
12 Dec 14 |
nicklas |
443 |
@Override |
3032 |
12 Dec 14 |
nicklas |
444 |
public void run() |
3032 |
12 Dec 14 |
nicklas |
445 |
{ |
3032 |
12 Dec 14 |
nicklas |
446 |
try |
3032 |
12 Dec 14 |
nicklas |
447 |
{ |
3033 |
12 Dec 14 |
nicklas |
448 |
getInstance().autoConfirm(); |
3032 |
12 Dec 14 |
nicklas |
449 |
} |
3032 |
12 Dec 14 |
nicklas |
450 |
catch (Exception ex) |
3032 |
12 Dec 14 |
nicklas |
451 |
{ |
3032 |
12 Dec 14 |
nicklas |
452 |
logger.error("Exception when performing auto-confirm check", ex); |
3032 |
12 Dec 14 |
nicklas |
453 |
} |
3032 |
12 Dec 14 |
nicklas |
454 |
} |
3032 |
12 Dec 14 |
nicklas |
455 |
|
3032 |
12 Dec 14 |
nicklas |
456 |
} |
3032 |
12 Dec 14 |
nicklas |
457 |
|
3032 |
12 Dec 14 |
nicklas |
458 |
} |