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

Code
Comments
Other
Rev Date Author Line
3034 12 Dec 14 nicklas 1 package net.sf.basedb.reggie.autoconfirm;
3034 12 Dec 14 nicklas 2
3034 12 Dec 14 nicklas 3 import java.util.HashMap;
3034 12 Dec 14 nicklas 4 import java.util.Map;
3034 12 Dec 14 nicklas 5
3049 17 Dec 14 nicklas 6 import org.slf4j.LoggerFactory;
3049 17 Dec 14 nicklas 7
3034 12 Dec 14 nicklas 8 import net.sf.basedb.core.Annotatable;
3247 14 Apr 15 nicklas 9 import net.sf.basedb.core.ItemList;
3072 13 Jan 15 nicklas 10 import net.sf.basedb.core.CommonItem;
3034 12 Dec 14 nicklas 11 import net.sf.basedb.core.DbControl;
3049 17 Dec 14 nicklas 12 import net.sf.basedb.core.Extract;
3055 19 Dec 14 nicklas 13 import net.sf.basedb.core.Job;
3055 19 Dec 14 nicklas 14 import net.sf.basedb.core.Project;
3049 17 Dec 14 nicklas 15 import net.sf.basedb.core.SessionControl;
7225 31 May 23 nicklas 16 import net.sf.basedb.core.User;
5553 12 Aug 19 nicklas 17 import net.sf.basedb.reggie.Reggie;
3034 12 Dec 14 nicklas 18 import net.sf.basedb.reggie.dao.Annotationtype;
3049 17 Dec 14 nicklas 19 import net.sf.basedb.reggie.dao.BiomaterialList;
5553 12 Aug 19 nicklas 20 import net.sf.basedb.reggie.dao.Dna;
3049 17 Dec 14 nicklas 21 import net.sf.basedb.reggie.dao.Library;
3049 17 Dec 14 nicklas 22 import net.sf.basedb.reggie.dao.Rna;
7077 27 Mar 23 nicklas 23 import net.sf.basedb.util.extensions.logging.ExtensionsLog;
7077 27 Mar 23 nicklas 24 import net.sf.basedb.util.extensions.logging.ExtensionsLogger;
3034 12 Dec 14 nicklas 25
3034 12 Dec 14 nicklas 26 /**
3034 12 Dec 14 nicklas 27   Manager for a batch of auto-confirmations. Each possible 
3034 12 Dec 14 nicklas 28   {@link AutoConfirmer} will be checked and kept either
3034 12 Dec 14 nicklas 29   for confirmation or resetting.
3034 12 Dec 14 nicklas 30   
3034 12 Dec 14 nicklas 31   @author nicklas
3045 16 Dec 14 nicklas 32   @since 3.0
3034 12 Dec 14 nicklas 33 */
3034 12 Dec 14 nicklas 34 public class AutoConfirmManager 
3034 12 Dec 14 nicklas 35 {
3034 12 Dec 14 nicklas 36
7077 27 Mar 23 nicklas 37   private static final ExtensionsLogger logger = 
7077 27 Mar 23 nicklas 38     ExtensionsLog.getLogger(AutoConfirmService.ID, true).wrap(LoggerFactory.getLogger(AutoConfirmManager.class));
3049 17 Dec 14 nicklas 39
3049 17 Dec 14 nicklas 40   private final Map<AutoConfirmer<?>, Boolean> autoConfirmers;
3034 12 Dec 14 nicklas 41   
3034 12 Dec 14 nicklas 42   public AutoConfirmManager()
3034 12 Dec 14 nicklas 43   {
3049 17 Dec 14 nicklas 44     this.autoConfirmers = new HashMap<AutoConfirmer<?>, Boolean>();
3034 12 Dec 14 nicklas 45   }
3034 12 Dec 14 nicklas 46   
3034 12 Dec 14 nicklas 47   
3034 12 Dec 14 nicklas 48   /**
3034 12 Dec 14 nicklas 49     Checks if the given auto-confirm handler passes the rules. The
3034 12 Dec 14 nicklas 50     result will be stored by the manager so that equal() handlers
3034 12 Dec 14 nicklas 51     are not processed multiple times.
3034 12 Dec 14 nicklas 52     
3034 12 Dec 14 nicklas 53     @return TRUE if the rules are met, FALSE if not
3034 12 Dec 14 nicklas 54   */
3034 12 Dec 14 nicklas 55   public boolean checkRulesAndAdd(DbControl dc, AutoConfirmer<?> ac)
3034 12 Dec 14 nicklas 56   {
3034 12 Dec 14 nicklas 57     if (ac == null) return false;
3034 12 Dec 14 nicklas 58     Boolean passed = autoConfirmers.get(ac);
3034 12 Dec 14 nicklas 59     if (passed == null)
3034 12 Dec 14 nicklas 60     {
3049 17 Dec 14 nicklas 61       logger.debug("Checking rules: " + ac);
3049 17 Dec 14 nicklas 62       try
3049 17 Dec 14 nicklas 63       {
3049 17 Dec 14 nicklas 64         passed = ac.checkRules(dc, this);
3049 17 Dec 14 nicklas 65         logger.debug((passed ? "Passed: " : "Failed: ") + ac);
3049 17 Dec 14 nicklas 66       }
3049 17 Dec 14 nicklas 67       catch (RuntimeException ex)
3049 17 Dec 14 nicklas 68       {
3049 17 Dec 14 nicklas 69         logger.debug("Failed: " + ac, ex);
3049 17 Dec 14 nicklas 70         passed = false;
3049 17 Dec 14 nicklas 71       }
3034 12 Dec 14 nicklas 72       autoConfirmers.put(ac, passed);
3034 12 Dec 14 nicklas 73     }
3034 12 Dec 14 nicklas 74     return passed;
3034 12 Dec 14 nicklas 75   }
3034 12 Dec 14 nicklas 76   
3049 17 Dec 14 nicklas 77   
3034 12 Dec 14 nicklas 78   /**
3049 17 Dec 14 nicklas 79     Auto-confirm all entries that has passed the rule validation. Note that
3049 17 Dec 14 nicklas 80     each auto-confirmation is done in it's own transaction so that if something
3049 17 Dec 14 nicklas 81     fails it should not block other entries.
3049 17 Dec 14 nicklas 82   */
3049 17 Dec 14 nicklas 83   public void autoConfirmAll(SessionControl sc)
3049 17 Dec 14 nicklas 84   {
3049 17 Dec 14 nicklas 85     DbControl dc = null;
3049 17 Dec 14 nicklas 86     for (Map.Entry<AutoConfirmer<?>, Boolean> entry : autoConfirmers.entrySet())
3049 17 Dec 14 nicklas 87     {
3049 17 Dec 14 nicklas 88       if (!entry.getValue()) continue;
3049 17 Dec 14 nicklas 89       
3049 17 Dec 14 nicklas 90       AutoConfirmer<?> ac = entry.getKey();
3049 17 Dec 14 nicklas 91       try
3049 17 Dec 14 nicklas 92       {
3049 17 Dec 14 nicklas 93         // Use a separate DbControl for each items since if one
3049 17 Dec 14 nicklas 94         // fails it should not block the others
6599 22 Feb 22 nicklas 95         dc = sc.newDbControl("Reggie: Auto-confirm");
3049 17 Dec 14 nicklas 96         logger.debug("Auto-confirming: " + ac);
3049 17 Dec 14 nicklas 97         boolean passed = ac.autoConfirm(dc, this);
3049 17 Dec 14 nicklas 98         entry.setValue(passed);
3049 17 Dec 14 nicklas 99         logger.debug((passed ? "Passed: " : "Failed: ") + ac);
3049 17 Dec 14 nicklas 100         dc.commit();
3049 17 Dec 14 nicklas 101       }
3049 17 Dec 14 nicklas 102       catch (RuntimeException ex)
3049 17 Dec 14 nicklas 103       {
3049 17 Dec 14 nicklas 104         entry.setValue(false);
3049 17 Dec 14 nicklas 105         logger.error("Failed: " + ac, ex);
3049 17 Dec 14 nicklas 106       }
3049 17 Dec 14 nicklas 107       finally
3049 17 Dec 14 nicklas 108       {
3049 17 Dec 14 nicklas 109         if (dc != null) dc.close();
3049 17 Dec 14 nicklas 110       }
3049 17 Dec 14 nicklas 111       
3049 17 Dec 14 nicklas 112     }
3049 17 Dec 14 nicklas 113   }
3049 17 Dec 14 nicklas 114
3049 17 Dec 14 nicklas 115   
3055 19 Dec 14 nicklas 116   public void startNextStep(SessionControl sc)
3055 19 Dec 14 nicklas 117   {
3055 19 Dec 14 nicklas 118     DbControl dc = null;
3055 19 Dec 14 nicklas 119     try
3055 19 Dec 14 nicklas 120     {
6599 22 Feb 22 nicklas 121       dc = sc.newDbControl("Reggie: Auto-confirm");
3055 19 Dec 14 nicklas 122       
3055 19 Dec 14 nicklas 123       for (Map.Entry<AutoConfirmer<?>, Boolean> entry : autoConfirmers.entrySet())
3055 19 Dec 14 nicklas 124       {
3055 19 Dec 14 nicklas 125         if (!entry.getValue()) continue;
3055 19 Dec 14 nicklas 126         
3055 19 Dec 14 nicklas 127         AutoConfirmer<?> ac = entry.getKey();
3055 19 Dec 14 nicklas 128         SessionControl impersonated = null;
3055 19 Dec 14 nicklas 129         try
3055 19 Dec 14 nicklas 130         {
3055 19 Dec 14 nicklas 131           // Use a separate DbControl for each items since if one
3055 19 Dec 14 nicklas 132           // fails it should not block the others
3055 19 Dec 14 nicklas 133           Job job = ac.job(dc);
3055 19 Dec 14 nicklas 134           int projectId = job != null ? job.getActiveProjectId() : sc.getActiveProjectId();
3072 13 Jan 15 nicklas 135           CommonItem item = ac.item(dc);
7225 31 May 23 nicklas 136           User userForNextStep = ac.userForNextStep(dc);
7225 31 May 23 nicklas 137           String comment = "Auto-confirming " + (job != null ? " job: " + job.getName() : ": " + item.getName());
7225 31 May 23 nicklas 138           if (userForNextStep != null)
7225 31 May 23 nicklas 139           {
7225 31 May 23 nicklas 140             impersonated = sc.impersonateLogin(userForNextStep.getId(), comment);
7225 31 May 23 nicklas 141           }
7225 31 May 23 nicklas 142           else
7225 31 May 23 nicklas 143           {
7225 31 May 23 nicklas 144             impersonated = sc.impersonateLogin(job == null ? item : job, comment);
7225 31 May 23 nicklas 145           }
3055 19 Dec 14 nicklas 146           if (projectId != 0)
3055 19 Dec 14 nicklas 147           {
3055 19 Dec 14 nicklas 148             impersonated.setActiveProject(Project.getById(dc, projectId));
3055 19 Dec 14 nicklas 149           }
3055 19 Dec 14 nicklas 150           
3055 19 Dec 14 nicklas 151           logger.debug("Starting next step: " + ac);
3055 19 Dec 14 nicklas 152           boolean passed = ac.startNextStep(impersonated, this);
3055 19 Dec 14 nicklas 153           entry.setValue(passed);
3072 13 Jan 15 nicklas 154           logger.debug((passed ? "Started: " : "Not started: ") + ac);
3055 19 Dec 14 nicklas 155         }
3055 19 Dec 14 nicklas 156         catch (RuntimeException ex)
3055 19 Dec 14 nicklas 157         {
3055 19 Dec 14 nicklas 158           entry.setValue(false);
3055 19 Dec 14 nicklas 159           logger.error("Failed: " + ac, ex);
3055 19 Dec 14 nicklas 160         }
3055 19 Dec 14 nicklas 161         finally
3055 19 Dec 14 nicklas 162         {
3055 19 Dec 14 nicklas 163           if (impersonated != null) impersonated.close();
3055 19 Dec 14 nicklas 164         }
3055 19 Dec 14 nicklas 165       }
3055 19 Dec 14 nicklas 166       
3055 19 Dec 14 nicklas 167     }
3055 19 Dec 14 nicklas 168     finally
3055 19 Dec 14 nicklas 169     {
3069 09 Jan 15 nicklas 170       if (dc != null) dc.close();
3055 19 Dec 14 nicklas 171     }
3055 19 Dec 14 nicklas 172   }
3055 19 Dec 14 nicklas 173   
3049 17 Dec 14 nicklas 174   /**
3034 12 Dec 14 nicklas 175     Utility method for resetting the AutoProcessing annotation
3034 12 Dec 14 nicklas 176     on the given item.
3034 12 Dec 14 nicklas 177     @see Annotationtype#AUTO_PROCESSING
3034 12 Dec 14 nicklas 178   */
3034 12 Dec 14 nicklas 179   public void resetAutoProcessing(DbControl dc, Annotatable item)
3034 12 Dec 14 nicklas 180   {
3034 12 Dec 14 nicklas 181     Annotationtype.AUTO_PROCESSING.setAnnotationValue(dc, item, null);
3034 12 Dec 14 nicklas 182   }
3049 17 Dec 14 nicklas 183   
3049 17 Dec 14 nicklas 184   /**
6021 23 Oct 20 nicklas 185     Utility method for resetting the AutoConfirmHandler parameter
6021 23 Oct 20 nicklas 186     on the given job.
6021 23 Oct 20 nicklas 187     @since 4.28
6021 23 Oct 20 nicklas 188   */
6021 23 Oct 20 nicklas 189   public void resetAutoConfirmHandler(DbControl dc, Job job)
6021 23 Oct 20 nicklas 190   {
6021 23 Oct 20 nicklas 191     job.setParameterValues("AutoConfirmHandler", null, null);
6021 23 Oct 20 nicklas 192   }
6021 23 Oct 20 nicklas 193   
6021 23 Oct 20 nicklas 194   /**
3049 17 Dec 14 nicklas 195     Utility method for flagging the RNA the given library is derived 
3049 17 Dec 14 nicklas 196     from. The RNA will be added to the {@link BiomaterialList#FLAGGED_RNA}
3049 17 Dec 14 nicklas 197     list and the {@link Annotationtype#FLAG} is set to the specified values.
3049 17 Dec 14 nicklas 198     Note that External RNA or Stratagene is ignored.
3049 17 Dec 14 nicklas 199   */
3049 17 Dec 14 nicklas 200   public void flagRna(DbControl dc, Extract library, String flag)
3049 17 Dec 14 nicklas 201   {
5553 12 Aug 19 nicklas 202     if (Reggie.isExternalItem(library.getName())) return;
3049 17 Dec 14 nicklas 203     
3247 14 Apr 15 nicklas 204     ItemList flaggedRna = BiomaterialList.FLAGGED_RNA.load(dc);
3049 17 Dec 14 nicklas 205     
3049 17 Dec 14 nicklas 206     Library lib = Library.get(library);
3309 06 May 15 nicklas 207     Rna rna = lib.getRna(dc, false);
3049 17 Dec 14 nicklas 208     Extract r = rna.getItem();
3049 17 Dec 14 nicklas 209     Annotationtype.FLAG.setAnnotationValue(dc, r, flag);
3049 17 Dec 14 nicklas 210
3049 17 Dec 14 nicklas 211     flaggedRna.add(r);
3049 17 Dec 14 nicklas 212   }
3049 17 Dec 14 nicklas 213   
5553 12 Aug 19 nicklas 214   /**
5553 12 Aug 19 nicklas 215     Utility method for flagging the DNA the given library is derived 
5553 12 Aug 19 nicklas 216     from. The DNA will be added to the {@link BiomaterialList#FLAGGED_DNA}
5553 12 Aug 19 nicklas 217     list and the {@link Annotationtype#FLAG} is set to the specified values.
5553 12 Aug 19 nicklas 218     Note that External DNA is ignored.
5553 12 Aug 19 nicklas 219     @since 4.23
5553 12 Aug 19 nicklas 220   */
5553 12 Aug 19 nicklas 221   public void flagDna(DbControl dc, Extract library, String flag)
5553 12 Aug 19 nicklas 222   {
5553 12 Aug 19 nicklas 223     if (Reggie.isExternalItem(library.getName())) return;
5553 12 Aug 19 nicklas 224     
5553 12 Aug 19 nicklas 225     ItemList flaggedDna = BiomaterialList.FLAGGED_DNA.load(dc);
5553 12 Aug 19 nicklas 226     
5553 12 Aug 19 nicklas 227     Library lib = Library.get(library);
5553 12 Aug 19 nicklas 228     Dna dna = lib.getDna(dc, false);
5553 12 Aug 19 nicklas 229     Extract d = dna.getItem();
5553 12 Aug 19 nicklas 230     Annotationtype.FLAG.setAnnotationValue(dc, d, flag);
5553 12 Aug 19 nicklas 231   
5553 12 Aug 19 nicklas 232     flaggedDna.add(d);
5553 12 Aug 19 nicklas 233   }
5553 12 Aug 19 nicklas 234
5553 12 Aug 19 nicklas 235   
3034 12 Dec 14 nicklas 236 }