1562 |
15 Mar 12 |
nicklas |
1 |
package net.sf.basedb.reggie.plugins; |
1562 |
15 Mar 12 |
nicklas |
2 |
|
1562 |
15 Mar 12 |
nicklas |
3 |
import java.io.IOException; |
1562 |
15 Mar 12 |
nicklas |
4 |
import java.io.OutputStreamWriter; |
1562 |
15 Mar 12 |
nicklas |
5 |
import java.io.Writer; |
1562 |
15 Mar 12 |
nicklas |
6 |
import java.util.ArrayList; |
1562 |
15 Mar 12 |
nicklas |
7 |
import java.util.Arrays; |
1562 |
15 Mar 12 |
nicklas |
8 |
import java.util.Collections; |
1562 |
15 Mar 12 |
nicklas |
9 |
import java.util.Iterator; |
1562 |
15 Mar 12 |
nicklas |
10 |
import java.util.List; |
1562 |
15 Mar 12 |
nicklas |
11 |
import java.util.Set; |
1562 |
15 Mar 12 |
nicklas |
12 |
|
3009 |
04 Dec 14 |
nicklas |
13 |
import org.jdom2.Document; |
3009 |
04 Dec 14 |
nicklas |
14 |
import org.jdom2.Element; |
3009 |
04 Dec 14 |
nicklas |
15 |
import org.jdom2.output.Format; |
3009 |
04 Dec 14 |
nicklas |
16 |
import org.jdom2.output.XMLOutputter; |
1562 |
15 Mar 12 |
nicklas |
17 |
|
1562 |
15 Mar 12 |
nicklas |
18 |
import net.sf.basedb.core.BaseException; |
1562 |
15 Mar 12 |
nicklas |
19 |
import net.sf.basedb.core.BioMaterial; |
1562 |
15 Mar 12 |
nicklas |
20 |
import net.sf.basedb.core.BioPlate; |
1562 |
15 Mar 12 |
nicklas |
21 |
import net.sf.basedb.core.BioWell; |
1562 |
15 Mar 12 |
nicklas |
22 |
import net.sf.basedb.core.DbControl; |
1562 |
15 Mar 12 |
nicklas |
23 |
import net.sf.basedb.core.Item; |
1562 |
15 Mar 12 |
nicklas |
24 |
import net.sf.basedb.core.ItemParameterType; |
1562 |
15 Mar 12 |
nicklas |
25 |
import net.sf.basedb.core.ItemQuery; |
1562 |
15 Mar 12 |
nicklas |
26 |
import net.sf.basedb.core.Path; |
1562 |
15 Mar 12 |
nicklas |
27 |
import net.sf.basedb.core.PermissionDeniedException; |
1562 |
15 Mar 12 |
nicklas |
28 |
import net.sf.basedb.core.PluginDefinition; |
1562 |
15 Mar 12 |
nicklas |
29 |
import net.sf.basedb.core.PluginParameter; |
1562 |
15 Mar 12 |
nicklas |
30 |
import net.sf.basedb.core.ProgressReporter; |
1562 |
15 Mar 12 |
nicklas |
31 |
import net.sf.basedb.core.RequestInformation; |
1562 |
15 Mar 12 |
nicklas |
32 |
import net.sf.basedb.core.User; |
1562 |
15 Mar 12 |
nicklas |
33 |
import net.sf.basedb.core.Job.ExecutionTime; |
1562 |
15 Mar 12 |
nicklas |
34 |
import net.sf.basedb.core.StringParameterType; |
1562 |
15 Mar 12 |
nicklas |
35 |
import net.sf.basedb.core.plugin.AbstractExporterPlugin; |
1562 |
15 Mar 12 |
nicklas |
36 |
import net.sf.basedb.core.plugin.ExportOutputStream; |
1562 |
15 Mar 12 |
nicklas |
37 |
import net.sf.basedb.core.plugin.GuiContext; |
1562 |
15 Mar 12 |
nicklas |
38 |
import net.sf.basedb.core.plugin.InteractivePlugin; |
1562 |
15 Mar 12 |
nicklas |
39 |
import net.sf.basedb.core.plugin.ParameterValues; |
1562 |
15 Mar 12 |
nicklas |
40 |
import net.sf.basedb.core.plugin.ParameterValuesWrapper; |
1562 |
15 Mar 12 |
nicklas |
41 |
import net.sf.basedb.core.plugin.Request; |
1562 |
15 Mar 12 |
nicklas |
42 |
import net.sf.basedb.core.plugin.Response; |
1562 |
15 Mar 12 |
nicklas |
43 |
import net.sf.basedb.core.query.Hql; |
1562 |
15 Mar 12 |
nicklas |
44 |
import net.sf.basedb.core.query.Orders; |
1610 |
23 Apr 12 |
nicklas |
45 |
import net.sf.basedb.reggie.dao.Annotationtype; |
1562 |
15 Mar 12 |
nicklas |
46 |
import net.sf.basedb.util.Values; |
1562 |
15 Mar 12 |
nicklas |
47 |
|
1562 |
15 Mar 12 |
nicklas |
48 |
/** |
1562 |
15 Mar 12 |
nicklas |
Plug-in for exporting run parameters that can be imported when starting |
1562 |
15 Mar 12 |
nicklas |
a Caliper run. The run file contains information about bioassay type (standard |
1562 |
15 Mar 12 |
nicklas |
or high sense) and which wells that should be included in the run. |
1562 |
15 Mar 12 |
nicklas |
52 |
|
1562 |
15 Mar 12 |
nicklas |
This class can be used as a BASE plug-in or as a standalone exporter. |
1562 |
15 Mar 12 |
nicklas |
In the latter case, simply use the {@link #exportRunParameters(DbControl, BioPlate, boolean, ParameterValues, Writer)} |
1562 |
15 Mar 12 |
nicklas |
method. |
1562 |
15 Mar 12 |
nicklas |
<p> |
1562 |
15 Mar 12 |
nicklas |
57 |
|
1562 |
15 Mar 12 |
nicklas |
Since the exporter should be really quick it doesn't implement support for aborting |
1562 |
15 Mar 12 |
nicklas |
or progress reporting. |
1562 |
15 Mar 12 |
nicklas |
60 |
|
1562 |
15 Mar 12 |
nicklas |
@author nicklas |
1562 |
15 Mar 12 |
nicklas |
@since 2.4 |
1562 |
15 Mar 12 |
nicklas |
63 |
*/ |
1562 |
15 Mar 12 |
nicklas |
64 |
public class CaliperRunParametersExporter |
1562 |
15 Mar 12 |
nicklas |
65 |
extends AbstractExporterPlugin |
1562 |
15 Mar 12 |
nicklas |
66 |
implements InteractivePlugin |
1562 |
15 Mar 12 |
nicklas |
67 |
{ |
1562 |
15 Mar 12 |
nicklas |
68 |
|
1562 |
15 Mar 12 |
nicklas |
69 |
private RequestInformation configureJob; |
1562 |
15 Mar 12 |
nicklas |
70 |
|
1562 |
15 Mar 12 |
nicklas |
71 |
public CaliperRunParametersExporter() |
1562 |
15 Mar 12 |
nicklas |
72 |
{} |
1562 |
15 Mar 12 |
nicklas |
73 |
|
1562 |
15 Mar 12 |
nicklas |
74 |
/* |
1562 |
15 Mar 12 |
nicklas |
From the Plugin interface |
1562 |
15 Mar 12 |
nicklas |
76 |
-------------------------------- |
1562 |
15 Mar 12 |
nicklas |
77 |
*/ |
1562 |
15 Mar 12 |
nicklas |
78 |
@Override |
1562 |
15 Mar 12 |
nicklas |
79 |
public boolean supportsConfigurations() |
1562 |
15 Mar 12 |
nicklas |
80 |
{ |
1562 |
15 Mar 12 |
nicklas |
81 |
return true; |
1562 |
15 Mar 12 |
nicklas |
82 |
} |
1562 |
15 Mar 12 |
nicklas |
83 |
@Override |
1562 |
15 Mar 12 |
nicklas |
84 |
public boolean requiresConfiguration() |
1562 |
15 Mar 12 |
nicklas |
85 |
{ |
1562 |
15 Mar 12 |
nicklas |
86 |
return true; |
1562 |
15 Mar 12 |
nicklas |
87 |
} |
1562 |
15 Mar 12 |
nicklas |
88 |
// ------------------------------------- |
1562 |
15 Mar 12 |
nicklas |
89 |
|
1562 |
15 Mar 12 |
nicklas |
90 |
/* |
1562 |
15 Mar 12 |
nicklas |
From the InteractivePlugin interface |
1562 |
15 Mar 12 |
nicklas |
92 |
------------------------------------------- |
1562 |
15 Mar 12 |
nicklas |
93 |
*/ |
1562 |
15 Mar 12 |
nicklas |
94 |
/** |
1562 |
15 Mar 12 |
nicklas |
The plug-in will appear on the |
1562 |
15 Mar 12 |
nicklas |
96 |
*/ |
1562 |
15 Mar 12 |
nicklas |
97 |
@Override |
1562 |
15 Mar 12 |
nicklas |
98 |
public Set<GuiContext> getGuiContexts() |
1562 |
15 Mar 12 |
nicklas |
99 |
{ |
1562 |
15 Mar 12 |
nicklas |
100 |
return Collections.singleton(GuiContext.item(Item.BIOPLATE)); |
1562 |
15 Mar 12 |
nicklas |
101 |
} |
1562 |
15 Mar 12 |
nicklas |
102 |
/** |
1562 |
15 Mar 12 |
nicklas |
We accept all bioplates. |
1562 |
15 Mar 12 |
nicklas |
104 |
*/ |
1562 |
15 Mar 12 |
nicklas |
105 |
@Override |
1562 |
15 Mar 12 |
nicklas |
106 |
public String isInContext(GuiContext context, Object item) |
1562 |
15 Mar 12 |
nicklas |
107 |
{ |
1562 |
15 Mar 12 |
nicklas |
108 |
String message = null; |
1562 |
15 Mar 12 |
nicklas |
109 |
if (item == null) |
1562 |
15 Mar 12 |
nicklas |
110 |
{ |
1562 |
15 Mar 12 |
nicklas |
111 |
message = "The object is null"; |
1562 |
15 Mar 12 |
nicklas |
112 |
} |
1562 |
15 Mar 12 |
nicklas |
113 |
else if (!(item instanceof BioPlate)) |
1562 |
15 Mar 12 |
nicklas |
114 |
{ |
1562 |
15 Mar 12 |
nicklas |
115 |
message = "The object is not a BioPlate: " + item; |
1562 |
15 Mar 12 |
nicklas |
116 |
} |
1562 |
15 Mar 12 |
nicklas |
117 |
return message; |
1562 |
15 Mar 12 |
nicklas |
118 |
} |
1562 |
15 Mar 12 |
nicklas |
119 |
@Override |
1562 |
15 Mar 12 |
nicklas |
120 |
public RequestInformation getRequestInformation(GuiContext context, String command) |
1562 |
15 Mar 12 |
nicklas |
121 |
throws BaseException |
1562 |
15 Mar 12 |
nicklas |
122 |
{ |
1562 |
15 Mar 12 |
nicklas |
123 |
RequestInformation requestInformation = null; |
1562 |
15 Mar 12 |
nicklas |
124 |
if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command)) |
1562 |
15 Mar 12 |
nicklas |
125 |
{ |
1562 |
15 Mar 12 |
nicklas |
126 |
requestInformation = getConfigurePluginParameters(); |
1562 |
15 Mar 12 |
nicklas |
127 |
} |
1562 |
15 Mar 12 |
nicklas |
128 |
else if (Request.COMMAND_CONFIGURE_JOB.equals(command)) |
1562 |
15 Mar 12 |
nicklas |
129 |
{ |
1562 |
15 Mar 12 |
nicklas |
130 |
requestInformation = getConfigureJobParameters(null); |
1562 |
15 Mar 12 |
nicklas |
131 |
} |
1562 |
15 Mar 12 |
nicklas |
132 |
return requestInformation; |
1562 |
15 Mar 12 |
nicklas |
133 |
} |
1562 |
15 Mar 12 |
nicklas |
134 |
@Override |
1562 |
15 Mar 12 |
nicklas |
135 |
public void configure(GuiContext context, Request request, Response response) |
1562 |
15 Mar 12 |
nicklas |
136 |
{ |
1562 |
15 Mar 12 |
nicklas |
137 |
String command = request.getCommand(); |
1562 |
15 Mar 12 |
nicklas |
138 |
try |
1562 |
15 Mar 12 |
nicklas |
139 |
{ |
1562 |
15 Mar 12 |
nicklas |
140 |
if (command.equals(Request.COMMAND_CONFIGURE_PLUGIN)) |
1562 |
15 Mar 12 |
nicklas |
141 |
{ |
1562 |
15 Mar 12 |
nicklas |
142 |
RequestInformation ri = getConfigurePluginParameters(); |
1562 |
15 Mar 12 |
nicklas |
143 |
List<Throwable> errors = validateRequestParameters(ri.getParameters(), request); |
1562 |
15 Mar 12 |
nicklas |
144 |
if (errors != null) |
1562 |
15 Mar 12 |
nicklas |
145 |
{ |
1562 |
15 Mar 12 |
nicklas |
146 |
response.setError(errors.size() + " invalid parameters were found in the request",errors); |
1562 |
15 Mar 12 |
nicklas |
147 |
return; |
1562 |
15 Mar 12 |
nicklas |
148 |
} |
1562 |
15 Mar 12 |
nicklas |
149 |
|
1562 |
15 Mar 12 |
nicklas |
150 |
storeValue(configuration, request, ri.getParameter("sensitivity")); |
1562 |
15 Mar 12 |
nicklas |
151 |
storeValue(configuration, request, ri.getParameter("AssayType")); |
1562 |
15 Mar 12 |
nicklas |
152 |
storeValue(configuration, request, ri.getParameter("PlateName")); |
1562 |
15 Mar 12 |
nicklas |
153 |
storeValue(configuration, request, ri.getParameter("DataPath")); |
1562 |
15 Mar 12 |
nicklas |
154 |
response.setDone("Plugin configuration complete"); |
1562 |
15 Mar 12 |
nicklas |
155 |
} |
1562 |
15 Mar 12 |
nicklas |
156 |
else if (command.equals(Request.COMMAND_CONFIGURE_JOB)) |
1562 |
15 Mar 12 |
nicklas |
157 |
{ |
1562 |
15 Mar 12 |
nicklas |
158 |
RequestInformation ri = getConfigureJobParameters(!request.isAllowedImmediateExecution()); |
1562 |
15 Mar 12 |
nicklas |
159 |
List<Throwable> errors = validateRequestParameters(ri.getParameters(), request); |
1562 |
15 Mar 12 |
nicklas |
160 |
if (errors != null) |
1562 |
15 Mar 12 |
nicklas |
161 |
{ |
1562 |
15 Mar 12 |
nicklas |
162 |
response.setError(errors.size() + " invalid parameters were found in the request",errors); |
1562 |
15 Mar 12 |
nicklas |
163 |
return; |
1562 |
15 Mar 12 |
nicklas |
164 |
} |
1562 |
15 Mar 12 |
nicklas |
165 |
|
1562 |
15 Mar 12 |
nicklas |
166 |
storeValue(job, request, ri.getParameter("bioplate")); |
1562 |
15 Mar 12 |
nicklas |
167 |
if (request.getParameterValue(SAVE_AS) == null) |
1562 |
15 Mar 12 |
nicklas |
168 |
{ |
1562 |
15 Mar 12 |
nicklas |
169 |
if (!request.isAllowedImmediateExecution()) |
1562 |
15 Mar 12 |
nicklas |
170 |
{ |
1562 |
15 Mar 12 |
nicklas |
171 |
response.setError("Immediate download is not allowed. Please specify a filename.", null); |
1562 |
15 Mar 12 |
nicklas |
172 |
return; |
1562 |
15 Mar 12 |
nicklas |
173 |
} |
1562 |
15 Mar 12 |
nicklas |
174 |
BioPlate plate = (BioPlate)request.getParameterValue("bioplate"); |
1562 |
15 Mar 12 |
nicklas |
175 |
response.setDownloadImmediately("Export Caliper sample names for bioplate " + |
1562 |
15 Mar 12 |
nicklas |
176 |
plate.getName(), ExecutionTime.SHORTEST, true); |
1562 |
15 Mar 12 |
nicklas |
177 |
} |
1562 |
15 Mar 12 |
nicklas |
178 |
else |
1562 |
15 Mar 12 |
nicklas |
179 |
{ |
1562 |
15 Mar 12 |
nicklas |
180 |
Object parameterValue = request.getParameterValue(OVERWRITE); |
1562 |
15 Mar 12 |
nicklas |
181 |
boolean overwrite = parameterValue != null ? (Boolean)parameterValue : false; |
1562 |
15 Mar 12 |
nicklas |
182 |
if (!pathCanBeUsed((String)request.getParameterValue(ri.getParameter(SAVE_AS).getName()), overwrite)) |
1562 |
15 Mar 12 |
nicklas |
183 |
{ |
1562 |
15 Mar 12 |
nicklas |
184 |
response.setError("File exists: " + (String)request.getParameterValue(ri.getParameter(SAVE_AS).getName()), null); |
1562 |
15 Mar 12 |
nicklas |
185 |
return; |
1562 |
15 Mar 12 |
nicklas |
186 |
} |
1562 |
15 Mar 12 |
nicklas |
187 |
storeValue(job, request, ri.getParameter(SAVE_AS)); |
1562 |
15 Mar 12 |
nicklas |
188 |
storeValue(job, request, ri.getParameter(OVERWRITE)); |
1562 |
15 Mar 12 |
nicklas |
189 |
BioPlate plate = (BioPlate)job.getValue("bioplate"); |
1562 |
15 Mar 12 |
nicklas |
190 |
response.setSuggestedJobName("Export Caliper sample names for bioplate '" + plate.getName() + "'"); |
1562 |
15 Mar 12 |
nicklas |
191 |
response.setDone("The job configuration is complete", ExecutionTime.SHORTEST); |
1562 |
15 Mar 12 |
nicklas |
192 |
} |
1562 |
15 Mar 12 |
nicklas |
193 |
} |
1562 |
15 Mar 12 |
nicklas |
194 |
} |
1562 |
15 Mar 12 |
nicklas |
195 |
catch(Throwable ex) |
1562 |
15 Mar 12 |
nicklas |
196 |
{ |
1562 |
15 Mar 12 |
nicklas |
197 |
response.setError(ex.getMessage(), Arrays.asList(ex)); |
1562 |
15 Mar 12 |
nicklas |
198 |
} |
1562 |
15 Mar 12 |
nicklas |
199 |
} |
1562 |
15 Mar 12 |
nicklas |
200 |
// ------------------------------------------------ |
1562 |
15 Mar 12 |
nicklas |
201 |
|
1562 |
15 Mar 12 |
nicklas |
202 |
|
1562 |
15 Mar 12 |
nicklas |
203 |
/* |
1562 |
15 Mar 12 |
nicklas |
From the AbstractExporterPlugin interface |
1562 |
15 Mar 12 |
nicklas |
205 |
----------------------------------------- |
1562 |
15 Mar 12 |
nicklas |
206 |
*/ |
1562 |
15 Mar 12 |
nicklas |
207 |
private DbControl dc; |
1562 |
15 Mar 12 |
nicklas |
208 |
private int numExported; |
1562 |
15 Mar 12 |
nicklas |
209 |
@Override |
1562 |
15 Mar 12 |
nicklas |
210 |
protected void begin(DbControl dc) |
1562 |
15 Mar 12 |
nicklas |
211 |
{ |
1562 |
15 Mar 12 |
nicklas |
212 |
this.dc = dc; |
1562 |
15 Mar 12 |
nicklas |
213 |
} |
1562 |
15 Mar 12 |
nicklas |
214 |
|
1562 |
15 Mar 12 |
nicklas |
215 |
@Override |
1562 |
15 Mar 12 |
nicklas |
216 |
protected void performExport(ExportOutputStream out, ProgressReporter progress) |
1562 |
15 Mar 12 |
nicklas |
217 |
throws IOException |
1562 |
15 Mar 12 |
nicklas |
218 |
{ |
1562 |
15 Mar 12 |
nicklas |
219 |
BioPlate plate = (BioPlate)job.getValue("bioplate"); |
1562 |
15 Mar 12 |
nicklas |
220 |
plate = BioPlate.getById(dc, plate.getId()); |
1562 |
15 Mar 12 |
nicklas |
221 |
out.setMimeType("application/xml"); |
1562 |
15 Mar 12 |
nicklas |
222 |
String filename = Path.makeSafeFilename(plate.getName(), "")+".xml"; |
1562 |
15 Mar 12 |
nicklas |
223 |
out.setFilename(filename); |
1562 |
15 Mar 12 |
nicklas |
224 |
out.setCharacterSet("UTF-8"); |
1562 |
15 Mar 12 |
nicklas |
225 |
boolean hiSense = "High".equals(configuration.getValue("sensitivity")); |
1562 |
15 Mar 12 |
nicklas |
226 |
|
1562 |
15 Mar 12 |
nicklas |
227 |
Writer writer = new OutputStreamWriter(out, "UTF-8"); |
1562 |
15 Mar 12 |
nicklas |
228 |
|
1562 |
15 Mar 12 |
nicklas |
229 |
ParameterValues parameters = new ParameterValuesWrapper(null, job, configuration, true); |
1562 |
15 Mar 12 |
nicklas |
230 |
|
1562 |
15 Mar 12 |
nicklas |
231 |
numExported = exportRunParameters(dc, plate, hiSense, parameters, writer); |
1562 |
15 Mar 12 |
nicklas |
232 |
writer.flush(); |
1562 |
15 Mar 12 |
nicklas |
233 |
|
1562 |
15 Mar 12 |
nicklas |
234 |
} |
1751 |
28 Nov 12 |
nicklas |
235 |
@Override |
1562 |
15 Mar 12 |
nicklas |
236 |
protected void end(boolean success) |
1562 |
15 Mar 12 |
nicklas |
237 |
{ |
1562 |
15 Mar 12 |
nicklas |
238 |
this.dc = null; |
1562 |
15 Mar 12 |
nicklas |
239 |
} |
1751 |
28 Nov 12 |
nicklas |
240 |
@Override |
1562 |
15 Mar 12 |
nicklas |
241 |
protected String getSuccessMessage() |
1562 |
15 Mar 12 |
nicklas |
242 |
{ |
1562 |
15 Mar 12 |
nicklas |
243 |
return numExported + " samples selected in run file"; |
1562 |
15 Mar 12 |
nicklas |
244 |
} |
1562 |
15 Mar 12 |
nicklas |
245 |
// ------------------------------------------- |
1562 |
15 Mar 12 |
nicklas |
246 |
|
1562 |
15 Mar 12 |
nicklas |
247 |
private RequestInformation getConfigurePluginParameters() |
1562 |
15 Mar 12 |
nicklas |
248 |
{ |
1562 |
15 Mar 12 |
nicklas |
249 |
List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>(); |
1562 |
15 Mar 12 |
nicklas |
250 |
|
1562 |
15 Mar 12 |
nicklas |
251 |
parameters.add(new PluginParameter<String>("sensitivity", "Sensitivity", |
1562 |
15 Mar 12 |
nicklas |
252 |
"This parameter decide which RNA QC aliquots from the plate are selected for " + |
1562 |
15 Mar 12 |
nicklas |
253 |
"a specific run:\n" + |
1562 |
15 Mar 12 |
nicklas |
254 |
"Standard = extracts QCHiSense=FALSE or missing are selected\n" + |
1562 |
15 Mar 12 |
nicklas |
255 |
"High = extracts with QCHiSense=TRUE are selected", |
1562 |
15 Mar 12 |
nicklas |
256 |
new StringParameterType(255, "Standard", true, 1, 0, 0, Arrays.asList("Standard", "High")) |
1562 |
15 Mar 12 |
nicklas |
257 |
)); |
1562 |
15 Mar 12 |
nicklas |
258 |
|
1562 |
15 Mar 12 |
nicklas |
259 |
parameters.add(new PluginParameter<String>("AssayType", "Assay Type", |
1562 |
15 Mar 12 |
nicklas |
260 |
"Enter the name of the Assay Type parameter as it appears in the Run dialog in the Caliper software. " + |
1562 |
15 Mar 12 |
nicklas |
261 |
"If an incorrect name is used the exported file can't be used by Caliper.", |
1562 |
15 Mar 12 |
nicklas |
262 |
new StringParameterType(255, null, true) |
1562 |
15 Mar 12 |
nicklas |
263 |
)); |
1562 |
15 Mar 12 |
nicklas |
264 |
|
1562 |
15 Mar 12 |
nicklas |
265 |
parameters.add(new PluginParameter<String>("PlateName", "Plate Name", |
1562 |
15 Mar 12 |
nicklas |
266 |
"Enter the name of the plate as it appears in the Run dialog in the Caliper software. " + |
1562 |
15 Mar 12 |
nicklas |
267 |
"If an incorrect name is used the exported file can't be used by Caliper.", |
1562 |
15 Mar 12 |
nicklas |
268 |
new StringParameterType(255, null, true) |
1562 |
15 Mar 12 |
nicklas |
269 |
)); |
1562 |
15 Mar 12 |
nicklas |
270 |
|
1562 |
15 Mar 12 |
nicklas |
271 |
parameters.add(new PluginParameter<String>("DataPath", "Data Path", |
1562 |
15 Mar 12 |
nicklas |
272 |
"Enter the path on the Caliper computer where data files should be saved." + |
1562 |
15 Mar 12 |
nicklas |
273 |
"If not specified, the descision is left to the Caliper software.", |
1562 |
15 Mar 12 |
nicklas |
274 |
new StringParameterType() |
1562 |
15 Mar 12 |
nicklas |
275 |
)); |
1562 |
15 Mar 12 |
nicklas |
276 |
|
1562 |
15 Mar 12 |
nicklas |
277 |
return new RequestInformation(Request.COMMAND_CONFIGURE_PLUGIN, |
1562 |
15 Mar 12 |
nicklas |
278 |
"Caliper runtime options", |
1562 |
15 Mar 12 |
nicklas |
279 |
"Select various runtime options for the Caliper software", |
1562 |
15 Mar 12 |
nicklas |
280 |
parameters); |
1562 |
15 Mar 12 |
nicklas |
281 |
} |
1562 |
15 Mar 12 |
nicklas |
282 |
|
1562 |
15 Mar 12 |
nicklas |
283 |
private RequestInformation getConfigureJobParameters(Boolean requireFile) |
1562 |
15 Mar 12 |
nicklas |
284 |
{ |
1562 |
15 Mar 12 |
nicklas |
285 |
if (configureJob == null) |
1562 |
15 Mar 12 |
nicklas |
286 |
{ |
1562 |
15 Mar 12 |
nicklas |
// Load the current bioplate |
1562 |
15 Mar 12 |
nicklas |
288 |
BioPlate currentPlate = null; |
1562 |
15 Mar 12 |
nicklas |
289 |
int currentPlateId = sc.getCurrentContext(Item.BIOPLATE).getId(); |
1562 |
15 Mar 12 |
nicklas |
290 |
if (currentPlateId != 0) |
1562 |
15 Mar 12 |
nicklas |
291 |
{ |
1562 |
15 Mar 12 |
nicklas |
292 |
DbControl dc = sc.newDbControl(); |
1562 |
15 Mar 12 |
nicklas |
293 |
try |
1562 |
15 Mar 12 |
nicklas |
294 |
{ |
1562 |
15 Mar 12 |
nicklas |
295 |
currentPlate = BioPlate.getById(dc, currentPlateId); |
1562 |
15 Mar 12 |
nicklas |
296 |
} |
1562 |
15 Mar 12 |
nicklas |
297 |
finally |
1562 |
15 Mar 12 |
nicklas |
298 |
{ |
1562 |
15 Mar 12 |
nicklas |
299 |
if (dc != null) dc.close(); |
1562 |
15 Mar 12 |
nicklas |
300 |
} |
1562 |
15 Mar 12 |
nicklas |
301 |
} |
1562 |
15 Mar 12 |
nicklas |
302 |
|
1562 |
15 Mar 12 |
nicklas |
303 |
List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>(); |
1562 |
15 Mar 12 |
nicklas |
304 |
|
1562 |
15 Mar 12 |
nicklas |
305 |
parameters.add(new PluginParameter<BioPlate>( |
1562 |
15 Mar 12 |
nicklas |
306 |
"bioplate", "Bioplate", "Select the bioplate to export", |
1562 |
15 Mar 12 |
nicklas |
307 |
new ItemParameterType<BioPlate>(BioPlate.class, currentPlate, true, 1, null) |
1562 |
15 Mar 12 |
nicklas |
308 |
)); |
1562 |
15 Mar 12 |
nicklas |
309 |
|
1562 |
15 Mar 12 |
nicklas |
310 |
if (requireFile == null) |
1562 |
15 Mar 12 |
nicklas |
311 |
{ |
1562 |
15 Mar 12 |
nicklas |
312 |
PluginDefinition pd = job.getPluginDefinition(); |
1562 |
15 Mar 12 |
nicklas |
313 |
requireFile = pd == null ? false : !pd.getAllowImmediateExecution(); |
1562 |
15 Mar 12 |
nicklas |
314 |
} |
1562 |
15 Mar 12 |
nicklas |
315 |
String defaultPath = null; |
1562 |
15 Mar 12 |
nicklas |
316 |
if (requireFile && currentPlate != null) |
1562 |
15 Mar 12 |
nicklas |
317 |
{ |
1562 |
15 Mar 12 |
nicklas |
318 |
defaultPath = "~/" + Path.makeSafeFilename(currentPlate.getName(), "") + ".csv"; |
1562 |
15 Mar 12 |
nicklas |
319 |
} |
1562 |
15 Mar 12 |
nicklas |
320 |
parameters.add(getSaveAsParameter(null, null, defaultPath, requireFile)); |
1562 |
15 Mar 12 |
nicklas |
321 |
parameters.add(getOverwriteParameter(null, null)); |
1562 |
15 Mar 12 |
nicklas |
322 |
|
1562 |
15 Mar 12 |
nicklas |
323 |
configureJob = new RequestInformation |
1562 |
15 Mar 12 |
nicklas |
324 |
( |
1562 |
15 Mar 12 |
nicklas |
325 |
Request.COMMAND_CONFIGURE_JOB, |
1562 |
15 Mar 12 |
nicklas |
326 |
"Caliper export options", |
1562 |
15 Mar 12 |
nicklas |
327 |
"Select bioplate and the file path where the export file should be saved", |
1562 |
15 Mar 12 |
nicklas |
328 |
parameters |
1562 |
15 Mar 12 |
nicklas |
329 |
); |
1562 |
15 Mar 12 |
nicklas |
330 |
} |
1562 |
15 Mar 12 |
nicklas |
331 |
return configureJob; |
1562 |
15 Mar 12 |
nicklas |
332 |
} |
1562 |
15 Mar 12 |
nicklas |
333 |
|
1562 |
15 Mar 12 |
nicklas |
334 |
/** |
1562 |
15 Mar 12 |
nicklas |
Export Caliper run parameters for the given bioplate. The data is written |
1562 |
15 Mar 12 |
nicklas |
to the given writer formatted according to the Caliper specifications. |
1562 |
15 Mar 12 |
nicklas |
<p> |
1562 |
15 Mar 12 |
nicklas |
The parameters parameter may include the following string values. We list |
1562 |
15 Mar 12 |
nicklas |
the parameter name and default value. |
1562 |
15 Mar 12 |
nicklas |
340 |
|
1562 |
15 Mar 12 |
nicklas |
<ul> |
1562 |
15 Mar 12 |
nicklas |
<li>AssayType: 'HT RNA High Sens' or 'HT RNA Std Sens' |
1562 |
15 Mar 12 |
nicklas |
<li>Operator: The name of the logged in user |
1562 |
15 Mar 12 |
nicklas |
<li>PlateName: FrameStar Skirted 96 [sip 2mm] |
1562 |
15 Mar 12 |
nicklas |
<li>DataPath: C:\\CaliperFiles |
1562 |
15 Mar 12 |
nicklas |
<li>ComputerName: False |
1562 |
15 Mar 12 |
nicklas |
<li>ProjectName: 'std' or 'hi' |
1562 |
15 Mar 12 |
nicklas |
<li>DailySubDir: True |
1562 |
15 Mar 12 |
nicklas |
<li>UseBarcodeEnabled: False |
1562 |
15 Mar 12 |
nicklas |
<li>IncludeBarcodeInDataFile: False |
1562 |
15 Mar 12 |
nicklas |
<li>IncludeDateInDataFile: True |
1569 |
16 Mar 12 |
nicklas |
<li>IncludeTimeInDataFile: False |
1562 |
15 Mar 12 |
nicklas |
<li>PlateCycles: 1 |
1562 |
15 Mar 12 |
nicklas |
<li>SampleSaver: False |
1562 |
15 Mar 12 |
nicklas |
<li>SampleSaverRepeats: 1 |
1562 |
15 Mar 12 |
nicklas |
</ul> |
1562 |
15 Mar 12 |
nicklas |
357 |
|
1562 |
15 Mar 12 |
nicklas |
358 |
|
1562 |
15 Mar 12 |
nicklas |
@param plate The bioplate to export |
1562 |
15 Mar 12 |
nicklas |
@param hiSense If extracts flagged with QCHiSense should be exporter or not |
1562 |
15 Mar 12 |
nicklas |
@param parameters More parameters for the export |
1562 |
15 Mar 12 |
nicklas |
@return The number of wells included in the selection |
1562 |
15 Mar 12 |
nicklas |
363 |
*/ |
1562 |
15 Mar 12 |
nicklas |
364 |
public int exportRunParameters(DbControl dc, BioPlate plate, boolean hiSense, ParameterValues parameters, Writer out) |
1562 |
15 Mar 12 |
nicklas |
365 |
throws IOException |
1562 |
15 Mar 12 |
nicklas |
366 |
{ |
1562 |
15 Mar 12 |
nicklas |
// RunParameters is the root element |
1562 |
15 Mar 12 |
nicklas |
368 |
Element root = new Element("RunParameters"); |
1562 |
15 Mar 12 |
nicklas |
369 |
Document doc = new Document(root); |
1562 |
15 Mar 12 |
nicklas |
370 |
|
1562 |
15 Mar 12 |
nicklas |
// Assay type |
1562 |
15 Mar 12 |
nicklas |
372 |
addChildElement(root, "AssayType", getParameter(parameters, "AssayType", hiSense ? "HT RNA High Sens" : "HT RNA Std Sens")); |
1562 |
15 Mar 12 |
nicklas |
373 |
|
1562 |
15 Mar 12 |
nicklas |
374 |
User user = User.getById(dc, dc.getSessionControl().getLoggedInUserId()); |
1562 |
15 Mar 12 |
nicklas |
375 |
|
1562 |
15 Mar 12 |
nicklas |
// Operator |
1562 |
15 Mar 12 |
nicklas |
377 |
addChildElement(root, "Operator", getParameter(parameters, "Operator", user.getName())); |
1562 |
15 Mar 12 |
nicklas |
378 |
|
1562 |
15 Mar 12 |
nicklas |
// PlateName |
1562 |
15 Mar 12 |
nicklas |
380 |
addChildElement(root, "PlateName", getParameter(parameters, "PlateName", "FrameStar Skirted 96 [sip 2mm]")); |
1562 |
15 Mar 12 |
nicklas |
381 |
|
1562 |
15 Mar 12 |
nicklas |
// SelectedSamples |
1562 |
15 Mar 12 |
nicklas |
383 |
List<String> selectedWells = new ArrayList<String>(plate.getUsedWells()); |
1562 |
15 Mar 12 |
nicklas |
384 |
|
1562 |
15 Mar 12 |
nicklas |
//Query to get all non-empty wells on the plate |
1562 |
15 Mar 12 |
nicklas |
386 |
ItemQuery<BioWell> query = plate.getBioWells(); |
1562 |
15 Mar 12 |
nicklas |
387 |
|
1562 |
15 Mar 12 |
nicklas |
// Load only non-empty wells |
1562 |
15 Mar 12 |
nicklas |
389 |
query.join(Hql.innerJoin(null, "bioMaterial", "bm", true)); |
1562 |
15 Mar 12 |
nicklas |
390 |
query.order(Orders.asc(Hql.property("row"))); |
1562 |
15 Mar 12 |
nicklas |
391 |
query.order(Orders.asc(Hql.property("column"))); |
1562 |
15 Mar 12 |
nicklas |
392 |
|
1562 |
15 Mar 12 |
nicklas |
393 |
Iterator<BioWell> it = query.iterate(dc); |
1562 |
15 Mar 12 |
nicklas |
394 |
while (it.hasNext()) |
1562 |
15 Mar 12 |
nicklas |
395 |
{ |
1562 |
15 Mar 12 |
nicklas |
396 |
BioWell well = it.next(); |
1562 |
15 Mar 12 |
nicklas |
397 |
boolean isHiSense = false; |
1562 |
15 Mar 12 |
nicklas |
398 |
try |
1562 |
15 Mar 12 |
nicklas |
399 |
{ |
1562 |
15 Mar 12 |
nicklas |
400 |
BioMaterial bm = well.getBioMaterial(); |
1610 |
23 Apr 12 |
nicklas |
401 |
isHiSense = Boolean.TRUE.equals(Annotationtype.QC_HISENSE.getAnnotationValue(dc, bm)); |
1562 |
15 Mar 12 |
nicklas |
402 |
} |
1562 |
15 Mar 12 |
nicklas |
403 |
catch (PermissionDeniedException ex) |
1562 |
15 Mar 12 |
nicklas |
404 |
{} |
1562 |
15 Mar 12 |
nicklas |
405 |
if (hiSense == isHiSense) selectedWells.add(well.getCoordinate()); |
1562 |
15 Mar 12 |
nicklas |
406 |
} |
1562 |
15 Mar 12 |
nicklas |
407 |
|
1562 |
15 Mar 12 |
nicklas |
408 |
addChildElement(root, "SelectedSamples", Values.getString(selectedWells, ",", true)); |
1562 |
15 Mar 12 |
nicklas |
409 |
|
1562 |
15 Mar 12 |
nicklas |
410 |
String fileName = Path.makeSafeFilename(plate.getName(), ""); |
1562 |
15 Mar 12 |
nicklas |
411 |
|
1562 |
15 Mar 12 |
nicklas |
// Data path |
1562 |
15 Mar 12 |
nicklas |
413 |
addChildElement(root, "DataPath", getParameter(parameters, "DataPath", "C:\\CaliperFiles")); |
1562 |
15 Mar 12 |
nicklas |
414 |
|
1562 |
15 Mar 12 |
nicklas |
// File name generation |
1562 |
15 Mar 12 |
nicklas |
416 |
addChildElement(root, "DataFilePrefix", fileName); |
1562 |
15 Mar 12 |
nicklas |
417 |
addChildElement(root, "ComputerName", getParameter(parameters, "ComputerName", "False")); |
1562 |
15 Mar 12 |
nicklas |
418 |
addChildElement(root, "ProjectName", getParameter(parameters, "ProjectName", hiSense ? "hi" : "std")); |
1562 |
15 Mar 12 |
nicklas |
419 |
addChildElement(root, "DailySubDir", getParameter(parameters, "DailySubDir", "True")); |
1562 |
15 Mar 12 |
nicklas |
420 |
addChildElement(root, "UseBarcodeEnabled", getParameter(parameters, "UseBarcodeEnabled", "False")); |
1562 |
15 Mar 12 |
nicklas |
421 |
addChildElement(root, "IncludeBarcodeInDataFile", getParameter(parameters, "IncludeBarcodeInDataFile", "False")); |
1562 |
15 Mar 12 |
nicklas |
422 |
addChildElement(root, "IncludeDateInDataFile", getParameter(parameters, "IncludeDateInDataFile", "True")); |
1569 |
16 Mar 12 |
nicklas |
423 |
addChildElement(root, "IncludeTimeInDataFile", getParameter(parameters, "IncludeTimeInDataFile", "False")); |
1562 |
15 Mar 12 |
nicklas |
424 |
|
1562 |
15 Mar 12 |
nicklas |
// Repeats |
1562 |
15 Mar 12 |
nicklas |
426 |
addChildElement(root, "PlateCycles", getParameter(parameters, "PlateCycles", "1")); |
1562 |
15 Mar 12 |
nicklas |
427 |
addChildElement(root, "SampleSaver", getParameter(parameters, "SampleSaver", "False")); |
1562 |
15 Mar 12 |
nicklas |
428 |
addChildElement(root, "SampleSaverRepeats", getParameter(parameters, "SampleSaverRepeats", "1")); |
1562 |
15 Mar 12 |
nicklas |
429 |
|
1562 |
15 Mar 12 |
nicklas |
// SampleNamesFilePath |
1562 |
15 Mar 12 |
nicklas |
431 |
addChildElement(root, "SampleNamesFilePath", fileName + ".csv"); |
1562 |
15 Mar 12 |
nicklas |
432 |
|
1562 |
15 Mar 12 |
nicklas |
// Write document |
1562 |
15 Mar 12 |
nicklas |
434 |
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); |
1562 |
15 Mar 12 |
nicklas |
435 |
XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat().setEncoding("UTF-8")); |
1562 |
15 Mar 12 |
nicklas |
436 |
xmlOut.output(root, out); |
1562 |
15 Mar 12 |
nicklas |
437 |
out.flush(); |
1562 |
15 Mar 12 |
nicklas |
438 |
return selectedWells.size(); |
1562 |
15 Mar 12 |
nicklas |
439 |
} |
1562 |
15 Mar 12 |
nicklas |
440 |
|
1562 |
15 Mar 12 |
nicklas |
441 |
|
1562 |
15 Mar 12 |
nicklas |
442 |
private Element addChildElement(Element parent, String childName, String childText) |
1562 |
15 Mar 12 |
nicklas |
443 |
{ |
1562 |
15 Mar 12 |
nicklas |
444 |
Element child = new Element(childName); |
1562 |
15 Mar 12 |
nicklas |
445 |
child.setText(childText); |
1562 |
15 Mar 12 |
nicklas |
446 |
parent.addContent(child); |
1562 |
15 Mar 12 |
nicklas |
447 |
return child; |
1562 |
15 Mar 12 |
nicklas |
448 |
} |
1562 |
15 Mar 12 |
nicklas |
449 |
|
1562 |
15 Mar 12 |
nicklas |
450 |
private String getParameter(ParameterValues parameters, String key, String defaultValue) |
1562 |
15 Mar 12 |
nicklas |
451 |
{ |
1562 |
15 Mar 12 |
nicklas |
452 |
String value = (String)parameters.getValue(key); |
1562 |
15 Mar 12 |
nicklas |
453 |
return value == null ? defaultValue : value; |
1562 |
15 Mar 12 |
nicklas |
454 |
} |
1562 |
15 Mar 12 |
nicklas |
455 |
} |