extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/autoconfirm/JsonAutoImporter.java

Code
Comments
Other
Rev Date Author Line
7221 31 May 23 nicklas 1 package net.sf.basedb.reggie.autoconfirm;
7221 31 May 23 nicklas 2
7221 31 May 23 nicklas 3 import java.util.ArrayList;
7228 01 Jun 23 nicklas 4 import java.util.Arrays;
7221 31 May 23 nicklas 5 import java.util.HashSet;
7221 31 May 23 nicklas 6 import java.util.List;
7221 31 May 23 nicklas 7 import java.util.Set;
7221 31 May 23 nicklas 8
7221 31 May 23 nicklas 9 import org.slf4j.LoggerFactory;
7221 31 May 23 nicklas 10
7228 01 Jun 23 nicklas 11 import net.sf.basedb.core.Annotatable;
7225 31 May 23 nicklas 12 import net.sf.basedb.core.AnyToAny;
7221 31 May 23 nicklas 13 import net.sf.basedb.core.DbControl;
7221 31 May 23 nicklas 14 import net.sf.basedb.core.FileServer;
7225 31 May 23 nicklas 15 import net.sf.basedb.core.Item;
7228 01 Jun 23 nicklas 16 import net.sf.basedb.core.Job;
7228 01 Jun 23 nicklas 17 import net.sf.basedb.core.Protocol;
7221 31 May 23 nicklas 18 import net.sf.basedb.core.SessionControl;
7228 01 Jun 23 nicklas 19 import net.sf.basedb.core.Software;
7225 31 May 23 nicklas 20 import net.sf.basedb.core.User;
7228 01 Jun 23 nicklas 21 import net.sf.basedb.opengrid.JobDefinition;
7228 01 Jun 23 nicklas 22 import net.sf.basedb.opengrid.OpenGrid;
7228 01 Jun 23 nicklas 23 import net.sf.basedb.opengrid.OpenGridCluster;
7226 01 Jun 23 nicklas 24 import net.sf.basedb.opengrid.RemoteHost;
7226 01 Jun 23 nicklas 25 import net.sf.basedb.opengrid.RemoteSession;
7226 01 Jun 23 nicklas 26 import net.sf.basedb.opengrid.config.ConnectionInfo;
7226 01 Jun 23 nicklas 27 import net.sf.basedb.reggie.activity.ActivityDef;
7224 31 May 23 nicklas 28 import net.sf.basedb.reggie.dao.Annotationtype;
7226 01 Jun 23 nicklas 29 import net.sf.basedb.reggie.dao.BiomaterialList;
7226 01 Jun 23 nicklas 30 import net.sf.basedb.reggie.dao.DemuxedSequences;
7226 01 Jun 23 nicklas 31 import net.sf.basedb.reggie.dao.Fileserver;
7228 01 Jun 23 nicklas 32 import net.sf.basedb.reggie.dao.Pipeline;
7228 01 Jun 23 nicklas 33 import net.sf.basedb.reggie.dao.Subtype;
7228 01 Jun 23 nicklas 34 import net.sf.basedb.reggie.grid.ImportFastqJobCreator;
7226 01 Jun 23 nicklas 35 import net.sf.basedb.reggie.grid.ScriptUtil;
7226 01 Jun 23 nicklas 36 import net.sf.basedb.reggie.plugins.ExternalSpecimenImporter;
7226 01 Jun 23 nicklas 37 import net.sf.basedb.reggie.plugins.ExternalSpecimenImporter.ImportedItems;
7221 31 May 23 nicklas 38 import net.sf.basedb.reggie.plugins.cmd.EndPoint;
7221 31 May 23 nicklas 39 import net.sf.basedb.reggie.plugins.cmd.JsonFile;
7221 31 May 23 nicklas 40 import net.sf.basedb.reggie.plugins.cmd.MainInfo;
7221 31 May 23 nicklas 41 import net.sf.basedb.reggie.plugins.cmd.ScanBIdRef.SampleIdType;
7221 31 May 23 nicklas 42 import net.sf.basedb.util.extensions.logging.ExtensionsLog;
7221 31 May 23 nicklas 43 import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
7228 01 Jun 23 nicklas 44 import net.sf.basedb.util.filter.AllOfFilter;
7228 01 Jun 23 nicklas 45 import net.sf.basedb.util.filter.Filter;
7221 31 May 23 nicklas 46
7221 31 May 23 nicklas 47 /**
7221 31 May 23 nicklas 48
7221 31 May 23 nicklas 49   @author nicklas
7221 31 May 23 nicklas 50   @since 4.48
7221 31 May 23 nicklas 51 */
7221 31 May 23 nicklas 52 public class JsonAutoImporter 
7221 31 May 23 nicklas 53   extends AutoConfirmer<FileServer>
7221 31 May 23 nicklas 54 {
7221 31 May 23 nicklas 55   
7221 31 May 23 nicklas 56   private static final ExtensionsLogger logger = 
7221 31 May 23 nicklas 57     ExtensionsLog.getLogger(AutoConfirmService.ID, true).wrap(LoggerFactory.getLogger(JsonAutoImporter.class));
7221 31 May 23 nicklas 58
7256 13 Jun 23 nicklas 59   private List<String> filesToCheck;
7221 31 May 23 nicklas 60   private List<String> filesToIgnore;
7256 13 Jun 23 nicklas 61   private List<String> filesToImport;
7221 31 May 23 nicklas 62   
7221 31 May 23 nicklas 63   public JsonAutoImporter(FileServer gateway)
7221 31 May 23 nicklas 64   {
7221 31 May 23 nicklas 65     super(gateway, null);
7221 31 May 23 nicklas 66   }
7221 31 May 23 nicklas 67
7221 31 May 23 nicklas 68   /**
7225 31 May 23 nicklas 69     We can link a user account to the gateway with an any-to-any link named "AutoImportAccount"
7225 31 May 23 nicklas 70     to make the importer use that account when importing. If this link is not specified, 
7225 31 May 23 nicklas 71     the owner account of the gateway is used.
7225 31 May 23 nicklas 72   */
7225 31 May 23 nicklas 73   @Override
7225 31 May 23 nicklas 74   public User userForNextStep(DbControl dc) 
7225 31 May 23 nicklas 75   {
7225 31 May 23 nicklas 76     FileServer gateway = item(dc);
7225 31 May 23 nicklas 77     User user = null;
7225 31 May 23 nicklas 78     try
7225 31 May 23 nicklas 79     {
7225 31 May 23 nicklas 80       AnyToAny link = AnyToAny.getByName(dc, gateway, "AutoImportAccount");
7225 31 May 23 nicklas 81       if (link.getToType() == Item.USER) 
7225 31 May 23 nicklas 82       {
7225 31 May 23 nicklas 83         user = (User)link.getTo();
7225 31 May 23 nicklas 84       }
7225 31 May 23 nicklas 85     }
7225 31 May 23 nicklas 86     catch (RuntimeException ex)
7225 31 May 23 nicklas 87     {}
7225 31 May 23 nicklas 88     return user;
7225 31 May 23 nicklas 89   }
7225 31 May 23 nicklas 90
7225 31 May 23 nicklas 91   /**
7221 31 May 23 nicklas 92     Check if there are any new JSON files in the gateway.
7221 31 May 23 nicklas 93   */
7224 31 May 23 nicklas 94   @SuppressWarnings("unchecked")
7221 31 May 23 nicklas 95   @Override
7221 31 May 23 nicklas 96   public boolean checkRules(DbControl dc, AutoConfirmManager manager) 
7221 31 May 23 nicklas 97   {
7221 31 May 23 nicklas 98     FileServer gateway = item(dc);
7221 31 May 23 nicklas 99     
7221 31 May 23 nicklas 100     List<JsonFile> files = JsonFile.findJsonFiles(dc, gateway, null, false, 0, null);
7221 31 May 23 nicklas 101     logger.debug("Found "+files.size()+" JSON files on "+gateway.getName());
7221 31 May 23 nicklas 102     
7224 31 May 23 nicklas 103     Set<String> currentFilesToIgnore = new HashSet<>(
7224 31 May 23 nicklas 104       (List<String>)Annotationtype.FILES_TO_IGNORE.getAnnotationValues(dc, gateway));
7221 31 May 23 nicklas 105     
7221 31 May 23 nicklas 106     filesToIgnore = new ArrayList<>();
7221 31 May 23 nicklas 107     filesToCheck = new ArrayList<>();
7221 31 May 23 nicklas 108     for (JsonFile file : files)
7221 31 May 23 nicklas 109     {
7221 31 May 23 nicklas 110       if (currentFilesToIgnore.contains(file.getName()))
7221 31 May 23 nicklas 111       {
7221 31 May 23 nicklas 112         filesToIgnore.add(file.getName());
7221 31 May 23 nicklas 113         logger.trace("Ignored: "+file.getName());
7221 31 May 23 nicklas 114       }
7221 31 May 23 nicklas 115       else
7221 31 May 23 nicklas 116       {
7221 31 May 23 nicklas 117         // This is a new file that should be checked
7256 13 Jun 23 nicklas 118         filesToCheck.add(file.getName());
7221 31 May 23 nicklas 119         logger.trace("New file: "+file.getName());
7221 31 May 23 nicklas 120       }
7221 31 May 23 nicklas 121     }
7221 31 May 23 nicklas 122     
7221 31 May 23 nicklas 123     logger.debug(filesToCheck.size()+" JSON files are new and should be checked");
7221 31 May 23 nicklas 124     logger.debug(filesToIgnore.size()+" JSON files are ignored since before");
7221 31 May 23 nicklas 125     
7221 31 May 23 nicklas 126     // If there are new files to check or if the files to ignore has changed we need to
7221 31 May 23 nicklas 127     // continue with the auto-confirm step
7221 31 May 23 nicklas 128     return filesToCheck.size() > 0 || filesToIgnore.size() != currentFilesToIgnore.size();
7221 31 May 23 nicklas 129   }
7221 31 May 23 nicklas 130
7221 31 May 23 nicklas 131   /**
7221 31 May 23 nicklas 132     The new files are checked if they can be imported.
7221 31 May 23 nicklas 133   */
7221 31 May 23 nicklas 134   @Override
7221 31 May 23 nicklas 135   public boolean autoConfirm(DbControl dc, AutoConfirmManager manager) 
7221 31 May 23 nicklas 136   {
7221 31 May 23 nicklas 137     FileServer gateway = item(dc);
7221 31 May 23 nicklas 138     filesToImport = new ArrayList<>();
7256 13 Jun 23 nicklas 139     RemoteSession gatewaySession = null;
7256 13 Jun 23 nicklas 140     try
7221 31 May 23 nicklas 141     {
7256 13 Jun 23 nicklas 142       gatewaySession = new RemoteHost(new ConnectionInfo(gateway)).connect(5);
7256 13 Jun 23 nicklas 143       String gatewayRoot = ScriptUtil.checkValidPath(gateway.getRootPath(), true, false);
7256 13 Jun 23 nicklas 144       
7256 13 Jun 23 nicklas 145       // Check new files
7256 13 Jun 23 nicklas 146       for (String fileName : filesToCheck)
7221 31 May 23 nicklas 147       {
7256 13 Jun 23 nicklas 148         // We always add it to the igore list since no matter if the import
7256 13 Jun 23 nicklas 149         // succeeds or fails we are not going to try again
7256 13 Jun 23 nicklas 150         filesToIgnore.add(fileName);
7256 13 Jun 23 nicklas 151         try
7221 31 May 23 nicklas 152         {
7256 13 Jun 23 nicklas 153           logger.debug("Checking file: "+fileName);
7256 13 Jun 23 nicklas 154           JsonFile file = new JsonFile(dc, fileName);
7256 13 Jun 23 nicklas 155           file.downloadAndParse(gatewaySession, gatewayRoot, true, null, null);
7256 13 Jun 23 nicklas 156           MainInfo main = file.getMain();
7256 13 Jun 23 nicklas 157           
7256 13 Jun 23 nicklas 158           if (logger.isDebugEnabled())
7256 13 Jun 23 nicklas 159           {
7256 13 Jun 23 nicklas 160             logger.debug(file.getName()+": "+
7256 13 Jun 23 nicklas 161               file.getErrorMessages().size()+" errors; "+
7256 13 Jun 23 nicklas 162               file.getWarningMessages().size()+" warnings; "+
7256 13 Jun 23 nicklas 163               "end-point: "+(main != null ? main.endPoint:"-"));
7256 13 Jun 23 nicklas 164             if (logger.isTraceEnabled()) traceAllMessages(file);
7256 13 Jun 23 nicklas 165           }
7256 13 Jun 23 nicklas 166           
7256 13 Jun 23 nicklas 167           // We ignore all files with error or warnings that is not a
7256 13 Jun 23 nicklas 168           // full import from Case to DemuxedSequences
7256 13 Jun 23 nicklas 169           boolean canImport = !file.hasError() && !file.hasWarning() 
7256 13 Jun 23 nicklas 170             && main != null && main.endPoint == EndPoint.DEMUX 
7256 13 Jun 23 nicklas 171             && main.idRef != null && main.idRef.idType == SampleIdType.CASE;
7256 13 Jun 23 nicklas 172           
7256 13 Jun 23 nicklas 173           if (canImport)
7256 13 Jun 23 nicklas 174           {
7256 13 Jun 23 nicklas 175             logger.debug("File can be imported: "+file.getName());
7256 13 Jun 23 nicklas 176             filesToImport.add(file.getName());
7256 13 Jun 23 nicklas 177           }
7256 13 Jun 23 nicklas 178           else
7256 13 Jun 23 nicklas 179           {
7256 13 Jun 23 nicklas 180             logger.debug("File can't be imported: "+file.getName());
7256 13 Jun 23 nicklas 181           }
7221 31 May 23 nicklas 182         }
7256 13 Jun 23 nicklas 183         catch (Exception ex)
7221 31 May 23 nicklas 184         {
7256 13 Jun 23 nicklas 185           // If there is a problem we ignore the file
7256 13 Jun 23 nicklas 186           logger.info("Could not check file: " + fileName, ex);
7221 31 May 23 nicklas 187         }
7221 31 May 23 nicklas 188       }
7221 31 May 23 nicklas 189     }
7256 13 Jun 23 nicklas 190     finally
7256 13 Jun 23 nicklas 191     {
7256 13 Jun 23 nicklas 192       OpenGrid.close(gatewaySession);
7256 13 Jun 23 nicklas 193     }
7221 31 May 23 nicklas 194     
7221 31 May 23 nicklas 195     // Update "FilesToIgnore" annotation on the gateway
7224 31 May 23 nicklas 196     Annotationtype.FILES_TO_IGNORE.setAnnotationValues(dc, gateway, filesToIgnore);
7221 31 May 23 nicklas 197     
7221 31 May 23 nicklas 198     logger.debug(filesToImport.size()+" JSON files can be imported");
7224 31 May 23 nicklas 199     logger.debug((filesToIgnore.size()-filesToImport.size())+" JSON files are ignored");
7221 31 May 23 nicklas 200     
7221 31 May 23 nicklas 201     return filesToImport.size() > 0;
7221 31 May 23 nicklas 202   }
7221 31 May 23 nicklas 203
7221 31 May 23 nicklas 204   /**
7221 31 May 23 nicklas 205     Perform the import of the JSON files.
7221 31 May 23 nicklas 206   */
7221 31 May 23 nicklas 207   @Override
7221 31 May 23 nicklas 208   public boolean startNextStep(SessionControl sc, AutoConfirmManager manager) 
7221 31 May 23 nicklas 209   {
7226 01 Jun 23 nicklas 210     logger.debug("Using account: "+sc.getLoggedInUserLogin());
7221 31 May 23 nicklas 211     int numImported = 0;
7225 31 May 23 nicklas 212     
7228 01 Jun 23 nicklas 213     List<DemuxedSequences> demuxedSequences = new ArrayList<>(); // Collect DemuxedSequences that has been created by the importer
7226 01 Jun 23 nicklas 214     RemoteSession gatewaySession = null;
7226 01 Jun 23 nicklas 215     RemoteSession archiveSession = null;
7226 01 Jun 23 nicklas 216     DbControl dc = null;
7226 01 Jun 23 nicklas 217     try
7221 31 May 23 nicklas 218     {
7226 01 Jun 23 nicklas 219       dc = sc.newDbControl("Reggie: Auto-import JSON files");
7226 01 Jun 23 nicklas 220       FileServer importGateway = item(dc);
7226 01 Jun 23 nicklas 221       FileServer importArchive = Fileserver.IMPORT_ARCHIVE.get(dc);
7227 01 Jun 23 nicklas 222       String operator = (String)Annotationtype.EXTERNAL_OPERATOR.getAnnotationValue(dc, importGateway);
7221 31 May 23 nicklas 223       
7226 01 Jun 23 nicklas 224       // Connect to the import gateway and archive so that we can move JSON from the gateway
7226 01 Jun 23 nicklas 225       gatewaySession = new RemoteHost(new ConnectionInfo(importGateway)).connect(5);
7226 01 Jun 23 nicklas 226       archiveSession = new RemoteHost(new ConnectionInfo(importArchive)).connect(5);
7226 01 Jun 23 nicklas 227       String archiveRoot = ScriptUtil.checkValidPath(importArchive.getRootPath(), true, false);
7226 01 Jun 23 nicklas 228       String gatewayRoot = ScriptUtil.checkValidPath(importGateway.getRootPath(), true, false);
7226 01 Jun 23 nicklas 229
7256 13 Jun 23 nicklas 230       for (String fileName : filesToImport)
7226 01 Jun 23 nicklas 231       {
7256 13 Jun 23 nicklas 232         logger.info("Importing JSON file: "+fileName);
7226 01 Jun 23 nicklas 233
7226 01 Jun 23 nicklas 234         // We use one transaction per JSON file
7226 01 Jun 23 nicklas 235         if (dc.isClosed()) dc = sc.newDbControl(dc.getName());
7256 13 Jun 23 nicklas 236         JsonFile file = new JsonFile(dc, fileName);
7256 13 Jun 23 nicklas 237         file.downloadAndParse(gatewaySession, gatewayRoot, true, null, null);
7227 01 Jun 23 nicklas 238         // Set operator from the annotation on the import gateway
7227 01 Jun 23 nicklas 239         if (operator != null) file.setOperator(operator);
7256 13 Jun 23 nicklas 240         
7256 13 Jun 23 nicklas 241         if (!file.hasError() && !file.hasWarning())
7226 01 Jun 23 nicklas 242         {
7256 13 Jun 23 nicklas 243           try
7256 13 Jun 23 nicklas 244           {
7256 13 Jun 23 nicklas 245             ExternalSpecimenImporter importer = new ExternalSpecimenImporter();
7256 13 Jun 23 nicklas 246             ImportedItems items = importer.doImport(dc, file, importGateway);
7226 01 Jun 23 nicklas 247           
7256 13 Jun 23 nicklas 248             if (logger.isTraceEnabled()) traceAllMessages(file);
7226 01 Jun 23 nicklas 249             
7256 13 Jun 23 nicklas 250             if (items != null && items.importedTo != null && items.demux != null)
7256 13 Jun 23 nicklas 251             {
7256 13 Jun 23 nicklas 252               // Copy the JSON file to the import archive and link it with the imported top item (eg. Specimen)
7256 13 Jun 23 nicklas 253               String archiveFolder = (String)Annotationtype.DATA_FILES_FOLDER.getAnnotationValue(dc, items.demux.getItem());
7256 13 Jun 23 nicklas 254               file.saveTo(archiveSession, archiveRoot + archiveFolder);
7256 13 Jun 23 nicklas 255               importer.createJsonLink(dc, file, items.importedTo, importArchive, archiveFolder);
7256 13 Jun 23 nicklas 256               
7256 13 Jun 23 nicklas 257               // Add to the the FASTQ import pipeline in case the auto-start fails
7256 13 Jun 23 nicklas 258               BiomaterialList.FASTQ_IMPORT_PIPELINE.get(dc).add(items.demux.getItem());
7256 13 Jun 23 nicklas 259               ActivityDef.JSON_AUTO_IMPORT_COMPLETED.merge(dc, 1).setUser("Auto-import");
7256 13 Jun 23 nicklas 260               dc.commit();
7256 13 Jun 23 nicklas 261               demuxedSequences.add(items.demux);
7256 13 Jun 23 nicklas 262               numImported++;
7256 13 Jun 23 nicklas 263               logger.info("Import completed successfully: "+file.getName());
7256 13 Jun 23 nicklas 264               String msg = file.deleteFrom(gatewaySession, gatewayRoot);
7256 13 Jun 23 nicklas 265               if (msg != null) logger.warn(msg); // If the file could not be deleted
7256 13 Jun 23 nicklas 266             }
7256 13 Jun 23 nicklas 267             else
7256 13 Jun 23 nicklas 268             {
7256 13 Jun 23 nicklas 269               logger.error("Failed to import "+file.getName());
7256 13 Jun 23 nicklas 270             }          
7226 01 Jun 23 nicklas 271           }
7256 13 Jun 23 nicklas 272           catch (RuntimeException ex)
7226 01 Jun 23 nicklas 273           {
7256 13 Jun 23 nicklas 274             logger.error("Failed to import "+file.getName(), ex);
7256 13 Jun 23 nicklas 275           }
7226 01 Jun 23 nicklas 276         }
7256 13 Jun 23 nicklas 277         else
7226 01 Jun 23 nicklas 278         {
7256 13 Jun 23 nicklas 279           logger.error("File can't be imported: "+file.getName());
7256 13 Jun 23 nicklas 280           if (logger.isTraceEnabled()) traceAllMessages(file);
7226 01 Jun 23 nicklas 281         }
7226 01 Jun 23 nicklas 282         dc.close();
7226 01 Jun 23 nicklas 283       }
7221 31 May 23 nicklas 284     }
7226 01 Jun 23 nicklas 285     finally
7226 01 Jun 23 nicklas 286     {
7228 01 Jun 23 nicklas 287       OpenGrid.close(gatewaySession);
7228 01 Jun 23 nicklas 288       OpenGrid.close(archiveSession);
7226 01 Jun 23 nicklas 289       if (dc != null) dc.close();
7226 01 Jun 23 nicklas 290     }
7228 01 Jun 23 nicklas 291     
7228 01 Jun 23 nicklas 292     if (demuxedSequences.size() > 0)
7228 01 Jun 23 nicklas 293     {
7228 01 Jun 23 nicklas 294       try
7228 01 Jun 23 nicklas 295       {
7228 01 Jun 23 nicklas 296         dc = sc.newDbControl(dc.getName());
7228 01 Jun 23 nicklas 297         
7228 01 Jun 23 nicklas 298         Filter<Annotatable> mergeFilter = new AllOfFilter<>(Arrays.asList(
7228 01 Jun 23 nicklas 299           Annotationtype.PIPELINE.createFilter(Pipeline.RNA_SEQ.getName()), 
7228 01 Jun 23 nicklas 300           Annotationtype.MERGE_TYPE.createFilter("Import")));
7228 01 Jun 23 nicklas 301         Protocol protocol = (Protocol)Subtype.MERGE_PROTOCOL.getLatestProjectDefault(dc, mergeFilter);
7228 01 Jun 23 nicklas 302         Software software = (Software)Subtype.MERGE_SOFTWARE.getLatestProjectDefault(dc, mergeFilter);
7228 01 Jun 23 nicklas 303         
7228 01 Jun 23 nicklas 304         ImportFastqJobCreator jobCreator = new ImportFastqJobCreator();
7228 01 Jun 23 nicklas 305         jobCreator.setAutoConfirm(true);
7228 01 Jun 23 nicklas 306         jobCreator.setMergeProtocol(protocol);
7228 01 Jun 23 nicklas 307         jobCreator.setMergeSoftware(software);
7228 01 Jun 23 nicklas 308         
7228 01 Jun 23 nicklas 309         OpenGridCluster cluster = ScriptUtil.autoSelectClusterWithConfig(dc, "demux/execute-import", null);
7228 01 Jun 23 nicklas 310         if (cluster != null)
7228 01 Jun 23 nicklas 311         {
7228 01 Jun 23 nicklas 312           logger.debug("Submitting "+demuxedSequences.size()+" jobs for FASTQ import");
7228 01 Jun 23 nicklas 313           if (logger.isTraceEnabled())
7228 01 Jun 23 nicklas 314           {
7228 01 Jun 23 nicklas 315             logger.trace("Starting demux job on cluster: " + cluster.getId());
7228 01 Jun 23 nicklas 316             logger.debug("Merge software/protocol: " + software + "/" + protocol);
7228 01 Jun 23 nicklas 317           }
7228 01 Jun 23 nicklas 318           List<JobDefinition> jobDefs = jobCreator.createFastqImportJobs(dc, cluster, demuxedSequences);
7228 01 Jun 23 nicklas 319           List<Job> jobs = ScriptUtil.submitJobs(dc, cluster, jobDefs);
7228 01 Jun 23 nicklas 320           for (Job job : jobs)
7228 01 Jun 23 nicklas 321           {
7228 01 Jun 23 nicklas 322             if (job.getStatus() == Job.Status.ERROR)
7228 01 Jun 23 nicklas 323             {
7228 01 Jun 23 nicklas 324               logger.warn("Job submission for '" + job.getName() + "' failed: " + job.getStatusMessage());
7228 01 Jun 23 nicklas 325             }
7228 01 Jun 23 nicklas 326             else
7228 01 Jun 23 nicklas 327             {
7228 01 Jun 23 nicklas 328               logger.info("Submitted "+job.getName()+" to "+cluster.getConnectionInfo().getName()+" with id "+job.getExternalId());
7228 01 Jun 23 nicklas 329             }
7228 01 Jun 23 nicklas 330           }
7228 01 Jun 23 nicklas 331           dc.commit();
7228 01 Jun 23 nicklas 332         }
7228 01 Jun 23 nicklas 333         else
7228 01 Jun 23 nicklas 334         {
7228 01 Jun 23 nicklas 335           logger.warn("Could not find any cluster that can import FASTQ files");
7228 01 Jun 23 nicklas 336         }
7228 01 Jun 23 nicklas 337       }
7228 01 Jun 23 nicklas 338       catch (Exception ex)
7228 01 Jun 23 nicklas 339       {
7228 01 Jun 23 nicklas 340         logger.error("Job submission for FASTQ import failed: "+ ex.getMessage());
7228 01 Jun 23 nicklas 341       }
7228 01 Jun 23 nicklas 342       finally
7228 01 Jun 23 nicklas 343       {
7228 01 Jun 23 nicklas 344         if (dc != null) dc.close();
7228 01 Jun 23 nicklas 345       }
7228 01 Jun 23 nicklas 346     }
7228 01 Jun 23 nicklas 347       
7221 31 May 23 nicklas 348     return numImported > 0;
7221 31 May 23 nicklas 349   }
7221 31 May 23 nicklas 350
7226 01 Jun 23 nicklas 351   
7226 01 Jun 23 nicklas 352   private void traceAllMessages(JsonFile file)
7226 01 Jun 23 nicklas 353   {
7226 01 Jun 23 nicklas 354     for (String msg : file.getErrorMessages())
7226 01 Jun 23 nicklas 355     {
7226 01 Jun 23 nicklas 356       logger.trace(file.getName()+" error: "+msg);
7226 01 Jun 23 nicklas 357     }
7226 01 Jun 23 nicklas 358     for (String msg : file.getWarningMessages())
7226 01 Jun 23 nicklas 359     {
7226 01 Jun 23 nicklas 360       logger.trace(file.getName()+" warning: "+msg);
7226 01 Jun 23 nicklas 361     }
7226 01 Jun 23 nicklas 362     for (String msg : file.getDebugMessages())
7226 01 Jun 23 nicklas 363     {
7226 01 Jun 23 nicklas 364       logger.trace(file.getName()+" debug: "+msg);
7226 01 Jun 23 nicklas 365     }
7226 01 Jun 23 nicklas 366     
7226 01 Jun 23 nicklas 367   }
7226 01 Jun 23 nicklas 368   
7221 31 May 23 nicklas 369 }