View Javadoc

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