5924 |
29 Apr 20 |
nicklas |
1 |
package net.sf.basedb.reggie.servlet; |
5924 |
29 Apr 20 |
nicklas |
2 |
|
5924 |
29 Apr 20 |
nicklas |
3 |
import java.io.IOException; |
5924 |
29 Apr 20 |
nicklas |
4 |
import java.util.ArrayList; |
5924 |
29 Apr 20 |
nicklas |
5 |
import java.util.List; |
5924 |
29 Apr 20 |
nicklas |
6 |
|
5924 |
29 Apr 20 |
nicklas |
7 |
import javax.servlet.ServletException; |
5924 |
29 Apr 20 |
nicklas |
8 |
import javax.servlet.http.HttpServlet; |
5924 |
29 Apr 20 |
nicklas |
9 |
import javax.servlet.http.HttpServletRequest; |
5924 |
29 Apr 20 |
nicklas |
10 |
import javax.servlet.http.HttpServletResponse; |
5924 |
29 Apr 20 |
nicklas |
11 |
|
5924 |
29 Apr 20 |
nicklas |
12 |
import org.json.simple.JSONArray; |
5924 |
29 Apr 20 |
nicklas |
13 |
import org.json.simple.JSONObject; |
5924 |
29 Apr 20 |
nicklas |
14 |
|
5941 |
18 May 20 |
nicklas |
15 |
import net.sf.basedb.core.AnnotationType; |
5924 |
29 Apr 20 |
nicklas |
16 |
import net.sf.basedb.core.DbControl; |
5924 |
29 Apr 20 |
nicklas |
17 |
import net.sf.basedb.core.ItemList; |
5924 |
29 Apr 20 |
nicklas |
18 |
import net.sf.basedb.core.ItemQuery; |
5924 |
29 Apr 20 |
nicklas |
19 |
import net.sf.basedb.core.Job; |
5944 |
20 May 20 |
nicklas |
20 |
import net.sf.basedb.core.PluginConfiguration; |
5924 |
29 Apr 20 |
nicklas |
21 |
import net.sf.basedb.core.RawBioAssay; |
5924 |
29 Apr 20 |
nicklas |
22 |
import net.sf.basedb.core.SessionControl; |
5944 |
20 May 20 |
nicklas |
23 |
import net.sf.basedb.core.query.Expressions; |
5924 |
29 Apr 20 |
nicklas |
24 |
import net.sf.basedb.core.query.Hql; |
5924 |
29 Apr 20 |
nicklas |
25 |
import net.sf.basedb.core.query.Orders; |
5944 |
20 May 20 |
nicklas |
26 |
import net.sf.basedb.core.query.Restrictions; |
5924 |
29 Apr 20 |
nicklas |
27 |
import net.sf.basedb.core.snapshot.SnapshotManager; |
5924 |
29 Apr 20 |
nicklas |
28 |
import net.sf.basedb.reggie.JsonUtil; |
5924 |
29 Apr 20 |
nicklas |
29 |
import net.sf.basedb.reggie.Reggie; |
5924 |
29 Apr 20 |
nicklas |
30 |
import net.sf.basedb.reggie.counter.CounterService; |
5924 |
29 Apr 20 |
nicklas |
31 |
import net.sf.basedb.reggie.dao.Annotationtype; |
5924 |
29 Apr 20 |
nicklas |
32 |
import net.sf.basedb.reggie.dao.BiomaterialList; |
5924 |
29 Apr 20 |
nicklas |
33 |
import net.sf.basedb.reggie.dao.Library; |
5924 |
29 Apr 20 |
nicklas |
34 |
import net.sf.basedb.reggie.dao.Pipeline; |
5924 |
29 Apr 20 |
nicklas |
35 |
import net.sf.basedb.reggie.dao.Rawbioassay; |
5924 |
29 Apr 20 |
nicklas |
36 |
import net.sf.basedb.reggie.dao.Rawdatatype; |
5924 |
29 Apr 20 |
nicklas |
37 |
import net.sf.basedb.reggie.dao.ReggieRole; |
5924 |
29 Apr 20 |
nicklas |
38 |
import net.sf.basedb.reggie.dao.Rna; |
5924 |
29 Apr 20 |
nicklas |
39 |
import net.sf.basedb.reggie.ssp.SspModel; |
5924 |
29 Apr 20 |
nicklas |
40 |
import net.sf.basedb.reggie.ssp.SspPlugin; |
5924 |
29 Apr 20 |
nicklas |
41 |
import net.sf.basedb.util.Values; |
5924 |
29 Apr 20 |
nicklas |
42 |
import net.sf.basedb.util.error.ThrowableUtil; |
5924 |
29 Apr 20 |
nicklas |
43 |
|
5924 |
29 Apr 20 |
nicklas |
44 |
|
5924 |
29 Apr 20 |
nicklas |
45 |
public class SspServlet |
5924 |
29 Apr 20 |
nicklas |
46 |
extends HttpServlet |
5924 |
29 Apr 20 |
nicklas |
47 |
{ |
5924 |
29 Apr 20 |
nicklas |
48 |
|
5924 |
29 Apr 20 |
nicklas |
49 |
private static final long serialVersionUID = 444691884705070524L; |
5924 |
29 Apr 20 |
nicklas |
50 |
|
5924 |
29 Apr 20 |
nicklas |
51 |
public SspServlet() |
5924 |
29 Apr 20 |
nicklas |
52 |
{} |
5924 |
29 Apr 20 |
nicklas |
53 |
|
5924 |
29 Apr 20 |
nicklas |
54 |
@SuppressWarnings("unchecked") |
5924 |
29 Apr 20 |
nicklas |
55 |
@Override |
5924 |
29 Apr 20 |
nicklas |
56 |
protected void doGet(HttpServletRequest req, HttpServletResponse resp) |
5924 |
29 Apr 20 |
nicklas |
57 |
throws ServletException, IOException |
5924 |
29 Apr 20 |
nicklas |
58 |
{ |
5924 |
29 Apr 20 |
nicklas |
59 |
String cmd = req.getParameter("cmd"); |
5924 |
29 Apr 20 |
nicklas |
60 |
JsonUtil.setJsonResponseHeaders(resp); |
5924 |
29 Apr 20 |
nicklas |
61 |
|
5924 |
29 Apr 20 |
nicklas |
62 |
JSONObject json = new JSONObject(); |
5924 |
29 Apr 20 |
nicklas |
63 |
json.put("status", "ok"); |
5924 |
29 Apr 20 |
nicklas |
64 |
|
5924 |
29 Apr 20 |
nicklas |
65 |
final SessionControl sc = Reggie.getSessionControl(req); |
5924 |
29 Apr 20 |
nicklas |
66 |
DbControl dc = null; |
5924 |
29 Apr 20 |
nicklas |
67 |
try |
5924 |
29 Apr 20 |
nicklas |
68 |
{ |
5924 |
29 Apr 20 |
nicklas |
69 |
if ("GetRawBioAssaysForSsp".equals(cmd)) |
5924 |
29 Apr 20 |
nicklas |
70 |
{ |
5924 |
29 Apr 20 |
nicklas |
71 |
Rawdatatype rawDataType = Rawdatatype.STRINGTIE; |
5924 |
29 Apr 20 |
nicklas |
72 |
Pipeline pipeline = Pipeline.RNASEQ_HISAT_STRINGTIE; |
5924 |
29 Apr 20 |
nicklas |
73 |
|
6335 |
15 Jun 21 |
nicklas |
74 |
dc = sc.newDbControl(":Start SSP analysis"); |
5924 |
29 Apr 20 |
nicklas |
75 |
List<Rawbioassay> list = null; |
5924 |
29 Apr 20 |
nicklas |
76 |
String items = Values.getStringOrNull(req.getParameter("items")); |
5924 |
29 Apr 20 |
nicklas |
77 |
if (items == null) |
5924 |
29 Apr 20 |
nicklas |
78 |
{ |
5924 |
29 Apr 20 |
nicklas |
79 |
ItemList sspPipeline = BiomaterialList.SSP_PIPELINE.load(dc); |
6183 |
26 Mar 21 |
nicklas |
80 |
ItemQuery<RawBioAssay> query = sspPipeline.getMembers(); |
5924 |
29 Apr 20 |
nicklas |
81 |
query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT); |
5924 |
29 Apr 20 |
nicklas |
82 |
Rawdatatype.STRINGTIE.addFilter(dc, query); |
5924 |
29 Apr 20 |
nicklas |
// Join LibPlate for sorting |
5924 |
29 Apr 20 |
nicklas |
84 |
query.join(Hql.innerJoin(null, "parentExtract", "lib", true)); |
5924 |
29 Apr 20 |
nicklas |
85 |
query.join(Hql.innerJoin("lib", "bioWell", "bw", true)); |
5924 |
29 Apr 20 |
nicklas |
86 |
query.join(Hql.innerJoin("bw", "bioPlate", "libPlate", true)); |
5924 |
29 Apr 20 |
nicklas |
87 |
query.order(Orders.asc(Hql.property("libPlate", "id"))); |
5924 |
29 Apr 20 |
nicklas |
88 |
query.order(Orders.asc(Hql.property("name"))); |
5943 |
18 May 20 |
nicklas |
89 |
query.setMaxResults(500); |
5924 |
29 Apr 20 |
nicklas |
90 |
list = Rawbioassay.toList(query.list(dc)); |
5924 |
29 Apr 20 |
nicklas |
91 |
} |
5924 |
29 Apr 20 |
nicklas |
92 |
else |
5924 |
29 Apr 20 |
nicklas |
93 |
{ |
5924 |
29 Apr 20 |
nicklas |
94 |
Integer[] ids = Values.getInt(items.split(",")); |
5924 |
29 Apr 20 |
nicklas |
95 |
list = new ArrayList<Rawbioassay>(); |
5924 |
29 Apr 20 |
nicklas |
96 |
for (Integer id : ids) |
5924 |
29 Apr 20 |
nicklas |
97 |
{ |
5924 |
29 Apr 20 |
nicklas |
98 |
list.add(Rawbioassay.getById(dc, id)); |
5924 |
29 Apr 20 |
nicklas |
99 |
} |
5924 |
29 Apr 20 |
nicklas |
100 |
} |
5924 |
29 Apr 20 |
nicklas |
101 |
|
5924 |
29 Apr 20 |
nicklas |
102 |
SnapshotManager manager = new SnapshotManager(); |
5924 |
29 Apr 20 |
nicklas |
103 |
JSONArray jsonRawBioAssays = new JSONArray(); |
5924 |
29 Apr 20 |
nicklas |
104 |
for (Rawbioassay raw : list) |
5924 |
29 Apr 20 |
nicklas |
105 |
{ |
5924 |
29 Apr 20 |
nicklas |
106 |
RawBioAssay rba = raw.getItem(); |
5924 |
29 Apr 20 |
nicklas |
107 |
raw.loadAnnotations(dc, manager, "AutoProcess", Annotationtype.AUTO_PROCESSING, null); |
5924 |
29 Apr 20 |
nicklas |
108 |
raw.loadAnnotations(dc, manager, "pipeline", Annotationtype.PIPELINE, null); |
5924 |
29 Apr 20 |
nicklas |
109 |
|
5924 |
29 Apr 20 |
nicklas |
// Load library information |
5924 |
29 Apr 20 |
nicklas |
111 |
Library lib = raw.getLibrary(dc); |
5924 |
29 Apr 20 |
nicklas |
112 |
Rna r = lib.getRna(dc, true); |
5924 |
29 Apr 20 |
nicklas |
113 |
lib.loadBioPlateLocation(); |
5924 |
29 Apr 20 |
nicklas |
114 |
lib.setAnnotation("specimen", r.loadYellowLabelInfo(dc, manager)); |
5924 |
29 Apr 20 |
nicklas |
115 |
raw.setAnnotation("lib", lib.asJSONObject()); |
5924 |
29 Apr 20 |
nicklas |
116 |
raw.loadDoNotUseAnnotations(dc, manager); |
5924 |
29 Apr 20 |
nicklas |
117 |
jsonRawBioAssays.add(raw.asJSONObject()); |
5924 |
29 Apr 20 |
nicklas |
118 |
} |
5924 |
29 Apr 20 |
nicklas |
119 |
|
5924 |
29 Apr 20 |
nicklas |
120 |
json.put("rawBioAssays", jsonRawBioAssays); |
5924 |
29 Apr 20 |
nicklas |
121 |
json.put("rawDataType", rawDataType != null ? rawDataType.getId() : null); |
5924 |
29 Apr 20 |
nicklas |
122 |
json.put("pipeline", pipeline != null ? pipeline.getName() : ""); |
5924 |
29 Apr 20 |
nicklas |
123 |
} |
5924 |
29 Apr 20 |
nicklas |
124 |
else if ("GetModels".equals(cmd)) |
5924 |
29 Apr 20 |
nicklas |
125 |
{ |
6335 |
15 Jun 21 |
nicklas |
126 |
dc = sc.newDbControl(":Start SSP analysis"); |
5924 |
29 Apr 20 |
nicklas |
127 |
JSONArray jsonModels = new JSONArray(); |
5926 |
29 Apr 20 |
nicklas |
128 |
List<SspModel> models = SspModel.getConfiguredModels(); |
5941 |
18 May 20 |
nicklas |
//Collections.sort(models); |
5926 |
29 Apr 20 |
nicklas |
130 |
for (SspModel m : models) |
5924 |
29 Apr 20 |
nicklas |
131 |
{ |
5941 |
18 May 20 |
nicklas |
132 |
AnnotationType at = m.getAnnotationType(dc); |
5941 |
18 May 20 |
nicklas |
133 |
|
5924 |
29 Apr 20 |
nicklas |
134 |
JSONObject jsonModel = new JSONObject(); |
5924 |
29 Apr 20 |
nicklas |
135 |
jsonModel.put("name", m.getName()); |
5941 |
18 May 20 |
nicklas |
136 |
jsonModel.put("annotationType", m.getAnnotationTypeName()); |
5962 |
03 Jun 20 |
nicklas |
137 |
jsonModel.put("description", m.getDescription()); |
5941 |
18 May 20 |
nicklas |
138 |
if (at != null) |
5941 |
18 May 20 |
nicklas |
139 |
{ |
5962 |
03 Jun 20 |
nicklas |
140 |
if (at.getDescription() != null) |
5962 |
03 Jun 20 |
nicklas |
141 |
{ |
5962 |
03 Jun 20 |
nicklas |
142 |
jsonModel.put("description", at.getDescription()); |
5962 |
03 Jun 20 |
nicklas |
143 |
} |
5941 |
18 May 20 |
nicklas |
144 |
} |
5941 |
18 May 20 |
nicklas |
145 |
else |
5941 |
18 May 20 |
nicklas |
146 |
{ |
5941 |
18 May 20 |
nicklas |
147 |
jsonModel.put("error", "Can't find annotation type: " + m.getAnnotationTypeName()); |
5941 |
18 May 20 |
nicklas |
148 |
} |
5941 |
18 May 20 |
nicklas |
149 |
if (!m.modelDataExists()) jsonModel.put("error", "Can't find file: "+m.getModelData()); |
5924 |
29 Apr 20 |
nicklas |
150 |
jsonModels.add(jsonModel); |
5924 |
29 Apr 20 |
nicklas |
151 |
} |
5924 |
29 Apr 20 |
nicklas |
152 |
json.put("models", jsonModels); |
5944 |
20 May 20 |
nicklas |
153 |
|
5944 |
20 May 20 |
nicklas |
// Load presets -- eg. PluginConfigurations |
5944 |
20 May 20 |
nicklas |
155 |
ItemQuery<PluginConfiguration> query = PluginConfiguration.getQuery(); |
5944 |
20 May 20 |
nicklas |
156 |
query.setIncludes(Reggie.INCLUDE_IN_CURRENT_PROJECT); |
5944 |
20 May 20 |
nicklas |
157 |
query.join(Hql.innerJoin("pluginDefinition", "p")); |
5944 |
20 May 20 |
nicklas |
158 |
query.restrict(Restrictions.eq(Hql.property("p", "className"), Expressions.string(SspPlugin.class.getName()))); |
5944 |
20 May 20 |
nicklas |
159 |
query.order(Orders.asc(Hql.property("name"))); |
5944 |
20 May 20 |
nicklas |
160 |
|
5944 |
20 May 20 |
nicklas |
161 |
JSONArray jsonPresets = new JSONArray(); |
5944 |
20 May 20 |
nicklas |
162 |
for (PluginConfiguration config : query.list(dc)) |
5944 |
20 May 20 |
nicklas |
163 |
{ |
5944 |
20 May 20 |
nicklas |
164 |
JSONObject jsonPreset = new JSONObject(); |
5944 |
20 May 20 |
nicklas |
165 |
jsonPreset.put("name", config.getName()); |
5944 |
20 May 20 |
nicklas |
166 |
JSONArray jsonPresetModels = new JSONArray(); |
5944 |
20 May 20 |
nicklas |
167 |
jsonPresetModels.addAll(config.getParameterValues("models")); |
5944 |
20 May 20 |
nicklas |
168 |
jsonPreset.put("models", jsonPresetModels); |
5944 |
20 May 20 |
nicklas |
169 |
jsonPresets.add(jsonPreset); |
5944 |
20 May 20 |
nicklas |
170 |
} |
5944 |
20 May 20 |
nicklas |
171 |
json.put("presets", jsonPresets); |
5924 |
29 Apr 20 |
nicklas |
172 |
} |
5924 |
29 Apr 20 |
nicklas |
173 |
|
5924 |
29 Apr 20 |
nicklas |
174 |
} |
5924 |
29 Apr 20 |
nicklas |
175 |
catch (Throwable t) |
5924 |
29 Apr 20 |
nicklas |
176 |
{ |
5924 |
29 Apr 20 |
nicklas |
177 |
t.printStackTrace(); |
5924 |
29 Apr 20 |
nicklas |
178 |
json.clear(); |
5924 |
29 Apr 20 |
nicklas |
179 |
json.put("status", "error"); |
5924 |
29 Apr 20 |
nicklas |
180 |
json.put("message", t.getMessage()); |
5924 |
29 Apr 20 |
nicklas |
181 |
json.put("stacktrace", ThrowableUtil.stackTraceToString(t)); |
5924 |
29 Apr 20 |
nicklas |
182 |
} |
5924 |
29 Apr 20 |
nicklas |
183 |
finally |
5924 |
29 Apr 20 |
nicklas |
184 |
{ |
5924 |
29 Apr 20 |
nicklas |
185 |
if (dc != null) dc.close(); |
5924 |
29 Apr 20 |
nicklas |
186 |
json.writeJSONString(resp.getWriter()); |
5924 |
29 Apr 20 |
nicklas |
187 |
} |
5924 |
29 Apr 20 |
nicklas |
188 |
|
5924 |
29 Apr 20 |
nicklas |
189 |
} |
5924 |
29 Apr 20 |
nicklas |
190 |
|
5924 |
29 Apr 20 |
nicklas |
191 |
@SuppressWarnings("unchecked") |
5924 |
29 Apr 20 |
nicklas |
192 |
@Override |
5924 |
29 Apr 20 |
nicklas |
193 |
protected void doPost(HttpServletRequest req, HttpServletResponse resp) |
5924 |
29 Apr 20 |
nicklas |
194 |
throws ServletException, IOException |
5924 |
29 Apr 20 |
nicklas |
195 |
{ |
5924 |
29 Apr 20 |
nicklas |
196 |
String cmd = req.getParameter("cmd"); |
5924 |
29 Apr 20 |
nicklas |
197 |
JsonUtil.setJsonResponseHeaders(resp); |
5924 |
29 Apr 20 |
nicklas |
198 |
|
5924 |
29 Apr 20 |
nicklas |
199 |
JSONObject json = new JSONObject(); |
5924 |
29 Apr 20 |
nicklas |
200 |
json.put("status", "ok"); |
5924 |
29 Apr 20 |
nicklas |
201 |
JSONArray jsonMessages = new JSONArray(); |
5924 |
29 Apr 20 |
nicklas |
202 |
|
5924 |
29 Apr 20 |
nicklas |
203 |
final SessionControl sc = Reggie.getSessionControl(req); |
5924 |
29 Apr 20 |
nicklas |
204 |
DbControl dc = null; |
5924 |
29 Apr 20 |
nicklas |
205 |
try |
5924 |
29 Apr 20 |
nicklas |
206 |
{ |
5924 |
29 Apr 20 |
nicklas |
207 |
|
5924 |
29 Apr 20 |
nicklas |
208 |
if ("RunSsp".equals(cmd)) |
5924 |
29 Apr 20 |
nicklas |
209 |
{ |
6335 |
15 Jun 21 |
nicklas |
210 |
dc = sc.newDbControl(":Start SSP analysis"); |
5924 |
29 Apr 20 |
nicklas |
211 |
ReggieRole.checkPermission(dc, "'" + cmd + "' wizard", ReggieRole.SECONDARY_ANALYSIS, ReggieRole.ADMINISTRATOR); |
5924 |
29 Apr 20 |
nicklas |
212 |
|
5924 |
29 Apr 20 |
nicklas |
213 |
JSONObject jsonReq = JsonUtil.parseRequest(req); |
5924 |
29 Apr 20 |
nicklas |
214 |
JSONArray jsonRawBioAssays = (JSONArray)jsonReq.get("rawBioAssays"); |
5924 |
29 Apr 20 |
nicklas |
215 |
List<String> models = (List<String>)jsonReq.get("models"); |
6025 |
26 Oct 20 |
nicklas |
216 |
boolean autoConfirm = Boolean.TRUE.equals(jsonReq.get("autoConfirm")); |
5924 |
29 Apr 20 |
nicklas |
217 |
|
5924 |
29 Apr 20 |
nicklas |
218 |
List<RawBioAssay> rawBioAssays = new ArrayList<RawBioAssay>(jsonRawBioAssays.size()); |
5924 |
29 Apr 20 |
nicklas |
219 |
for (int rawNo = 0; rawNo < jsonRawBioAssays.size(); rawNo++) |
5924 |
29 Apr 20 |
nicklas |
220 |
{ |
5924 |
29 Apr 20 |
nicklas |
221 |
Number rawId = (Number)jsonRawBioAssays.get(rawNo); |
5924 |
29 Apr 20 |
nicklas |
222 |
RawBioAssay raw = RawBioAssay.getById(dc, rawId.intValue()); |
5924 |
29 Apr 20 |
nicklas |
223 |
rawBioAssays.add(raw); |
5924 |
29 Apr 20 |
nicklas |
224 |
} |
5924 |
29 Apr 20 |
nicklas |
225 |
|
6025 |
26 Oct 20 |
nicklas |
226 |
Job j = SspPlugin.createAnalysisJob(dc, rawBioAssays, models, autoConfirm); |
5924 |
29 Apr 20 |
nicklas |
227 |
dc.commit(); |
5924 |
29 Apr 20 |
nicklas |
228 |
|
5924 |
29 Apr 20 |
nicklas |
229 |
json.put("job", JsonUtil.getJobAsJSON(j)); |
5962 |
03 Jun 20 |
nicklas |
230 |
if (rawBioAssays.size() == 0) |
5962 |
03 Jun 20 |
nicklas |
231 |
{ |
5962 |
03 Jun 20 |
nicklas |
232 |
jsonMessages.add("Successfully scheduled job for analyzing " + models.size() + " models"); |
5962 |
03 Jun 20 |
nicklas |
233 |
} |
5962 |
03 Jun 20 |
nicklas |
234 |
else |
5962 |
03 Jun 20 |
nicklas |
235 |
{ |
5962 |
03 Jun 20 |
nicklas |
236 |
jsonMessages.add("Successfully scheduled job for analyzing " + rawBioAssays.size() + " raw bioassays with " + models.size() + " models"); |
5962 |
03 Jun 20 |
nicklas |
237 |
} |
5924 |
29 Apr 20 |
nicklas |
238 |
} |
5924 |
29 Apr 20 |
nicklas |
239 |
|
5924 |
29 Apr 20 |
nicklas |
240 |
json.put("messages", jsonMessages); |
5924 |
29 Apr 20 |
nicklas |
241 |
CounterService.getInstance().setForceCount(); |
5924 |
29 Apr 20 |
nicklas |
242 |
} |
5924 |
29 Apr 20 |
nicklas |
243 |
catch (Throwable t) |
5924 |
29 Apr 20 |
nicklas |
244 |
{ |
5924 |
29 Apr 20 |
nicklas |
245 |
t.printStackTrace(); |
5924 |
29 Apr 20 |
nicklas |
246 |
json.clear(); |
5924 |
29 Apr 20 |
nicklas |
247 |
json.put("status", "error"); |
5924 |
29 Apr 20 |
nicklas |
248 |
json.put("message", t.getMessage()); |
5924 |
29 Apr 20 |
nicklas |
249 |
json.put("stacktrace", ThrowableUtil.stackTraceToString(t)); |
5924 |
29 Apr 20 |
nicklas |
250 |
} |
5924 |
29 Apr 20 |
nicklas |
251 |
finally |
5924 |
29 Apr 20 |
nicklas |
252 |
{ |
5924 |
29 Apr 20 |
nicklas |
253 |
if (dc != null) dc.close(); |
5924 |
29 Apr 20 |
nicklas |
254 |
json.writeJSONString(resp.getWriter()); |
5924 |
29 Apr 20 |
nicklas |
255 |
} |
5924 |
29 Apr 20 |
nicklas |
256 |
|
5924 |
29 Apr 20 |
nicklas |
257 |
} |
5924 |
29 Apr 20 |
nicklas |
258 |
|
5924 |
29 Apr 20 |
nicklas |
259 |
|
5924 |
29 Apr 20 |
nicklas |
260 |
|
5924 |
29 Apr 20 |
nicklas |
261 |
} |