plugins/base2/se.lu.thep.affymetrix/trunk/AbstractExternalBinaryPlugin.java

Code
Comments
Other
Rev Date Author Line
311 28 May 07 peter 1 /*
311 28 May 07 peter 2   $Id$
311 28 May 07 peter 3
348 27 Jun 07 jari 4   Copyright (C) 2007 Jari Häkkinen, Peter Johansson
311 28 May 07 peter 5   
311 28 May 07 peter 6   This file is part of BASEPlugIns - Non-core plug-ins for BASE,
311 28 May 07 peter 7   BioArray Software Environment.
311 28 May 07 peter 8   BASEPlugIns is available at http://baseplugins.thep.lu.se/
311 28 May 07 peter 9   BASE is available at http://base.thep.lu.se/
311 28 May 07 peter 10
311 28 May 07 peter 11   BASEPlugIns is free software; you can redistribute it and/or modify
311 28 May 07 peter 12   it under the terms of the GNU General Public License as published by
311 28 May 07 peter 13   the Free Software Foundation; either version 2 of the License, or
311 28 May 07 peter 14   (at your option) any later version.
311 28 May 07 peter 15
311 28 May 07 peter 16   BASEPlugIns is distributed in the hope that it will be useful, but
311 28 May 07 peter 17   WITHOUT ANY WARRANTY; without even the implied warranty of
311 28 May 07 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
311 28 May 07 peter 19   General Public License for more details.
311 28 May 07 peter 20
311 28 May 07 peter 21   You should have received a copy of the GNU General Public License
311 28 May 07 peter 22   along with this program; if not, write to the Free Software
311 28 May 07 peter 23   Foundation, Inc., 59 Temple Place - Suite 330,
311 28 May 07 peter 24   Boston, MA  02111-1307, USA.
311 28 May 07 peter 25 */
311 28 May 07 peter 26
311 28 May 07 peter 27 package se.lu.thep.affymetrix;
311 28 May 07 peter 28
311 28 May 07 peter 29 import net.sf.basedb.core.BaseException;
311 28 May 07 peter 30 import net.sf.basedb.core.BioAssaySet;
311 28 May 07 peter 31 import net.sf.basedb.core.DbControl;
311 28 May 07 peter 32 import net.sf.basedb.core.Experiment;
311 28 May 07 peter 33 import net.sf.basedb.core.File;
311 28 May 07 peter 34 import net.sf.basedb.core.Include;
311 28 May 07 peter 35 import net.sf.basedb.core.InvalidDataException;
311 28 May 07 peter 36 import net.sf.basedb.core.InvalidUseOfNullException;
311 28 May 07 peter 37 import net.sf.basedb.core.Item;
311 28 May 07 peter 38 import net.sf.basedb.core.ItemParameterType;
311 28 May 07 peter 39 import net.sf.basedb.core.ItemQuery;
311 28 May 07 peter 40 import net.sf.basedb.core.Job;
311 28 May 07 peter 41 import net.sf.basedb.core.PluginParameter;
311 28 May 07 peter 42 import net.sf.basedb.core.ProgressReporter;
311 28 May 07 peter 43 import net.sf.basedb.core.RawBioAssay;
311 28 May 07 peter 44 import net.sf.basedb.core.RequestInformation;
311 28 May 07 peter 45 import net.sf.basedb.core.StringParameterType;
311 28 May 07 peter 46
311 28 May 07 peter 47 import net.sf.basedb.core.plugin.About;
311 28 May 07 peter 48 import net.sf.basedb.core.plugin.AbstractPlugin;
311 28 May 07 peter 49 import net.sf.basedb.core.plugin.GuiContext;
311 28 May 07 peter 50 import net.sf.basedb.core.plugin.InteractivePlugin;
311 28 May 07 peter 51 import net.sf.basedb.core.plugin.Plugin;
311 28 May 07 peter 52 import net.sf.basedb.core.plugin.Request;
311 28 May 07 peter 53 import net.sf.basedb.core.plugin.Response;
311 28 May 07 peter 54
311 28 May 07 peter 55 import net.sf.basedb.core.query.Hql;
311 28 May 07 peter 56 import net.sf.basedb.core.query.Orders;
311 28 May 07 peter 57
311 28 May 07 peter 58 import java.io.IOException;
311 28 May 07 peter 59
311 28 May 07 peter 60 import java.util.ArrayList;
311 28 May 07 peter 61 import java.util.Arrays;
311 28 May 07 peter 62 import java.util.Collections;
311 28 May 07 peter 63 import java.util.List;
311 28 May 07 peter 64 import java.util.Set;
311 28 May 07 peter 65
311 28 May 07 peter 66 /**
311 28 May 07 peter 67    This is an abstract base class useful for developing plugins.
311 28 May 07 peter 68    <pre>
311 28 May 07 peter 69    String              : name; The name of the new bioassayset.
311 28 May 07 peter 70    Experiment          : experiment; The experiment we are working on.
311 28 May 07 peter 71    List&gt;RawBioAssay&lt;   : rawBioAssays; The raw bioassays to create bioassays for
311 28 May 07 peter 72                          (must be part of the experiment).
311 28 May 07 peter 73    </pre>
311 28 May 07 peter 74
311 28 May 07 peter 75    @author Peter
311 28 May 07 peter 76    @version MAKESUBSTOFVERSIONNUMBER
311 28 May 07 peter 77    @base.modified $Date$
311 28 May 07 peter 78 */
311 28 May 07 peter 79
311 28 May 07 peter 80 abstract public class AbstractExternalBinaryPlugin
311 28 May 07 peter 81   extends AbstractPlugin
311 28 May 07 peter 82   implements InteractivePlugin 
311 28 May 07 peter 83 {
311 28 May 07 peter 84
311 28 May 07 peter 85   protected AbstractExternalBinaryPlugin() {}
311 28 May 07 peter 86
311 28 May 07 peter 87   @SuppressWarnings("unchecked")
311 28 May 07 peter 88   public void configure(GuiContext context, Request request, Response response)
311 28 May 07 peter 89   {
311 28 May 07 peter 90     try {
311 28 May 07 peter 91       if (request.getCommand().equals(Request.COMMAND_CONFIGURE_JOB)) {
311 28 May 07 peter 92         List<Throwable> errors = validateRequestParameters
311 28 May 07 peter 93           (getConfigureJobParameters().getParameters(), request);
311 28 May 07 peter 94         if (errors != null) {
311 28 May 07 peter 95           response.setError(errors.size() +
311 28 May 07 peter 96                             " invalid parameter(s) were found in the request",
311 28 May 07 peter 97                             errors);
311 28 May 07 peter 98           return;
311 28 May 07 peter 99         }
311 28 May 07 peter 100         Experiment experiment =
311 28 May 07 peter 101           (Experiment)request.getParameterValue("experiment");
311 28 May 07 peter 102         DbControl dc = sc.newDbControl();
311 28 May 07 peter 103         int numCels=0;
311 28 May 07 peter 104         try {
311 28 May 07 peter 105           experiment = Experiment.getById(dc, experiment.getId());
311 28 May 07 peter 106           if (!experiment.getRawDataType().isAffymetrix())
311 28 May 07 peter 107             throw new BaseException("Raw data type '" +
311 28 May 07 peter 108                                     experiment.getRawDataType() +
311 28 May 07 peter 109                                     "' is not supoorted by this plug-in.");
311 28 May 07 peter 110           List<RawBioAssay> rawBioAssays =
311 28 May 07 peter 111             (List<RawBioAssay>)request.getParameterValues("rawBioAssays");
311 28 May 07 peter 112           for (RawBioAssay rba : rawBioAssays)
311 28 May 07 peter 113             if (!experiment.isUsing(rba))
311 28 May 07 peter 114               throw new InvalidDataException
311 28 May 07 peter 115                 ("Raw bioassay '" + rba.getName() +
311 28 May 07 peter 116                  "' is not part of the experiment '" + experiment.getName()+"'");
311 28 May 07 peter 117           numCels=rawBioAssays.size();
311 28 May 07 peter 118         }
311 28 May 07 peter 119         finally {
311 28 May 07 peter 120           if (dc != null)
311 28 May 07 peter 121             dc.close();
311 28 May 07 peter 122         }
311 28 May 07 peter 123         storeValue(job, request, nameParameter);
311 28 May 07 peter 124         storeValue(job, request, experimentParameter);
311 28 May 07 peter 125         storeValues(job, request, rawBioAssaysParameter);
311 28 May 07 peter 126         Job.ExecutionTime execTime = Job.ExecutionTime.SHORT;
311 28 May 07 peter 127         if (numCels>10 && numCels<30)
311 28 May 07 peter 128           execTime = Job.ExecutionTime.MEDIUM;
311 28 May 07 peter 129         else if (numCels>=30)
311 28 May 07 peter 130           execTime = Job.ExecutionTime.LONG;
311 28 May 07 peter 131         response.setDone("Job configuration complete", execTime);
311 28 May 07 peter 132       }
311 28 May 07 peter 133     }
311 28 May 07 peter 134     catch (Throwable e) {
311 28 May 07 peter 135       response.setError(e.getMessage(), Arrays.asList(e));
311 28 May 07 peter 136     }
311 28 May 07 peter 137   }
311 28 May 07 peter 138
311 28 May 07 peter 139
311 28 May 07 peter 140   protected void download(File file)
311 28 May 07 peter 141     throws IOException
311 28 May 07 peter 142   {
311 28 May 07 peter 143     java.io.FileOutputStream os = new java.io.FileOutputStream
311 28 May 07 peter 144       (new java.io.File(getExecDirectory(),file.getName()));
311 28 May 07 peter 145     file.download(os,0);
311 28 May 07 peter 146   }
311 28 May 07 peter 147
311 28 May 07 peter 148
311 28 May 07 peter 149   abstract public About getAbout();
311 28 May 07 peter 150
311 28 May 07 peter 151
311 28 May 07 peter 152   private RequestInformation getConfigureJobParameters()
311 28 May 07 peter 153   {
311 28 May 07 peter 154     if (configureJob == null) {
311 28 May 07 peter 155       List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
311 28 May 07 peter 156       
311 28 May 07 peter 157       experimentType = new ItemParameterType<Experiment>(Experiment.class, null,
311 28 May 07 peter 158                                                          true, 1, null);
311 28 May 07 peter 159       experimentParameter = new PluginParameter<Experiment>(
311 28 May 07 peter 160         "experiment", "Experiment", "The experiment we are working with",
311 28 May 07 peter 161         experimentType);
311 28 May 07 peter 162       parameters.add(experimentParameter);
311 28 May 07 peter 163       parameters.add(nameParameter);
311 28 May 07 peter 164       DbControl dc = sc.newDbControl();
311 28 May 07 peter 165       try {
311 28 May 07 peter 166         int experimentId = sc.getCurrentContext(Item.EXPERIMENT).getId();
311 28 May 07 peter 167         Experiment experiment = Experiment.getById(dc, experimentId);
311 28 May 07 peter 168         ItemQuery<RawBioAssay> rawBioAssayQuery = experiment.getRawBioAssays();
311 28 May 07 peter 169         rawBioAssayQuery.include(Include.MINE, Include.SHARED, Include.OTHERS,
311 28 May 07 peter 170                                  Include.IN_PROJECT);
311 28 May 07 peter 171         rawBioAssayQuery.order(Orders.asc(Hql.property("name")));
311 28 May 07 peter 172         List<RawBioAssay> rawBioAssays = new ArrayList<RawBioAssay>(
311 28 May 07 peter 173                                                       rawBioAssayQuery.list(dc));
311 28 May 07 peter 174         rawBioAssaysType = new ItemParameterType<RawBioAssay>(RawBioAssay.class,
311 28 May 07 peter 175                                                               null, true, 0,
311 28 May 07 peter 176                                                               rawBioAssays);
311 28 May 07 peter 177         rawBioAssaysParameter = new PluginParameter<RawBioAssay>(
311 28 May 07 peter 178           "rawBioAssays", "Raw bioassays",
311 28 May 07 peter 179           "Select the raw bioassays to use when creating the root bioassay set",
311 28 May 07 peter 180           rawBioAssaysType);
311 28 May 07 peter 181         parameters.add(rawBioAssaysParameter);
311 28 May 07 peter 182       }
311 28 May 07 peter 183       finally {
311 28 May 07 peter 184         if (dc != null)
311 28 May 07 peter 185           dc.close();
311 28 May 07 peter 186       }
311 28 May 07 peter 187       configureJob = new RequestInformation(
311 28 May 07 peter 188         Request.COMMAND_CONFIGURE_JOB, "Intensity calculation options",
311 28 May 07 peter 189         "Select which raw bioassays to use and a formula for the calculations",
311 28 May 07 peter 190         parameters);
311 28 May 07 peter 191     }
311 28 May 07 peter 192     return configureJob;
311 28 May 07 peter 193   }
311 28 May 07 peter 194
311 28 May 07 peter 195
311 28 May 07 peter 196   protected java.io.File getExecDirectory()
311 28 May 07 peter 197   {
311 28 May 07 peter 198     if (execDirectory == null) {
311 28 May 07 peter 199       execDirectory = new java.io.File
311 28 May 07 peter 200         (System.getProperty("java.io.tmpdir") + java.io.File.separator +
311 28 May 07 peter 201          getAbout().getName() + java.io.File.separator + job.getId());
311 28 May 07 peter 202       execDirectory.mkdirs();
311 28 May 07 peter 203     }
311 28 May 07 peter 204     return execDirectory;
311 28 May 07 peter 205   }
311 28 May 07 peter 206
311 28 May 07 peter 207
311 28 May 07 peter 208   public Set<GuiContext> getGuiContexts() { return guiContexts; }
311 28 May 07 peter 209
311 28 May 07 peter 210
311 28 May 07 peter 211   public Plugin.MainType getMainType() { return Plugin.MainType.INTENSITY; }
311 28 May 07 peter 212
311 28 May 07 peter 213
311 28 May 07 peter 214   public RequestInformation getRequestInformation(GuiContext context,
311 28 May 07 peter 215                                                   String command)
311 28 May 07 peter 216     throws BaseException
311 28 May 07 peter 217   {
311 28 May 07 peter 218     if (command.equals(Request.COMMAND_CONFIGURE_JOB))
311 28 May 07 peter 219       return getConfigureJobParameters();
311 28 May 07 peter 220     return null;
311 28 May 07 peter 221   }
311 28 May 07 peter 222
311 28 May 07 peter 223
311 28 May 07 peter 224   public String isInContext(GuiContext context, Object item)
311 28 May 07 peter 225   {
311 28 May 07 peter 226     DbControl dc = sc.newDbControl();
311 28 May 07 peter 227     try {
311 28 May 07 peter 228       Experiment e=Experiment.getById
311 28 May 07 peter 229         (dc, sc.getCurrentContext(Item.EXPERIMENT).getId());
311 28 May 07 peter 230       if (!e.getRawDataType().isAffymetrix())
311 28 May 07 peter 231         return ("Raw data type '" + e.getRawDataType() +
311 28 May 07 peter 232                 "' is not supoorted by this plug-in.");
311 28 May 07 peter 233     }
311 28 May 07 peter 234     finally {
311 28 May 07 peter 235       if (dc != null)
311 28 May 07 peter 236         dc.close();
311 28 May 07 peter 237     }
311 28 May 07 peter 238     return null;
311 28 May 07 peter 239   }
311 28 May 07 peter 240
311 28 May 07 peter 241
311 28 May 07 peter 242   public boolean requiresConfiguration() { return false; }
311 28 May 07 peter 243
311 28 May 07 peter 244
311 28 May 07 peter 245   @SuppressWarnings("unchecked")
311 28 May 07 peter 246   public void run(Request request, Response response,  ProgressReporter progress)
311 28 May 07 peter 247   {
311 28 May 07 peter 248     DbControl dc=sc.newDbControl();
311 28 May 07 peter 249     try {
311 28 May 07 peter 250       String name=(String)job.getValue("name");
311 28 May 07 peter 251       if (name==null)
311 28 May 07 peter 252         name="New root bioassay set";
311 28 May 07 peter 253       Experiment experiment=(Experiment)job.getValue("experiment");
311 28 May 07 peter 254       if (experiment==null)
311 28 May 07 peter 255         throw new InvalidUseOfNullException("experiment");
311 28 May 07 peter 256       experiment=Experiment.getById(dc, experiment.getId());
311 28 May 07 peter 257       List<RawBioAssay> sources=(List<RawBioAssay>)job.getValues("rawBioAssays");
311 28 May 07 peter 258       if (sources==null || sources.size()==0)
311 28 May 07 peter 259         throw new InvalidUseOfNullException("sources");
311 28 May 07 peter 260       for (RawBioAssay rba : sources)
311 28 May 07 peter 261         dc.reattachItem(rba);
311 28 May 07 peter 262       runBinary(sources,progress);
311 28 May 07 peter 263       storeResult(dc,experiment,sources,name,progress);
311 28 May 07 peter 264       dc.commit();
311 28 May 07 peter 265       response.setDone("Plug-in ended successfully");
311 28 May 07 peter 266     }
311 28 May 07 peter 267     catch (Throwable e) {
311 28 May 07 peter 268       response.setError(e.getMessage(), Arrays.asList(e));
311 28 May 07 peter 269     }
311 28 May 07 peter 270     finally {
311 28 May 07 peter 271       // clean up
311 28 May 07 peter 272       java.io.File[] files=getExecDirectory().listFiles();
311 28 May 07 peter 273       for (java.io.File f : files)
311 28 May 07 peter 274         f.delete();
311 28 May 07 peter 275       getExecDirectory().delete();
311 28 May 07 peter 276       if (dc != null)
311 28 May 07 peter 277         dc.close();
311 28 May 07 peter 278     }
311 28 May 07 peter 279   }
311 28 May 07 peter 280
311 28 May 07 peter 281
311 28 May 07 peter 282    abstract protected void runBinary(List<RawBioAssay> sources,
311 28 May 07 peter 283                          ProgressReporter progress)
311 28 May 07 peter 284     throws InterruptedException, IOException;
311 28 May 07 peter 285
311 28 May 07 peter 286
311 28 May 07 peter 287   abstract protected void storeResult(DbControl dc, Experiment experiment,
311 28 May 07 peter 288                                       List<RawBioAssay> sources, String name,
311 28 May 07 peter 289                                       ProgressReporter progress);
311 28 May 07 peter 290
311 28 May 07 peter 291
311 28 May 07 peter 292   public boolean supportsConfigurations() { return false; }
311 28 May 07 peter 293
311 28 May 07 peter 294
311 28 May 07 peter 295   private RequestInformation configureJob = null;
311 28 May 07 peter 296   private RequestInformation configurePlugin = null;
311 28 May 07 peter 297   private ItemParameterType<Experiment> experimentType;
311 28 May 07 peter 298   /**
311 28 May 07 peter 299      This is the directory where the plug-in will generate its output.
311 28 May 07 peter 300   */
311 28 May 07 peter 301   private java.io.File execDirectory;
311 28 May 07 peter 302   private PluginParameter<Experiment> experimentParameter;
311 28 May 07 peter 303   private static final Set<GuiContext> guiContexts = Collections.singleton
311 28 May 07 peter 304     (new GuiContext(Item.BIOASSAYSET,GuiContext.Type.LIST));
311 28 May 07 peter 305   private static final StringParameterType nameType = 
311 28 May 07 peter 306     new StringParameterType(BioAssaySet.MAX_NAME_LENGTH, "New bioassayset",
311 28 May 07 peter 307                             true);
311 28 May 07 peter 308   private static final PluginParameter<String> nameParameter =
311 28 May 07 peter 309     new PluginParameter<String>("name", "Bioassay set name",
311 28 May 07 peter 310                                 "The name of the root bioassayset", nameType);
311 28 May 07 peter 311   private int percentDone=0;
311 28 May 07 peter 312   private ItemParameterType<RawBioAssay> rawBioAssaysType;
311 28 May 07 peter 313   private PluginParameter<RawBioAssay> rawBioAssaysParameter;
311 28 May 07 peter 314   private String RMAExpressConsolePath;
311 28 May 07 peter 315 }