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

Code
Comments
Other
Rev Date Author Line
3032 12 Dec 14 nicklas 1 package net.sf.basedb.reggie.autoconfirm;
3032 12 Dec 14 nicklas 2
3032 12 Dec 14 nicklas 3 import java.util.Iterator;
3032 12 Dec 14 nicklas 4 import java.util.TimerTask;
3032 12 Dec 14 nicklas 5
3571 30 Oct 15 nicklas 6 import net.sf.basedb.clients.web.extensions.service.ServiceControllerAction;
3032 12 Dec 14 nicklas 7 import net.sf.basedb.clients.web.extensions.service.Services;
3032 12 Dec 14 nicklas 8 import net.sf.basedb.core.Application;
3032 12 Dec 14 nicklas 9 import net.sf.basedb.core.DbControl;
3032 12 Dec 14 nicklas 10 import net.sf.basedb.core.DerivedBioAssay;
7221 31 May 23 nicklas 11 import net.sf.basedb.core.FileServer;
3032 12 Dec 14 nicklas 12 import net.sf.basedb.core.Include;
3032 12 Dec 14 nicklas 13 import net.sf.basedb.core.ItemQuery;
3034 12 Dec 14 nicklas 14 import net.sf.basedb.core.ItemSubtype;
6021 23 Oct 20 nicklas 15 import net.sf.basedb.core.Job;
3032 12 Dec 14 nicklas 16 import net.sf.basedb.core.RawBioAssay;
4665 31 Jan 18 nicklas 17 import net.sf.basedb.core.RawDataType;
3032 12 Dec 14 nicklas 18 import net.sf.basedb.core.SessionControl;
6021 23 Oct 20 nicklas 19 import net.sf.basedb.core.Type;
3032 12 Dec 14 nicklas 20 import net.sf.basedb.core.query.Annotations;
3032 12 Dec 14 nicklas 21 import net.sf.basedb.core.query.Expressions;
3032 12 Dec 14 nicklas 22 import net.sf.basedb.core.query.Hql;
3032 12 Dec 14 nicklas 23 import net.sf.basedb.core.query.Restrictions;
3033 12 Dec 14 nicklas 24 import net.sf.basedb.reggie.Reggie;
3059 19 Dec 14 nicklas 25 import net.sf.basedb.reggie.counter.CounterService;
3032 12 Dec 14 nicklas 26 import net.sf.basedb.reggie.dao.Annotationtype;
7221 31 May 23 nicklas 27 import net.sf.basedb.reggie.dao.Fileserver;
6816 26 Aug 22 nicklas 28 import net.sf.basedb.reggie.dao.Pipeline;
4665 31 Jan 18 nicklas 29 import net.sf.basedb.reggie.dao.Rawdatatype;
3034 12 Dec 14 nicklas 30 import net.sf.basedb.reggie.dao.Subtype;
6021 23 Oct 20 nicklas 31 import net.sf.basedb.reggie.query.JobParameter;
3032 12 Dec 14 nicklas 32 import net.sf.basedb.util.extensions.Extension;
7077 27 Mar 23 nicklas 33 import net.sf.basedb.util.extensions.logging.ExtensionsLog;
7077 27 Mar 23 nicklas 34 import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
3032 12 Dec 14 nicklas 35
3032 12 Dec 14 nicklas 36 import org.slf4j.LoggerFactory;
3032 12 Dec 14 nicklas 37
3032 12 Dec 14 nicklas 38 /**
3032 12 Dec 14 nicklas 39   Service for auto-confirmation of secondary analysis steps. It will
3032 12 Dec 14 nicklas 40   check the database at regular intervals for derived and raw bioassay
3032 12 Dec 14 nicklas 41   items that has annotation {@link Annotationtype#AUTO_PROCESSING} == AutoConfirm.
3032 12 Dec 14 nicklas 42   
3032 12 Dec 14 nicklas 43   It will always clear the annotation so that if anything fails later, the
3032 12 Dec 14 nicklas 44   item will be visible in the manual flow.
3032 12 Dec 14 nicklas 45   
3032 12 Dec 14 nicklas 46   If the items fulfill a given set of rules they will automatically be
3032 12 Dec 14 nicklas 47   confirmed and the next step is started.
3032 12 Dec 14 nicklas 48   
3032 12 Dec 14 nicklas 49   Note that checks are usually made in 15-minute intervals, but a job handler may
3032 12 Dec 14 nicklas 50   call {@link #setForceCheck()} when a job has ended to force a check at the next
3032 12 Dec 14 nicklas 51   timer event (typically within the next 5 seconds).
3032 12 Dec 14 nicklas 52   
3032 12 Dec 14 nicklas 53   @author nicklas
3045 16 Dec 14 nicklas 54   @since 3.0
3032 12 Dec 14 nicklas 55 */
3032 12 Dec 14 nicklas 56 public class AutoConfirmService 
3032 12 Dec 14 nicklas 57 {
3032 12 Dec 14 nicklas 58
7077 27 Mar 23 nicklas 59   public static final String ID = "net.sf.basedb.reggie.auto-confirm-service";
3032 12 Dec 14 nicklas 60
7077 27 Mar 23 nicklas 61   private static final ExtensionsLogger logger = 
7077 27 Mar 23 nicklas 62       ExtensionsLog.getLogger(ID, true).wrap(LoggerFactory.getLogger(AutoConfirmService.class));
7077 27 Mar 23 nicklas 63
3032 12 Dec 14 nicklas 64   // The singleton
3032 12 Dec 14 nicklas 65   private static AutoConfirmService instance = null;
3032 12 Dec 14 nicklas 66
7077 27 Mar 23 nicklas 67   // At most 15 minutes between auto-confirm checks (1 when debugging)
7077 27 Mar 23 nicklas 68   private static final long MAX_WAIT_INTERVAL_NORMAL = 15 * 60000;
7077 27 Mar 23 nicklas 69   private static final long MAX_WAIT_INTERVAL_DEBUG = 1 * 60000;
3032 12 Dec 14 nicklas 70   
3032 12 Dec 14 nicklas 71   /**
3032 12 Dec 14 nicklas 72     Get the singleton instance of the service. If the service has
3032 12 Dec 14 nicklas 73     not been created yet it is created at this time.
3032 12 Dec 14 nicklas 74   */
3032 12 Dec 14 nicklas 75   public static final AutoConfirmService getInstance()
3032 12 Dec 14 nicklas 76   {
3032 12 Dec 14 nicklas 77     if (instance == null)
3032 12 Dec 14 nicklas 78     {
3032 12 Dec 14 nicklas 79       synchronized (AutoConfirmService.class)
3032 12 Dec 14 nicklas 80       {
3032 12 Dec 14 nicklas 81         if (instance == null)
3032 12 Dec 14 nicklas 82         {
3032 12 Dec 14 nicklas 83           AutoConfirmService tmp = new AutoConfirmService();
3032 12 Dec 14 nicklas 84           instance = tmp;
3032 12 Dec 14 nicklas 85         }
3032 12 Dec 14 nicklas 86       }
3032 12 Dec 14 nicklas 87     }
3032 12 Dec 14 nicklas 88     return instance;
3032 12 Dec 14 nicklas 89   }
3032 12 Dec 14 nicklas 90
3032 12 Dec 14 nicklas 91   private volatile boolean isRunning;
3033 12 Dec 14 nicklas 92   private SessionControl systemSc;
3571 30 Oct 15 nicklas 93   private Extension<ServiceControllerAction> ext;
3032 12 Dec 14 nicklas 94   private TimerTask autoConfirmTimer;
3032 12 Dec 14 nicklas 95   
3032 12 Dec 14 nicklas 96   // Time when last check for auto-confirmation was made
3032 12 Dec 14 nicklas 97   private volatile long lastAutoConfirmCheck;
3032 12 Dec 14 nicklas 98   // If flag is set, we force check for auto-confirmation
5036 17 Oct 18 nicklas 99   private volatile long forceAutoConfirmCheck;
3032 12 Dec 14 nicklas 100   
3032 12 Dec 14 nicklas 101   private AutoConfirmService()
3032 12 Dec 14 nicklas 102   {}
3032 12 Dec 14 nicklas 103   
3032 12 Dec 14 nicklas 104   /**
3032 12 Dec 14 nicklas 105     Is the auto-confirm service running or not?
3032 12 Dec 14 nicklas 106   */
3032 12 Dec 14 nicklas 107   public boolean isRunning()
3032 12 Dec 14 nicklas 108   {
3032 12 Dec 14 nicklas 109     return isRunning;
3032 12 Dec 14 nicklas 110   }
3032 12 Dec 14 nicklas 111
3032 12 Dec 14 nicklas 112   /**
3032 12 Dec 14 nicklas 113     Start the service if it is not running.
3032 12 Dec 14 nicklas 114   */
3571 30 Oct 15 nicklas 115   public synchronized void start(SessionControl systemSc, Extension<ServiceControllerAction> ext)
3032 12 Dec 14 nicklas 116   {
3032 12 Dec 14 nicklas 117     if (!isRunning)
3032 12 Dec 14 nicklas 118     {
3032 12 Dec 14 nicklas 119       logger.debug("Starting auto-confirm service");
3033 12 Dec 14 nicklas 120       this.systemSc = systemSc;
3032 12 Dec 14 nicklas 121       this.ext = ext;
3032 12 Dec 14 nicklas 122       
3033 12 Dec 14 nicklas 123       Reggie.getRootSessionControl(systemSc);
3032 12 Dec 14 nicklas 124       
3032 12 Dec 14 nicklas 125       autoConfirmTimer = Application.getScheduler().scheduleAtFixedRate(
3033 12 Dec 14 nicklas 126         new AutoConfirmTimerTask(), 5000, 5000, false);
3032 12 Dec 14 nicklas 127       
3032 12 Dec 14 nicklas 128       isRunning = true;
3032 12 Dec 14 nicklas 129       logger.debug("Auto-confirm service is now running");
3032 12 Dec 14 nicklas 130     }
3032 12 Dec 14 nicklas 131   }
3032 12 Dec 14 nicklas 132
3032 12 Dec 14 nicklas 133   /**
3032 12 Dec 14 nicklas 134     Stop the service if it is running.
3032 12 Dec 14 nicklas 135   */
3032 12 Dec 14 nicklas 136   public synchronized void stop()
3032 12 Dec 14 nicklas 137   {
3032 12 Dec 14 nicklas 138     if (isRunning)
3032 12 Dec 14 nicklas 139     {
3032 12 Dec 14 nicklas 140       logger.debug("Stopping auto-confirm service");
3032 12 Dec 14 nicklas 141       isRunning = false;
3032 12 Dec 14 nicklas 142
3032 12 Dec 14 nicklas 143       if (autoConfirmTimer != null)
3032 12 Dec 14 nicklas 144       {
3032 12 Dec 14 nicklas 145         autoConfirmTimer.cancel();
3032 12 Dec 14 nicklas 146         autoConfirmTimer = null;
3032 12 Dec 14 nicklas 147       }
3033 12 Dec 14 nicklas 148       systemSc = null;
3032 12 Dec 14 nicklas 149       ext = null;
3033 12 Dec 14 nicklas 150       lastAutoConfirmCheck = 0;
5036 17 Oct 18 nicklas 151       forceAutoConfirmCheck = 0;
3033 12 Dec 14 nicklas 152       Reggie.closeRootSessionControl();
3032 12 Dec 14 nicklas 153       
3032 12 Dec 14 nicklas 154       logger.debug("Auto-confirm service has stopped");
3032 12 Dec 14 nicklas 155     }
3032 12 Dec 14 nicklas 156   }
3032 12 Dec 14 nicklas 157   
3032 12 Dec 14 nicklas 158   /**
3032 12 Dec 14 nicklas 159     Restart the service.
3032 12 Dec 14 nicklas 160   */
3032 12 Dec 14 nicklas 161   public synchronized void restart()
3032 12 Dec 14 nicklas 162   {
3032 12 Dec 14 nicklas 163     if (ext != null) Services.restart(ext);
3032 12 Dec 14 nicklas 164   }
3032 12 Dec 14 nicklas 165
3032 12 Dec 14 nicklas 166   /**
5036 17 Oct 18 nicklas 167     Set a flag forcing the service to perform a check soon after the given number
5036 17 Oct 18 nicklas 168     of seconds. This method is intended to be called by job handlers when a job has ended 
5036 17 Oct 18 nicklas 169     and if (only if) the detect that auto-confirm is enabled.
3032 12 Dec 14 nicklas 170   */
5036 17 Oct 18 nicklas 171   public void setForceCheck(int seconds)
3032 12 Dec 14 nicklas 172   {
5036 17 Oct 18 nicklas 173     this.forceAutoConfirmCheck = System.currentTimeMillis() + seconds * 1000;
3032 12 Dec 14 nicklas 174   }
3032 12 Dec 14 nicklas 175   
3032 12 Dec 14 nicklas 176   /**
3032 12 Dec 14 nicklas 177     Perform an auto-confirm check. Note that this method may return without doing
3032 12 Dec 14 nicklas 178     anything depending on how long time it was since the last check and if
3032 12 Dec 14 nicklas 179     the {@link #setForceCheck()} has been called or not.
3032 12 Dec 14 nicklas 180   */
3033 12 Dec 14 nicklas 181   void autoConfirm()
3032 12 Dec 14 nicklas 182   {
3032 12 Dec 14 nicklas 183     long now = System.currentTimeMillis();
3032 12 Dec 14 nicklas 184     long timeSinceLastCheck = now - lastAutoConfirmCheck;
3032 12 Dec 14 nicklas 185
3032 12 Dec 14 nicklas 186     // If we have not waited long enough and there there is no recent request we don't have to check
7077 27 Mar 23 nicklas 187     long maxWaitInterval = logger.isDebugEnabled() ? MAX_WAIT_INTERVAL_DEBUG : MAX_WAIT_INTERVAL_NORMAL;
7077 27 Mar 23 nicklas 188     if (timeSinceLastCheck < maxWaitInterval && (forceAutoConfirmCheck == 0 || forceAutoConfirmCheck > now))
3032 12 Dec 14 nicklas 189     {
3049 17 Dec 14 nicklas 190       logger.trace("No auto-confirm check since no recent request and not long enough wait time [" + (timeSinceLastCheck / 1000) + "]");
3032 12 Dec 14 nicklas 191       return;
3032 12 Dec 14 nicklas 192     }
3032 12 Dec 14 nicklas 193
5036 17 Oct 18 nicklas 194     forceAutoConfirmCheck = 0;
3032 12 Dec 14 nicklas 195     lastAutoConfirmCheck = now;
3032 12 Dec 14 nicklas 196     logger.debug("Time for auto-confirm check [" + (timeSinceLastCheck / 1000) + "]");
3049 17 Dec 14 nicklas 197     int numItems = 0;
3032 12 Dec 14 nicklas 198     
3033 12 Dec 14 nicklas 199     SessionControl sc = Reggie.getRootSessionControl(systemSc);
3032 12 Dec 14 nicklas 200     DbControl dc = null;
3032 12 Dec 14 nicklas 201     try
3032 12 Dec 14 nicklas 202     {
6599 22 Feb 22 nicklas 203       dc = sc.newDbControl("Reggie: Auto-confirm");
3032 12 Dec 14 nicklas 204       
3034 12 Dec 14 nicklas 205       // Load auto-confirmable types
3700 18 Jan 16 nicklas 206       ItemSubtype seqRunType = Subtype.SEQUENCING_RUN.load(dc);
3034 12 Dec 14 nicklas 207       ItemSubtype demuxType = Subtype.DEMUXED_SEQUENCES.load(dc);
6184 26 Mar 21 nicklas 208       ItemSubtype mergedType = Subtype.MERGED_SEQUENCES.load(dc);
4600 28 Sep 17 nicklas 209       ItemSubtype alignType = Subtype.ALIGNED_SEQUENCES.load(dc);
6184 26 Mar 21 nicklas 210       ItemSubtype fastqImportType = Subtype.FASTQ_IMPORT_JOB.get(dc);
4600 28 Sep 17 nicklas 211       ItemSubtype hisatType = Subtype.HISAT_ALIGN_JOB.load(dc);
7119 19 Apr 23 nicklas 212       ItemSubtype bwaMem2Type = Subtype.BWA_MEM2_ALIGN_JOB.get(dc);
5845 26 Feb 20 nicklas 213       ItemSubtype mipsAlignType = Subtype.MIPS_ALIGN_JOB.load(dc);
6881 22 Nov 22 nicklas 214       ItemSubtype methylationType = Subtype.METHYLATION.get(dc);
6881 22 Nov 22 nicklas 215       ItemSubtype methylationBetaJob = Subtype.METHYLATION_BETA_JOB.get(dc);
6881 22 Nov 22 nicklas 216       
4667 01 Feb 18 nicklas 217       RawDataType cufflinksType = Rawdatatype.CUFFLINKS.getRawDataType();
4670 05 Feb 18 nicklas 218       RawDataType stringTieType = Rawdatatype.STRINGTIE.getRawDataType();
5723 13 Nov 19 nicklas 219       RawDataType variantCallType = Rawdatatype.VARIANT_CALL.getRawDataType();
3034 12 Dec 14 nicklas 220       
3034 12 Dec 14 nicklas 221       // Collection AutoConfirm actions
3034 12 Dec 14 nicklas 222       AutoConfirmManager manager = new AutoConfirmManager();
3034 12 Dec 14 nicklas 223       
3032 12 Dec 14 nicklas 224       ItemQuery<DerivedBioAssay> query = DerivedBioAssay.getQuery();
3034 12 Dec 14 nicklas 225       query.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL);
3032 12 Dec 14 nicklas 226       // AutoProcess==AutoConfirm
3032 12 Dec 14 nicklas 227       query.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap"));
3032 12 Dec 14 nicklas 228       query.restrict(Restrictions.eq(Hql.alias("ap"), Expressions.string("AutoConfirm")));
3032 12 Dec 14 nicklas 229
3032 12 Dec 14 nicklas 230       // The job must be ended
3032 12 Dec 14 nicklas 231       query.join(Hql.innerJoin("job", "jb"));
3032 12 Dec 14 nicklas 232       query.restrict(Restrictions.neq(Hql.property("jb", "ended"), null));
3032 12 Dec 14 nicklas 233
3032 12 Dec 14 nicklas 234       Iterator<DerivedBioAssay> it = query.iterate(dc);
3032 12 Dec 14 nicklas 235       while (it.hasNext())
3032 12 Dec 14 nicklas 236       {
3049 17 Dec 14 nicklas 237         numItems++;
3032 12 Dec 14 nicklas 238         DerivedBioAssay dba = it.next();
3034 12 Dec 14 nicklas 239         ItemSubtype itemType = dba.getItemSubtype();
4600 28 Sep 17 nicklas 240         ItemSubtype jobType = dba.getJob().getItemSubtype();
6816 26 Aug 22 nicklas 241         Pipeline pipeline = Pipeline.getByName((String)Annotationtype.PIPELINE.getAnnotationValue(dc, dba));
4600 28 Sep 17 nicklas 242         
3034 12 Dec 14 nicklas 243         AutoConfirmer<?> ac = null;
3032 12 Dec 14 nicklas 244
3700 18 Jan 16 nicklas 245         if (seqRunType.equals(itemType))
3034 12 Dec 14 nicklas 246         {
3700 18 Jan 16 nicklas 247           ac = new SequencingRunAutoConfirmer(dba);
3700 18 Jan 16 nicklas 248         }
3700 18 Jan 16 nicklas 249         else if (demuxType.equals(itemType))
3700 18 Jan 16 nicklas 250         {
3034 12 Dec 14 nicklas 251           // Since there can be multiple demux items per job, we
3034 12 Dec 14 nicklas 252           // create one action per job
3034 12 Dec 14 nicklas 253           ac = new DemuxAutoConfirmer(dba.getJob());
3034 12 Dec 14 nicklas 254         }
6184 26 Mar 21 nicklas 255         else if (mergedType.equals(itemType))
6184 26 Mar 21 nicklas 256         {
6184 26 Mar 21 nicklas 257           if (fastqImportType.equals(jobType))
6184 26 Mar 21 nicklas 258           {
6184 26 Mar 21 nicklas 259             ac = new FastqImportAutoConfirmer(dba);
6184 26 Mar 21 nicklas 260           }
6184 26 Mar 21 nicklas 261         }
5845 26 Feb 20 nicklas 262         else if (alignType.equals(itemType))
4600 28 Sep 17 nicklas 263         {
5845 26 Feb 20 nicklas 264           if (hisatType.equals(jobType))
5845 26 Feb 20 nicklas 265           {
6816 26 Aug 22 nicklas 266             if (pipeline == Pipeline.RNASEQ_HISAT_STRINGTIE)
6816 26 Aug 22 nicklas 267             {
6816 26 Aug 22 nicklas 268               ac = new HisatAlignAutoConfirmer(dba);
6816 26 Aug 22 nicklas 269             }
6816 26 Aug 22 nicklas 270             else if (pipeline == Pipeline.RNASEQ_HISAT_2023)
6816 26 Aug 22 nicklas 271             {
6816 26 Aug 22 nicklas 272               ac = new Hisat2023AutoConfirmer(dba);
6816 26 Aug 22 nicklas 273             }
5845 26 Feb 20 nicklas 274           }
7119 19 Apr 23 nicklas 275           else if (bwaMem2Type.equals(jobType))
7119 19 Apr 23 nicklas 276           {
7119 19 Apr 23 nicklas 277             ac = new BwaMem2AutoConfirmer(dba);
7119 19 Apr 23 nicklas 278           }
5845 26 Feb 20 nicklas 279           else if (mipsAlignType.equals(jobType))
5845 26 Feb 20 nicklas 280           {
5845 26 Feb 20 nicklas 281             ac = new MipsAlignAutoConfirmer(dba);
5845 26 Feb 20 nicklas 282           }
4600 28 Sep 17 nicklas 283         }
6881 22 Nov 22 nicklas 284         else if (methylationType.equals(itemType))
6881 22 Nov 22 nicklas 285         {
6881 22 Nov 22 nicklas 286           if (methylationBetaJob.equals(jobType))
6881 22 Nov 22 nicklas 287           {
6881 22 Nov 22 nicklas 288             ac = new MethylationBetaAutoConfirmer(dba);
6881 22 Nov 22 nicklas 289           }
6881 22 Nov 22 nicklas 290         }
3049 17 Dec 14 nicklas 291         manager.checkRulesAndAdd(dc, ac);
3049 17 Dec 14 nicklas 292
3049 17 Dec 14 nicklas 293         logger.debug("Resetting AutoProcessing for " + dba.getName());
3049 17 Dec 14 nicklas 294         manager.resetAutoProcessing(dc, dba);
3032 12 Dec 14 nicklas 295       }
3032 12 Dec 14 nicklas 296       
4665 31 Jan 18 nicklas 297       ItemQuery<RawBioAssay> rawQuery = RawBioAssay.getQuery();
4665 31 Jan 18 nicklas 298       rawQuery.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL);
3032 12 Dec 14 nicklas 299       // AutoProcess==AutoConfirm
4665 31 Jan 18 nicklas 300       rawQuery.join(Annotations.leftJoin(null, Annotationtype.AUTO_PROCESSING.load(dc), "ap"));
4665 31 Jan 18 nicklas 301       rawQuery.restrict(Restrictions.eq(Hql.alias("ap"), Expressions.string("AutoConfirm")));
3032 12 Dec 14 nicklas 302       // The job must be ended
4665 31 Jan 18 nicklas 303       rawQuery.join(Hql.innerJoin("job", "jb"));
4665 31 Jan 18 nicklas 304       rawQuery.restrict(Restrictions.neq(Hql.property("jb", "ended"), null));
4665 31 Jan 18 nicklas 305
4665 31 Jan 18 nicklas 306       Iterator<RawBioAssay> rawIt = rawQuery.iterate(dc);
4665 31 Jan 18 nicklas 307       while (rawIt.hasNext())
3032 12 Dec 14 nicklas 308       {
3049 17 Dec 14 nicklas 309         numItems++;
4665 31 Jan 18 nicklas 310         RawBioAssay raw = rawIt.next();
4665 31 Jan 18 nicklas 311         RawDataType rawType = raw.getRawDataType();
6823 29 Aug 22 nicklas 312         Pipeline pipeline = Pipeline.getByName((String)Annotationtype.PIPELINE.getAnnotationValue(dc, raw));
4665 31 Jan 18 nicklas 313         
4665 31 Jan 18 nicklas 314         AutoConfirmer<?> ac = null;
4665 31 Jan 18 nicklas 315         
4665 31 Jan 18 nicklas 316         if (cufflinksType.equals(rawType))
4665 31 Jan 18 nicklas 317         {
4665 31 Jan 18 nicklas 318           ac = new CufflinksAutoConfirmer(raw);
4665 31 Jan 18 nicklas 319         }
4670 05 Feb 18 nicklas 320         else if (stringTieType.equals(rawType))
4670 05 Feb 18 nicklas 321         {
6823 29 Aug 22 nicklas 322           if (pipeline == Pipeline.RNASEQ_HISAT_STRINGTIE)
6823 29 Aug 22 nicklas 323           {
6823 29 Aug 22 nicklas 324             ac = new StringTieAutoConfirmer(raw);
6823 29 Aug 22 nicklas 325           }
6823 29 Aug 22 nicklas 326           else if (pipeline == Pipeline.RNASEQ_STRINGTIE_2023)
6823 29 Aug 22 nicklas 327           {
6823 29 Aug 22 nicklas 328             ac = new StringTie2023AutoConfirmer(raw);
6823 29 Aug 22 nicklas 329           }
4670 05 Feb 18 nicklas 330         }
5723 13 Nov 19 nicklas 331         else if (variantCallType.equals(rawType))
5723 13 Nov 19 nicklas 332         {
7438 16 Nov 23 nicklas 333           if (pipeline == Pipeline.RNASEQ_HISAT_VARIANTCALL)
7438 16 Nov 23 nicklas 334           {
7438 16 Nov 23 nicklas 335             ac = new VariantCallAutoConfirmer(raw);
7438 16 Nov 23 nicklas 336           }
7438 16 Nov 23 nicklas 337           else if (pipeline == Pipeline.DNA_PAIRED_VARIANTCALL)
7438 16 Nov 23 nicklas 338           {
7438 16 Nov 23 nicklas 339             ac = new WgsVariantCallAutoConfirmer(raw);
7438 16 Nov 23 nicklas 340           }
5723 13 Nov 19 nicklas 341         }
3034 12 Dec 14 nicklas 342       
3049 17 Dec 14 nicklas 343         manager.checkRulesAndAdd(dc, ac);
3049 17 Dec 14 nicklas 344
3049 17 Dec 14 nicklas 345         logger.debug("Resetting AutoProcessing for " + raw.getName());
3049 17 Dec 14 nicklas 346         manager.resetAutoProcessing(dc, raw);
3032 12 Dec 14 nicklas 347       }
3032 12 Dec 14 nicklas 348       
6021 23 Oct 20 nicklas 349       ItemQuery<Job> jobQuery = Job.getQuery();
6021 23 Oct 20 nicklas 350       jobQuery.setIncludes(sc.getActiveProjectId() != 0 ? Reggie.INCLUDE_IN_CURRENT_PROJECT : Include.ALL);
6021 23 Oct 20 nicklas 351       // The job must be ended
6021 23 Oct 20 nicklas 352       jobQuery.restrict(Restrictions.neq(Hql.property("ended"), null));
6021 23 Oct 20 nicklas 353       // A parameter named 'AutoConfirmHandler' should exist
6021 23 Oct 20 nicklas 354       JobParameter acHandler = new JobParameter("AutoConfirmHandler", "ach", Type.STRING);
6021 23 Oct 20 nicklas 355       jobQuery.join(acHandler.join());
6021 23 Oct 20 nicklas 356       
6021 23 Oct 20 nicklas 357       Iterator<Job> jobIt = jobQuery.iterate(dc);
6021 23 Oct 20 nicklas 358       while (jobIt.hasNext())
6021 23 Oct 20 nicklas 359       {
6021 23 Oct 20 nicklas 360         numItems++;
6021 23 Oct 20 nicklas 361         Job job = jobIt.next();
6021 23 Oct 20 nicklas 362         String handler = job.getParameterValue("AutoConfirmHandler");
6021 23 Oct 20 nicklas 363         
6023 26 Oct 20 nicklas 364         logger.debug("Found job with AutoConfirmHandler="+handler + "; job=" + job.getName());
6021 23 Oct 20 nicklas 365         
6021 23 Oct 20 nicklas 366         AutoConfirmer<?> ac = null;
6022 26 Oct 20 nicklas 367         if ("MBafAutoConfirmer".equals(handler))
6021 23 Oct 20 nicklas 368         {
6021 23 Oct 20 nicklas 369           ac = new MBafAutoConfirmer(job);
6021 23 Oct 20 nicklas 370         }
6022 26 Oct 20 nicklas 371         else if ("RawOnlyVariantCallingAutoConfirmer".equals(handler))
6022 26 Oct 20 nicklas 372         {
6022 26 Oct 20 nicklas 373           ac = new RawOnlyVariantCallAutoConfirmer(job);
6022 26 Oct 20 nicklas 374         }
6023 26 Oct 20 nicklas 375         else if ("GeneReportAutoConfirmer".equals(handler))
6023 26 Oct 20 nicklas 376         {
6023 26 Oct 20 nicklas 377           ac = new GeneReportAutoConfirmer(job);
6023 26 Oct 20 nicklas 378         }
6025 26 Oct 20 nicklas 379         else if ("SspAutoConfirmer".equals(handler))
6025 26 Oct 20 nicklas 380         {
6025 26 Oct 20 nicklas 381           ac = new SspAutoConfirmer(job);
6025 26 Oct 20 nicklas 382         }
6387 15 Sep 21 nicklas 383         else if ("TargetedGenotypeAutoConfirmer".equals(handler))
6387 15 Sep 21 nicklas 384         {
6387 15 Sep 21 nicklas 385           ac = new TargetedGenotypeAutoConfirmer(job);
6387 15 Sep 21 nicklas 386         }
6021 23 Oct 20 nicklas 387         
6023 26 Oct 20 nicklas 388         if (ac == null)
6023 26 Oct 20 nicklas 389         {
6023 26 Oct 20 nicklas 390           logger.warn("No implementation found for AutoConfirmHandler: " + handler);
6023 26 Oct 20 nicklas 391         }
6023 26 Oct 20 nicklas 392         
6021 23 Oct 20 nicklas 393         manager.checkRulesAndAdd(dc, ac);
6021 23 Oct 20 nicklas 394         
6021 23 Oct 20 nicklas 395         logger.debug("Resetting AutoConfirmHandler for " + job.getName());
6021 23 Oct 20 nicklas 396         manager.resetAutoConfirmHandler(dc, job);
6021 23 Oct 20 nicklas 397       }
6021 23 Oct 20 nicklas 398
7221 31 May 23 nicklas 399       FileServer importGateway = Fileserver.IMPORT_GATEWAY.get(dc);
7221 31 May 23 nicklas 400       if (importGateway != null)
7221 31 May 23 nicklas 401       {
7223 31 May 23 nicklas 402         if (!"Disable".equals(Annotationtype.AUTO_PROCESSING.getAnnotationValue(dc, importGateway)))
7223 31 May 23 nicklas 403         {
7223 31 May 23 nicklas 404           numItems++;
7223 31 May 23 nicklas 405           manager.checkRulesAndAdd(dc, new JsonAutoImporter(importGateway));
7223 31 May 23 nicklas 406         }
7223 31 May 23 nicklas 407         else
7223 31 May 23 nicklas 408         {
7223 31 May 23 nicklas 409           logger.info("Auto-import from "+importGateway.getName()+" is disabled");
7223 31 May 23 nicklas 410         }
7221 31 May 23 nicklas 411       }
7221 31 May 23 nicklas 412       
3049 17 Dec 14 nicklas 413       // Commit now so that all items are reverted to manual flow just in case
3049 17 Dec 14 nicklas 414       // Actual auto-confirm and starting of next step is done later
3032 12 Dec 14 nicklas 415       dc.commit();
3034 12 Dec 14 nicklas 416       
4547 29 Jun 17 nicklas 417       manager.autoConfirmAll(sc);
3055 19 Dec 14 nicklas 418       manager.startNextStep(sc);
3059 19 Dec 14 nicklas 419
3059 19 Dec 14 nicklas 420       if (numItems > 0)
3059 19 Dec 14 nicklas 421       {
3059 19 Dec 14 nicklas 422         CounterService.getInstance().setForceCount();
3059 19 Dec 14 nicklas 423       }
3032 12 Dec 14 nicklas 424     }
3032 12 Dec 14 nicklas 425     finally
3032 12 Dec 14 nicklas 426     {
3032 12 Dec 14 nicklas 427       lastAutoConfirmCheck = System.currentTimeMillis();
3032 12 Dec 14 nicklas 428       if (dc != null) dc.close();
7077 27 Mar 23 nicklas 429       logger.info("Processed auto-confirmation for " + numItems + " items");
3032 12 Dec 14 nicklas 430     }
3032 12 Dec 14 nicklas 431   }
3508 24 Sep 15 nicklas 432
5692 29 Oct 19 nicklas 433   /**
3032 12 Dec 14 nicklas 434     Timer for auto-confirmation
3032 12 Dec 14 nicklas 435   */
3032 12 Dec 14 nicklas 436   static class AutoConfirmTimerTask
3032 12 Dec 14 nicklas 437     extends TimerTask
3032 12 Dec 14 nicklas 438   {
3032 12 Dec 14 nicklas 439     
3033 12 Dec 14 nicklas 440     public AutoConfirmTimerTask() 
3033 12 Dec 14 nicklas 441     {}
3032 12 Dec 14 nicklas 442     
3032 12 Dec 14 nicklas 443     @Override
3032 12 Dec 14 nicklas 444     public void run()
3032 12 Dec 14 nicklas 445     {
3032 12 Dec 14 nicklas 446       try
3032 12 Dec 14 nicklas 447       {
3033 12 Dec 14 nicklas 448         getInstance().autoConfirm();
3032 12 Dec 14 nicklas 449       }
3032 12 Dec 14 nicklas 450       catch (Exception ex)
3032 12 Dec 14 nicklas 451       {
3032 12 Dec 14 nicklas 452         logger.error("Exception when performing auto-confirm check", ex);
3032 12 Dec 14 nicklas 453       }
3032 12 Dec 14 nicklas 454     }
3032 12 Dec 14 nicklas 455
3032 12 Dec 14 nicklas 456   }
3032 12 Dec 14 nicklas 457   
3032 12 Dec 14 nicklas 458 }