6161 |
04 Mar 21 |
nicklas |
1 |
package net.sf.basedb.varsearch.servlet; |
6161 |
04 Mar 21 |
nicklas |
2 |
|
6161 |
04 Mar 21 |
nicklas |
3 |
import java.io.IOException; |
6161 |
04 Mar 21 |
nicklas |
4 |
import java.util.ArrayList; |
6161 |
04 Mar 21 |
nicklas |
5 |
import java.util.Arrays; |
6161 |
04 Mar 21 |
nicklas |
6 |
import java.util.Collections; |
6161 |
04 Mar 21 |
nicklas |
7 |
import java.util.HashMap; |
6161 |
04 Mar 21 |
nicklas |
8 |
import java.util.List; |
6161 |
04 Mar 21 |
nicklas |
9 |
import java.util.Map; |
6161 |
04 Mar 21 |
nicklas |
10 |
import java.util.Set; |
6161 |
04 Mar 21 |
nicklas |
11 |
|
6161 |
04 Mar 21 |
nicklas |
12 |
import javax.servlet.ServletException; |
6161 |
04 Mar 21 |
nicklas |
13 |
import javax.servlet.http.HttpServlet; |
6161 |
04 Mar 21 |
nicklas |
14 |
import javax.servlet.http.HttpServletRequest; |
6161 |
04 Mar 21 |
nicklas |
15 |
import javax.servlet.http.HttpServletResponse; |
6161 |
04 Mar 21 |
nicklas |
16 |
|
6161 |
04 Mar 21 |
nicklas |
17 |
import org.json.simple.JSONArray; |
6161 |
04 Mar 21 |
nicklas |
18 |
import org.json.simple.JSONObject; |
6161 |
04 Mar 21 |
nicklas |
19 |
|
6161 |
04 Mar 21 |
nicklas |
20 |
import net.sf.basedb.core.AnnotationType; |
6161 |
04 Mar 21 |
nicklas |
21 |
import net.sf.basedb.core.DataFileType; |
6161 |
04 Mar 21 |
nicklas |
22 |
import net.sf.basedb.core.DbControl; |
6161 |
04 Mar 21 |
nicklas |
23 |
import net.sf.basedb.core.Group; |
6161 |
04 Mar 21 |
nicklas |
24 |
import net.sf.basedb.core.Item; |
6161 |
04 Mar 21 |
nicklas |
25 |
import net.sf.basedb.core.ItemKey; |
6161 |
04 Mar 21 |
nicklas |
26 |
import net.sf.basedb.core.ItemList; |
6543 |
18 Jan 22 |
nicklas |
27 |
import net.sf.basedb.core.ItemNotFoundException; |
6161 |
04 Mar 21 |
nicklas |
28 |
import net.sf.basedb.core.MultiPermissions; |
6161 |
04 Mar 21 |
nicklas |
29 |
import net.sf.basedb.core.Permission; |
6161 |
04 Mar 21 |
nicklas |
30 |
import net.sf.basedb.core.Platform; |
6161 |
04 Mar 21 |
nicklas |
31 |
import net.sf.basedb.core.PlatformVariant; |
6161 |
04 Mar 21 |
nicklas |
32 |
import net.sf.basedb.core.Project; |
6161 |
04 Mar 21 |
nicklas |
33 |
import net.sf.basedb.core.ProjectKey; |
6161 |
04 Mar 21 |
nicklas |
34 |
import net.sf.basedb.core.SessionControl; |
6161 |
04 Mar 21 |
nicklas |
35 |
import net.sf.basedb.core.SharedItem; |
6161 |
04 Mar 21 |
nicklas |
36 |
import net.sf.basedb.core.SystemItems; |
6161 |
04 Mar 21 |
nicklas |
37 |
import net.sf.basedb.util.error.ThrowableUtil; |
6161 |
04 Mar 21 |
nicklas |
38 |
import net.sf.basedb.varsearch.JsonUtil; |
6161 |
04 Mar 21 |
nicklas |
39 |
import net.sf.basedb.varsearch.VarSearch; |
6161 |
04 Mar 21 |
nicklas |
40 |
import net.sf.basedb.varsearch.dao.Annotationtype; |
6161 |
04 Mar 21 |
nicklas |
41 |
import net.sf.basedb.varsearch.dao.Datafiletype; |
6161 |
04 Mar 21 |
nicklas |
42 |
import net.sf.basedb.varsearch.dao.Itemlist; |
6161 |
04 Mar 21 |
nicklas |
43 |
import net.sf.basedb.varsearch.dao.Rawdatatype; |
6161 |
04 Mar 21 |
nicklas |
44 |
|
6161 |
04 Mar 21 |
nicklas |
45 |
/** |
6161 |
04 Mar 21 |
nicklas |
Servlet that verify and install items that are required by |
6161 |
04 Mar 21 |
nicklas |
other Relax actions. |
6161 |
04 Mar 21 |
nicklas |
48 |
|
6161 |
04 Mar 21 |
nicklas |
@author nicklas |
6161 |
04 Mar 21 |
nicklas |
@since 1.0 |
6161 |
04 Mar 21 |
nicklas |
51 |
*/ |
6161 |
04 Mar 21 |
nicklas |
52 |
public class InstallServlet |
6161 |
04 Mar 21 |
nicklas |
53 |
extends HttpServlet |
6161 |
04 Mar 21 |
nicklas |
54 |
{ |
6161 |
04 Mar 21 |
nicklas |
55 |
|
6161 |
04 Mar 21 |
nicklas |
56 |
|
6161 |
04 Mar 21 |
nicklas |
57 |
private static final long serialVersionUID = -1102755485743652012L; |
6161 |
04 Mar 21 |
nicklas |
58 |
|
6161 |
04 Mar 21 |
nicklas |
59 |
public InstallServlet() |
6161 |
04 Mar 21 |
nicklas |
60 |
{} |
6161 |
04 Mar 21 |
nicklas |
61 |
|
6161 |
04 Mar 21 |
nicklas |
62 |
@Override |
6161 |
04 Mar 21 |
nicklas |
63 |
protected void doGet(HttpServletRequest req, HttpServletResponse resp) |
6161 |
04 Mar 21 |
nicklas |
64 |
throws ServletException, IOException |
6161 |
04 Mar 21 |
nicklas |
65 |
{ |
6161 |
04 Mar 21 |
nicklas |
66 |
String cmd = req.getParameter("cmd"); |
6161 |
04 Mar 21 |
nicklas |
67 |
JsonUtil.setJsonResponseHeaders(resp); |
6161 |
04 Mar 21 |
nicklas |
68 |
|
6161 |
04 Mar 21 |
nicklas |
69 |
JSONObject json = new JSONObject(); |
6161 |
04 Mar 21 |
nicklas |
70 |
json.put("status", "ok"); |
6161 |
04 Mar 21 |
nicklas |
71 |
|
6161 |
04 Mar 21 |
nicklas |
72 |
final SessionControl sc = VarSearch.getSessionControl(req); |
6161 |
04 Mar 21 |
nicklas |
73 |
DbControl dc = null; |
6161 |
04 Mar 21 |
nicklas |
74 |
String progressId = null; |
6161 |
04 Mar 21 |
nicklas |
75 |
try |
6161 |
04 Mar 21 |
nicklas |
76 |
{ |
6161 |
04 Mar 21 |
nicklas |
77 |
if ("Validate".equals(cmd) || "Install".equals(cmd)) |
6161 |
04 Mar 21 |
nicklas |
78 |
{ |
6161 |
04 Mar 21 |
nicklas |
79 |
VarSearch.checkIsAdmin(sc, "'" + cmd + "' wizard"); |
6161 |
04 Mar 21 |
nicklas |
80 |
|
6161 |
04 Mar 21 |
nicklas |
81 |
|
6604 |
23 Feb 22 |
nicklas |
82 |
dc = sc.newDbControl("Variant search: Installation wizard"); |
6161 |
04 Mar 21 |
nicklas |
83 |
|
6161 |
04 Mar 21 |
nicklas |
84 |
boolean createIfMissing = "Install".equals(cmd); |
6161 |
04 Mar 21 |
nicklas |
85 |
JSONArray jsonChecks = new JSONArray(); |
6161 |
04 Mar 21 |
nicklas |
86 |
|
6161 |
04 Mar 21 |
nicklas |
87 |
Group everyone = Group.getById(dc, SystemItems.getId(Group.EVERYONE)); |
6161 |
04 Mar 21 |
nicklas |
88 |
|
6161 |
04 Mar 21 |
nicklas |
// READ permission for the EVERYONE group |
6161 |
04 Mar 21 |
nicklas |
90 |
PermissionOptions everyoneRead = new PermissionOptions(); |
6161 |
04 Mar 21 |
nicklas |
91 |
everyoneRead.set(everyone, Permission.READ); |
6161 |
04 Mar 21 |
nicklas |
92 |
|
6161 |
04 Mar 21 |
nicklas |
93 |
PermissionOptions everyoneDenied = new PermissionOptions(); |
6161 |
04 Mar 21 |
nicklas |
94 |
everyoneDenied.set(everyone, null); |
6161 |
04 Mar 21 |
nicklas |
95 |
|
6161 |
04 Mar 21 |
nicklas |
// Annotation type checks |
6161 |
04 Mar 21 |
nicklas |
97 |
jsonChecks.add(checkAnnotationType(dc, Annotationtype.AUTO_PROCESSING, |
6161 |
04 Mar 21 |
nicklas |
// List of current releases -- new ones are added automatically by the release importer |
6161 |
04 Mar 21 |
nicklas |
99 |
new ValueOptions("Disable"), |
6161 |
04 Mar 21 |
nicklas |
100 |
createIfMissing)); |
6161 |
04 Mar 21 |
nicklas |
101 |
|
6161 |
04 Mar 21 |
nicklas |
// Platform |
6161 |
04 Mar 21 |
nicklas |
103 |
jsonChecks.add(checkPlatform(dc, Rawdatatype.VARIANT_CALL, createIfMissing)); |
6543 |
18 Jan 22 |
nicklas |
104 |
jsonChecks.add(checkPlatform(dc, Rawdatatype.ONCOARRAY500K, createIfMissing)); |
6161 |
04 Mar 21 |
nicklas |
105 |
|
6161 |
04 Mar 21 |
nicklas |
// Data file types |
6161 |
04 Mar 21 |
nicklas |
107 |
jsonChecks.add(checkDataFileType(dc, Datafiletype.VCF, createIfMissing)); |
6543 |
18 Jan 22 |
nicklas |
108 |
jsonChecks.add(checkDataFileType(dc, Datafiletype.VCF_DESIGN, createIfMissing)); |
6161 |
04 Mar 21 |
nicklas |
109 |
|
6161 |
04 Mar 21 |
nicklas |
// Item lists |
6161 |
04 Mar 21 |
nicklas |
111 |
jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_FILTERED, true, null, createIfMissing)); |
6161 |
04 Mar 21 |
nicklas |
112 |
jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_ALL, true, null, createIfMissing)); |
6371 |
07 Sep 21 |
nicklas |
113 |
jsonChecks.add(checkItemList(dc, Itemlist.VARIANT_INDEX_TARGETED, true, null, createIfMissing)); |
6539 |
17 Jan 22 |
nicklas |
114 |
jsonChecks.add(checkItemList(dc, Itemlist.GENOTYPING_ONCOARRAY_500K, true, null, createIfMissing)); |
6161 |
04 Mar 21 |
nicklas |
115 |
|
6161 |
04 Mar 21 |
nicklas |
116 |
json.put("checks", jsonChecks); |
6161 |
04 Mar 21 |
nicklas |
117 |
|
6161 |
04 Mar 21 |
nicklas |
118 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
119 |
{ |
6161 |
04 Mar 21 |
nicklas |
120 |
dc.commit(); |
6161 |
04 Mar 21 |
nicklas |
121 |
} |
6161 |
04 Mar 21 |
nicklas |
122 |
} |
6161 |
04 Mar 21 |
nicklas |
123 |
} |
6161 |
04 Mar 21 |
nicklas |
124 |
catch (Throwable t) |
6161 |
04 Mar 21 |
nicklas |
125 |
{ |
6161 |
04 Mar 21 |
nicklas |
126 |
t.printStackTrace(); |
6161 |
04 Mar 21 |
nicklas |
127 |
json.clear(); |
6161 |
04 Mar 21 |
nicklas |
128 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
129 |
json.put("message", t.getMessage()); |
6161 |
04 Mar 21 |
nicklas |
130 |
json.put("stacktrace", ThrowableUtil.stackTraceToString(t)); |
6161 |
04 Mar 21 |
nicklas |
131 |
} |
6161 |
04 Mar 21 |
nicklas |
132 |
finally |
6161 |
04 Mar 21 |
nicklas |
133 |
{ |
6161 |
04 Mar 21 |
nicklas |
134 |
if (dc != null) dc.close(); |
6161 |
04 Mar 21 |
nicklas |
135 |
if (sc != null && progressId != null) sc.setSessionSetting(progressId, null); |
6161 |
04 Mar 21 |
nicklas |
136 |
json.writeJSONString(resp.getWriter()); |
6161 |
04 Mar 21 |
nicklas |
137 |
} |
6161 |
04 Mar 21 |
nicklas |
138 |
} |
6161 |
04 Mar 21 |
nicklas |
139 |
|
6161 |
04 Mar 21 |
nicklas |
140 |
|
6161 |
04 Mar 21 |
nicklas |
141 |
|
6161 |
04 Mar 21 |
nicklas |
142 |
|
6161 |
04 Mar 21 |
nicklas |
143 |
/** |
6161 |
04 Mar 21 |
nicklas |
Creates an annotation type with the given options. The annotation |
6161 |
04 Mar 21 |
nicklas |
type is created in a separate transaction. The annotation can be enabled for |
6161 |
04 Mar 21 |
nicklas |
one or more item-types. |
6161 |
04 Mar 21 |
nicklas |
147 |
*/ |
6161 |
04 Mar 21 |
nicklas |
148 |
public AnnotationType createAnnotationType(SessionControl sc, Annotationtype annotationType, |
6161 |
04 Mar 21 |
nicklas |
149 |
ValueOptions valueOptions, PermissionOptions... permissions) |
6161 |
04 Mar 21 |
nicklas |
150 |
{ |
6161 |
04 Mar 21 |
nicklas |
151 |
AnnotationType at = null; |
6604 |
23 Feb 22 |
nicklas |
152 |
DbControl dc = sc.newDbControl("Variant search: Installation wizard"); |
6161 |
04 Mar 21 |
nicklas |
153 |
try |
6161 |
04 Mar 21 |
nicklas |
154 |
{ |
6161 |
04 Mar 21 |
nicklas |
155 |
at = AnnotationType.getNew(dc, annotationType.getValueType()); |
6161 |
04 Mar 21 |
nicklas |
156 |
at.setName(annotationType.getName()); |
6161 |
04 Mar 21 |
nicklas |
157 |
for (Item it : annotationType.getMainType()) |
6161 |
04 Mar 21 |
nicklas |
158 |
{ |
6161 |
04 Mar 21 |
nicklas |
159 |
at.enableForItem(it); |
6161 |
04 Mar 21 |
nicklas |
160 |
} |
6161 |
04 Mar 21 |
nicklas |
161 |
at.setMultiplicity(1); |
6161 |
04 Mar 21 |
nicklas |
162 |
if (valueOptions != null) |
6161 |
04 Mar 21 |
nicklas |
163 |
{ |
6161 |
04 Mar 21 |
nicklas |
164 |
if (valueOptions.isEnumeration()) |
6161 |
04 Mar 21 |
nicklas |
165 |
{ |
6161 |
04 Mar 21 |
nicklas |
166 |
at.setEnumeration(true); |
6161 |
04 Mar 21 |
nicklas |
167 |
at.setDisplayAsList(false); |
6161 |
04 Mar 21 |
nicklas |
168 |
at.setValues(valueOptions.getList()); |
6161 |
04 Mar 21 |
nicklas |
169 |
} |
6161 |
04 Mar 21 |
nicklas |
170 |
} |
6161 |
04 Mar 21 |
nicklas |
171 |
if (permissions != null) |
6161 |
04 Mar 21 |
nicklas |
172 |
{ |
6161 |
04 Mar 21 |
nicklas |
173 |
for (PermissionOptions p : permissions) |
6161 |
04 Mar 21 |
nicklas |
174 |
{ |
6161 |
04 Mar 21 |
nicklas |
175 |
p.applyPermissions(at); |
6161 |
04 Mar 21 |
nicklas |
176 |
} |
6161 |
04 Mar 21 |
nicklas |
177 |
} |
6161 |
04 Mar 21 |
nicklas |
178 |
dc.saveItem(at); |
6161 |
04 Mar 21 |
nicklas |
179 |
dc.commit(); |
6161 |
04 Mar 21 |
nicklas |
180 |
} |
6161 |
04 Mar 21 |
nicklas |
181 |
finally |
6161 |
04 Mar 21 |
nicklas |
182 |
{ |
6161 |
04 Mar 21 |
nicklas |
183 |
if (dc != null) dc.close(); |
6161 |
04 Mar 21 |
nicklas |
184 |
} |
6161 |
04 Mar 21 |
nicklas |
185 |
return at; |
6161 |
04 Mar 21 |
nicklas |
186 |
} |
6161 |
04 Mar 21 |
nicklas |
187 |
|
6161 |
04 Mar 21 |
nicklas |
188 |
/** |
6161 |
04 Mar 21 |
nicklas |
Check for an existing annotation type with the given options. A JSONObject is returned |
6161 |
04 Mar 21 |
nicklas |
with the result. The following keys are used: |
6161 |
04 Mar 21 |
nicklas |
<ul> |
6161 |
04 Mar 21 |
nicklas |
<li>itemType: ANNOTATIONTYPE |
6161 |
04 Mar 21 |
nicklas |
<li>name: The name of the annotation type |
6161 |
04 Mar 21 |
nicklas |
<li>id: The id of the annotation type if it exists |
6161 |
04 Mar 21 |
nicklas |
<li>status: ok, error, or missing |
6161 |
04 Mar 21 |
nicklas |
<li>message: A descriptive message in case of an error |
6161 |
04 Mar 21 |
nicklas |
</ul> |
6161 |
04 Mar 21 |
nicklas |
198 |
*/ |
6161 |
04 Mar 21 |
nicklas |
199 |
public JSONObject checkAnnotationType(DbControl dc, Annotationtype annotationType, |
6161 |
04 Mar 21 |
nicklas |
200 |
ValueOptions valueOptions, boolean createIfMissing, PermissionOptions... permissions) |
6161 |
04 Mar 21 |
nicklas |
201 |
{ |
6161 |
04 Mar 21 |
nicklas |
202 |
JSONObject json = new JSONObject(); |
6161 |
04 Mar 21 |
nicklas |
203 |
JSONArray jsonMessages = new JSONArray(); |
6161 |
04 Mar 21 |
nicklas |
204 |
json.put("itemType", Item.ANNOTATIONTYPE.name()); |
6161 |
04 Mar 21 |
nicklas |
205 |
json.put("name", annotationType.getName()); |
6161 |
04 Mar 21 |
nicklas |
206 |
|
6161 |
04 Mar 21 |
nicklas |
207 |
List<AnnotationType> result = annotationType.list(dc); |
6161 |
04 Mar 21 |
nicklas |
208 |
if (result.size() == 0) |
6161 |
04 Mar 21 |
nicklas |
209 |
{ |
6161 |
04 Mar 21 |
nicklas |
210 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
211 |
{ |
6161 |
04 Mar 21 |
nicklas |
212 |
AnnotationType at = createAnnotationType(dc.getSessionControl(), annotationType, valueOptions, permissions); |
6161 |
04 Mar 21 |
nicklas |
213 |
json.put("id", at.getId()); |
6161 |
04 Mar 21 |
nicklas |
214 |
json.put("status", "ok"); |
6161 |
04 Mar 21 |
nicklas |
215 |
jsonMessages.add("Created"); |
6161 |
04 Mar 21 |
nicklas |
216 |
} |
6161 |
04 Mar 21 |
nicklas |
217 |
else |
6161 |
04 Mar 21 |
nicklas |
218 |
{ |
6161 |
04 Mar 21 |
nicklas |
219 |
json.put("status", "missing"); |
6161 |
04 Mar 21 |
nicklas |
220 |
jsonMessages.add("Not found"); |
6161 |
04 Mar 21 |
nicklas |
221 |
} |
6161 |
04 Mar 21 |
nicklas |
222 |
} |
6161 |
04 Mar 21 |
nicklas |
223 |
else if (result.size() > 1) |
6161 |
04 Mar 21 |
nicklas |
224 |
{ |
6161 |
04 Mar 21 |
nicklas |
225 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
226 |
jsonMessages.add("Found > 1 annotation type"); |
6161 |
04 Mar 21 |
nicklas |
227 |
} |
6161 |
04 Mar 21 |
nicklas |
228 |
else |
6161 |
04 Mar 21 |
nicklas |
229 |
{ |
6161 |
04 Mar 21 |
nicklas |
230 |
AnnotationType at = result.get(0); |
6161 |
04 Mar 21 |
nicklas |
231 |
json.put("id", at.getId()); |
6161 |
04 Mar 21 |
nicklas |
232 |
json.put("status", "ok");// For now -- more checks below |
6161 |
04 Mar 21 |
nicklas |
233 |
if (permissions != null) |
6161 |
04 Mar 21 |
nicklas |
234 |
{ |
6161 |
04 Mar 21 |
nicklas |
235 |
String permissionCheck = null; |
6161 |
04 Mar 21 |
nicklas |
236 |
for (PermissionOptions p : permissions) |
6161 |
04 Mar 21 |
nicklas |
237 |
{ |
6161 |
04 Mar 21 |
nicklas |
238 |
if (!p.checkPermissions(at)) |
6161 |
04 Mar 21 |
nicklas |
239 |
{ |
6161 |
04 Mar 21 |
nicklas |
240 |
permissionCheck = p.getMessage(); |
6161 |
04 Mar 21 |
nicklas |
241 |
break; |
6161 |
04 Mar 21 |
nicklas |
242 |
} |
6161 |
04 Mar 21 |
nicklas |
243 |
} |
6161 |
04 Mar 21 |
nicklas |
244 |
|
6161 |
04 Mar 21 |
nicklas |
245 |
if (permissionCheck != null) |
6161 |
04 Mar 21 |
nicklas |
246 |
{ |
6161 |
04 Mar 21 |
nicklas |
247 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
248 |
{ |
6161 |
04 Mar 21 |
nicklas |
249 |
for (PermissionOptions p : permissions) |
6161 |
04 Mar 21 |
nicklas |
250 |
{ |
6161 |
04 Mar 21 |
nicklas |
251 |
p.applyPermissions(at); |
6161 |
04 Mar 21 |
nicklas |
252 |
} |
6161 |
04 Mar 21 |
nicklas |
253 |
if (jsonMessages.size() == 0) jsonMessages.add("Fixed"); |
6161 |
04 Mar 21 |
nicklas |
254 |
} |
6161 |
04 Mar 21 |
nicklas |
255 |
else |
6161 |
04 Mar 21 |
nicklas |
256 |
{ |
6161 |
04 Mar 21 |
nicklas |
257 |
json.put("status", "incomplete"); |
6161 |
04 Mar 21 |
nicklas |
258 |
jsonMessages.add(permissionCheck); |
6161 |
04 Mar 21 |
nicklas |
259 |
} |
6161 |
04 Mar 21 |
nicklas |
260 |
} |
6161 |
04 Mar 21 |
nicklas |
261 |
} |
6161 |
04 Mar 21 |
nicklas |
262 |
boolean allTypesOk = true; |
6161 |
04 Mar 21 |
nicklas |
263 |
boolean fixedTypes = false; |
6161 |
04 Mar 21 |
nicklas |
264 |
for (Item it : annotationType.getMainType()) |
6161 |
04 Mar 21 |
nicklas |
265 |
{ |
6161 |
04 Mar 21 |
nicklas |
266 |
if (!at.isEnabledForItem(it)) |
6161 |
04 Mar 21 |
nicklas |
267 |
{ |
6161 |
04 Mar 21 |
nicklas |
268 |
allTypesOk = false; |
6161 |
04 Mar 21 |
nicklas |
269 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
270 |
{ |
6161 |
04 Mar 21 |
nicklas |
271 |
at.enableForItem(it); |
6161 |
04 Mar 21 |
nicklas |
272 |
fixedTypes = true; |
6161 |
04 Mar 21 |
nicklas |
273 |
} |
6161 |
04 Mar 21 |
nicklas |
274 |
else |
6161 |
04 Mar 21 |
nicklas |
275 |
{ |
6161 |
04 Mar 21 |
nicklas |
276 |
json.put("status", "incomplete"); |
6161 |
04 Mar 21 |
nicklas |
277 |
jsonMessages.add("Not enabled for " + it.name()); |
6161 |
04 Mar 21 |
nicklas |
278 |
} |
6161 |
04 Mar 21 |
nicklas |
279 |
} |
6161 |
04 Mar 21 |
nicklas |
280 |
} |
6161 |
04 Mar 21 |
nicklas |
281 |
if (fixedTypes && jsonMessages.size() == 0) jsonMessages.add("Fixed"); |
6161 |
04 Mar 21 |
nicklas |
282 |
if (at.getValueType() != annotationType.getValueType()) |
6161 |
04 Mar 21 |
nicklas |
283 |
{ |
6161 |
04 Mar 21 |
nicklas |
284 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
285 |
jsonMessages.add("Is not a " + annotationType.getValueType().name() + " type"); |
6161 |
04 Mar 21 |
nicklas |
286 |
} |
6161 |
04 Mar 21 |
nicklas |
287 |
if (at.getMultiplicity() != 1) |
6161 |
04 Mar 21 |
nicklas |
288 |
{ |
6161 |
04 Mar 21 |
nicklas |
289 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
290 |
jsonMessages.add("Should have multiplicity=1"); |
6161 |
04 Mar 21 |
nicklas |
291 |
} |
6161 |
04 Mar 21 |
nicklas |
292 |
if (at.isEnumeration() && (valueOptions == null || !valueOptions.isEnumeration())) |
6161 |
04 Mar 21 |
nicklas |
293 |
{ |
6161 |
04 Mar 21 |
nicklas |
294 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
295 |
jsonMessages.add("Should not be an enumeration"); |
6161 |
04 Mar 21 |
nicklas |
296 |
} |
6161 |
04 Mar 21 |
nicklas |
297 |
if (valueOptions != null) |
6161 |
04 Mar 21 |
nicklas |
298 |
{ |
6161 |
04 Mar 21 |
nicklas |
299 |
if (valueOptions.isEnumeration()) |
6161 |
04 Mar 21 |
nicklas |
300 |
{ |
6161 |
04 Mar 21 |
nicklas |
301 |
if (!at.isEnumeration()) |
6161 |
04 Mar 21 |
nicklas |
302 |
{ |
6161 |
04 Mar 21 |
nicklas |
303 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
304 |
jsonMessages.add("Is not enumeration of: " + valueOptions.getList()); |
6161 |
04 Mar 21 |
nicklas |
305 |
} |
6161 |
04 Mar 21 |
nicklas |
306 |
else if (!at.getValues().containsAll(valueOptions.getList())) |
6161 |
04 Mar 21 |
nicklas |
307 |
{ |
6161 |
04 Mar 21 |
nicklas |
308 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
309 |
{ |
6161 |
04 Mar 21 |
nicklas |
310 |
valueOptions.applyEnumeration(at); |
6161 |
04 Mar 21 |
nicklas |
311 |
if (jsonMessages.size() == 0) jsonMessages.add("Fixed"); |
6161 |
04 Mar 21 |
nicklas |
312 |
} |
6161 |
04 Mar 21 |
nicklas |
313 |
else |
6161 |
04 Mar 21 |
nicklas |
314 |
{ |
6161 |
04 Mar 21 |
nicklas |
315 |
json.put("status", "incomplete"); |
6161 |
04 Mar 21 |
nicklas |
316 |
jsonMessages.add("Doesn't have all options: " + valueOptions.getList() + "!=" + at.getValues()); |
6161 |
04 Mar 21 |
nicklas |
317 |
} |
6161 |
04 Mar 21 |
nicklas |
318 |
} |
6161 |
04 Mar 21 |
nicklas |
319 |
} |
6161 |
04 Mar 21 |
nicklas |
320 |
} |
6161 |
04 Mar 21 |
nicklas |
321 |
} |
6161 |
04 Mar 21 |
nicklas |
322 |
if (jsonMessages.size() == 0) jsonMessages.add("Ok"); |
6161 |
04 Mar 21 |
nicklas |
323 |
json.put("messages", jsonMessages); |
6161 |
04 Mar 21 |
nicklas |
324 |
return json; |
6161 |
04 Mar 21 |
nicklas |
325 |
} |
6161 |
04 Mar 21 |
nicklas |
326 |
|
6161 |
04 Mar 21 |
nicklas |
327 |
/** |
6161 |
04 Mar 21 |
nicklas |
Create an item list with the given options. The list is created in |
6161 |
04 Mar 21 |
nicklas |
a separate transaction. |
6161 |
04 Mar 21 |
nicklas |
330 |
*/ |
6161 |
04 Mar 21 |
nicklas |
331 |
public ItemList createItemList(SessionControl sc, Itemlist def, PermissionOptions permissions) |
6161 |
04 Mar 21 |
nicklas |
332 |
{ |
6161 |
04 Mar 21 |
nicklas |
333 |
ItemList list = null; |
6604 |
23 Feb 22 |
nicklas |
334 |
DbControl dc = sc.newDbControl("Variant search: Installation wizard"); |
6161 |
04 Mar 21 |
nicklas |
335 |
try |
6161 |
04 Mar 21 |
nicklas |
336 |
{ |
6161 |
04 Mar 21 |
nicklas |
337 |
list = ItemList.getNew(dc, def.getItemType()); |
6161 |
04 Mar 21 |
nicklas |
338 |
list.setName(def.getName()); |
6161 |
04 Mar 21 |
nicklas |
339 |
list.setExternalId(def.getExternalId()); |
6161 |
04 Mar 21 |
nicklas |
340 |
if (def.getRawdatatype() != null) |
6161 |
04 Mar 21 |
nicklas |
341 |
{ |
6161 |
04 Mar 21 |
nicklas |
342 |
list.setRawDataType(def.getRawdatatype().getRawDataType()); |
6161 |
04 Mar 21 |
nicklas |
343 |
} |
6161 |
04 Mar 21 |
nicklas |
344 |
list.setDescription(def.getDescription()); |
6161 |
04 Mar 21 |
nicklas |
345 |
if (permissions != null) permissions.applyPermissions(list); |
6161 |
04 Mar 21 |
nicklas |
346 |
|
6161 |
04 Mar 21 |
nicklas |
347 |
dc.saveItem(list); |
6161 |
04 Mar 21 |
nicklas |
348 |
dc.commit(); |
6161 |
04 Mar 21 |
nicklas |
349 |
} |
6161 |
04 Mar 21 |
nicklas |
350 |
finally |
6161 |
04 Mar 21 |
nicklas |
351 |
{ |
6161 |
04 Mar 21 |
nicklas |
352 |
if (dc != null) dc.close(); |
6161 |
04 Mar 21 |
nicklas |
353 |
} |
6161 |
04 Mar 21 |
nicklas |
354 |
return list; |
6161 |
04 Mar 21 |
nicklas |
355 |
} |
6161 |
04 Mar 21 |
nicklas |
356 |
|
6161 |
04 Mar 21 |
nicklas |
357 |
|
6161 |
04 Mar 21 |
nicklas |
358 |
/** |
6161 |
04 Mar 21 |
nicklas |
Check for an existing item list with the given options. |
6161 |
04 Mar 21 |
nicklas |
A JSONObject is returned with the result. The following |
6161 |
04 Mar 21 |
nicklas |
keys are used: |
6161 |
04 Mar 21 |
nicklas |
<ul> |
6161 |
04 Mar 21 |
nicklas |
<li>itemType: ITEMLIST |
6161 |
04 Mar 21 |
nicklas |
<li>name: The name of the biomaterial list |
6161 |
04 Mar 21 |
nicklas |
<li>id: The id of the biomaterial list if it exists |
6161 |
04 Mar 21 |
nicklas |
<li>itemType: The item type that can be stored in the list |
6161 |
04 Mar 21 |
nicklas |
<li>status: ok, error, or missing |
6161 |
04 Mar 21 |
nicklas |
<li>message: A descriptive message in case of an error |
6161 |
04 Mar 21 |
nicklas |
</ul> |
6161 |
04 Mar 21 |
nicklas |
370 |
*/ |
6161 |
04 Mar 21 |
nicklas |
371 |
public JSONObject checkItemList(DbControl dc, Itemlist list, boolean checkAutoProcessing, |
6161 |
04 Mar 21 |
nicklas |
372 |
PermissionOptions permissions, boolean createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
373 |
{ |
6161 |
04 Mar 21 |
nicklas |
374 |
|
6161 |
04 Mar 21 |
nicklas |
375 |
JSONObject json = new JSONObject(); |
6161 |
04 Mar 21 |
nicklas |
376 |
JSONArray jsonMessages = new JSONArray(); |
6161 |
04 Mar 21 |
nicklas |
377 |
json.put("itemType", Item.ITEMLIST.name()); |
6161 |
04 Mar 21 |
nicklas |
378 |
json.put("name", list.getName()); |
6161 |
04 Mar 21 |
nicklas |
379 |
json.put("memberType", list.getItemType().name()); |
6161 |
04 Mar 21 |
nicklas |
380 |
|
6161 |
04 Mar 21 |
nicklas |
381 |
List<ItemList> result = list.list(dc); |
6161 |
04 Mar 21 |
nicklas |
382 |
if (result.size() == 0) |
6161 |
04 Mar 21 |
nicklas |
383 |
{ |
6161 |
04 Mar 21 |
nicklas |
384 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
385 |
{ |
6161 |
04 Mar 21 |
nicklas |
386 |
ItemList l = createItemList(dc.getSessionControl(), list, permissions); |
6161 |
04 Mar 21 |
nicklas |
387 |
json.put("id", l.getId()); |
6161 |
04 Mar 21 |
nicklas |
388 |
json.put("status", "ok"); |
6161 |
04 Mar 21 |
nicklas |
389 |
jsonMessages.add("Created"); |
6161 |
04 Mar 21 |
nicklas |
390 |
} |
6161 |
04 Mar 21 |
nicklas |
391 |
else |
6161 |
04 Mar 21 |
nicklas |
392 |
{ |
6161 |
04 Mar 21 |
nicklas |
393 |
json.put("status", "missing"); |
6161 |
04 Mar 21 |
nicklas |
394 |
jsonMessages.add("Not found"); |
6161 |
04 Mar 21 |
nicklas |
395 |
} |
6161 |
04 Mar 21 |
nicklas |
396 |
} |
6161 |
04 Mar 21 |
nicklas |
397 |
else if (result.size() > 1) |
6161 |
04 Mar 21 |
nicklas |
398 |
{ |
6161 |
04 Mar 21 |
nicklas |
399 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
400 |
jsonMessages.add("Found > 1 item list"); |
6161 |
04 Mar 21 |
nicklas |
401 |
} |
6161 |
04 Mar 21 |
nicklas |
402 |
else |
6161 |
04 Mar 21 |
nicklas |
403 |
{ |
6161 |
04 Mar 21 |
nicklas |
404 |
ItemList l = result.get(0); |
6161 |
04 Mar 21 |
nicklas |
405 |
json.put("id", l.getId()); |
6161 |
04 Mar 21 |
nicklas |
406 |
json.put("status", "ok"); // For now -- more checks below |
6161 |
04 Mar 21 |
nicklas |
407 |
|
6161 |
04 Mar 21 |
nicklas |
408 |
if (l.getMemberType() != list.getItemType()) |
6161 |
04 Mar 21 |
nicklas |
409 |
{ |
6161 |
04 Mar 21 |
nicklas |
410 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
411 |
jsonMessages.add("Can't be used by '" + list.getItemType() + "' items."); |
6161 |
04 Mar 21 |
nicklas |
412 |
} |
6161 |
04 Mar 21 |
nicklas |
413 |
|
6161 |
04 Mar 21 |
nicklas |
414 |
if (checkAutoProcessing) |
6161 |
04 Mar 21 |
nicklas |
415 |
{ |
6161 |
04 Mar 21 |
nicklas |
416 |
AnnotationType autoProc = Annotationtype.AUTO_PROCESSING.get(dc); |
6161 |
04 Mar 21 |
nicklas |
417 |
if (autoProc != null) |
6161 |
04 Mar 21 |
nicklas |
418 |
{ |
6161 |
04 Mar 21 |
nicklas |
419 |
boolean disabled = "Disable".equals(Annotationtype.AUTO_PROCESSING.getAnnotationValue(dc, l)); |
6161 |
04 Mar 21 |
nicklas |
420 |
if (disabled) |
6161 |
04 Mar 21 |
nicklas |
421 |
{ |
6161 |
04 Mar 21 |
nicklas |
422 |
json.put("status", "warning"); |
6161 |
04 Mar 21 |
nicklas |
423 |
jsonMessages.add("Auto-processing is disabled. It can be enabled by clearing the AutoProcessing annotation."); |
6161 |
04 Mar 21 |
nicklas |
424 |
} |
6161 |
04 Mar 21 |
nicklas |
425 |
} |
6161 |
04 Mar 21 |
nicklas |
426 |
} |
6161 |
04 Mar 21 |
nicklas |
427 |
|
6161 |
04 Mar 21 |
nicklas |
428 |
Rawdatatype subtype = list.getRawdatatype(); |
6161 |
04 Mar 21 |
nicklas |
429 |
if (subtype != null) |
6161 |
04 Mar 21 |
nicklas |
430 |
{ |
6161 |
04 Mar 21 |
nicklas |
431 |
if (!subtype.getRawDataType().equals(l.getRawDataType())) |
6161 |
04 Mar 21 |
nicklas |
432 |
{ |
6161 |
04 Mar 21 |
nicklas |
433 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
434 |
{ |
6161 |
04 Mar 21 |
nicklas |
435 |
l.setRawDataType(subtype.getRawDataType()); |
6161 |
04 Mar 21 |
nicklas |
436 |
jsonMessages.add("Fixed"); |
6161 |
04 Mar 21 |
nicklas |
437 |
} |
6161 |
04 Mar 21 |
nicklas |
438 |
else |
6161 |
04 Mar 21 |
nicklas |
439 |
{ |
6161 |
04 Mar 21 |
nicklas |
440 |
json.put("status", "incomplete"); |
6161 |
04 Mar 21 |
nicklas |
441 |
jsonMessages.add("Raw data type should be '" + subtype.getName() + "'"); |
6161 |
04 Mar 21 |
nicklas |
442 |
} |
6161 |
04 Mar 21 |
nicklas |
443 |
} |
6161 |
04 Mar 21 |
nicklas |
444 |
} |
6161 |
04 Mar 21 |
nicklas |
445 |
|
6161 |
04 Mar 21 |
nicklas |
446 |
if (permissions != null && !permissions.checkPermissions(l)) |
6161 |
04 Mar 21 |
nicklas |
447 |
{ |
6161 |
04 Mar 21 |
nicklas |
448 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
449 |
{ |
6161 |
04 Mar 21 |
nicklas |
450 |
permissions.applyPermissions(l); |
6161 |
04 Mar 21 |
nicklas |
451 |
if (jsonMessages.size() == 0) jsonMessages.add("Fixed"); |
6161 |
04 Mar 21 |
nicklas |
452 |
} |
6161 |
04 Mar 21 |
nicklas |
453 |
else |
6161 |
04 Mar 21 |
nicklas |
454 |
{ |
6161 |
04 Mar 21 |
nicklas |
455 |
json.put("status", "incomplete"); |
6161 |
04 Mar 21 |
nicklas |
456 |
jsonMessages.add(permissions.getMessage()); |
6161 |
04 Mar 21 |
nicklas |
457 |
} |
6161 |
04 Mar 21 |
nicklas |
458 |
} |
6161 |
04 Mar 21 |
nicklas |
459 |
|
6161 |
04 Mar 21 |
nicklas |
460 |
} |
6161 |
04 Mar 21 |
nicklas |
461 |
if (jsonMessages.size() == 0) jsonMessages.add("Ok"); |
6161 |
04 Mar 21 |
nicklas |
462 |
json.put("messages", jsonMessages); |
6161 |
04 Mar 21 |
nicklas |
463 |
return json; |
6161 |
04 Mar 21 |
nicklas |
464 |
} |
6161 |
04 Mar 21 |
nicklas |
465 |
|
6161 |
04 Mar 21 |
nicklas |
466 |
|
6161 |
04 Mar 21 |
nicklas |
467 |
|
6161 |
04 Mar 21 |
nicklas |
468 |
/** |
6161 |
04 Mar 21 |
nicklas |
Create a platform variant with the given options. The platform is created in |
6161 |
04 Mar 21 |
nicklas |
a separate transaction. |
6161 |
04 Mar 21 |
nicklas |
@since 1.2 |
6161 |
04 Mar 21 |
nicklas |
472 |
*/ |
6161 |
04 Mar 21 |
nicklas |
473 |
public PlatformVariant createPlatform(SessionControl sc, Rawdatatype rawType) |
6161 |
04 Mar 21 |
nicklas |
474 |
{ |
6161 |
04 Mar 21 |
nicklas |
475 |
PlatformVariant pv = null; |
6543 |
18 Jan 22 |
nicklas |
476 |
Platform p = null; |
6604 |
23 Feb 22 |
nicklas |
477 |
DbControl dc = sc.newDbControl("Variant search: Installation wizard"); |
6161 |
04 Mar 21 |
nicklas |
478 |
try |
6161 |
04 Mar 21 |
nicklas |
479 |
{ |
6543 |
18 Jan 22 |
nicklas |
480 |
try |
6543 |
18 Jan 22 |
nicklas |
481 |
{ |
6543 |
18 Jan 22 |
nicklas |
482 |
p = rawType.getPlatform(dc); |
6543 |
18 Jan 22 |
nicklas |
483 |
} |
6543 |
18 Jan 22 |
nicklas |
484 |
catch (ItemNotFoundException ex) |
6543 |
18 Jan 22 |
nicklas |
485 |
{ |
6543 |
18 Jan 22 |
nicklas |
486 |
p = Platform.getNew(dc, rawType.getPlatformId(), 1); |
6543 |
18 Jan 22 |
nicklas |
487 |
p.setName(rawType.getPlatformName()); |
6543 |
18 Jan 22 |
nicklas |
488 |
dc.saveItem(p); |
6543 |
18 Jan 22 |
nicklas |
489 |
} |
6161 |
04 Mar 21 |
nicklas |
490 |
pv = PlatformVariant.getNew(dc, p, rawType.getVariantId(), 1); |
6161 |
04 Mar 21 |
nicklas |
491 |
pv.setName(rawType.getName()); |
6161 |
04 Mar 21 |
nicklas |
492 |
dc.saveItem(pv); |
6161 |
04 Mar 21 |
nicklas |
493 |
dc.commit(); |
6161 |
04 Mar 21 |
nicklas |
494 |
} |
6161 |
04 Mar 21 |
nicklas |
495 |
finally |
6161 |
04 Mar 21 |
nicklas |
496 |
{ |
6161 |
04 Mar 21 |
nicklas |
497 |
if (dc != null) dc.close(); |
6161 |
04 Mar 21 |
nicklas |
498 |
} |
6161 |
04 Mar 21 |
nicklas |
499 |
return pv; |
6161 |
04 Mar 21 |
nicklas |
500 |
} |
6161 |
04 Mar 21 |
nicklas |
501 |
|
6161 |
04 Mar 21 |
nicklas |
502 |
/** |
6161 |
04 Mar 21 |
nicklas |
Check for an existing platform (variant) with the given options. |
6161 |
04 Mar 21 |
nicklas |
A JSONObject is returned with the result. The following |
6161 |
04 Mar 21 |
nicklas |
keys are used: |
6161 |
04 Mar 21 |
nicklas |
<ul> |
6161 |
04 Mar 21 |
nicklas |
<li>itemType: PLATFORMVARIANT |
6161 |
04 Mar 21 |
nicklas |
<li>name: The name of the platform variant |
6161 |
04 Mar 21 |
nicklas |
<li>id: The id of the platform variant if it exists |
6161 |
04 Mar 21 |
nicklas |
<li>status: ok, error, or missing |
6161 |
04 Mar 21 |
nicklas |
<li>message: A descriptive message in case of an error |
6161 |
04 Mar 21 |
nicklas |
</ul> |
6161 |
04 Mar 21 |
nicklas |
@since 1.2 |
6161 |
04 Mar 21 |
nicklas |
514 |
*/ |
6161 |
04 Mar 21 |
nicklas |
515 |
public JSONObject checkPlatform(DbControl dc, Rawdatatype rawType, |
6161 |
04 Mar 21 |
nicklas |
516 |
boolean createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
517 |
{ |
6161 |
04 Mar 21 |
nicklas |
518 |
|
6161 |
04 Mar 21 |
nicklas |
519 |
JSONObject json = new JSONObject(); |
6161 |
04 Mar 21 |
nicklas |
520 |
JSONArray jsonMessages = new JSONArray(); |
6161 |
04 Mar 21 |
nicklas |
521 |
json.put("itemType", Item.PLATFORMVARIANT.name()); |
6161 |
04 Mar 21 |
nicklas |
522 |
json.put("name", rawType.getName()); |
6161 |
04 Mar 21 |
nicklas |
523 |
|
6161 |
04 Mar 21 |
nicklas |
524 |
List<PlatformVariant> result = rawType.list(dc); |
6161 |
04 Mar 21 |
nicklas |
525 |
if (result.size() == 0) |
6161 |
04 Mar 21 |
nicklas |
526 |
{ |
6161 |
04 Mar 21 |
nicklas |
527 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
528 |
{ |
6161 |
04 Mar 21 |
nicklas |
529 |
PlatformVariant pv = createPlatform(dc.getSessionControl(), rawType); |
6161 |
04 Mar 21 |
nicklas |
530 |
json.put("id", pv.getId()); |
6161 |
04 Mar 21 |
nicklas |
531 |
json.put("status", "ok"); |
6161 |
04 Mar 21 |
nicklas |
532 |
jsonMessages.add("Created"); |
6161 |
04 Mar 21 |
nicklas |
533 |
} |
6161 |
04 Mar 21 |
nicklas |
534 |
else |
6161 |
04 Mar 21 |
nicklas |
535 |
{ |
6161 |
04 Mar 21 |
nicklas |
536 |
json.put("status", "missing"); |
6161 |
04 Mar 21 |
nicklas |
537 |
jsonMessages.add("Not found"); |
6161 |
04 Mar 21 |
nicklas |
538 |
} |
6161 |
04 Mar 21 |
nicklas |
539 |
} |
6161 |
04 Mar 21 |
nicklas |
540 |
else if (result.size() > 1) |
6161 |
04 Mar 21 |
nicklas |
541 |
{ |
6161 |
04 Mar 21 |
nicklas |
542 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
543 |
jsonMessages.add("Found > 1 platform"); |
6161 |
04 Mar 21 |
nicklas |
544 |
} |
6161 |
04 Mar 21 |
nicklas |
545 |
else |
6161 |
04 Mar 21 |
nicklas |
546 |
{ |
6161 |
04 Mar 21 |
nicklas |
547 |
PlatformVariant pv = result.get(0); |
6161 |
04 Mar 21 |
nicklas |
548 |
Platform p = pv.getPlatform(); |
6161 |
04 Mar 21 |
nicklas |
549 |
json.put("id", pv.getId()); |
6161 |
04 Mar 21 |
nicklas |
550 |
json.put("status", "ok"); // For now -- more checks below |
6161 |
04 Mar 21 |
nicklas |
551 |
|
6161 |
04 Mar 21 |
nicklas |
552 |
if (!pv.getExternalId().equals(rawType.getVariantId())) |
6161 |
04 Mar 21 |
nicklas |
553 |
{ |
6161 |
04 Mar 21 |
nicklas |
554 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
555 |
jsonMessages.add("Should have '" + rawType.getVariantId() + "' as external id."); |
6161 |
04 Mar 21 |
nicklas |
556 |
} |
6161 |
04 Mar 21 |
nicklas |
557 |
} |
6161 |
04 Mar 21 |
nicklas |
558 |
|
6161 |
04 Mar 21 |
nicklas |
559 |
if (jsonMessages.size() == 0) jsonMessages.add("Ok"); |
6161 |
04 Mar 21 |
nicklas |
560 |
json.put("messages", jsonMessages); |
6161 |
04 Mar 21 |
nicklas |
561 |
return json; |
6161 |
04 Mar 21 |
nicklas |
562 |
|
6161 |
04 Mar 21 |
nicklas |
563 |
} |
6161 |
04 Mar 21 |
nicklas |
564 |
|
6161 |
04 Mar 21 |
nicklas |
565 |
/** |
6161 |
04 Mar 21 |
nicklas |
Create a data file type with the given options. The type is created in |
6161 |
04 Mar 21 |
nicklas |
a separate transaction. |
6161 |
04 Mar 21 |
nicklas |
@since 2.16 |
6161 |
04 Mar 21 |
nicklas |
569 |
*/ |
6161 |
04 Mar 21 |
nicklas |
570 |
public DataFileType createDataFileType(SessionControl sc, Datafiletype def) |
6161 |
04 Mar 21 |
nicklas |
571 |
{ |
6161 |
04 Mar 21 |
nicklas |
572 |
DataFileType type = null; |
6604 |
23 Feb 22 |
nicklas |
573 |
DbControl dc = sc.newDbControl("Variant search: Installation wizard"); |
6161 |
04 Mar 21 |
nicklas |
574 |
try |
6161 |
04 Mar 21 |
nicklas |
575 |
{ |
6161 |
04 Mar 21 |
nicklas |
576 |
type = DataFileType.getNew(dc, def.getExternalId(), def.getItemType()); |
6161 |
04 Mar 21 |
nicklas |
577 |
type.setName(def.getName()); |
6161 |
04 Mar 21 |
nicklas |
578 |
dc.saveItem(type); |
6161 |
04 Mar 21 |
nicklas |
579 |
dc.commit(); |
6161 |
04 Mar 21 |
nicklas |
580 |
} |
6161 |
04 Mar 21 |
nicklas |
581 |
finally |
6161 |
04 Mar 21 |
nicklas |
582 |
{ |
6161 |
04 Mar 21 |
nicklas |
583 |
if (dc != null) dc.close(); |
6161 |
04 Mar 21 |
nicklas |
584 |
} |
6161 |
04 Mar 21 |
nicklas |
585 |
return type; |
6161 |
04 Mar 21 |
nicklas |
586 |
} |
6161 |
04 Mar 21 |
nicklas |
587 |
|
6161 |
04 Mar 21 |
nicklas |
588 |
|
6161 |
04 Mar 21 |
nicklas |
589 |
/** |
6161 |
04 Mar 21 |
nicklas |
Check for an existing data file type with the given options. |
6161 |
04 Mar 21 |
nicklas |
A JSONObject is returned with the result. The following |
6161 |
04 Mar 21 |
nicklas |
keys are used: |
6161 |
04 Mar 21 |
nicklas |
<ul> |
6161 |
04 Mar 21 |
nicklas |
<li>itemType: DATAFILETYPE |
6161 |
04 Mar 21 |
nicklas |
<li>name: The name of the file type |
6161 |
04 Mar 21 |
nicklas |
<li>id: The id of the file type if it exists |
6161 |
04 Mar 21 |
nicklas |
<li>status: ok, error, or missing |
6161 |
04 Mar 21 |
nicklas |
<li>message: A descriptive message in case of an error |
6161 |
04 Mar 21 |
nicklas |
</ul> |
6161 |
04 Mar 21 |
nicklas |
@since 2.16 |
6161 |
04 Mar 21 |
nicklas |
601 |
*/ |
6161 |
04 Mar 21 |
nicklas |
602 |
public JSONObject checkDataFileType(DbControl dc, Datafiletype fileType, |
6161 |
04 Mar 21 |
nicklas |
603 |
boolean createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
604 |
{ |
6161 |
04 Mar 21 |
nicklas |
605 |
|
6161 |
04 Mar 21 |
nicklas |
606 |
JSONObject json = new JSONObject(); |
6161 |
04 Mar 21 |
nicklas |
607 |
JSONArray jsonMessages = new JSONArray(); |
6161 |
04 Mar 21 |
nicklas |
608 |
json.put("itemType", Item.DATAFILETYPE.name()); |
6161 |
04 Mar 21 |
nicklas |
609 |
json.put("name", fileType.getName()); |
6161 |
04 Mar 21 |
nicklas |
610 |
|
6161 |
04 Mar 21 |
nicklas |
611 |
List<DataFileType> result = fileType.list(dc); |
6161 |
04 Mar 21 |
nicklas |
612 |
if (result.size() == 0) |
6161 |
04 Mar 21 |
nicklas |
613 |
{ |
6161 |
04 Mar 21 |
nicklas |
614 |
if (createIfMissing) |
6161 |
04 Mar 21 |
nicklas |
615 |
{ |
6161 |
04 Mar 21 |
nicklas |
616 |
DataFileType type = createDataFileType(dc.getSessionControl(), fileType); |
6161 |
04 Mar 21 |
nicklas |
617 |
json.put("id", type.getId()); |
6161 |
04 Mar 21 |
nicklas |
618 |
json.put("status", "ok"); |
6161 |
04 Mar 21 |
nicklas |
619 |
jsonMessages.add("Created"); |
6161 |
04 Mar 21 |
nicklas |
620 |
} |
6161 |
04 Mar 21 |
nicklas |
621 |
else |
6161 |
04 Mar 21 |
nicklas |
622 |
{ |
6161 |
04 Mar 21 |
nicklas |
623 |
json.put("status", "missing"); |
6161 |
04 Mar 21 |
nicklas |
624 |
jsonMessages.add("Not found"); |
6161 |
04 Mar 21 |
nicklas |
625 |
} |
6161 |
04 Mar 21 |
nicklas |
626 |
} |
6161 |
04 Mar 21 |
nicklas |
627 |
else if (result.size() > 1) |
6161 |
04 Mar 21 |
nicklas |
628 |
{ |
6161 |
04 Mar 21 |
nicklas |
629 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
630 |
jsonMessages.add("Found > 1 data file type"); |
6161 |
04 Mar 21 |
nicklas |
631 |
} |
6161 |
04 Mar 21 |
nicklas |
632 |
else |
6161 |
04 Mar 21 |
nicklas |
633 |
{ |
6161 |
04 Mar 21 |
nicklas |
634 |
DataFileType ft = result.get(0); |
6161 |
04 Mar 21 |
nicklas |
635 |
json.put("id", ft.getId()); |
6161 |
04 Mar 21 |
nicklas |
636 |
json.put("status", "ok"); // For now -- more checks below |
6161 |
04 Mar 21 |
nicklas |
637 |
|
6161 |
04 Mar 21 |
nicklas |
638 |
if (!ft.getExternalId().equals(fileType.getExternalId())) |
6161 |
04 Mar 21 |
nicklas |
639 |
{ |
6161 |
04 Mar 21 |
nicklas |
640 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
641 |
jsonMessages.add("Should have '" + fileType.getExternalId() + "' as external id."); |
6161 |
04 Mar 21 |
nicklas |
642 |
} |
6161 |
04 Mar 21 |
nicklas |
643 |
|
6161 |
04 Mar 21 |
nicklas |
644 |
if (!ft.getItemType().equals(fileType.getItemType())) |
6161 |
04 Mar 21 |
nicklas |
645 |
{ |
6161 |
04 Mar 21 |
nicklas |
646 |
json.put("status", "error"); |
6161 |
04 Mar 21 |
nicklas |
647 |
jsonMessages.add("Should have '" + fileType.getItemType().name() + "' as item type."); |
6161 |
04 Mar 21 |
nicklas |
648 |
} |
6161 |
04 Mar 21 |
nicklas |
649 |
|
6161 |
04 Mar 21 |
nicklas |
650 |
} |
6161 |
04 Mar 21 |
nicklas |
651 |
if (jsonMessages.size() == 0) jsonMessages.add("Ok"); |
6161 |
04 Mar 21 |
nicklas |
652 |
json.put("messages", jsonMessages); |
6161 |
04 Mar 21 |
nicklas |
653 |
return json; |
6161 |
04 Mar 21 |
nicklas |
654 |
|
6161 |
04 Mar 21 |
nicklas |
655 |
} |
6161 |
04 Mar 21 |
nicklas |
656 |
|
6161 |
04 Mar 21 |
nicklas |
657 |
|
6161 |
04 Mar 21 |
nicklas |
658 |
/** |
6161 |
04 Mar 21 |
nicklas |
Store options for enumerated annotation types. |
6161 |
04 Mar 21 |
nicklas |
660 |
*/ |
6161 |
04 Mar 21 |
nicklas |
661 |
static class ValueOptions |
6161 |
04 Mar 21 |
nicklas |
662 |
{ |
6161 |
04 Mar 21 |
nicklas |
663 |
private final Object[] options; |
6161 |
04 Mar 21 |
nicklas |
664 |
|
6161 |
04 Mar 21 |
nicklas |
665 |
/** |
6161 |
04 Mar 21 |
nicklas |
The annotation type is an enumerated annotation type with the following options. |
6161 |
04 Mar 21 |
nicklas |
667 |
*/ |
6161 |
04 Mar 21 |
nicklas |
668 |
ValueOptions(Object... options) |
6161 |
04 Mar 21 |
nicklas |
669 |
{ |
6161 |
04 Mar 21 |
nicklas |
670 |
this.options = options; |
6161 |
04 Mar 21 |
nicklas |
671 |
} |
6161 |
04 Mar 21 |
nicklas |
672 |
|
6161 |
04 Mar 21 |
nicklas |
673 |
boolean isEnumeration() |
6161 |
04 Mar 21 |
nicklas |
674 |
{ |
6161 |
04 Mar 21 |
nicklas |
675 |
return options != null; |
6161 |
04 Mar 21 |
nicklas |
676 |
} |
6161 |
04 Mar 21 |
nicklas |
677 |
|
6161 |
04 Mar 21 |
nicklas |
678 |
/** |
6161 |
04 Mar 21 |
nicklas |
Get the options as a List. |
6161 |
04 Mar 21 |
nicklas |
680 |
*/ |
6161 |
04 Mar 21 |
nicklas |
681 |
List<?> getList() |
6161 |
04 Mar 21 |
nicklas |
682 |
{ |
6161 |
04 Mar 21 |
nicklas |
683 |
return Arrays.asList(options); |
6161 |
04 Mar 21 |
nicklas |
684 |
} |
6161 |
04 Mar 21 |
nicklas |
685 |
|
6161 |
04 Mar 21 |
nicklas |
686 |
/** |
6161 |
04 Mar 21 |
nicklas |
Get the options as an array. |
6161 |
04 Mar 21 |
nicklas |
688 |
*/ |
6161 |
04 Mar 21 |
nicklas |
689 |
Object[] getArray() |
6161 |
04 Mar 21 |
nicklas |
690 |
{ |
6161 |
04 Mar 21 |
nicklas |
691 |
return options; |
6161 |
04 Mar 21 |
nicklas |
692 |
} |
6161 |
04 Mar 21 |
nicklas |
693 |
|
6161 |
04 Mar 21 |
nicklas |
694 |
/** |
6161 |
04 Mar 21 |
nicklas |
Add options missing in the current annotation type. |
6161 |
04 Mar 21 |
nicklas |
696 |
*/ |
6161 |
04 Mar 21 |
nicklas |
697 |
void applyEnumeration(AnnotationType at) |
6161 |
04 Mar 21 |
nicklas |
698 |
{ |
6161 |
04 Mar 21 |
nicklas |
699 |
List<Object> values = new ArrayList<Object>(at.getValues()); |
6161 |
04 Mar 21 |
nicklas |
700 |
for (Object opt : options) |
6161 |
04 Mar 21 |
nicklas |
701 |
{ |
6161 |
04 Mar 21 |
nicklas |
702 |
if (!values.contains(opt)) values.add(opt); |
6161 |
04 Mar 21 |
nicklas |
703 |
} |
6161 |
04 Mar 21 |
nicklas |
704 |
at.setValues(values); |
6161 |
04 Mar 21 |
nicklas |
705 |
} |
6161 |
04 Mar 21 |
nicklas |
706 |
} |
6161 |
04 Mar 21 |
nicklas |
707 |
/** |
6161 |
04 Mar 21 |
nicklas |
Store permissions that can be applied to shareable items. |
6161 |
04 Mar 21 |
nicklas |
709 |
*/ |
6161 |
04 Mar 21 |
nicklas |
710 |
static class PermissionOptions |
6161 |
04 Mar 21 |
nicklas |
711 |
{ |
6161 |
04 Mar 21 |
nicklas |
712 |
private Map<Group, Permission> groupPermissions; |
6161 |
04 Mar 21 |
nicklas |
713 |
private Map<Project, Permission> projectPermissions; |
6161 |
04 Mar 21 |
nicklas |
714 |
private String message; |
6161 |
04 Mar 21 |
nicklas |
715 |
|
6161 |
04 Mar 21 |
nicklas |
716 |
PermissionOptions() |
6161 |
04 Mar 21 |
nicklas |
717 |
{ |
6161 |
04 Mar 21 |
nicklas |
718 |
groupPermissions = new HashMap<Group, Permission>(); |
6161 |
04 Mar 21 |
nicklas |
719 |
projectPermissions = new HashMap<Project, Permission>(); |
6161 |
04 Mar 21 |
nicklas |
720 |
} |
6161 |
04 Mar 21 |
nicklas |
721 |
|
6161 |
04 Mar 21 |
nicklas |
722 |
/** |
6161 |
04 Mar 21 |
nicklas |
Set a permission for the given group. |
6161 |
04 Mar 21 |
nicklas |
724 |
*/ |
6161 |
04 Mar 21 |
nicklas |
725 |
void set(Group g, Permission p) |
6161 |
04 Mar 21 |
nicklas |
726 |
{ |
6161 |
04 Mar 21 |
nicklas |
727 |
groupPermissions.put(g, p); |
6161 |
04 Mar 21 |
nicklas |
728 |
} |
6161 |
04 Mar 21 |
nicklas |
729 |
|
6161 |
04 Mar 21 |
nicklas |
730 |
/** |
6161 |
04 Mar 21 |
nicklas |
Set a permission for the given project. |
6161 |
04 Mar 21 |
nicklas |
732 |
*/ |
6161 |
04 Mar 21 |
nicklas |
733 |
void set(Project pr, Permission p) |
6161 |
04 Mar 21 |
nicklas |
734 |
{ |
6161 |
04 Mar 21 |
nicklas |
735 |
projectPermissions.put(pr, p); |
6161 |
04 Mar 21 |
nicklas |
736 |
} |
6161 |
04 Mar 21 |
nicklas |
737 |
|
6161 |
04 Mar 21 |
nicklas |
738 |
/** |
6161 |
04 Mar 21 |
nicklas |
Check if the given item includes at least all the required permissions. |
6161 |
04 Mar 21 |
nicklas |
@return TRUE if all permissions are ok, FALSE if not (call getMessage()) |
6161 |
04 Mar 21 |
nicklas |
to get more information. |
6161 |
04 Mar 21 |
nicklas |
742 |
*/ |
6161 |
04 Mar 21 |
nicklas |
743 |
boolean checkPermissions(SharedItem item) |
6161 |
04 Mar 21 |
nicklas |
744 |
{ |
6161 |
04 Mar 21 |
nicklas |
745 |
ProjectKey pKey = item.getProjectKey(); |
6161 |
04 Mar 21 |
nicklas |
746 |
for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet()) |
6161 |
04 Mar 21 |
nicklas |
747 |
{ |
6161 |
04 Mar 21 |
nicklas |
748 |
Project pr = entry.getKey(); |
6161 |
04 Mar 21 |
nicklas |
749 |
Permission p = entry.getValue(); |
6161 |
04 Mar 21 |
nicklas |
750 |
|
6161 |
04 Mar 21 |
nicklas |
751 |
Set<Permission> permissions = pKey != null ? pKey.getPermissions(pr) : null; |
6161 |
04 Mar 21 |
nicklas |
752 |
if (p == null) |
6161 |
04 Mar 21 |
nicklas |
753 |
{ |
6161 |
04 Mar 21 |
nicklas |
// The item should not be shared to project 'pr' |
6161 |
04 Mar 21 |
nicklas |
755 |
if (permissions != null && permissions.size() > 0) |
6161 |
04 Mar 21 |
nicklas |
756 |
{ |
6161 |
04 Mar 21 |
nicklas |
757 |
message = "Should not be shared to project: " + pr.getName() + " (" + permissions + ")"; |
6161 |
04 Mar 21 |
nicklas |
758 |
return false; |
6161 |
04 Mar 21 |
nicklas |
759 |
} |
6161 |
04 Mar 21 |
nicklas |
760 |
} |
6161 |
04 Mar 21 |
nicklas |
761 |
else |
6161 |
04 Mar 21 |
nicklas |
762 |
{ |
6161 |
04 Mar 21 |
nicklas |
// The item should be shared to project 'pr' with permission 'p' |
6161 |
04 Mar 21 |
nicklas |
764 |
if (pKey == null || !permissions.contains(p)) |
6161 |
04 Mar 21 |
nicklas |
765 |
{ |
6161 |
04 Mar 21 |
nicklas |
766 |
message = "Not shared to project: " + pr.getName() + " (" + p + ")"; |
6161 |
04 Mar 21 |
nicklas |
767 |
return false; |
6161 |
04 Mar 21 |
nicklas |
768 |
} |
6161 |
04 Mar 21 |
nicklas |
769 |
} |
6161 |
04 Mar 21 |
nicklas |
770 |
} |
6161 |
04 Mar 21 |
nicklas |
771 |
ItemKey key = item.getItemKey(); |
6161 |
04 Mar 21 |
nicklas |
772 |
for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet()) |
6161 |
04 Mar 21 |
nicklas |
773 |
{ |
6161 |
04 Mar 21 |
nicklas |
774 |
Group g = entry.getKey(); |
6161 |
04 Mar 21 |
nicklas |
775 |
Permission p = entry.getValue(); |
6161 |
04 Mar 21 |
nicklas |
776 |
|
6161 |
04 Mar 21 |
nicklas |
777 |
Set<Permission> permissions = key != null ? key.getPermissions(g) : null; |
6161 |
04 Mar 21 |
nicklas |
778 |
if (p == null) |
6161 |
04 Mar 21 |
nicklas |
779 |
{ |
6161 |
04 Mar 21 |
nicklas |
// The item should not be shared to group 'g' |
6161 |
04 Mar 21 |
nicklas |
781 |
if (permissions != null && permissions.size() > 0) |
6161 |
04 Mar 21 |
nicklas |
782 |
{ |
6161 |
04 Mar 21 |
nicklas |
783 |
message = "Should not be shared to group: " + g.getName() + " (" + permissions + ")"; |
6161 |
04 Mar 21 |
nicklas |
784 |
return false; |
6161 |
04 Mar 21 |
nicklas |
785 |
} |
6161 |
04 Mar 21 |
nicklas |
786 |
} |
6161 |
04 Mar 21 |
nicklas |
787 |
else |
6161 |
04 Mar 21 |
nicklas |
788 |
{ |
6161 |
04 Mar 21 |
nicklas |
// The item should be shared to group 'g' with permission 'p' |
6161 |
04 Mar 21 |
nicklas |
790 |
if (key == null || !key.getPermissions(g).contains(p)) |
6161 |
04 Mar 21 |
nicklas |
791 |
{ |
6161 |
04 Mar 21 |
nicklas |
792 |
message = "Not shared to group: " + g.getName() + " (" + p + ")"; |
6161 |
04 Mar 21 |
nicklas |
793 |
return false; |
6161 |
04 Mar 21 |
nicklas |
794 |
} |
6161 |
04 Mar 21 |
nicklas |
795 |
} |
6161 |
04 Mar 21 |
nicklas |
796 |
|
6161 |
04 Mar 21 |
nicklas |
797 |
} |
6161 |
04 Mar 21 |
nicklas |
798 |
return true; |
6161 |
04 Mar 21 |
nicklas |
799 |
} |
6161 |
04 Mar 21 |
nicklas |
800 |
|
6161 |
04 Mar 21 |
nicklas |
801 |
/** |
6161 |
04 Mar 21 |
nicklas |
More information about missing permission from the checkPermissions() method. |
6161 |
04 Mar 21 |
nicklas |
803 |
*/ |
6161 |
04 Mar 21 |
nicklas |
804 |
String getMessage() |
6161 |
04 Mar 21 |
nicklas |
805 |
{ |
6161 |
04 Mar 21 |
nicklas |
806 |
return message; |
6161 |
04 Mar 21 |
nicklas |
807 |
} |
6161 |
04 Mar 21 |
nicklas |
808 |
|
6161 |
04 Mar 21 |
nicklas |
809 |
/** |
6161 |
04 Mar 21 |
nicklas |
Apply all permissions to the given item. |
6161 |
04 Mar 21 |
nicklas |
811 |
*/ |
6161 |
04 Mar 21 |
nicklas |
812 |
void applyPermissions(SharedItem item) |
6161 |
04 Mar 21 |
nicklas |
813 |
{ |
6161 |
04 Mar 21 |
nicklas |
814 |
MultiPermissions mp = new MultiPermissions(Collections.singleton(item)); |
6161 |
04 Mar 21 |
nicklas |
815 |
for (Map.Entry<Group, Permission> entry : groupPermissions.entrySet()) |
6161 |
04 Mar 21 |
nicklas |
816 |
{ |
6161 |
04 Mar 21 |
nicklas |
817 |
Group g = entry.getKey(); |
6161 |
04 Mar 21 |
nicklas |
818 |
Permission p = entry.getValue(); |
6161 |
04 Mar 21 |
nicklas |
819 |
if (p == null) |
6161 |
04 Mar 21 |
nicklas |
820 |
{ |
6161 |
04 Mar 21 |
nicklas |
821 |
mp.setPermissions(g, null); |
6161 |
04 Mar 21 |
nicklas |
822 |
} |
6161 |
04 Mar 21 |
nicklas |
823 |
else |
6161 |
04 Mar 21 |
nicklas |
824 |
{ |
6161 |
04 Mar 21 |
nicklas |
825 |
mp.addPermissions(g, Collections.singleton(p)); |
6161 |
04 Mar 21 |
nicklas |
826 |
} |
6161 |
04 Mar 21 |
nicklas |
827 |
} |
6161 |
04 Mar 21 |
nicklas |
828 |
for (Map.Entry<Project, Permission> entry : projectPermissions.entrySet()) |
6161 |
04 Mar 21 |
nicklas |
829 |
{ |
6161 |
04 Mar 21 |
nicklas |
830 |
Project pr = entry.getKey(); |
6161 |
04 Mar 21 |
nicklas |
831 |
Permission p = entry.getValue(); |
6161 |
04 Mar 21 |
nicklas |
832 |
if (p == null) |
6161 |
04 Mar 21 |
nicklas |
833 |
{ |
6161 |
04 Mar 21 |
nicklas |
834 |
mp.setPermissions(pr, null); |
6161 |
04 Mar 21 |
nicklas |
835 |
} |
6161 |
04 Mar 21 |
nicklas |
836 |
else |
6161 |
04 Mar 21 |
nicklas |
837 |
{ |
6161 |
04 Mar 21 |
nicklas |
838 |
mp.addPermissions(pr, Collections.singleton(p)); |
6161 |
04 Mar 21 |
nicklas |
839 |
} |
6161 |
04 Mar 21 |
nicklas |
840 |
} |
6161 |
04 Mar 21 |
nicklas |
841 |
mp.updateKeys(item.getDbControl()); |
6161 |
04 Mar 21 |
nicklas |
842 |
} |
6161 |
04 Mar 21 |
nicklas |
843 |
} |
6161 |
04 Mar 21 |
nicklas |
844 |
} |