1 package net.sourceforge.pmd.jsp.rules;
2
3 import java.util.Set;
4
5 import net.sourceforge.pmd.jsp.ast.ASTAttribute;
6 import net.sourceforge.pmd.jsp.ast.ASTElement;
7 import net.sourceforge.pmd.util.CollectionUtil;
8
9 /***
10 * This rule checks that no "style" elements (like <B>, <FONT>, ...) are used, and that no
11 * "style" attributes (like "font", "size", "align") are used.
12 *
13 * @author pieter_van_raemdonck
14 */
15 public class NoInlineStyleInformation extends AbstractJspRule {
16
17
18
19 /***
20 * List of HTML element-names that define style.
21 */
22 private static final Set STYLE_ELEMENT_NAMES = CollectionUtil.asSet(
23 new String[]{"B", "I", "FONT", "BASEFONT", "U", "CENTER"}
24 );
25
26 /***
27 * List of HTML element-names that can have attributes defining style.
28 */
29 private static final Set ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES = CollectionUtil.asSet(
30 new String[]{"P", "TABLE", "THEAD", "TBODY", "TFOOT", "TR", "TD", "COL", "COLGROUP"}
31 );
32
33 /***
34 * List of attributes that define style when they are attributes of HTML elements with
35 * names in ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES.
36 */
37 private static final Set STYLE_ATTRIBUTES = CollectionUtil.asSet(
38 new String[]{"STYLE", "FONT", "SIZE", "COLOR", "FACE", "ALIGN", "VALIGN", "BGCOLOR"}
39 );
40
41 public Object visit(ASTAttribute node, Object data) {
42 if (isStyleAttribute(node)) {
43 addViolation(data, node);
44 }
45
46 return super.visit(node, data);
47 }
48
49 public Object visit(ASTElement node, Object data) {
50 if (isStyleElement(node)) {
51 addViolation(data, node);
52 }
53
54 return super.visit(node, data);
55 }
56
57 /***
58 * Checks whether the name of the elementNode argument is one of STYLE_ELEMENT_NAMES.
59 *
60 * @param elementNode
61 * @return boolean
62 */
63 private boolean isStyleElement(ASTElement elementNode) {
64 return STYLE_ELEMENT_NAMES.contains(elementNode.getName().toUpperCase());
65 }
66
67 /***
68 * Checks whether the attributeNode argument is a style attribute of a HTML element
69 * that can have style attributes.
70 *
71 * @param elementNode
72 * @return boolean
73 */
74 private boolean isStyleAttribute(ASTAttribute attributeNode) {
75 if (STYLE_ATTRIBUTES.contains(attributeNode.getName().toUpperCase())) {
76 if (attributeNode.jjtGetParent() instanceof ASTElement) {
77 ASTElement parent = (ASTElement) attributeNode.jjtGetParent();
78 if (ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES.contains(parent
79 .getName().toUpperCase())) {
80 return true;
81 }
82 }
83 }
84
85 return false;
86 }
87 }