1 package net.sourceforge.pmd; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.HashSet; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Set; 9 10 /*** 11 * Grouping of Rules per Language in a RuleSet. 12 * 13 * @author pieter_van_raemdonck - Application Engineers NV/SA - www.ae.be 14 */ 15 public class RuleSets { 16 /*** 17 * Map of RuleLanguage on RuleSet. 18 */ 19 private Collection ruleSets = new ArrayList(); 20 21 /*** 22 * Public constructor. 23 */ 24 public RuleSets() { 25 } 26 27 /*** 28 * Public constructor. Add the given rule set. 29 * 30 * @param ruleSet the RuleSet 31 */ 32 public RuleSets(RuleSet ruleSet) { 33 this(); 34 addRuleSet(ruleSet); 35 } 36 37 /*** 38 * Add a ruleset for a language. Only one ruleset can be added for a specific 39 * language. If ruleSet.getLanguage() is null, it is assumed to be a RuleSet of java 40 * rules. 41 * 42 * @param ruleSet the RuleSet 43 */ 44 public void addRuleSet(RuleSet ruleSet) { 45 ruleSets.add(ruleSet); 46 } 47 48 /*** 49 * Get all the RuleSets. 50 * 51 * @return RuleSet[] 52 */ 53 public RuleSet[] getAllRuleSets() { 54 return (RuleSet[]) ruleSets.toArray(new RuleSet[ruleSets.size()]); 55 } 56 57 public Iterator getRuleSetsIterator() { 58 return ruleSets.iterator(); 59 } 60 61 /*** 62 * Return all rules from all rulesets. 63 * 64 * @return Set 65 */ 66 public Set getAllRules() { 67 HashSet result = new HashSet(); 68 for (Iterator i = ruleSets.iterator(); i.hasNext();) { 69 result.addAll(((RuleSet) i.next()).getRules()); 70 } 71 return result; 72 } 73 74 /*** 75 * Check if a source with given language should be checked by rules for a given 76 * language. This is the case if both languages are equal, or if the source is in 77 * java, and the language of the rules is unknown (for backward-compatibility 78 * reasons). 79 * 80 * @param languageOfSource language of a source; can not be null 81 * @param languageOfRule language of a ruleset; can be null 82 * @return boolean true if the rule applies, else false 83 */ 84 public boolean applies(Language languageOfSource, Language languageOfRule) { 85 return (languageOfSource.equals(languageOfRule) || (languageOfSource 86 .equals(Language.JAVA) && (null == languageOfRule))); 87 } 88 89 /*** 90 * Apply all applicable rules to the compilation units. 91 * Applicable means the language of the rules must match the language 92 * of the source (@see applies). 93 * 94 * @param acuList the List of compilation units; the type these must have, 95 * depends on the source language 96 * @param ctx the RuleContext 97 * @param language the Language of the source 98 */ 99 public void apply(List acuList, RuleContext ctx, Language language) { 100 for (Iterator i = ruleSets.iterator(); i.hasNext();) { 101 RuleSet ruleSet = (RuleSet) i.next(); 102 if (applies(language, ruleSet.getLanguage())) { 103 ruleSet.apply(acuList, ctx); 104 } 105 } 106 } 107 108 /*** 109 * Check if the rules that apply to a source of the given language 110 * use DFA. 111 * 112 * @param language the language of a source 113 * @return true if any rule in the RuleSet needs the DFA layer 114 */ 115 public boolean usesDFA(Language language) { 116 for (Iterator i = ruleSets.iterator(); i.hasNext();) { 117 RuleSet ruleSet = (RuleSet) i.next(); 118 if (applies(language, ruleSet.getLanguage()) && ruleSet.usesDFA()) { 119 return true; 120 } 121 } 122 return false; 123 } 124 125 /*** 126 * Returns the Rule with the given name 127 * 128 * @param ruleName the name of the rule to find 129 * @return the rule or null if not found 130 */ 131 public Rule getRuleByName(String ruleName) { 132 Rule rule = null; 133 for (Iterator i = ruleSets.iterator(); i.hasNext() && (rule == null);) { 134 RuleSet ruleSet = (RuleSet) i.next(); 135 rule = ruleSet.getRuleByName(ruleName); 136 } 137 return rule; 138 } 139 140 public boolean usesTypeResolution(Language language) { 141 for (Iterator i = ruleSets.iterator(); i.hasNext();) { 142 RuleSet ruleSet = (RuleSet) i.next(); 143 if (applies(language, ruleSet.getLanguage()) && ruleSet.usesTypeResolution()) { 144 return true; 145 } 146 } 147 return false; 148 } 149 }