extensions/no.uib.cbu.base.magetabexport/trunk/src/main/java/no/uib/cbu/base/magetabexport/MageTabExporterPlugin.java

Code
Comments
Other
Rev Date Author Line
1474 29 Nov 11 pawels 1 /*******************************************************************************
1474 29 Nov 11 pawels 2  * Copyright (c) 2011 The Norwegian Microarray Consortium.
1474 29 Nov 11 pawels 3  * All rights reserved. This program and the accompanying materials
1474 29 Nov 11 pawels 4  * are made available under the terms of the GNU Public License v3.0
1474 29 Nov 11 pawels 5  * which accompanies this distribution, and is available at
1474 29 Nov 11 pawels 6  * http://www.gnu.org/licenses/gpl-3.0.html
1474 29 Nov 11 pawels 7  * 
1474 29 Nov 11 pawels 8  * Contributors:
1474 29 Nov 11 pawels 9  *     The Norwegian Microarray Consortium - initial API and implementation
1474 29 Nov 11 pawels 10  ******************************************************************************/
1474 29 Nov 11 pawels 11 package no.uib.cbu.base.magetabexport;
1474 29 Nov 11 pawels 12
1474 29 Nov 11 pawels 13 import java.io.IOException;
1474 29 Nov 11 pawels 14 import java.io.InputStream;
1474 29 Nov 11 pawels 15 import java.io.OutputStream;
1474 29 Nov 11 pawels 16 import java.util.ArrayList;
1474 29 Nov 11 pawels 17 import java.util.Arrays;
1474 29 Nov 11 pawels 18 import java.util.Calendar;
1474 29 Nov 11 pawels 19 import java.util.Collections;
1474 29 Nov 11 pawels 20 import java.util.Date;
1474 29 Nov 11 pawels 21 import java.util.HashSet;
1474 29 Nov 11 pawels 22 import java.util.List;
1474 29 Nov 11 pawels 23 import java.util.Set;
1474 29 Nov 11 pawels 24
1474 29 Nov 11 pawels 25 import net.sf.basedb.core.AnnotationType;
1474 29 Nov 11 pawels 26 import net.sf.basedb.core.Application;
1474 29 Nov 11 pawels 27 import net.sf.basedb.core.BaseException;
1474 29 Nov 11 pawels 28 import net.sf.basedb.core.BooleanParameterType;
1474 29 Nov 11 pawels 29 import net.sf.basedb.core.DataFileType;
1474 29 Nov 11 pawels 30 import net.sf.basedb.core.DateParameterType;
1474 29 Nov 11 pawels 31 import net.sf.basedb.core.DbControl;
1474 29 Nov 11 pawels 32 import net.sf.basedb.core.Experiment;
1474 29 Nov 11 pawels 33 import net.sf.basedb.core.File;
1474 29 Nov 11 pawels 34 import net.sf.basedb.core.Include;
1474 29 Nov 11 pawels 35 import net.sf.basedb.core.Item;
1474 29 Nov 11 pawels 36 import net.sf.basedb.core.ItemParameterType;
1474 29 Nov 11 pawels 37 import net.sf.basedb.core.ItemQuery;
1474 29 Nov 11 pawels 38 import net.sf.basedb.core.ItemResultList;
1474 29 Nov 11 pawels 39 import net.sf.basedb.core.Path;
1474 29 Nov 11 pawels 40 import net.sf.basedb.core.PathParameterType;
1474 29 Nov 11 pawels 41 import net.sf.basedb.core.Permission;
1474 29 Nov 11 pawels 42 import net.sf.basedb.core.PermissionDeniedException;
1474 29 Nov 11 pawels 43 import net.sf.basedb.core.Platform;
1474 29 Nov 11 pawels 44 import net.sf.basedb.core.PlatformVariant;
1474 29 Nov 11 pawels 45 import net.sf.basedb.core.PluginParameter;
1474 29 Nov 11 pawels 46 import net.sf.basedb.core.ProgressReporter;
1474 29 Nov 11 pawels 47 import net.sf.basedb.core.RawBioAssay;
1474 29 Nov 11 pawels 48 import net.sf.basedb.core.RequestInformation;
1474 29 Nov 11 pawels 49 import net.sf.basedb.core.StringParameterType;
1474 29 Nov 11 pawels 50 import net.sf.basedb.core.User;
1474 29 Nov 11 pawels 51 import net.sf.basedb.core.plugin.About;
1474 29 Nov 11 pawels 52 import net.sf.basedb.core.plugin.AboutImpl;
1474 29 Nov 11 pawels 53 import net.sf.basedb.core.plugin.AbstractPlugin;
1474 29 Nov 11 pawels 54 import net.sf.basedb.core.plugin.GuiContext;
1474 29 Nov 11 pawels 55 import net.sf.basedb.core.plugin.InteractivePlugin;
1474 29 Nov 11 pawels 56 import net.sf.basedb.core.plugin.Plugin;
1474 29 Nov 11 pawels 57 import net.sf.basedb.core.plugin.Request;
1474 29 Nov 11 pawels 58 import net.sf.basedb.core.plugin.Response;
1474 29 Nov 11 pawels 59 import net.sf.basedb.core.query.Hql;
1474 29 Nov 11 pawels 60 import net.sf.basedb.core.query.Orders;
1474 29 Nov 11 pawels 61 import net.sf.basedb.util.zip.ZipFilePacker;
1474 29 Nov 11 pawels 62
1474 29 Nov 11 pawels 63 /**
1474 29 Nov 11 pawels 64  * MageTab Exporter plugin 
1474 29 Nov 11 pawels 65  */
1474 29 Nov 11 pawels 66 public class MageTabExporterPlugin extends AbstractPlugin implements InteractivePlugin {
1474 29 Nov 11 pawels 67
1474 29 Nov 11 pawels 68   public About getAbout() {
1474 29 Nov 11 pawels 69     return new AboutImpl (
1474 29 Nov 11 pawels 70         "MageTab exporter",
1474 29 Nov 11 pawels 71         "The plugin exports an experiment in the Mage-Tab format. The Mage-Tab format specification " +
1474 29 Nov 11 pawels 72         "is available at http://www.mged.org/mage-tab/spec1.0.html",
1474 29 Nov 11 pawels 73         "1.0",
1474 29 Nov 11 pawels 74         "2011, The Norwegian Microarray Consortium",
1474 29 Nov 11 pawels 75         null,
1474 29 Nov 11 pawels 76         "pawel.sztromwasser@cbu.uib.no",
1474 29 Nov 11 pawels 77         "http://baseplugins.thep.lu.se/"
1474 29 Nov 11 pawels 78     );
1474 29 Nov 11 pawels 79   }
1474 29 Nov 11 pawels 80
1474 29 Nov 11 pawels 81   private static final GuiContext experimentItemGuiContext = new GuiContext(Item.EXPERIMENT, GuiContext.Type.ITEM);
1474 29 Nov 11 pawels 82   private static final Set<GuiContext> guiContexts = Collections.singleton(experimentItemGuiContext);
1474 29 Nov 11 pawels 83   
1474 29 Nov 11 pawels 84   /*
1474 29 Nov 11 pawels 85    * 
1474 29 Nov 11 pawels 86    * job parameters (not configurable elsewhere than during runtime)
1474 29 Nov 11 pawels 87    * 
1474 29 Nov 11 pawels 88    */
1474 29 Nov 11 pawels 89   private PluginParameter<String> pathParameter; 
1474 29 Nov 11 pawels 90   private PluginParameter<String> archivePathParameter;
1474 29 Nov 11 pawels 91   private PluginParameter<Experiment> experimentParameter;
1474 29 Nov 11 pawels 92   private PluginParameter<Date> releaseDateParameter;
1474 29 Nov 11 pawels 93   private PluginParameter<Boolean> overWriteParameter;
1474 29 Nov 11 pawels 94   private PluginParameter<Boolean> quoteFieldsParameter;
1474 29 Nov 11 pawels 95   private final String QUOTE_FIELDS_PARAM_NAME = "quoteFields";
1474 29 Nov 11 pawels 96   private PluginParameter<String> handleMissingContentParameter;
1474 29 Nov 11 pawels 97   private final String HANDLE_MISSING_CONTENT_PARAM_NAME = "handleMissingContent";
1474 29 Nov 11 pawels 98   private final String FILL_MISSING_CONTENT_PARAM_VALUE = "Ignore & fill with empty";
1474 29 Nov 11 pawels 99   private final String ERROR_MISSING_CONTENT_PARAM_VALUE = "Error";
1474 29 Nov 11 pawels 100   private PluginParameter<String> missingContentReplParameter;
1474 29 Nov 11 pawels 101   private final String MISSING_CONTENT_REPLACEMENT_PARAM_NAME = "missingContentReplacement";
1474 29 Nov 11 pawels 102   
1474 29 Nov 11 pawels 103   // job configuration step 2
1474 29 Nov 11 pawels 104   private static final String COMMAND_CONFIGURE_JOB_STEP2 = "configure_job2";
1474 29 Nov 11 pawels 105
1474 29 Nov 11 pawels 106   // After first step of configuration, when the experiment is known, we can filter data file types
1474 29 Nov 11 pawels 107   // based on platform used in the experiment 
1474 29 Nov 11 pawels 108   private Experiment chosenExperiment = null;
1474 29 Nov 11 pawels 109
1474 29 Nov 11 pawels 110   
1474 29 Nov 11 pawels 111   /*
1474 29 Nov 11 pawels 112    * 
1474 29 Nov 11 pawels 113    * plugin parameters (configured using plugin configuration or at runtime)
1474 29 Nov 11 pawels 114    * 
1474 29 Nov 11 pawels 115    */
1474 29 Nov 11 pawels 116   private PluginParameter<PlatformVariant> platformVariantParameter;
1474 29 Nov 11 pawels 117   private PluginParameter<DataFileType> rawDataFileTypeParameter;
1474 29 Nov 11 pawels 118   private final String RAWDATA_FILE_TYPES_PARAM_NAME = "rawDataFileType";
1474 29 Nov 11 pawels 119   private PluginParameter<AnnotationType> aeAccessionATParameter;
1474 29 Nov 11 pawels 120   private final String AE_ACCESSION_ANNOTATION_PARAM_NAME = "aeAccessionAT";
1474 29 Nov 11 pawels 121   private PluginParameter<AnnotationType> materialTypeATParameter;
1474 29 Nov 11 pawels 122   private final String MATERIAL_TYPE_ANNOTATION_PARAM_NAME = "materialTypeAT";
1474 29 Nov 11 pawels 123
1474 29 Nov 11 pawels 124   // plugin configuration step 2 
1474 29 Nov 11 pawels 125   private static final String COMMAND_CONFIGURE_PLUGIN_FILE_TYPES = "configure_plugin_file_types";
1474 29 Nov 11 pawels 126
1474 29 Nov 11 pawels 127   // temporary variables used to save state between subsequent plugin configuration steps 
1474 29 Nov 11 pawels 128   private PlatformVariant chosenVariant;
1474 29 Nov 11 pawels 129   
1474 29 Nov 11 pawels 130
1474 29 Nov 11 pawels 131       
1474 29 Nov 11 pawels 132   private RequestInformation getConfigureJobParameters1() {
1474 29 Nov 11 pawels 133     
1474 29 Nov 11 pawels 134     pathParameter = new PluginParameter<String>(
1474 29 Nov 11 pawels 135         "exportPath",
1474 29 Nov 11 pawels 136         "Save as",
1474 29 Nov 11 pawels 137         "Please specify the file name where the plugin should store it's output",  
1474 29 Nov 11 pawels 138         new PathParameterType(Path.Type.FILE, Utils.getUserDefaultDirectory(sc)+"/magetab", true)); 
1474 29 Nov 11 pawels 139
1474 29 Nov 11 pawels 140     archivePathParameter = new PluginParameter<String>(
1474 29 Nov 11 pawels 141         "archivePath",
1474 29 Nov 11 pawels 142         "Save raw data archive as",
1474 29 Nov 11 pawels 143         "Please specify the file name where the plugin should store .zip archive with raw data files",  
1474 29 Nov 11 pawels 144         new PathParameterType(Path.Type.FILE, Utils.getUserDefaultDirectory(sc)+"/magetab_rawdata.zip", true));
1474 29 Nov 11 pawels 145
1474 29 Nov 11 pawels 146     experimentParameter = new PluginParameter<Experiment>(
1474 29 Nov 11 pawels 147         "experiment",
1474 29 Nov 11 pawels 148         "Experiment",  
1474 29 Nov 11 pawels 149         "The experiment to export",  
1474 29 Nov 11 pawels 150         new ItemParameterType<Experiment>(Experiment.class, null,true,1,null));
1474 29 Nov 11 pawels 151
1474 29 Nov 11 pawels 152     releaseDateParameter= new PluginParameter<Date>(
1474 29 Nov 11 pawels 153         "releaseDate", 
1474 29 Nov 11 pawels 154         "Release Date",
1474 29 Nov 11 pawels 155         "Please specify the release date of the experiment. This is optional at this point and can be entered into the exported file",
1474 29 Nov 11 pawels 156         new DateParameterType(Calendar.getInstance().getTime(), true));
1474 29 Nov 11 pawels 157
1474 29 Nov 11 pawels 158     overWriteParameter = new PluginParameter<Boolean>(
1474 29 Nov 11 pawels 159         "overwrite", 
1474 29 Nov 11 pawels 160         "Overwrite",
1474 29 Nov 11 pawels 161         "Overwrite existing file?",
1474 29 Nov 11 pawels 162         new BooleanParameterType(false, true));
1474 29 Nov 11 pawels 163
1474 29 Nov 11 pawels 164     quoteFieldsParameter = new PluginParameter<Boolean>(
1474 29 Nov 11 pawels 165         QUOTE_FIELDS_PARAM_NAME, 
1474 29 Nov 11 pawels 166         "Quote fields",
1474 29 Nov 11 pawels 167         "Should the content in tab-delimited idf and sdrf files be quoted?",
1474 29 Nov 11 pawels 168         new BooleanParameterType(true, true));
1474 29 Nov 11 pawels 169     
1474 29 Nov 11 pawels 170     handleMissingContentParameter = new PluginParameter<String>(
1474 29 Nov 11 pawels 171         HANDLE_MISSING_CONTENT_PARAM_NAME, 
1474 29 Nov 11 pawels 172         "Handle missing content by",
1474 29 Nov 11 pawels 173         "Should the missing content be ignored and filled with missing content replacement?",
1474 29 Nov 11 pawels 174         new StringParameterType(25, "Ignore & fill with empty", true, 1, 25, 10, 
1474 29 Nov 11 pawels 175                     Arrays.asList(FILL_MISSING_CONTENT_PARAM_VALUE, ERROR_MISSING_CONTENT_PARAM_VALUE)));
1474 29 Nov 11 pawels 176     
1474 29 Nov 11 pawels 177     missingContentReplParameter = new PluginParameter<String>(
1474 29 Nov 11 pawels 178         MISSING_CONTENT_REPLACEMENT_PARAM_NAME,
1474 29 Nov 11 pawels 179         "Replace missing content with",
1474 29 Nov 11 pawels 180         "A string to replace missing content",
1474 29 Nov 11 pawels 181         new StringParameterType(10, "N/A", false));
1474 29 Nov 11 pawels 182
1474 29 Nov 11 pawels 183     List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
1474 29 Nov 11 pawels 184     parameters.add(experimentParameter);
1474 29 Nov 11 pawels 185     parameters.add(pathParameter);
1474 29 Nov 11 pawels 186     parameters.add(archivePathParameter);
1474 29 Nov 11 pawels 187     parameters.add(overWriteParameter);
1474 29 Nov 11 pawels 188     parameters.add(releaseDateParameter);
1474 29 Nov 11 pawels 189     parameters.add(quoteFieldsParameter);
1474 29 Nov 11 pawels 190     parameters.add(handleMissingContentParameter);
1474 29 Nov 11 pawels 191     parameters.add(missingContentReplParameter);
1474 29 Nov 11 pawels 192
1474 29 Nov 11 pawels 193     RequestInformation configureJob = new RequestInformation
1474 29 Nov 11 pawels 194     (
1474 29 Nov 11 pawels 195         Request.COMMAND_CONFIGURE_JOB,
1474 29 Nov 11 pawels 196         "MageTab exporter options",
1474 29 Nov 11 pawels 197         "Set the path where the export files should be saved",
1474 29 Nov 11 pawels 198         parameters
1474 29 Nov 11 pawels 199     );
1474 29 Nov 11 pawels 200
1474 29 Nov 11 pawels 201     return configureJob;
1474 29 Nov 11 pawels 202   }
1474 29 Nov 11 pawels 203   
1474 29 Nov 11 pawels 204   
1474 29 Nov 11 pawels 205   private RequestInformation getConfigureJobParameters2() {
1474 29 Nov 11 pawels 206       
1474 29 Nov 11 pawels 207     DbControl dc = sc.newDbControl();
1474 29 Nov 11 pawels 208     
1474 29 Nov 11 pawels 209     /*
1474 29 Nov 11 pawels 210      *  Retrieve platform and variant of selected experiment to filter list of data file types 
1474 29 Nov 11 pawels 211      *  WARNING: experiment can have rbas using different platforms/variants 
1474 29 Nov 11 pawels 212      *  as long as they all have the same rawdata type. If this is the case, the plugin
1474 29 Nov 11 pawels 213      *  will only find files of types connected to platform/variant of the first rba in 
1474 29 Nov 11 pawels 214      *  the query results.
1474 29 Nov 11 pawels 215      */
1474 29 Nov 11 pawels 216     Platform platform = null;
1474 29 Nov 11 pawels 217     PlatformVariant variant = null;
1474 29 Nov 11 pawels 218     if (chosenExperiment != null) {
1474 29 Nov 11 pawels 219       ItemQuery<RawBioAssay> query = chosenExperiment.getRawBioAssays();
1474 29 Nov 11 pawels 220       query.include(Include.ALL);
1474 29 Nov 11 pawels 221       ItemResultList<RawBioAssay> rbas = query.list(dc);
1474 29 Nov 11 pawels 222       if (rbas != null && !rbas.isEmpty()) {
1474 29 Nov 11 pawels 223         platform = rbas.get(0).getPlatform();
1474 29 Nov 11 pawels 224         variant = rbas.get(0).getVariant();
1474 29 Nov 11 pawels 225       }
1474 29 Nov 11 pawels 226     }
1474 29 Nov 11 pawels 227     // get list of DataFileTypes relevant for this platform/variant
1474 29 Nov 11 pawels 228     ItemQuery<DataFileType> dfTypesQuery = DataFileType.getQuery(platform, variant, Item.RAWBIOASSAY, null);
1474 29 Nov 11 pawels 229     ItemResultList<DataFileType> dfTypeOptions = dfTypesQuery.list(dc);
1474 29 Nov 11 pawels 230     ItemParameterType<DataFileType> dtParameterType = new ItemParameterType<DataFileType>(
1474 29 Nov 11 pawels 231         DataFileType.class, 
1474 29 Nov 11 pawels 232         dfTypeOptions.size()==1 ? dfTypeOptions.get(0) : null, 
1474 29 Nov 11 pawels 233         true, 0, dfTypeOptions);
1474 29 Nov 11 pawels 234     rawDataFileTypeParameter = new PluginParameter<DataFileType>(
1474 29 Nov 11 pawels 235         RAWDATA_FILE_TYPES_PARAM_NAME,
1474 29 Nov 11 pawels 236         "Raw data file type",  
1474 29 Nov 11 pawels 237         "Type of the raw data files to include in the export",  
1474 29 Nov 11 pawels 238         dtParameterType);
1474 29 Nov 11 pawels 239     
1474 29 Nov 11 pawels 240     // query relevant annotationtypes from database      
1474 29 Nov 11 pawels 241     ItemQuery<AnnotationType> atQuery = AnnotationType.getQuery(Item.PROTOCOL);
1474 29 Nov 11 pawels 242     atQuery.include(Include.MINE, Include.IN_PROJECT, Include.SHARED);
1474 29 Nov 11 pawels 243     atQuery.exclude(Include.REMOVED);
1474 29 Nov 11 pawels 244     ItemResultList<AnnotationType> atQueryResult = atQuery.list(dc);
1474 29 Nov 11 pawels 245     ItemParameterType<AnnotationType> itemParameterType = new ItemParameterType<AnnotationType>(
1474 29 Nov 11 pawels 246             AnnotationType.class, 
1474 29 Nov 11 pawels 247             atQueryResult.size()==1 ? atQueryResult.get(0) : null, 
1474 29 Nov 11 pawels 248             false, 1, atQueryResult);
1474 29 Nov 11 pawels 249     aeAccessionATParameter = new PluginParameter<AnnotationType>(
1474 29 Nov 11 pawels 250         AE_ACCESSION_ANNOTATION_PARAM_NAME,
1474 29 Nov 11 pawels 251         "ArrayExpress accession AnnotationType",
1474 29 Nov 11 pawels 252         "AnnotationType representing ArrayExpress accession",
1474 29 Nov 11 pawels 253         itemParameterType);
1474 29 Nov 11 pawels 254     
1474 29 Nov 11 pawels 255     // reuse the query object
1474 29 Nov 11 pawels 256     atQuery = AnnotationType.getQuery(Item.LABELEDEXTRACT);
1474 29 Nov 11 pawels 257     atQuery.include(Include.MINE, Include.IN_PROJECT, Include.SHARED);
1474 29 Nov 11 pawels 258     atQuery.exclude(Include.REMOVED);
1474 29 Nov 11 pawels 259     atQueryResult = atQuery.list(dc);
1474 29 Nov 11 pawels 260     itemParameterType = new ItemParameterType<AnnotationType>(
1474 29 Nov 11 pawels 261             AnnotationType.class, 
1474 29 Nov 11 pawels 262             atQueryResult.size()==1 ? atQueryResult.get(0) : null, 
1474 29 Nov 11 pawels 263             false, 1, atQueryResult);
1474 29 Nov 11 pawels 264     materialTypeATParameter = new PluginParameter<AnnotationType>(
1474 29 Nov 11 pawels 265             MATERIAL_TYPE_ANNOTATION_PARAM_NAME,
1474 29 Nov 11 pawels 266             "Material Type AnnotationType",
1474 29 Nov 11 pawels 267             "AnnotationType representing material type of a biomaterial",
1474 29 Nov 11 pawels 268             itemParameterType);
1474 29 Nov 11 pawels 269     // close db
1474 29 Nov 11 pawels 270     dc.close();
1474 29 Nov 11 pawels 271
1474 29 Nov 11 pawels 272     
1474 29 Nov 11 pawels 273     List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();  
1474 29 Nov 11 pawels 274     parameters.add(rawDataFileTypeParameter);
1474 29 Nov 11 pawels 275     parameters.add(aeAccessionATParameter);
1474 29 Nov 11 pawels 276     parameters.add(materialTypeATParameter);
1474 29 Nov 11 pawels 277
1474 29 Nov 11 pawels 278       
1474 29 Nov 11 pawels 279     RequestInformation configureJob = new RequestInformation (
1474 29 Nov 11 pawels 280         COMMAND_CONFIGURE_JOB_STEP2,
1474 29 Nov 11 pawels 281         "Additional MageTab exporter options",
1474 29 Nov 11 pawels 282         "Set the data file types for raw data, and annotation types for ArrayExpress identifiers",
1474 29 Nov 11 pawels 283         parameters
1474 29 Nov 11 pawels 284     );
1474 29 Nov 11 pawels 285     
1474 29 Nov 11 pawels 286     return configureJob;
1474 29 Nov 11 pawels 287   }
1474 29 Nov 11 pawels 288   
1474 29 Nov 11 pawels 289   private RequestInformation getConfigurePluginParameters_PlatformVariant() {
1474 29 Nov 11 pawels 290     
1474 29 Nov 11 pawels 291     RequestInformation configurePlugin = null;
1474 29 Nov 11 pawels 292     
1474 29 Nov 11 pawels 293     DbControl dc = sc.newDbControl();
1474 29 Nov 11 pawels 294     
1474 29 Nov 11 pawels 295     try {
1474 29 Nov 11 pawels 296       
1474 29 Nov 11 pawels 297       ItemResultList<PlatformVariant> variants = PlatformVariant.getQuery().list(dc);
1474 29 Nov 11 pawels 298       
1474 29 Nov 11 pawels 299       platformVariantParameter = new PluginParameter<PlatformVariant>(
1474 29 Nov 11 pawels 300           "platformVariant",
1474 29 Nov 11 pawels 301           "Platform variant",  
1474 29 Nov 11 pawels 302           "Platform variant this export configuration will be used for",  
1474 29 Nov 11 pawels 303           new ItemParameterType<PlatformVariant>(PlatformVariant.class, null, true, 1, variants));
1474 29 Nov 11 pawels 304       
1474 29 Nov 11 pawels 305       List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();
1474 29 Nov 11 pawels 306       parameters.add(platformVariantParameter);
1474 29 Nov 11 pawels 307       
1474 29 Nov 11 pawels 308       configurePlugin = new RequestInformation (
1474 29 Nov 11 pawels 309         Request.COMMAND_CONFIGURE_PLUGIN,
1474 29 Nov 11 pawels 310         "Configurable Tab2Mage exporter options - step 1",
1474 29 Nov 11 pawels 311         "Choose platform this configuration will be used for",
1474 29 Nov 11 pawels 312         parameters
1474 29 Nov 11 pawels 313       );
1474 29 Nov 11 pawels 314     
1474 29 Nov 11 pawels 315     } finally {
1474 29 Nov 11 pawels 316       dc.close();
1474 29 Nov 11 pawels 317     }
1474 29 Nov 11 pawels 318     
1474 29 Nov 11 pawels 319     return configurePlugin;
1474 29 Nov 11 pawels 320   }
1474 29 Nov 11 pawels 321   
1474 29 Nov 11 pawels 322   private RequestInformation getConfigurePluginParameters_FileTypes() {
1474 29 Nov 11 pawels 323
1474 29 Nov 11 pawels 324     RequestInformation configurePlugin = null;
1474 29 Nov 11 pawels 325     
1474 29 Nov 11 pawels 326     DbControl dc = sc.newDbControl();
1474 29 Nov 11 pawels 327     
1474 29 Nov 11 pawels 328     try {
1474 29 Nov 11 pawels 329       
1474 29 Nov 11 pawels 330       dc.refreshItem(chosenVariant);
1474 29 Nov 11 pawels 331       
1474 29 Nov 11 pawels 332       // get list of DataFileTypes relevant for this platform/variant
1474 29 Nov 11 pawels 333       ItemQuery<DataFileType> dfTypesQuery = DataFileType.getQuery(chosenVariant.getPlatform(), chosenVariant, Item.RAWBIOASSAY, null);
1474 29 Nov 11 pawels 334       rawDataFileTypeParameter = new PluginParameter<DataFileType>(
1474 29 Nov 11 pawels 335           RAWDATA_FILE_TYPES_PARAM_NAME,
1474 29 Nov 11 pawels 336           "Raw data file type",  
1474 29 Nov 11 pawels 337           "Type of the raw data files to include in the export",  
1474 29 Nov 11 pawels 338           new ItemParameterType<DataFileType>(DataFileType.class, null, true, 0, dfTypesQuery.list(dc)));
1474 29 Nov 11 pawels 339       
1474 29 Nov 11 pawels 340       // query relevant annotation types from database      
1474 29 Nov 11 pawels 341       ItemQuery<AnnotationType> atQuery = AnnotationType.getQuery(Item.PROTOCOL);
1474 29 Nov 11 pawels 342       atQuery.include(Include.MINE, Include.IN_PROJECT, Include.SHARED);
1474 29 Nov 11 pawels 343       atQuery.exclude(Include.REMOVED);
1474 29 Nov 11 pawels 344       aeAccessionATParameter = new PluginParameter<AnnotationType>(
1474 29 Nov 11 pawels 345           AE_ACCESSION_ANNOTATION_PARAM_NAME,
1474 29 Nov 11 pawels 346           "Protocol AE accession AnnotationType",
1474 29 Nov 11 pawels 347           "AnnotationType representing ArrayExpress accession for protocol",
1474 29 Nov 11 pawels 348           new ItemParameterType<AnnotationType>(AnnotationType.class, null, false, 1,  atQuery.list(dc)));
1474 29 Nov 11 pawels 349
1474 29 Nov 11 pawels 350       // reuse query object
1474 29 Nov 11 pawels 351       atQuery = AnnotationType.getQuery(Item.EXTRACT);
1474 29 Nov 11 pawels 352       atQuery.include(Include.MINE, Include.IN_PROJECT, Include.SHARED);
1474 29 Nov 11 pawels 353       atQuery.exclude(Include.REMOVED);
1474 29 Nov 11 pawels 354       materialTypeATParameter = new PluginParameter<AnnotationType>(
1474 29 Nov 11 pawels 355               MATERIAL_TYPE_ANNOTATION_PARAM_NAME,
1474 29 Nov 11 pawels 356               "Material Type AnnotationType",
1474 29 Nov 11 pawels 357               "AnnotationType representing material type of a biomaterial",
1474 29 Nov 11 pawels 358               new ItemParameterType<AnnotationType>(AnnotationType.class, null, false, 1, atQuery.list(dc)));
1474 29 Nov 11 pawels 359
1474 29 Nov 11 pawels 360       List<PluginParameter<?>> parameters = new ArrayList<PluginParameter<?>>();  
1474 29 Nov 11 pawels 361       parameters.add(rawDataFileTypeParameter);
1474 29 Nov 11 pawels 362       parameters.add(aeAccessionATParameter);
1474 29 Nov 11 pawels 363       parameters.add(materialTypeATParameter);
1474 29 Nov 11 pawels 364       
1474 29 Nov 11 pawels 365       configurePlugin = new RequestInformation (
1474 29 Nov 11 pawels 366           COMMAND_CONFIGURE_PLUGIN_FILE_TYPES,
1474 29 Nov 11 pawels 367           "Configurable Tab2Mage exporter options - step 2",
1474 29 Nov 11 pawels 368           "Choose raw data file types to export, and annotation types for ArrayExpress annotations",
1474 29 Nov 11 pawels 369           parameters
1474 29 Nov 11 pawels 370       );
1474 29 Nov 11 pawels 371       
1474 29 Nov 11 pawels 372     } finally {
1474 29 Nov 11 pawels 373       dc.close();
1474 29 Nov 11 pawels 374     }
1474 29 Nov 11 pawels 375     
1474 29 Nov 11 pawels 376     return configurePlugin;
1474 29 Nov 11 pawels 377
1474 29 Nov 11 pawels 378   }
1474 29 Nov 11 pawels 379
1474 29 Nov 11 pawels 380     
1474 29 Nov 11 pawels 381   public RequestInformation getRequestInformation(GuiContext context, String command) 
1474 29 Nov 11 pawels 382     throws BaseException
1474 29 Nov 11 pawels 383   {
1474 29 Nov 11 pawels 384     RequestInformation requestInformation = null;
1474 29 Nov 11 pawels 385     if (Request.COMMAND_CONFIGURE_JOB.equals(command))
1474 29 Nov 11 pawels 386     {
1474 29 Nov 11 pawels 387       requestInformation = getConfigureJobParameters1();
1474 29 Nov 11 pawels 388     }
1474 29 Nov 11 pawels 389     else if (COMMAND_CONFIGURE_JOB_STEP2.equals(command))
1474 29 Nov 11 pawels 390     {
1474 29 Nov 11 pawels 391       requestInformation = getConfigureJobParameters2();
1474 29 Nov 11 pawels 392     }
1474 29 Nov 11 pawels 393     else if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command)) {
1474 29 Nov 11 pawels 394       requestInformation = getConfigurePluginParameters_PlatformVariant();
1474 29 Nov 11 pawels 395     }
1474 29 Nov 11 pawels 396     else if (COMMAND_CONFIGURE_PLUGIN_FILE_TYPES.equals(command)) {
1474 29 Nov 11 pawels 397       requestInformation = getConfigurePluginParameters_FileTypes();
1474 29 Nov 11 pawels 398     }
1474 29 Nov 11 pawels 399     
1474 29 Nov 11 pawels 400     return requestInformation;
1474 29 Nov 11 pawels 401   }
1474 29 Nov 11 pawels 402   
1474 29 Nov 11 pawels 403   public void configure(GuiContext context, Request request, Response response)
1474 29 Nov 11 pawels 404   {
1474 29 Nov 11 pawels 405     String command = request.getCommand();    
1474 29 Nov 11 pawels 406     try
1474 29 Nov 11 pawels 407     {
1474 29 Nov 11 pawels 408       if (Request.COMMAND_CONFIGURE_JOB.equals(command)) {
1474 29 Nov 11 pawels 409         
1474 29 Nov 11 pawels 410         List<Throwable> errors = validateRequestParameters(getConfigureJobParameters1().getParameters(), request);
1474 29 Nov 11 pawels 411         if (errors != null)
1474 29 Nov 11 pawels 412         {
1474 29 Nov 11 pawels 413           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1474 29 Nov 11 pawels 414           return;
1474 29 Nov 11 pawels 415         }
1474 29 Nov 11 pawels 416         storeValue(job, request, experimentParameter);
1474 29 Nov 11 pawels 417         storeValue(job, request, pathParameter);
1474 29 Nov 11 pawels 418         storeValue(job, request, archivePathParameter);
1474 29 Nov 11 pawels 419         storeValue(job, request, overWriteParameter);
1474 29 Nov 11 pawels 420         storeValue(job, request, releaseDateParameter);
1474 29 Nov 11 pawels 421         storeValue(job, request, quoteFieldsParameter);
1474 29 Nov 11 pawels 422         storeValue(job, request, handleMissingContentParameter);
1474 29 Nov 11 pawels 423         storeValue(job, request, missingContentReplParameter);
1474 29 Nov 11 pawels 424         
1474 29 Nov 11 pawels 425         chosenExperiment = (Experiment)job.getValue(experimentParameter.getName());
1474 29 Nov 11 pawels 426         
1474 29 Nov 11 pawels 427         response.setContinue(COMMAND_CONFIGURE_JOB_STEP2);
1474 29 Nov 11 pawels 428         
1474 29 Nov 11 pawels 429       } else if (COMMAND_CONFIGURE_JOB_STEP2.equals(command)) {
1474 29 Nov 11 pawels 430       
1474 29 Nov 11 pawels 431         List<Throwable> errors = validateRequestParameters(getConfigureJobParameters2().getParameters(), request);
1474 29 Nov 11 pawels 432         if (errors != null)
1474 29 Nov 11 pawels 433         {
1474 29 Nov 11 pawels 434           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1474 29 Nov 11 pawels 435           return;
1474 29 Nov 11 pawels 436         }
1474 29 Nov 11 pawels 437         storeValues(job, request, rawDataFileTypeParameter);
1474 29 Nov 11 pawels 438         storeValue(job, request, aeAccessionATParameter);
1474 29 Nov 11 pawels 439         storeValue(job, request, materialTypeATParameter);
1474 29 Nov 11 pawels 440         response.setDone("The job configuration is complete");
1474 29 Nov 11 pawels 441         
1474 29 Nov 11 pawels 442       } else if (Request.COMMAND_CONFIGURE_PLUGIN.equals(command)) {
1474 29 Nov 11 pawels 443
1474 29 Nov 11 pawels 444         List<Throwable> errors = validateRequestParameters(getConfigurePluginParameters_PlatformVariant().getParameters(), request);
1474 29 Nov 11 pawels 445         if (errors != null)
1474 29 Nov 11 pawels 446         {
1474 29 Nov 11 pawels 447           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1474 29 Nov 11 pawels 448           return;
1474 29 Nov 11 pawels 449         }
1474 29 Nov 11 pawels 450         storeValue(configuration, request, platformVariantParameter);
1474 29 Nov 11 pawels 451         
1474 29 Nov 11 pawels 452         chosenVariant = (PlatformVariant)configuration.getValue(platformVariantParameter.getName());
1474 29 Nov 11 pawels 453         
1474 29 Nov 11 pawels 454         response.setContinue(COMMAND_CONFIGURE_PLUGIN_FILE_TYPES);
1474 29 Nov 11 pawels 455         
1474 29 Nov 11 pawels 456       } else if (COMMAND_CONFIGURE_PLUGIN_FILE_TYPES.equals(command)) {
1474 29 Nov 11 pawels 457         
1474 29 Nov 11 pawels 458         List<Throwable> errors = validateRequestParameters(getConfigurePluginParameters_FileTypes().getParameters(), request);
1474 29 Nov 11 pawels 459         if (errors != null)
1474 29 Nov 11 pawels 460         {
1474 29 Nov 11 pawels 461           response.setError(errors.size() + " invalid parameters were found in the request",errors);
1474 29 Nov 11 pawels 462           return;
1474 29 Nov 11 pawels 463         }
1474 29 Nov 11 pawels 464         storeValues(configuration, request, rawDataFileTypeParameter);
1474 29 Nov 11 pawels 465         storeValue(configuration, request, aeAccessionATParameter);
1474 29 Nov 11 pawels 466         storeValue(configuration, request, materialTypeATParameter);
1474 29 Nov 11 pawels 467         response.setDone("The plugin configuration is complete");
1474 29 Nov 11 pawels 468       }
1474 29 Nov 11 pawels 469       
1474 29 Nov 11 pawels 470     }
1474 29 Nov 11 pawels 471     catch(Throwable ex)
1474 29 Nov 11 pawels 472     {
1474 29 Nov 11 pawels 473       response.setError(ex.getMessage(), Arrays.asList(ex));
1474 29 Nov 11 pawels 474     }    
1474 29 Nov 11 pawels 475   }
1474 29 Nov 11 pawels 476   
1474 29 Nov 11 pawels 477   
1474 29 Nov 11 pawels 478   
1474 29 Nov 11 pawels 479   public void run(Request request, Response response, ProgressReporter progress) {
1474 29 Nov 11 pawels 480     
1474 29 Nov 11 pawels 481     DbControl dc = null;
1474 29 Nov 11 pawels 482     
1474 29 Nov 11 pawels 483     try {
1474 29 Nov 11 pawels 484
1474 29 Nov 11 pawels 485       dc = sc.newDbControl();
1474 29 Nov 11 pawels 486
1474 29 Nov 11 pawels 487       User user = User.getById(dc, sc.getLoggedInUserId());
1474 29 Nov 11 pawels 488       
1474 29 Nov 11 pawels 489       /*
1474 29 Nov 11 pawels 490        * get job parameters / options
1474 29 Nov 11 pawels 491        */
1474 29 Nov 11 pawels 492       
1474 29 Nov 11 pawels 493       Experiment experiment = (Experiment) job.getValue("experiment");
1474 29 Nov 11 pawels 494       dc.refreshItem(experiment);
1474 29 Nov 11 pawels 495       
1474 29 Nov 11 pawels 496       String exportPath = (String) job.getValue("exportPath"); 
1474 29 Nov 11 pawels 497       String archivePath = (String) job.getValue("archivePath");
1474 29 Nov 11 pawels 498       Date releaseDate = (Date) job.getValue("releaseDate");
1474 29 Nov 11 pawels 499       boolean overwrite = (Boolean) job.getValue("overwrite");
1474 29 Nov 11 pawels 500       
1474 29 Nov 11 pawels 501
1474 29 Nov 11 pawels 502       List<DataFileType> fTypes = (List<DataFileType>)job.getValues(RAWDATA_FILE_TYPES_PARAM_NAME);
1474 29 Nov 11 pawels 503       
1474 29 Nov 11 pawels 504       // user-selected AnnotationType for AE accession
1474 29 Nov 11 pawels 505       AnnotationType aeAccessionAT = (AnnotationType) job.getValue(AE_ACCESSION_ANNOTATION_PARAM_NAME);
1474 29 Nov 11 pawels 506       if (aeAccessionAT != null) {
1474 29 Nov 11 pawels 507         dc.refreshItem(aeAccessionAT);
1474 29 Nov 11 pawels 508       }
1474 29 Nov 11 pawels 509
1474 29 Nov 11 pawels 510       // user-selected AnnotationType for material type
1474 29 Nov 11 pawels 511       AnnotationType materialType_AT = (AnnotationType) job.getValue(MATERIAL_TYPE_ANNOTATION_PARAM_NAME);
1474 29 Nov 11 pawels 512       if (materialType_AT != null) {
1474 29 Nov 11 pawels 513         dc.refreshItem(materialType_AT);
1474 29 Nov 11 pawels 514       }
1474 29 Nov 11 pawels 515
1474 29 Nov 11 pawels 516       
1474 29 Nov 11 pawels 517       /* 
1474 29 Nov 11 pawels 518        * Check if a user has write permission on the experiment. If one can change experiment, one should be able to 
1474 29 Nov 11 pawels 519        * export it as well. 
1474 29 Nov 11 pawels 520        */
1474 29 Nov 11 pawels 521       if (!experiment.getPermissions().contains(Permission.WRITE))
1474 29 Nov 11 pawels 522       {
1474 29 Nov 11 pawels 523         throw new PermissionDeniedException("Export failed. User ["+user.getName()+
1474 29 Nov 11 pawels 524             "] does not have permission to export the experiment ["+experiment.getName()+"].");
1474 29 Nov 11 pawels 525       }
1474 29 Nov 11 pawels 526
1474 29 Nov 11 pawels 527
1474 29 Nov 11 pawels 528       // 
1474 29 Nov 11 pawels 529       // set settings for the export
1474 29 Nov 11 pawels 530       MageTabExporterSettings.BASE_HOST = Application.getHostName();
1474 29 Nov 11 pawels 531       MageTabExporterSettings.QUOTE = (Boolean)job.getValue(QUOTE_FIELDS_PARAM_NAME); 
1474 29 Nov 11 pawels 532       MageTabExporterSettings.FILL_MISSING_VALUES = 
1474 29 Nov 11 pawels 533           FILL_MISSING_CONTENT_PARAM_VALUE.equals((String)job.getValue(HANDLE_MISSING_CONTENT_PARAM_NAME));
1474 29 Nov 11 pawels 534       // add following to plugin parameters ?
1474 29 Nov 11 pawels 535       // MageTabExporterSettings.DELIMITER =
1474 29 Nov 11 pawels 536       
1474 29 Nov 11 pawels 537       String missingValueReplacement = (String)job.getValue(MISSING_CONTENT_REPLACEMENT_PARAM_NAME);
1474 29 Nov 11 pawels 538       if (missingValueReplacement == null) {
1474 29 Nov 11 pawels 539         missingValueReplacement = "";
1474 29 Nov 11 pawels 540       }
1474 29 Nov 11 pawels 541       MageTabExporterSettings.REPLACE_MISSING_VALUE_WITH = missingValueReplacement;
1474 29 Nov 11 pawels 542
1474 29 Nov 11 pawels 543             
1474 29 Nov 11 pawels 544       // make sdrf
1474 29 Nov 11 pawels 545       SDRFCreator sdrfCreator = new SDRFCreator(experiment);
1474 29 Nov 11 pawels 546       sdrfCreator.setArrayExpressRefAnnotationType(aeAccessionAT);
1474 29 Nov 11 pawels 547       sdrfCreator.setMaterialTypeAnnotationType(materialType_AT);
1474 29 Nov 11 pawels 548       sdrfCreator.setArrayDataFileTypes(fTypes);
1474 29 Nov 11 pawels 549       SDRF sdrf = sdrfCreator.getSDRFForExperiment(dc);
1474 29 Nov 11 pawels 550       SDRFFile sdrfFile = new SDRFFile(sdrf);
1474 29 Nov 11 pawels 551       // save sdrf
1474 29 Nov 11 pawels 552       String sdrfPath = exportPath + "_sdrf.txt";
1474 29 Nov 11 pawels 553       OutputStream out = Utils.getOutputStreamForPath(sdrfPath, overwrite, dc);
1474 29 Nov 11 pawels 554       sdrfFile.save(out);
1474 29 Nov 11 pawels 555       out.close();
1474 29 Nov 11 pawels 556
1474 29 Nov 11 pawels 557       // make idf
1474 29 Nov 11 pawels 558       String idfPath = exportPath + "_idf.txt";
1474 29 Nov 11 pawels 559       IDFCreator idfCreator = new IDFCreator(experiment);
1474 29 Nov 11 pawels 560       IDF idf = idfCreator.getIDFForExperiment(sdrf);
1474 29 Nov 11 pawels 561       idf.setFieldContent(IDF.SDRF_FILE, sdrfPath.substring(sdrfPath.lastIndexOf("/")+1));
1474 29 Nov 11 pawels 562       idf.setFieldContent(IDF.PUBLIC_RELEASE_DATE, releaseDate.toString());
1474 29 Nov 11 pawels 563       IDFFile idfFile = new IDFFile(idf);
1474 29 Nov 11 pawels 564       // save idf
1474 29 Nov 11 pawels 565       out = Utils.getOutputStreamForPath(idfPath, overwrite, dc);
1474 29 Nov 11 pawels 566       idfFile.save(out);
1474 29 Nov 11 pawels 567       out.close();
1474 29 Nov 11 pawels 568
1474 29 Nov 11 pawels 569       
1474 29 Nov 11 pawels 570       // make rawdata archive
1474 29 Nov 11 pawels 571       ItemQuery<RawBioAssay> q = experiment.getRawBioAssays();
1474 29 Nov 11 pawels 572       q.include(Include.ALL);
1474 29 Nov 11 pawels 573       q.order(Orders.asc(Hql.property("name")));
1474 29 Nov 11 pawels 574       List<RawBioAssay> rbas = q.list(dc);
1474 29 Nov 11 pawels 575       // save archive
1474 29 Nov 11 pawels 576       out = Utils.getOutputStreamForPath(archivePath, overwrite, dc);
1474 29 Nov 11 pawels 577       saveRawDataArchive(out, rbas, fTypes, progress, dc);
1474 29 Nov 11 pawels 578       out.close();
1474 29 Nov 11 pawels 579       
1474 29 Nov 11 pawels 580       dc.commit();
1474 29 Nov 11 pawels 581       response.setDone("Experiment " + experiment.getName() + " exported successfully");
1474 29 Nov 11 pawels 582
1474 29 Nov 11 pawels 583     } catch (MageTabException e) {
1474 29 Nov 11 pawels 584       response.setError(e.getMessage(), Arrays.asList(e));
1474 29 Nov 11 pawels 585     } catch (PermissionDeniedException e) {
1474 29 Nov 11 pawels 586       response.setError(e.getMessage(), Arrays.asList(e));
1474 29 Nov 11 pawels 587     } catch (java.util.zip.ZipException e) {
1474 29 Nov 11 pawels 588       String msg = "";
1474 29 Nov 11 pawels 589       if (e.getMessage().equals("ZIP file must have at least one entry")) {
1474 29 Nov 11 pawels 590         List<DataFileType> dfts = (List<DataFileType>)job.getValues(RAWDATA_FILE_TYPES_PARAM_NAME);
1474 29 Nov 11 pawels 591         msg = "Couldn't find any files of types: [";
1474 29 Nov 11 pawels 592         for (DataFileType dft : dfts) {
1474 29 Nov 11 pawels 593           msg += dft.getName()+",";
1474 29 Nov 11 pawels 594         }
1474 29 Nov 11 pawels 595         if (msg.endsWith(",")) { msg.substring(0, msg.length()-1); }
1474 29 Nov 11 pawels 596         msg += "] attached to rawbioassays in the experiment.\n";
1474 29 Nov 11 pawels 597         msg += "Check the 'Raw data file type' parameter of the export plugin.\n";
1474 29 Nov 11 pawels 598         msg += "Original exception message: "; 
1474 29 Nov 11 pawels 599       } 
1474 29 Nov 11 pawels 600       response.setError(msg + e.getMessage(), Arrays.asList(e));
1474 29 Nov 11 pawels 601     } catch (IOException e) {
1474 29 Nov 11 pawels 602       response.setError(e.getMessage(), Arrays.asList(e));
1474 29 Nov 11 pawels 603     } finally {
1474 29 Nov 11 pawels 604       if (dc != null) { dc.close(); }
1474 29 Nov 11 pawels 605     }
1474 29 Nov 11 pawels 606   }
1474 29 Nov 11 pawels 607
1474 29 Nov 11 pawels 608   
1474 29 Nov 11 pawels 609   /**
1474 29 Nov 11 pawels 610    * Packs raw data files of selected types and prints to a given OutputStream.
1474 29 Nov 11 pawels 611    * WARNING: Different files with the same names (for example kept in different dirs)
1474 29 Nov 11 pawels 612    * will not be included.
1474 29 Nov 11 pawels 613    * 
1474 29 Nov 11 pawels 614    * @param out - OutputStream to print zipped files to
1474 29 Nov 11 pawels 615    * @param rbaList - raw bioassays to extract raw data files from
1474 29 Nov 11 pawels 616    * @param dfts - types of data files which will be included
1474 29 Nov 11 pawels 617    * @param progress - ProgressReporter
1474 29 Nov 11 pawels 618    * @param dc - DbControl
1474 29 Nov 11 pawels 619    * @return
1474 29 Nov 11 pawels 620    *     an InputStream of zipped files.
1474 29 Nov 11 pawels 621    */
1474 29 Nov 11 pawels 622   public static void saveRawDataArchive(OutputStream out,
1474 29 Nov 11 pawels 623       List<RawBioAssay> rbaList, List<DataFileType> dfts,
1474 29 Nov 11 pawels 624       ProgressReporter progress, DbControl dc) 
1474 29 Nov 11 pawels 625   throws IOException {
1474 29 Nov 11 pawels 626     
1474 29 Nov 11 pawels 627     ZipFilePacker packer = new ZipFilePacker();
1474 29 Nov 11 pawels 628     packer.setOutputStream(out);
1474 29 Nov 11 pawels 629     
1474 29 Nov 11 pawels 630     int currProgress = 30;
1474 29 Nov 11 pawels 631     int progressPerRBA = (95 - currProgress) / rbaList.size();
1474 29 Nov 11 pawels 632     
1474 29 Nov 11 pawels 633     // for checking if file has not been included because all the files are packed in the same
1474 29 Nov 11 pawels 634     // directory and can't have the same filename
1474 29 Nov 11 pawels 635     HashSet<String> includedFiles = new HashSet<String>();
1474 29 Nov 11 pawels 636     
1474 29 Nov 11 pawels 637     for (RawBioAssay rba : rbaList) {
1474 29 Nov 11 pawels 638               
1474 29 Nov 11 pawels 639       for (DataFileType dft : dfts) {
1474 29 Nov 11 pawels 640         if (rba.hasFileSet() && rba.getFileSet().hasMember(dft)) {
1474 29 Nov 11 pawels 641           File f = rba.getFileSet().getMember(dft).getFile();
1474 29 Nov 11 pawels 642           if (f != null && !includedFiles.contains(f.getName())) {  
1474 29 Nov 11 pawels 643             progress.display(currProgress, "Zipping file: "+f.getName());
1474 29 Nov 11 pawels 644             includedFiles.add(f.getName());
1474 29 Nov 11 pawels 645             InputStream in = f.getDownloadStream(0);
1474 29 Nov 11 pawels 646             packer.pack(f.getName(), in, f.getSize(), f.getLastUpdate().getTime());
1474 29 Nov 11 pawels 647           }
1474 29 Nov 11 pawels 648         }
1474 29 Nov 11 pawels 649       }
1474 29 Nov 11 pawels 650
1474 29 Nov 11 pawels 651       currProgress += progressPerRBA;
1474 29 Nov 11 pawels 652     }
1474 29 Nov 11 pawels 653     
1474 29 Nov 11 pawels 654     packer.close();
1474 29 Nov 11 pawels 655   }
1474 29 Nov 11 pawels 656
1474 29 Nov 11 pawels 657     
1474 29 Nov 11 pawels 658
1474 29 Nov 11 pawels 659   /*
1474 29 Nov 11 pawels 660    * 
1474 29 Nov 11 pawels 661    * Other plugin methods
1474 29 Nov 11 pawels 662    * 
1474 29 Nov 11 pawels 663    */
1474 29 Nov 11 pawels 664   
1474 29 Nov 11 pawels 665   
1474 29 Nov 11 pawels 666   /**
1474 29 Nov 11 pawels 667      Create a new MageTab exporter
1474 29 Nov 11 pawels 668    */
1474 29 Nov 11 pawels 669   public MageTabExporterPlugin() {}
1474 29 Nov 11 pawels 670   
1474 29 Nov 11 pawels 671
1474 29 Nov 11 pawels 672   public Set<GuiContext> getGuiContexts()
1474 29 Nov 11 pawels 673   {
1474 29 Nov 11 pawels 674     return guiContexts;
1474 29 Nov 11 pawels 675   }
1474 29 Nov 11 pawels 676   
1474 29 Nov 11 pawels 677   public String isInContext(GuiContext context, Object item)
1474 29 Nov 11 pawels 678   {
1474 29 Nov 11 pawels 679     String message = null;
1474 29 Nov 11 pawels 680     if (context.equals(experimentItemGuiContext))
1474 29 Nov 11 pawels 681     {
1474 29 Nov 11 pawels 682       if (item == null)
1474 29 Nov 11 pawels 683       {
1474 29 Nov 11 pawels 684         message = "The object is null";
1474 29 Nov 11 pawels 685       }
1474 29 Nov 11 pawels 686       else if (!(item instanceof Experiment))
1474 29 Nov 11 pawels 687       {
1474 29 Nov 11 pawels 688         message = "The object is not an Experiment: " + item;
1474 29 Nov 11 pawels 689       }
1474 29 Nov 11 pawels 690     }
1474 29 Nov 11 pawels 691     return message;
1474 29 Nov 11 pawels 692   }
1474 29 Nov 11 pawels 693
1474 29 Nov 11 pawels 694
1474 29 Nov 11 pawels 695   public MainType getMainType()
1474 29 Nov 11 pawels 696   {
1474 29 Nov 11 pawels 697     return Plugin.MainType.EXPORT;
1474 29 Nov 11 pawels 698   }
1474 29 Nov 11 pawels 699
1474 29 Nov 11 pawels 700   
1474 29 Nov 11 pawels 701   public boolean supportsConfigurations()
1474 29 Nov 11 pawels 702   {
1474 29 Nov 11 pawels 703     return true;
1474 29 Nov 11 pawels 704   }
1474 29 Nov 11 pawels 705
1474 29 Nov 11 pawels 706   
1474 29 Nov 11 pawels 707   public boolean requiresConfiguration()
1474 29 Nov 11 pawels 708   {
1474 29 Nov 11 pawels 709     return false;
1474 29 Nov 11 pawels 710   }
1474 29 Nov 11 pawels 711
1474 29 Nov 11 pawels 712 }