3034 |
12 Dec 14 |
nicklas |
1 |
package net.sf.basedb.reggie.autoconfirm; |
3034 |
12 Dec 14 |
nicklas |
2 |
|
3034 |
12 Dec 14 |
nicklas |
3 |
import java.util.HashMap; |
3034 |
12 Dec 14 |
nicklas |
4 |
import java.util.Map; |
3034 |
12 Dec 14 |
nicklas |
5 |
|
3049 |
17 Dec 14 |
nicklas |
6 |
import org.slf4j.LoggerFactory; |
3049 |
17 Dec 14 |
nicklas |
7 |
|
3034 |
12 Dec 14 |
nicklas |
8 |
import net.sf.basedb.core.Annotatable; |
3247 |
14 Apr 15 |
nicklas |
9 |
import net.sf.basedb.core.ItemList; |
3072 |
13 Jan 15 |
nicklas |
10 |
import net.sf.basedb.core.CommonItem; |
3034 |
12 Dec 14 |
nicklas |
11 |
import net.sf.basedb.core.DbControl; |
3049 |
17 Dec 14 |
nicklas |
12 |
import net.sf.basedb.core.Extract; |
3055 |
19 Dec 14 |
nicklas |
13 |
import net.sf.basedb.core.Job; |
3055 |
19 Dec 14 |
nicklas |
14 |
import net.sf.basedb.core.Project; |
3049 |
17 Dec 14 |
nicklas |
15 |
import net.sf.basedb.core.SessionControl; |
7225 |
31 May 23 |
nicklas |
16 |
import net.sf.basedb.core.User; |
5553 |
12 Aug 19 |
nicklas |
17 |
import net.sf.basedb.reggie.Reggie; |
3034 |
12 Dec 14 |
nicklas |
18 |
import net.sf.basedb.reggie.dao.Annotationtype; |
3049 |
17 Dec 14 |
nicklas |
19 |
import net.sf.basedb.reggie.dao.BiomaterialList; |
5553 |
12 Aug 19 |
nicklas |
20 |
import net.sf.basedb.reggie.dao.Dna; |
3049 |
17 Dec 14 |
nicklas |
21 |
import net.sf.basedb.reggie.dao.Library; |
3049 |
17 Dec 14 |
nicklas |
22 |
import net.sf.basedb.reggie.dao.Rna; |
7077 |
27 Mar 23 |
nicklas |
23 |
import net.sf.basedb.util.extensions.logging.ExtensionsLog; |
7077 |
27 Mar 23 |
nicklas |
24 |
import net.sf.basedb.util.extensions.logging.ExtensionsLogger; |
3034 |
12 Dec 14 |
nicklas |
25 |
|
3034 |
12 Dec 14 |
nicklas |
26 |
/** |
3034 |
12 Dec 14 |
nicklas |
Manager for a batch of auto-confirmations. Each possible |
3034 |
12 Dec 14 |
nicklas |
{@link AutoConfirmer} will be checked and kept either |
3034 |
12 Dec 14 |
nicklas |
for confirmation or resetting. |
3034 |
12 Dec 14 |
nicklas |
30 |
|
3034 |
12 Dec 14 |
nicklas |
@author nicklas |
3045 |
16 Dec 14 |
nicklas |
@since 3.0 |
3034 |
12 Dec 14 |
nicklas |
33 |
*/ |
3034 |
12 Dec 14 |
nicklas |
34 |
public class AutoConfirmManager |
3034 |
12 Dec 14 |
nicklas |
35 |
{ |
3034 |
12 Dec 14 |
nicklas |
36 |
|
7077 |
27 Mar 23 |
nicklas |
37 |
private static final ExtensionsLogger logger = |
7077 |
27 Mar 23 |
nicklas |
38 |
ExtensionsLog.getLogger(AutoConfirmService.ID, true).wrap(LoggerFactory.getLogger(AutoConfirmManager.class)); |
3049 |
17 Dec 14 |
nicklas |
39 |
|
3049 |
17 Dec 14 |
nicklas |
40 |
private final Map<AutoConfirmer<?>, Boolean> autoConfirmers; |
3034 |
12 Dec 14 |
nicklas |
41 |
|
3034 |
12 Dec 14 |
nicklas |
42 |
public AutoConfirmManager() |
3034 |
12 Dec 14 |
nicklas |
43 |
{ |
3049 |
17 Dec 14 |
nicklas |
44 |
this.autoConfirmers = new HashMap<AutoConfirmer<?>, Boolean>(); |
3034 |
12 Dec 14 |
nicklas |
45 |
} |
3034 |
12 Dec 14 |
nicklas |
46 |
|
3034 |
12 Dec 14 |
nicklas |
47 |
|
3034 |
12 Dec 14 |
nicklas |
48 |
/** |
3034 |
12 Dec 14 |
nicklas |
Checks if the given auto-confirm handler passes the rules. The |
3034 |
12 Dec 14 |
nicklas |
result will be stored by the manager so that equal() handlers |
3034 |
12 Dec 14 |
nicklas |
are not processed multiple times. |
3034 |
12 Dec 14 |
nicklas |
52 |
|
3034 |
12 Dec 14 |
nicklas |
@return TRUE if the rules are met, FALSE if not |
3034 |
12 Dec 14 |
nicklas |
54 |
*/ |
3034 |
12 Dec 14 |
nicklas |
55 |
public boolean checkRulesAndAdd(DbControl dc, AutoConfirmer<?> ac) |
3034 |
12 Dec 14 |
nicklas |
56 |
{ |
3034 |
12 Dec 14 |
nicklas |
57 |
if (ac == null) return false; |
3034 |
12 Dec 14 |
nicklas |
58 |
Boolean passed = autoConfirmers.get(ac); |
3034 |
12 Dec 14 |
nicklas |
59 |
if (passed == null) |
3034 |
12 Dec 14 |
nicklas |
60 |
{ |
3049 |
17 Dec 14 |
nicklas |
61 |
logger.debug("Checking rules: " + ac); |
3049 |
17 Dec 14 |
nicklas |
62 |
try |
3049 |
17 Dec 14 |
nicklas |
63 |
{ |
3049 |
17 Dec 14 |
nicklas |
64 |
passed = ac.checkRules(dc, this); |
3049 |
17 Dec 14 |
nicklas |
65 |
logger.debug((passed ? "Passed: " : "Failed: ") + ac); |
3049 |
17 Dec 14 |
nicklas |
66 |
} |
3049 |
17 Dec 14 |
nicklas |
67 |
catch (RuntimeException ex) |
3049 |
17 Dec 14 |
nicklas |
68 |
{ |
3049 |
17 Dec 14 |
nicklas |
69 |
logger.debug("Failed: " + ac, ex); |
3049 |
17 Dec 14 |
nicklas |
70 |
passed = false; |
3049 |
17 Dec 14 |
nicklas |
71 |
} |
3034 |
12 Dec 14 |
nicklas |
72 |
autoConfirmers.put(ac, passed); |
3034 |
12 Dec 14 |
nicklas |
73 |
} |
3034 |
12 Dec 14 |
nicklas |
74 |
return passed; |
3034 |
12 Dec 14 |
nicklas |
75 |
} |
3034 |
12 Dec 14 |
nicklas |
76 |
|
3049 |
17 Dec 14 |
nicklas |
77 |
|
3034 |
12 Dec 14 |
nicklas |
78 |
/** |
3049 |
17 Dec 14 |
nicklas |
Auto-confirm all entries that has passed the rule validation. Note that |
3049 |
17 Dec 14 |
nicklas |
each auto-confirmation is done in it's own transaction so that if something |
3049 |
17 Dec 14 |
nicklas |
fails it should not block other entries. |
3049 |
17 Dec 14 |
nicklas |
82 |
*/ |
3049 |
17 Dec 14 |
nicklas |
83 |
public void autoConfirmAll(SessionControl sc) |
3049 |
17 Dec 14 |
nicklas |
84 |
{ |
3049 |
17 Dec 14 |
nicklas |
85 |
DbControl dc = null; |
3049 |
17 Dec 14 |
nicklas |
86 |
for (Map.Entry<AutoConfirmer<?>, Boolean> entry : autoConfirmers.entrySet()) |
3049 |
17 Dec 14 |
nicklas |
87 |
{ |
3049 |
17 Dec 14 |
nicklas |
88 |
if (!entry.getValue()) continue; |
3049 |
17 Dec 14 |
nicklas |
89 |
|
3049 |
17 Dec 14 |
nicklas |
90 |
AutoConfirmer<?> ac = entry.getKey(); |
3049 |
17 Dec 14 |
nicklas |
91 |
try |
3049 |
17 Dec 14 |
nicklas |
92 |
{ |
3049 |
17 Dec 14 |
nicklas |
// Use a separate DbControl for each items since if one |
3049 |
17 Dec 14 |
nicklas |
// fails it should not block the others |
6599 |
22 Feb 22 |
nicklas |
95 |
dc = sc.newDbControl("Reggie: Auto-confirm"); |
3049 |
17 Dec 14 |
nicklas |
96 |
logger.debug("Auto-confirming: " + ac); |
3049 |
17 Dec 14 |
nicklas |
97 |
boolean passed = ac.autoConfirm(dc, this); |
3049 |
17 Dec 14 |
nicklas |
98 |
entry.setValue(passed); |
3049 |
17 Dec 14 |
nicklas |
99 |
logger.debug((passed ? "Passed: " : "Failed: ") + ac); |
3049 |
17 Dec 14 |
nicklas |
100 |
dc.commit(); |
3049 |
17 Dec 14 |
nicklas |
101 |
} |
3049 |
17 Dec 14 |
nicklas |
102 |
catch (RuntimeException ex) |
3049 |
17 Dec 14 |
nicklas |
103 |
{ |
3049 |
17 Dec 14 |
nicklas |
104 |
entry.setValue(false); |
3049 |
17 Dec 14 |
nicklas |
105 |
logger.error("Failed: " + ac, ex); |
3049 |
17 Dec 14 |
nicklas |
106 |
} |
3049 |
17 Dec 14 |
nicklas |
107 |
finally |
3049 |
17 Dec 14 |
nicklas |
108 |
{ |
3049 |
17 Dec 14 |
nicklas |
109 |
if (dc != null) dc.close(); |
3049 |
17 Dec 14 |
nicklas |
110 |
} |
3049 |
17 Dec 14 |
nicklas |
111 |
|
3049 |
17 Dec 14 |
nicklas |
112 |
} |
3049 |
17 Dec 14 |
nicklas |
113 |
} |
3049 |
17 Dec 14 |
nicklas |
114 |
|
3049 |
17 Dec 14 |
nicklas |
115 |
|
3055 |
19 Dec 14 |
nicklas |
116 |
public void startNextStep(SessionControl sc) |
3055 |
19 Dec 14 |
nicklas |
117 |
{ |
3055 |
19 Dec 14 |
nicklas |
118 |
DbControl dc = null; |
3055 |
19 Dec 14 |
nicklas |
119 |
try |
3055 |
19 Dec 14 |
nicklas |
120 |
{ |
6599 |
22 Feb 22 |
nicklas |
121 |
dc = sc.newDbControl("Reggie: Auto-confirm"); |
3055 |
19 Dec 14 |
nicklas |
122 |
|
3055 |
19 Dec 14 |
nicklas |
123 |
for (Map.Entry<AutoConfirmer<?>, Boolean> entry : autoConfirmers.entrySet()) |
3055 |
19 Dec 14 |
nicklas |
124 |
{ |
3055 |
19 Dec 14 |
nicklas |
125 |
if (!entry.getValue()) continue; |
3055 |
19 Dec 14 |
nicklas |
126 |
|
3055 |
19 Dec 14 |
nicklas |
127 |
AutoConfirmer<?> ac = entry.getKey(); |
3055 |
19 Dec 14 |
nicklas |
128 |
SessionControl impersonated = null; |
3055 |
19 Dec 14 |
nicklas |
129 |
try |
3055 |
19 Dec 14 |
nicklas |
130 |
{ |
3055 |
19 Dec 14 |
nicklas |
// Use a separate DbControl for each items since if one |
3055 |
19 Dec 14 |
nicklas |
// fails it should not block the others |
3055 |
19 Dec 14 |
nicklas |
133 |
Job job = ac.job(dc); |
3055 |
19 Dec 14 |
nicklas |
134 |
int projectId = job != null ? job.getActiveProjectId() : sc.getActiveProjectId(); |
3072 |
13 Jan 15 |
nicklas |
135 |
CommonItem item = ac.item(dc); |
7225 |
31 May 23 |
nicklas |
136 |
User userForNextStep = ac.userForNextStep(dc); |
7225 |
31 May 23 |
nicklas |
137 |
String comment = "Auto-confirming " + (job != null ? " job: " + job.getName() : ": " + item.getName()); |
7225 |
31 May 23 |
nicklas |
138 |
if (userForNextStep != null) |
7225 |
31 May 23 |
nicklas |
139 |
{ |
7225 |
31 May 23 |
nicklas |
140 |
impersonated = sc.impersonateLogin(userForNextStep.getId(), comment); |
7225 |
31 May 23 |
nicklas |
141 |
} |
7225 |
31 May 23 |
nicklas |
142 |
else |
7225 |
31 May 23 |
nicklas |
143 |
{ |
7225 |
31 May 23 |
nicklas |
144 |
impersonated = sc.impersonateLogin(job == null ? item : job, comment); |
7225 |
31 May 23 |
nicklas |
145 |
} |
3055 |
19 Dec 14 |
nicklas |
146 |
if (projectId != 0) |
3055 |
19 Dec 14 |
nicklas |
147 |
{ |
3055 |
19 Dec 14 |
nicklas |
148 |
impersonated.setActiveProject(Project.getById(dc, projectId)); |
3055 |
19 Dec 14 |
nicklas |
149 |
} |
3055 |
19 Dec 14 |
nicklas |
150 |
|
3055 |
19 Dec 14 |
nicklas |
151 |
logger.debug("Starting next step: " + ac); |
3055 |
19 Dec 14 |
nicklas |
152 |
boolean passed = ac.startNextStep(impersonated, this); |
3055 |
19 Dec 14 |
nicklas |
153 |
entry.setValue(passed); |
3072 |
13 Jan 15 |
nicklas |
154 |
logger.debug((passed ? "Started: " : "Not started: ") + ac); |
3055 |
19 Dec 14 |
nicklas |
155 |
} |
3055 |
19 Dec 14 |
nicklas |
156 |
catch (RuntimeException ex) |
3055 |
19 Dec 14 |
nicklas |
157 |
{ |
3055 |
19 Dec 14 |
nicklas |
158 |
entry.setValue(false); |
3055 |
19 Dec 14 |
nicklas |
159 |
logger.error("Failed: " + ac, ex); |
3055 |
19 Dec 14 |
nicklas |
160 |
} |
3055 |
19 Dec 14 |
nicklas |
161 |
finally |
3055 |
19 Dec 14 |
nicklas |
162 |
{ |
3055 |
19 Dec 14 |
nicklas |
163 |
if (impersonated != null) impersonated.close(); |
3055 |
19 Dec 14 |
nicklas |
164 |
} |
3055 |
19 Dec 14 |
nicklas |
165 |
} |
3055 |
19 Dec 14 |
nicklas |
166 |
|
3055 |
19 Dec 14 |
nicklas |
167 |
} |
3055 |
19 Dec 14 |
nicklas |
168 |
finally |
3055 |
19 Dec 14 |
nicklas |
169 |
{ |
3069 |
09 Jan 15 |
nicklas |
170 |
if (dc != null) dc.close(); |
3055 |
19 Dec 14 |
nicklas |
171 |
} |
3055 |
19 Dec 14 |
nicklas |
172 |
} |
3055 |
19 Dec 14 |
nicklas |
173 |
|
3049 |
17 Dec 14 |
nicklas |
174 |
/** |
3034 |
12 Dec 14 |
nicklas |
Utility method for resetting the AutoProcessing annotation |
3034 |
12 Dec 14 |
nicklas |
on the given item. |
3034 |
12 Dec 14 |
nicklas |
@see Annotationtype#AUTO_PROCESSING |
3034 |
12 Dec 14 |
nicklas |
178 |
*/ |
3034 |
12 Dec 14 |
nicklas |
179 |
public void resetAutoProcessing(DbControl dc, Annotatable item) |
3034 |
12 Dec 14 |
nicklas |
180 |
{ |
3034 |
12 Dec 14 |
nicklas |
181 |
Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, item, null); |
3034 |
12 Dec 14 |
nicklas |
182 |
} |
3049 |
17 Dec 14 |
nicklas |
183 |
|
3049 |
17 Dec 14 |
nicklas |
184 |
/** |
6021 |
23 Oct 20 |
nicklas |
Utility method for resetting the AutoConfirmHandler parameter |
6021 |
23 Oct 20 |
nicklas |
on the given job. |
6021 |
23 Oct 20 |
nicklas |
@since 4.28 |
6021 |
23 Oct 20 |
nicklas |
188 |
*/ |
6021 |
23 Oct 20 |
nicklas |
189 |
public void resetAutoConfirmHandler(DbControl dc, Job job) |
6021 |
23 Oct 20 |
nicklas |
190 |
{ |
6021 |
23 Oct 20 |
nicklas |
191 |
job.setParameterValues("AutoConfirmHandler", null, null); |
6021 |
23 Oct 20 |
nicklas |
192 |
} |
6021 |
23 Oct 20 |
nicklas |
193 |
|
6021 |
23 Oct 20 |
nicklas |
194 |
/** |
3049 |
17 Dec 14 |
nicklas |
Utility method for flagging the RNA the given library is derived |
3049 |
17 Dec 14 |
nicklas |
from. The RNA will be added to the {@link BiomaterialList#FLAGGED_RNA} |
3049 |
17 Dec 14 |
nicklas |
list and the {@link Annotationtype#FLAG} is set to the specified values. |
3049 |
17 Dec 14 |
nicklas |
Note that External RNA or Stratagene is ignored. |
3049 |
17 Dec 14 |
nicklas |
199 |
*/ |
3049 |
17 Dec 14 |
nicklas |
200 |
public void flagRna(DbControl dc, Extract library, String flag) |
3049 |
17 Dec 14 |
nicklas |
201 |
{ |
5553 |
12 Aug 19 |
nicklas |
202 |
if (Reggie.isExternalItem(library.getName())) return; |
3049 |
17 Dec 14 |
nicklas |
203 |
|
3247 |
14 Apr 15 |
nicklas |
204 |
ItemList flaggedRna = BiomaterialList.FLAGGED_RNA.load(dc); |
3049 |
17 Dec 14 |
nicklas |
205 |
|
3049 |
17 Dec 14 |
nicklas |
206 |
Library lib = Library.get(library); |
3309 |
06 May 15 |
nicklas |
207 |
Rna rna = lib.getRna(dc, false); |
3049 |
17 Dec 14 |
nicklas |
208 |
Extract r = rna.getItem(); |
3049 |
17 Dec 14 |
nicklas |
209 |
Annotationtype.FLAG.setAnnotationValue(dc, r, flag); |
3049 |
17 Dec 14 |
nicklas |
210 |
|
3049 |
17 Dec 14 |
nicklas |
211 |
flaggedRna.add(r); |
3049 |
17 Dec 14 |
nicklas |
212 |
} |
3049 |
17 Dec 14 |
nicklas |
213 |
|
5553 |
12 Aug 19 |
nicklas |
214 |
/** |
5553 |
12 Aug 19 |
nicklas |
Utility method for flagging the DNA the given library is derived |
5553 |
12 Aug 19 |
nicklas |
from. The DNA will be added to the {@link BiomaterialList#FLAGGED_DNA} |
5553 |
12 Aug 19 |
nicklas |
list and the {@link Annotationtype#FLAG} is set to the specified values. |
5553 |
12 Aug 19 |
nicklas |
Note that External DNA is ignored. |
5553 |
12 Aug 19 |
nicklas |
@since 4.23 |
5553 |
12 Aug 19 |
nicklas |
220 |
*/ |
5553 |
12 Aug 19 |
nicklas |
221 |
public void flagDna(DbControl dc, Extract library, String flag) |
5553 |
12 Aug 19 |
nicklas |
222 |
{ |
5553 |
12 Aug 19 |
nicklas |
223 |
if (Reggie.isExternalItem(library.getName())) return; |
5553 |
12 Aug 19 |
nicklas |
224 |
|
5553 |
12 Aug 19 |
nicklas |
225 |
ItemList flaggedDna = BiomaterialList.FLAGGED_DNA.load(dc); |
5553 |
12 Aug 19 |
nicklas |
226 |
|
5553 |
12 Aug 19 |
nicklas |
227 |
Library lib = Library.get(library); |
5553 |
12 Aug 19 |
nicklas |
228 |
Dna dna = lib.getDna(dc, false); |
5553 |
12 Aug 19 |
nicklas |
229 |
Extract d = dna.getItem(); |
5553 |
12 Aug 19 |
nicklas |
230 |
Annotationtype.FLAG.setAnnotationValue(dc, d, flag); |
5553 |
12 Aug 19 |
nicklas |
231 |
|
5553 |
12 Aug 19 |
nicklas |
232 |
flaggedDna.add(d); |
5553 |
12 Aug 19 |
nicklas |
233 |
} |
5553 |
12 Aug 19 |
nicklas |
234 |
|
5553 |
12 Aug 19 |
nicklas |
235 |
|
3034 |
12 Dec 14 |
nicklas |
236 |
} |