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

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