src/core/net/sf/basedb/util/overview/Failure.java

Code
Comments
Other
Rev Date Author Line
3033 15 Dec 06 nicklas 1 /**
3033 15 Dec 06 nicklas 2   $Id$
3033 15 Dec 06 nicklas 3
3675 16 Aug 07 jari 4   Copyright (C) 2006, 2007 Nicklas Nordborg
3033 15 Dec 06 nicklas 5
3033 15 Dec 06 nicklas 6   This file is part of BASE - BioArray Software Environment.
3033 15 Dec 06 nicklas 7   Available at http://base.thep.lu.se/
3033 15 Dec 06 nicklas 8
3033 15 Dec 06 nicklas 9   BASE is free software; you can redistribute it and/or
3033 15 Dec 06 nicklas 10   modify it under the terms of the GNU General Public License
4479 05 Sep 08 jari 11   as published by the Free Software Foundation; either version 3
3033 15 Dec 06 nicklas 12   of the License, or (at your option) any later version.
3033 15 Dec 06 nicklas 13
3033 15 Dec 06 nicklas 14   BASE is distributed in the hope that it will be useful,
3033 15 Dec 06 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
3033 15 Dec 06 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3033 15 Dec 06 nicklas 17   GNU General Public License for more details.
3033 15 Dec 06 nicklas 18
3033 15 Dec 06 nicklas 19   You should have received a copy of the GNU General Public License
4515 11 Sep 08 jari 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
3033 15 Dec 06 nicklas 21 */
3033 15 Dec 06 nicklas 22 package net.sf.basedb.util.overview;
3033 15 Dec 06 nicklas 23
3045 20 Dec 06 nicklas 24 import java.util.Arrays;
3045 20 Dec 06 nicklas 25 import java.util.LinkedList;
3045 20 Dec 06 nicklas 26 import java.util.List;
3045 20 Dec 06 nicklas 27
5384 13 Aug 10 nicklas 28 import net.sf.basedb.util.EqualsHelper;
6047 18 Apr 12 nicklas 29 import net.sf.basedb.util.overview.extensions.ValidationRuleAction;
3051 08 Jan 07 nicklas 30
3033 15 Dec 06 nicklas 31 /**
3033 15 Dec 06 nicklas 32    Holds information about a failed validation. Note that all 
3033 15 Dec 06 nicklas 33    rules are always validated. Use a {@link ValidationOptions}
3033 15 Dec 06 nicklas 34    object to keep track of which validators that should be
3033 15 Dec 06 nicklas 35    ignored, generate warnings or errors.
3062 15 Jan 07 nicklas 36    <p>
3062 15 Jan 07 nicklas 37    NOTE! The implementation of the {@link #equals(Object)} method of
3062 15 Jan 07 nicklas 38    this object is a bit unorthodox. Two failures are considered equal
3062 15 Jan 07 nicklas 39    if they have the same validator but different nodes referencing the
4134 08 Feb 08 nicklas 40    same item with the same descriptor. Two failures on the same node 
4134 08 Feb 08 nicklas 41    are never equal. This allows us to filter out duplicate failures that 
4134 08 Feb 08 nicklas 42    happens because there can be several ways to reach a certain item (for 
4134 08 Feb 08 nicklas 43    example a reference sample that is used on all hybridizations).   
3062 15 Jan 07 nicklas 44    
3033 15 Dec 06 nicklas 45   @author Nicklas
3033 15 Dec 06 nicklas 46   @version 2.2
3033 15 Dec 06 nicklas 47   @base.modified $Date$
3033 15 Dec 06 nicklas 48   @see Validator
3033 15 Dec 06 nicklas 49   @see ValidationOptions
4789 24 Feb 09 nicklas 50   @see GenericOverview#getFailures()
4789 24 Feb 09 nicklas 51   @see GenericOverview#getValidationOptions()
3033 15 Dec 06 nicklas 52 */
3033 15 Dec 06 nicklas 53 public class Failure
3033 15 Dec 06 nicklas 54 {
3033 15 Dec 06 nicklas 55   
6047 18 Apr 12 nicklas 56   private ValidationRuleAction rule;
3033 15 Dec 06 nicklas 57   private Node node;
3045 20 Dec 06 nicklas 58   private String message;
3045 20 Dec 06 nicklas 59   private List<Fix> fixes;
4134 08 Feb 08 nicklas 60   private Object descriptor;
3033 15 Dec 06 nicklas 61   
3033 15 Dec 06 nicklas 62   /**
3033 15 Dec 06 nicklas 63     Create a new validation failure.
6047 18 Apr 12 nicklas 64     @param rule The validation rule that fails
3033 15 Dec 06 nicklas 65     @param node The node that contains the failure
3033 15 Dec 06 nicklas 66   */
6047 18 Apr 12 nicklas 67   public Failure(ValidationRuleAction rule, Node node)
3033 15 Dec 06 nicklas 68   {
6047 18 Apr 12 nicklas 69     this(rule, node, null, (Fix[])null);
3045 20 Dec 06 nicklas 70   }
3045 20 Dec 06 nicklas 71   
3062 15 Jan 07 nicklas 72   /**
3062 15 Jan 07 nicklas 73     Create a new validation failure with a detailed message. 
6047 18 Apr 12 nicklas 74     @param rule The validation rule that fails
3062 15 Jan 07 nicklas 75     @param node The node that contains the failure
3062 15 Jan 07 nicklas 76     @param message A detailed message about the failue, if null
3062 15 Jan 07 nicklas 77       the {@link Validator#getFailureSummary()} is used
3062 15 Jan 07 nicklas 78    */
6047 18 Apr 12 nicklas 79   public Failure(ValidationRuleAction rule, Node node, String message)
3045 20 Dec 06 nicklas 80   {
6047 18 Apr 12 nicklas 81     this(rule, node, message, (Fix[])null);
3045 20 Dec 06 nicklas 82   }
3045 20 Dec 06 nicklas 83   
3062 15 Jan 07 nicklas 84   /**
3062 15 Jan 07 nicklas 85     Create a new validation failure with a detailed message and a list
3062 15 Jan 07 nicklas 86     of suggested fixes.
3062 15 Jan 07 nicklas 87     
6047 18 Apr 12 nicklas 88     @param rule The validation rule that fails
3062 15 Jan 07 nicklas 89     @param node The node that contains the failure
3062 15 Jan 07 nicklas 90     @param message A detailed message about the failue, if null
3062 15 Jan 07 nicklas 91       the {@link Validator#getFailureSummary()} is used
3062 15 Jan 07 nicklas 92     @param fixes A list of suggested fixes
3062 15 Jan 07 nicklas 93   */
6047 18 Apr 12 nicklas 94   public Failure(ValidationRuleAction rule, Node node, String message, Fix... fixes)
3045 20 Dec 06 nicklas 95   {
6047 18 Apr 12 nicklas 96     this.rule = rule;
3033 15 Dec 06 nicklas 97     this.node = node;
3045 20 Dec 06 nicklas 98     this.message = message;
3045 20 Dec 06 nicklas 99     this.fixes = new LinkedList<Fix>();
3045 20 Dec 06 nicklas 100     if (fixes != null) this.fixes.addAll(Arrays.asList(fixes));
3033 15 Dec 06 nicklas 101   }
3033 15 Dec 06 nicklas 102   
3033 15 Dec 06 nicklas 103   /**
4134 08 Feb 08 nicklas 104     Set a descriptor on this failure. This affects the {@link #equals(Object)}
4134 08 Feb 08 nicklas 105     method, since the descriptor must be equal for two failures to be
4134 08 Feb 08 nicklas 106     equal. 
4134 08 Feb 08 nicklas 107     <p>
4134 08 Feb 08 nicklas 108     NOTE! The main reason for this property is that we need to discriminate
5807 14 Oct 11 nicklas 109     between failures on different positions on physical bioassays.
4134 08 Feb 08 nicklas 110     @param descriptor Any object
4134 08 Feb 08 nicklas 111     @since 2.6
4134 08 Feb 08 nicklas 112   */
4134 08 Feb 08 nicklas 113   public void setDescriptor(Object descriptor)
4134 08 Feb 08 nicklas 114   {
4134 08 Feb 08 nicklas 115     this.descriptor = descriptor;
4134 08 Feb 08 nicklas 116   }
4134 08 Feb 08 nicklas 117   /**
4134 08 Feb 08 nicklas 118     @return The descriptor
4134 08 Feb 08 nicklas 119     @since 2.6
4134 08 Feb 08 nicklas 120     @see #setDescriptor(Object)
4134 08 Feb 08 nicklas 121   */
4134 08 Feb 08 nicklas 122   public Object getDescriptor()
4134 08 Feb 08 nicklas 123   {
4134 08 Feb 08 nicklas 124     return descriptor;
4134 08 Feb 08 nicklas 125   }
4134 08 Feb 08 nicklas 126   
4134 08 Feb 08 nicklas 127   /**
3033 15 Dec 06 nicklas 128     Get the validation rule that failed.
6047 18 Apr 12 nicklas 129     @since 3.2
3033 15 Dec 06 nicklas 130   */
6047 18 Apr 12 nicklas 131   public ValidationRuleAction getValidator()
3033 15 Dec 06 nicklas 132   {
6047 18 Apr 12 nicklas 133     return rule;
3033 15 Dec 06 nicklas 134   }
3033 15 Dec 06 nicklas 135   
3033 15 Dec 06 nicklas 136   /**
3033 15 Dec 06 nicklas 137     Get the node that failed validation.
3033 15 Dec 06 nicklas 138   */
3033 15 Dec 06 nicklas 139   public Node getNode()
3033 15 Dec 06 nicklas 140   {
3033 15 Dec 06 nicklas 141     return node;
3033 15 Dec 06 nicklas 142   }
3033 15 Dec 06 nicklas 143   
3045 20 Dec 06 nicklas 144   /**
3045 20 Dec 06 nicklas 145     Get a message explaining the failure.
3045 20 Dec 06 nicklas 146   */
3045 20 Dec 06 nicklas 147   public String getMessage()
3045 20 Dec 06 nicklas 148   {
6047 18 Apr 12 nicklas 149     return message != null ? message : rule.getFailureSummary();
3045 20 Dec 06 nicklas 150   }
3045 20 Dec 06 nicklas 151   
3062 15 Jan 07 nicklas 152   /**
3062 15 Jan 07 nicklas 153     Get a list of suggested fixes.
3062 15 Jan 07 nicklas 154     @return A list of suggested fixes, or null if there are none
3062 15 Jan 07 nicklas 155   */
3045 20 Dec 06 nicklas 156   public List<Fix> getFixes()
3045 20 Dec 06 nicklas 157   {
3045 20 Dec 06 nicklas 158     return fixes;
3045 20 Dec 06 nicklas 159   }
3045 20 Dec 06 nicklas 160   
3062 15 Jan 07 nicklas 161   /**
3062 15 Jan 07 nicklas 162     Add a suggested fix to this failure.
4034 05 Dec 07 martin 163      @param fix The fix to add.
3062 15 Jan 07 nicklas 164   */
3045 20 Dec 06 nicklas 165   public void addFix(Fix fix)
3045 20 Dec 06 nicklas 166   {
3045 20 Dec 06 nicklas 167     fixes.add(fix);
3045 20 Dec 06 nicklas 168   }
3045 20 Dec 06 nicklas 169   
3062 15 Jan 07 nicklas 170   /*
3062 15 Jan 07 nicklas 171     From the Object class
3062 15 Jan 07 nicklas 172     -------------------------------------------
3062 15 Jan 07 nicklas 173   */
6127 14 Sep 12 nicklas 174   @Override
3045 20 Dec 06 nicklas 175   public String toString()
3045 20 Dec 06 nicklas 176   {
3045 20 Dec 06 nicklas 177     return getMessage();
3045 20 Dec 06 nicklas 178   }
3051 08 Jan 07 nicklas 179   
3051 08 Jan 07 nicklas 180   /**
3051 08 Jan 07 nicklas 181     One failure is the same as another if they have the same validator
4134 08 Feb 08 nicklas 182     but different nodes referencing the same item with equal descriptors.
3051 08 Jan 07 nicklas 183   */
3051 08 Jan 07 nicklas 184   @Override
3051 08 Jan 07 nicklas 185   public boolean equals(Object o)
3051 08 Jan 07 nicklas 186   {
5384 13 Aug 10 nicklas 187     if (this == o) return true;
3051 08 Jan 07 nicklas 188     if (o == null || o.getClass() != this.getClass()) return false;
3051 08 Jan 07 nicklas 189     Failure other = (Failure)o;
3051 08 Jan 07 nicklas 190     boolean sameNode = this.node == other.node;
3051 08 Jan 07 nicklas 191     boolean sameItem = sameNode || this.node.getItem() ==  other.node.getItem();
6047 18 Apr 12 nicklas 192     boolean sameRule = this.rule == other.rule;
5384 13 Aug 10 nicklas 193     boolean sameSpecificator = sameNode || EqualsHelper.equals(this.descriptor, other.descriptor);
6047 18 Apr 12 nicklas 194     return !sameNode && sameItem && sameRule && sameSpecificator;
3051 08 Jan 07 nicklas 195   }
3051 08 Jan 07 nicklas 196
3051 08 Jan 07 nicklas 197   @Override
3051 08 Jan 07 nicklas 198   public int hashCode()
3051 08 Jan 07 nicklas 199   {
6047 18 Apr 12 nicklas 200     return rule.hashCode();
3051 08 Jan 07 nicklas 201   }
3062 15 Jan 07 nicklas 202   // -------------------------------------------
3033 15 Dec 06 nicklas 203 }