001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2009 SonarSource SA
004     * mailto:contact AT sonarsource DOT com
005     *
006     * Sonar is free software; you can redistribute it and/or
007     * modify it under the terms of the GNU Lesser General Public
008     * License as published by the Free Software Foundation; either
009     * version 3 of the License, or (at your option) any later version.
010     *
011     * Sonar is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014     * Lesser General Public License for more details.
015     *
016     * You should have received a copy of the GNU Lesser General Public
017     * License along with Sonar; if not, write to the Free Software
018     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019     */
020    package org.sonar.api.rules;
021    
022    import org.apache.commons.lang.builder.EqualsBuilder;
023    import org.apache.commons.lang.builder.HashCodeBuilder;
024    import org.apache.commons.lang.builder.ReflectionToStringBuilder;
025    import org.sonar.api.resources.Resource;
026    
027    /**
028     * A class that represents a violation. A violation happens when a resource does not respect a defined rule.
029     */
030    public class Violation {
031    
032      private Resource resource;
033      private Rule rule;
034      private String message;
035      private RulePriority priority;
036      private Integer lineId;
037    
038      /**
039       * Creates of a violation from a rule. Will need to define the resource later on
040       */
041      public Violation(Rule rule) {
042        this.rule = rule;
043      }
044    
045      /**
046       * Creates a fully qualified violation
047       *
048       * @param rule the rule that has been violated
049       * @param resource the resource the violation should be attached to
050       */
051      public Violation(Rule rule, Resource resource) {
052        this.resource = resource;
053        this.rule = rule;
054      }
055    
056      public Resource getResource() {
057        return resource;
058      }
059    
060      /**
061       * Sets the resource the violation applies to
062       *
063       * @return the current object
064       */
065      public Violation setResource(Resource resource) {
066        this.resource = resource;
067        return this;
068      }
069    
070      public Rule getRule() {
071        return rule;
072      }
073    
074      /**
075       * Sets the rule violated
076       *
077       * @return the current object
078       */
079      public Violation setRule(Rule rule) {
080        this.rule = rule;
081        return this;
082      }
083    
084      public String getMessage() {
085        return message;
086      }
087    
088      /**
089       * Sets the violation message
090       *
091       * @return the current object
092       */
093      public Violation setMessage(String message) {
094        this.message = message;
095        return this;
096      }
097    
098      public Integer getLineId() {
099        return lineId;
100      }
101    
102      /**
103       * Sets the violation line
104       *
105       * @return the current object
106       */
107      public Violation setLineId(Integer lineId) {
108        this.lineId = lineId;
109        return this;
110      }
111    
112      public RulePriority getPriority() {
113        return priority;
114      }
115    
116      /**
117       * Sets the violation priority
118       *
119       * @return the current object
120       */
121      public Violation setPriority(RulePriority priority) {
122        this.priority = priority;
123        return this;
124      }
125    
126      @Override
127      public boolean equals(Object obj) {
128        if (!(obj instanceof Violation)) {
129          return false;
130        }
131        if (this == obj) {
132          return true;
133        }
134        Violation other = (Violation) obj;
135        return new EqualsBuilder()
136            .append(rule, other.getRule())
137            .append(resource, other.getResource())
138            .isEquals();
139      }
140    
141      @Override
142      public int hashCode() {
143        return new HashCodeBuilder(17, 37)
144            .append(getRule())
145            .append(getResource())
146            .toHashCode();
147      }
148    
149      @Override
150      public String toString() {
151        return ReflectionToStringBuilder.toString(this);
152      }
153    }