src/core/net/sf/basedb/util/overview/validator/KitValidator.java

Code
Comments
Other
Rev Date Author Line
7005 09 Nov 15 nicklas 1 /**
7005 09 Nov 15 nicklas 2   $Id$
7005 09 Nov 15 nicklas 3
7005 09 Nov 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
7005 09 Nov 15 nicklas 5
7005 09 Nov 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
7005 09 Nov 15 nicklas 7   Available at http://base.thep.lu.se/
7005 09 Nov 15 nicklas 8
7005 09 Nov 15 nicklas 9   BASE is free software; you can redistribute it and/or
7005 09 Nov 15 nicklas 10   modify it under the terms of the GNU General Public License
7005 09 Nov 15 nicklas 11   as published by the Free Software Foundation; either version 3
7005 09 Nov 15 nicklas 12   of the License, or (at your option) any later version.
7005 09 Nov 15 nicklas 13
7005 09 Nov 15 nicklas 14   BASE is distributed in the hope that it will be useful,
7005 09 Nov 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
7005 09 Nov 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7005 09 Nov 15 nicklas 17   GNU General Public License for more details.
7005 09 Nov 15 nicklas 18
7005 09 Nov 15 nicklas 19   You should have received a copy of the GNU General Public License
7005 09 Nov 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
7005 09 Nov 15 nicklas 21 */
7005 09 Nov 15 nicklas 22 package net.sf.basedb.util.overview.validator;
7005 09 Nov 15 nicklas 23
7005 09 Nov 15 nicklas 24 import java.util.Date;
7005 09 Nov 15 nicklas 25
7005 09 Nov 15 nicklas 26 import net.sf.basedb.core.BasicItem;
7005 09 Nov 15 nicklas 27 import net.sf.basedb.core.BioPlateEvent;
7005 09 Nov 15 nicklas 28 import net.sf.basedb.core.DateUtil;
7005 09 Nov 15 nicklas 29 import net.sf.basedb.core.DbControl;
7005 09 Nov 15 nicklas 30 import net.sf.basedb.core.DerivedBioAssay;
7005 09 Nov 15 nicklas 31 import net.sf.basedb.core.Item;
7005 09 Nov 15 nicklas 32 import net.sf.basedb.core.ItemSubtype;
7005 09 Nov 15 nicklas 33 import net.sf.basedb.core.Kit;
7005 09 Nov 15 nicklas 34 import net.sf.basedb.core.MeasuredBioMaterial;
7005 09 Nov 15 nicklas 35 import net.sf.basedb.core.PermissionDeniedException;
7005 09 Nov 15 nicklas 36 import net.sf.basedb.core.PhysicalBioAssay;
7005 09 Nov 15 nicklas 37 import net.sf.basedb.core.Subtypable;
7005 09 Nov 15 nicklas 38 import net.sf.basedb.core.SystemItems;
7005 09 Nov 15 nicklas 39 import net.sf.basedb.util.overview.Fix;
7005 09 Nov 15 nicklas 40 import net.sf.basedb.util.overview.OverviewContext;
7005 09 Nov 15 nicklas 41 import net.sf.basedb.util.overview.Validator;
7005 09 Nov 15 nicklas 42 import net.sf.basedb.util.overview.Node;
7005 09 Nov 15 nicklas 43
7005 09 Nov 15 nicklas 44 /**
7005 09 Nov 15 nicklas 45   Validator implementation for kits. Validation rules:
7005 09 Nov 15 nicklas 46   <ul>
7005 09 Nov 15 nicklas 47   <li>Missing item: {@link Validator#MISSING_KIT}
7005 09 Nov 15 nicklas 48   <li>Access denied: {@link Validator#DENIED_KIT}
7005 09 Nov 15 nicklas 49   <li>Incorrect hardware type: {@link Validator#INCORRECT_KITTYPE} 
7005 09 Nov 15 nicklas 50   <li>Using kit after expiration date: {@link Validator#KIT_USED_AFTER_EXPIRATIONDATE}
7005 09 Nov 15 nicklas 51   </ul>
7005 09 Nov 15 nicklas 52
7005 09 Nov 15 nicklas 53   @author Nicklas
7005 09 Nov 15 nicklas 54   @since 3.7
7005 09 Nov 15 nicklas 55 */
7005 09 Nov 15 nicklas 56 public class KitValidator
7005 09 Nov 15 nicklas 57   extends NameableNodeValidator<Kit>
7005 09 Nov 15 nicklas 58 {
7005 09 Nov 15 nicklas 59   
7005 09 Nov 15 nicklas 60   public KitValidator()
7005 09 Nov 15 nicklas 61   {
7005 09 Nov 15 nicklas 62     super(null, Validator.DENIED_KIT);
7005 09 Nov 15 nicklas 63   }
7005 09 Nov 15 nicklas 64
7005 09 Nov 15 nicklas 65   
7005 09 Nov 15 nicklas 66   /* 
7005 09 Nov 15 nicklas 67     From BasicValidator class
7005 09 Nov 15 nicklas 68     -------------------------
7005 09 Nov 15 nicklas 69   */
7005 09 Nov 15 nicklas 70   /**
7005 09 Nov 15 nicklas 71     If the parent item has a subtype that is related to a KIT subtype, report
7005 09 Nov 15 nicklas 72     the missing item as a {@link Validator#MISSING_KIT} failure. Otherwise,
7005 09 Nov 15 nicklas 73     ignore the missing kit.
7005 09 Nov 15 nicklas 74     @return Always false
7005 09 Nov 15 nicklas 75   */
7005 09 Nov 15 nicklas 76   @Override
7005 09 Nov 15 nicklas 77   public boolean preMissingItem(DbControl dc, OverviewContext context, Node parentNode)
7005 09 Nov 15 nicklas 78   {
7005 09 Nov 15 nicklas 79     BasicItem parentItem = parentNode.getItem(dc);
7005 09 Nov 15 nicklas 80     ItemSubtype expectedSubtype = getExpectedKitSubtype(dc, parentItem, false);
7005 09 Nov 15 nicklas 81     if (expectedSubtype != null)
7005 09 Nov 15 nicklas 82     {
7005 09 Nov 15 nicklas 83       context.createFailure(Validator.MISSING_KIT, parentNode, 
7005 09 Nov 15 nicklas 84           "Missing kit: " + expectedSubtype.getName(), getMissingItemFix(dc, parentNode));
7005 09 Nov 15 nicklas 85     }
7005 09 Nov 15 nicklas 86     return false;
7005 09 Nov 15 nicklas 87   }
7005 09 Nov 15 nicklas 88   
7005 09 Nov 15 nicklas 89   /**
7005 09 Nov 15 nicklas 90     Checks if the hardware is of the correct hardware type
7005 09 Nov 15 nicklas 91     and, if a project is active, the hardware is included as a
7005 09 Nov 15 nicklas 92     default hardware for the project.
7005 09 Nov 15 nicklas 93   */
7005 09 Nov 15 nicklas 94   @Override
7005 09 Nov 15 nicklas 95   public void postValidate(DbControl dc, OverviewContext context, Node node, Node parentNode)
7005 09 Nov 15 nicklas 96   {
7005 09 Nov 15 nicklas 97     super.postValidate(dc, context, node, parentNode);
7005 09 Nov 15 nicklas 98     Kit kit = (Kit)node.getItem(dc);
7005 09 Nov 15 nicklas 99     
7005 09 Nov 15 nicklas 100     BasicItem parentItem = parentNode.getItem(dc);
7005 09 Nov 15 nicklas 101     ItemSubtype expectedSubtype = getExpectedKitSubtype(dc, parentItem, true);
7005 09 Nov 15 nicklas 102     try
7005 09 Nov 15 nicklas 103     {
7005 09 Nov 15 nicklas 104       ItemSubtype subtype = kit.getItemSubtype();
7005 09 Nov 15 nicklas 105       if (expectedSubtype != null && !expectedSubtype.equals(subtype))
7005 09 Nov 15 nicklas 106       {
7005 09 Nov 15 nicklas 107         ItemSubtype mySubtype = ((Subtypable)parentItem).getItemSubtype();
7005 09 Nov 15 nicklas 108         Fix subtypeFix = subtype == null || mySubtype == null ? null : 
7005 09 Nov 15 nicklas 109           new Fix("Change related kit subtype of '" + mySubtype.getName() + 
7005 09 Nov 15 nicklas 110             "' to '" + subtype.getName() + "'", mySubtype);
7005 09 Nov 15 nicklas 111
7005 09 Nov 15 nicklas 112         context.createFailure(Validator.INCORRECT_KITTYPE, parentNode, 
7005 09 Nov 15 nicklas 113           "Expected a kit with subtype: " + expectedSubtype.getName(),
7005 09 Nov 15 nicklas 114           new Fix("Change kit of '" + parentNode.getTitle() + "'", parentItem),
7005 09 Nov 15 nicklas 115           new Fix("Change kit type of '" + kit.getName() + "' to '" + expectedSubtype.getName() + "'", kit),
7005 09 Nov 15 nicklas 116           subtypeFix
7005 09 Nov 15 nicklas 117         );
7005 09 Nov 15 nicklas 118       }
7005 09 Nov 15 nicklas 119     }
7005 09 Nov 15 nicklas 120     catch (PermissionDeniedException ex)
7005 09 Nov 15 nicklas 121     {}
7005 09 Nov 15 nicklas 122     
7005 09 Nov 15 nicklas 123     // Check expiration date
7005 09 Nov 15 nicklas 124     Date expirationDate = kit.getExpirationDate();
7005 09 Nov 15 nicklas 125     if (expirationDate != null)
7005 09 Nov 15 nicklas 126     {
7005 09 Nov 15 nicklas 127       Date useDate = null;
7005 09 Nov 15 nicklas 128       if (parentItem instanceof MeasuredBioMaterial)
7005 09 Nov 15 nicklas 129       {
7005 09 Nov 15 nicklas 130         useDate = ((MeasuredBioMaterial)parentItem).getCreationEvent().getEventDate();
7005 09 Nov 15 nicklas 131       }
7005 09 Nov 15 nicklas 132       else if (parentItem instanceof PhysicalBioAssay)
7005 09 Nov 15 nicklas 133       {
7005 09 Nov 15 nicklas 134         useDate = ((PhysicalBioAssay)parentItem).getCreationEvent().getEventDate();
7005 09 Nov 15 nicklas 135       }
7005 09 Nov 15 nicklas 136       else if (parentItem instanceof DerivedBioAssay)
7005 09 Nov 15 nicklas 137       {
7005 09 Nov 15 nicklas 138         // There is no 'event date' on this item so we can't check this
7005 09 Nov 15 nicklas 139       }
7005 09 Nov 15 nicklas 140       else if (parentItem instanceof BioPlateEvent)
7005 09 Nov 15 nicklas 141       {
7005 09 Nov 15 nicklas 142         useDate = ((BioPlateEvent)parentItem).getEventDate();
7005 09 Nov 15 nicklas 143       }
7005 09 Nov 15 nicklas 144       
7005 09 Nov 15 nicklas 145       if (useDate != null && useDate.after(expirationDate))
7005 09 Nov 15 nicklas 146       {
7005 09 Nov 15 nicklas 147         context.createFailure(Validator.KIT_USED_AFTER_EXPIRATIONDATE, 
7005 09 Nov 15 nicklas 148           parentNode, "Kit used after expiration date: " + DateUtil.formatDate(expirationDate), 
7005 09 Nov 15 nicklas 149           new Fix("Change event date of '" + parentNode.getTitle() + "'", parentItem),
7005 09 Nov 15 nicklas 150           new Fix("Change expiration date of kit '" + kit.getName() + "'", kit)
7005 09 Nov 15 nicklas 151         );
7005 09 Nov 15 nicklas 152       }
7005 09 Nov 15 nicklas 153     }
7005 09 Nov 15 nicklas 154   }
7005 09 Nov 15 nicklas 155   
7005 09 Nov 15 nicklas 156   /**
7005 09 Nov 15 nicklas 157     @return Suggested fix is to add a hardware to the parent item
7005 09 Nov 15 nicklas 158   */
7005 09 Nov 15 nicklas 159   @Override
7005 09 Nov 15 nicklas 160   protected Fix getMissingItemFix(DbControl dc, Node parentNode)
7005 09 Nov 15 nicklas 161   {
7005 09 Nov 15 nicklas 162     BasicItem parentItem = parentNode.getItem();    
7005 09 Nov 15 nicklas 163     return new Fix("Add kit to '" + parentNode.getTitle() + "'", parentItem);
7005 09 Nov 15 nicklas 164   }
7005 09 Nov 15 nicklas 165   // --------------------------------
7005 09 Nov 15 nicklas 166   
7005 09 Nov 15 nicklas 167   
7005 09 Nov 15 nicklas 168   /**
7005 09 Nov 15 nicklas 169     Get the subtype of the associated kit that we expect for the given
7005 09 Nov 15 nicklas 170     parent item.
7005 09 Nov 15 nicklas 171   */
7005 09 Nov 15 nicklas 172   protected ItemSubtype getExpectedKitSubtype(DbControl dc, BasicItem parentItem, boolean useDefault)
7005 09 Nov 15 nicklas 173   {
7005 09 Nov 15 nicklas 174     ItemSubtype expectedSubtype = null;
7005 09 Nov 15 nicklas 175     int defaultSubtypeForItemType = SystemItems.getId(Kit.getDefaultSystemId(parentItem.getType()));
7005 09 Nov 15 nicklas 176     try
7005 09 Nov 15 nicklas 177     {
7005 09 Nov 15 nicklas 178       if (parentItem instanceof Subtypable)
7005 09 Nov 15 nicklas 179       {
7005 09 Nov 15 nicklas 180         expectedSubtype = ItemSubtype.getRelatedSubtype(dc, 
7005 09 Nov 15 nicklas 181             (Subtypable)parentItem, Item.KIT, useDefault ? defaultSubtypeForItemType : 0);
7005 09 Nov 15 nicklas 182       }
7005 09 Nov 15 nicklas 183       else if (useDefault && defaultSubtypeForItemType != 0)
7005 09 Nov 15 nicklas 184       {
7005 09 Nov 15 nicklas 185         expectedSubtype = ItemSubtype.getById(dc, defaultSubtypeForItemType);
7005 09 Nov 15 nicklas 186       }
7005 09 Nov 15 nicklas 187     }
7005 09 Nov 15 nicklas 188     catch (PermissionDeniedException ex)
7005 09 Nov 15 nicklas 189     {}
7005 09 Nov 15 nicklas 190     return expectedSubtype;
7005 09 Nov 15 nicklas 191   }
7005 09 Nov 15 nicklas 192
7005 09 Nov 15 nicklas 193   
7005 09 Nov 15 nicklas 194 }