View Javadoc

1   package net.sourceforge.pmd;
2   
3   import java.text.MessageFormat;
4   import java.util.Properties;
5   
6   import net.sourceforge.pmd.ast.Node;
7   import net.sourceforge.pmd.ast.SimpleNode;
8   
9   /***
10   * Basic abstract implementation of all parser-independent methods of the
11   * Rule interface.
12   *
13   * @author pieter_van_raemdonck - Application Engineers NV/SA - www.ae.be
14   */
15  public abstract class CommonAbstractRule implements Rule {
16  
17      protected String name = getClass().getName();
18      protected Properties properties = new Properties();
19      protected String message;
20      protected String description;
21      protected String example;
22      protected String ruleSetName;
23      protected boolean include;
24      protected boolean usesDFA;
25      protected boolean usesTypeResolution;
26      protected int priority = LOWEST_PRIORITY;
27      protected String externalInfoUrl;
28  
29      public String getRuleSetName() {
30          return ruleSetName;
31      }
32  
33      public void setRuleSetName(String ruleSetName) {
34          this.ruleSetName = ruleSetName;
35      }
36  
37      public String getDescription() {
38          return description;
39      }
40  
41      public void setDescription(String description) {
42          this.description = description;
43      }
44  
45      public String getExample() {
46          return example;
47      }
48  
49      public void setExample(String example) {
50          this.example = example;
51      }
52  
53      public boolean hasProperty(String name) {
54          return properties.containsKey(name);
55      }
56  
57      public void addProperty(String name, String value) {
58          properties.setProperty(name, value);
59      }
60  
61      public void addProperties(Properties properties) {
62          this.properties.putAll(properties);
63      }
64  
65      public double getDoubleProperty(String name) {
66          return Double.parseDouble(properties.getProperty(name));
67      }
68  
69      public int getIntProperty(String name) {
70          return Integer.parseInt(properties.getProperty(name));
71      }
72  
73      public boolean getBooleanProperty(String name) {
74          return Boolean.valueOf(properties.getProperty(name)).booleanValue();
75      }
76  
77      public String getStringProperty(String name) {
78          return properties.getProperty(name);
79      }
80  
81      public String getName() {
82          return name;
83      }
84  
85      public void setName(String name) {
86          this.name = name;
87      }
88  
89      public String getMessage() {
90          return message;
91      }
92  
93      public void setMessage(String message) {
94          this.message = message;
95      }
96  
97      public String getExternalInfoUrl() {
98          return externalInfoUrl;
99      }
100 
101     public void setExternalInfoUrl(String url) {
102         this.externalInfoUrl = url;
103     }
104 
105     /***
106      * Test if rules are equals. Rules are equals if
107      * 1. they have the same implementation class
108      * 2. they have the same name
109      * 3. they have the same priority
110      * 4. they share the same properties/values
111      */
112     public boolean equals(Object o) {
113         if (o == null) {
114             return false; // trivial
115         }
116 
117         if (this == o) {
118             return true;  // trivial
119         }
120 
121         Rule rule = null;
122         boolean equality = this.getClass().getName().equals(o.getClass().getName());
123 
124         if (equality) {
125             rule = (Rule) o;
126             equality = this.getName().equals(rule.getName())
127                     && this.getPriority() == rule.getPriority()
128                     && this.getProperties().equals(rule.getProperties());
129         }
130 
131         return equality;
132     }
133 
134     /***
135      * Return a hash code to conform to equality. Try with a string.
136      */
137     public int hashCode() {
138         String s = this.getClass().getName() + this.getName() + this.getPriority() + this.getProperties().toString();
139         return s.hashCode();
140     }
141 
142 
143     public Properties getProperties() {
144         return properties;
145     }
146 
147     public boolean include() {
148         return include;
149     }
150 
151     public void setInclude(boolean include) {
152         this.include = include;
153     }
154 
155     public int getPriority() {
156         return priority;
157     }
158 
159     public String getPriorityName() {
160         return PRIORITIES[getPriority() - 1];
161     }
162 
163     public void setPriority(int priority) {
164         this.priority = priority;
165     }
166 
167     public void setUsesDFA() {
168         this.usesDFA = true;
169     }
170 
171     public boolean usesDFA() {
172         return this.usesDFA;
173     }
174 
175     public void setUsesTypeResolution() {
176         this.usesTypeResolution= true;
177     }
178 
179     public boolean usesTypeResolution() {
180         return this.usesTypeResolution;
181     }
182 
183 
184     /***
185      * Adds a violation to the report.
186      *
187      * @param ctx  the RuleContext
188      * @param node the node that produces the violation
189      */
190     protected final void addViolation(Object data, SimpleNode node) {
191         RuleContext ctx = (RuleContext) data;
192         ctx.getReport().addRuleViolation(new RuleViolation(this, ctx, node));
193     }
194 
195     /***
196      * Adds a violation to the report.
197      *
198      * @param ctx  the RuleContext
199      * @param node the node that produces the violation
200      * @param msg  specific message to put in the report
201      */
202     protected final void addViolationWithMessage(Object data, SimpleNode node, String msg) {
203         RuleContext ctx = (RuleContext) data;
204         ctx.getReport().addRuleViolation(new RuleViolation(this, ctx, node, msg));
205     }
206 
207     /***
208      * Adds a violation to the report.
209      *
210      * @param ctx   the RuleContext
211      * @param node  the node that produces the violation
212      * @param embed a variable to embed in the rule violation message
213      */
214     protected final void addViolation(Object data, SimpleNode node, String embed) {
215         RuleContext ctx = (RuleContext) data;
216         ctx.getReport().addRuleViolation(new RuleViolation(this, ctx, node, MessageFormat.format(getMessage(), new Object[]{embed})));
217     }
218 
219     /***
220      * Adds a violation to the report.
221      *
222      * @param ctx  the RuleContext
223      * @param node the node that produces the violation, may be null, in which case all line and column info will be set to zero
224      * @param args objects to embed in the rule violation message
225      */
226     protected final void addViolation(Object data, Node node, Object[] args) {
227         RuleContext ctx = (RuleContext) data;
228         ctx.getReport().addRuleViolation(new RuleViolation(this, ctx, (SimpleNode) node, MessageFormat.format(getMessage(), args)));
229     }
230 
231     public PropertyDescriptor propertyDescriptorFor(String name) {
232     	return null;	// TODO not implemented yet
233     }
234 }