/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.jsp.rule.basic; import java.util.Set; import net.sourceforge.pmd.lang.jsp.ast.ASTAttribute; import net.sourceforge.pmd.lang.jsp.ast.ASTElement; import net.sourceforge.pmd.lang.jsp.rule.AbstractJspRule; import net.sourceforge.pmd.util.CollectionUtil; /** * This rule checks that no "style" elements (like <B>, <FONT>, ...) are used, * and that no "style" attributes (like "font", "size", "align") are used. * * @author pieter_van_raemdonck */ public class NoInlineStyleInformationRule extends AbstractJspRule { // These lists should probably be extended /** * List of HTML element-names that define style. */ private static final Set<String> STYLE_ELEMENT_NAMES = CollectionUtil .asSet(new String[] { "B", "I", "FONT", "BASEFONT", "U", "CENTER" }); /** * List of HTML element-names that can have attributes defining style. */ private static final Set<String> ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES = CollectionUtil .asSet(new String[] { "P", "TABLE", "THEAD", "TBODY", "TFOOT", "TR", "TD", "COL", "COLGROUP" }); /** * List of attributes that define style when they are attributes of HTML * elements with names in ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES. */ private static final Set<String> STYLE_ATTRIBUTES = CollectionUtil .asSet(new String[] { "STYLE", "FONT", "SIZE", "COLOR", "FACE", "ALIGN", "VALIGN", "BGCOLOR" }); public Object visit(ASTAttribute node, Object data) { if (isStyleAttribute(node)) { addViolation(data, node); } return super.visit(node, data); } public Object visit(ASTElement node, Object data) { if (isStyleElement(node)) { addViolation(data, node); } return super.visit(node, data); } /** * Checks whether the name of the elementNode argument is one of * STYLE_ELEMENT_NAMES. * * @param elementNode * @return boolean */ private boolean isStyleElement(ASTElement elementNode) { return STYLE_ELEMENT_NAMES.contains(elementNode.getName().toUpperCase()); } /** * Checks whether the attributeNode argument is a style attribute of a HTML * element that can have style attributes. * * @param attributeNode * The attribute node. * @return <code>true</code> if a style attribute, <code>false</code> * otherwise. */ private boolean isStyleAttribute(ASTAttribute attributeNode) { if (STYLE_ATTRIBUTES.contains(attributeNode.getName().toUpperCase())) { if (attributeNode.jjtGetParent() instanceof ASTElement) { ASTElement parent = (ASTElement) attributeNode.jjtGetParent(); if (ELEMENT_NAMES_THAT_CAN_HAVE_STYLE_ATTRIBUTES.contains(parent.getName().toUpperCase())) { return true; } } } return false; } }