extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/CaliperLibPrepParametersExporter.java

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