// for user extensions
private ServerFileSystem fileSystem;
+ private XMLRuleParser xmlRuleParser;
- public CheckstyleRuleRepository(ServerFileSystem fileSystem) {
+ public CheckstyleRuleRepository(ServerFileSystem fileSystem, XMLRuleParser xmlRuleParser) {
super(CheckstyleConstants.REPOSITORY_KEY, Java.KEY);
setName(CheckstyleConstants.REPOSITORY_NAME);
this.fileSystem = fileSystem;
+ this.xmlRuleParser = xmlRuleParser;
}
@Override
public List<Rule> createRules() {
List<Rule> rules = new ArrayList<Rule>();
- rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/checkstyle/rules.xml")));
+ rules.addAll(xmlRuleParser.parse(getClass().getResourceAsStream("/org/sonar/plugins/checkstyle/rules.xml")));
for (File userExtensionXml : fileSystem.getExtensions(CheckstyleConstants.REPOSITORY_KEY, "xml")) {
- rules.addAll(XMLRuleParser.parseXML(userExtensionXml));
+ rules.addAll(xmlRuleParser.parse(userExtensionXml));
}
return rules;
}
import org.junit.Test;
import org.sonar.api.platform.ServerFileSystem;
import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.XMLRuleParser;
import java.util.List;
@Test
public void loadRepositoryFromXml() {
ServerFileSystem fileSystem = mock(ServerFileSystem.class);
- CheckstyleRuleRepository repository = new CheckstyleRuleRepository(fileSystem);
+ CheckstyleRuleRepository repository = new CheckstyleRuleRepository(fileSystem, new XMLRuleParser());
List<Rule> rules = repository.createRules();
assertThat(rules.size(), greaterThan(100));
}
public final class FindbugsRuleRepository extends RuleRepository {
- public FindbugsRuleRepository() {
+ private XMLRuleParser xmlRuleParser;
+
+ public FindbugsRuleRepository(XMLRuleParser xmlRuleParser) {
super(FindbugsConstants.REPOSITORY_KEY, Java.KEY);
setName(FindbugsConstants.REPOSITORY_NAME);
+ this.xmlRuleParser = xmlRuleParser;
}
@Override
public List<Rule> createRules() {
- return XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml"));
+ return xmlRuleParser.parse(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml"));
}
}
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.rules.RuleQuery;
+import org.sonar.api.rules.XMLRuleParser;
public class FindbugsRuleFinder implements RuleFinder {
private final List<Rule> findbugsRules;
public FindbugsRuleFinder() {
- FindbugsRuleRepository repo = new FindbugsRuleRepository();
+ FindbugsRuleRepository repo = new FindbugsRuleRepository(new XMLRuleParser());
findbugsRules = repo.createRules();
for(Rule rule : findbugsRules){
rule.setRepositoryKey(FindbugsConstants.REPOSITORY_KEY);
import org.junit.Test;
import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.XMLRuleParser;
public class FindbugsRuleRepositoryTest {
@Test
public void testLoadRepositoryFromXml() {
- FindbugsRuleRepository repository = new FindbugsRuleRepository();
+ FindbugsRuleRepository repository = new FindbugsRuleRepository(new XMLRuleParser());
List<Rule> rules = repository.createRules();
assertThat(rules.size(), greaterThan(300));
for (Rule rule : rules) {
import org.sonar.api.CoreProperties;\r
import org.sonar.api.profiles.RulesProfile;\r
import org.sonar.api.resources.Java;\r
-import org.sonar.api.rules.ActiveRule;\r
-import org.sonar.api.rules.Rule;\r
-import org.sonar.api.rules.RulePriority;\r
-import org.sonar.api.rules.RuleQuery;\r
-import org.sonar.api.rules.RulesManager;\r
+import org.sonar.api.rules.*;\r
import org.sonar.test.TestUtils;\r
import org.xml.sax.SAXException;\r
\r
RulesProfile profile = RulesProfile.create();\r
profile.setName(RulesProfile.SONAR_WAY_FINDBUGS_NAME);\r
profile.setLanguage(Java.KEY);\r
- for (Rule rule : new FindbugsRuleRepository().createRules()) {\r
+ for (Rule rule : new FindbugsRuleRepository(new XMLRuleParser()).createRules()) {\r
rule.setRepositoryKey(FindbugsConstants.REPOSITORY_KEY);\r
profile.activateRule(rule, null);\r
}\r
*/
package org.sonar.plugins.pmd;
+import com.google.common.collect.Lists;
import org.sonar.api.platform.ServerFileSystem;
import org.sonar.api.resources.Java;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.XMLRuleParser;
import java.io.File;
-import java.util.ArrayList;
import java.util.List;
public final class PmdRuleRepository extends RuleRepository {
// for user extensions
private ServerFileSystem fileSystem;
+ private XMLRuleParser xmlRuleParser;
- public PmdRuleRepository(ServerFileSystem fileSystem) {
+ public PmdRuleRepository(ServerFileSystem fileSystem, XMLRuleParser xmlRuleParser) {
super(PmdConstants.REPOSITORY_KEY, Java.KEY);
setName(PmdConstants.REPOSITORY_NAME);
this.fileSystem = fileSystem;
+ this.xmlRuleParser = xmlRuleParser;
}
@Override
public List<Rule> createRules() {
- List<Rule> rules = new ArrayList<Rule>();
- rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/pmd/rules.xml")));
+ List<Rule> rules = Lists.newArrayList();
+ rules.addAll(xmlRuleParser.parse(getClass().getResourceAsStream("/org/sonar/plugins/pmd/rules.xml")));
for (File userExtensionXml : fileSystem.getExtensions(PmdConstants.REPOSITORY_KEY, "xml")) {
- rules.addAll(XMLRuleParser.parseXML(userExtensionXml));
+ rules.addAll(xmlRuleParser.parse(userExtensionXml));
}
return rules;
}
import org.junit.Test;
import org.sonar.api.platform.ServerFileSystem;
import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.rules.ActiveRule;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RuleQuery;
+import org.sonar.api.rules.*;
import org.sonar.api.utils.ValidationMessages;
import org.sonar.plugins.pmd.xml.PmdProperty;
import org.sonar.plugins.pmd.xml.PmdRule;
@Test
public void testExportProfile() throws IOException, SAXException {
ServerFileSystem fileSystem = mock(ServerFileSystem.class);
- PmdRuleRepository repository = new PmdRuleRepository(fileSystem);
+ PmdRuleRepository repository = new PmdRuleRepository(fileSystem, new XMLRuleParser());
List<Rule> rules = repository.createRules();
RuleFinder ruleFinder = new PmdRuleFinder(rules);
import org.junit.Test;
import org.sonar.api.platform.ServerFileSystem;
import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.XMLRuleParser;
public class PmdRuleRepositoryTest {
@Test
public void testLoadRepositoryFromXml() {
ServerFileSystem fileSystem = mock(ServerFileSystem.class);
- PmdRuleRepository repository = new PmdRuleRepository(fileSystem);
+ PmdRuleRepository repository = new PmdRuleRepository(fileSystem, new XMLRuleParser());
List<Rule> rules = repository.createRules();
assertThat(rules.size(), greaterThan(100));
}
--- /dev/null
+/*
+ * Sonar, open source software quality management tool.
+ * Copyright (C) 2009 SonarSource SA
+ * mailto:contact AT sonarsource DOT com
+ *
+ * Sonar is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * Sonar is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Sonar; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
+ */
+package org.sonar.api.rules;
+
+import com.google.common.collect.Lists;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.utils.AnnotationUtils;
+import org.sonar.check.Check;
+
+import java.lang.reflect.Field;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @since 2.3
+ */
+public final class AnnotationRuleParser implements ServerComponent {
+
+ private static final Logger LOG = LoggerFactory.getLogger(AnnotationRuleParser.class);
+
+ public List<Rule> parse(String repositoryKey, Collection<Class> annotatedClasses) {
+ List<Rule> rules = Lists.newArrayList();
+ for (Class annotatedClass : annotatedClasses) {
+ rules.add(create(repositoryKey, annotatedClass));
+ }
+ return rules;
+ }
+
+ private Rule create(String repositoryKey, Class annotatedClass) {
+ org.sonar.check.Rule ruleAnnotation = AnnotationUtils.getClassAnnotation(annotatedClass, org.sonar.check.Rule.class);
+ if (ruleAnnotation != null) {
+ return toRule(repositoryKey, annotatedClass, ruleAnnotation);
+ }
+ Check checkAnnotation = AnnotationUtils.getClassAnnotation(annotatedClass, Check.class);
+ if (checkAnnotation != null) {
+ return toRule(repositoryKey, annotatedClass, checkAnnotation);
+ }
+ LOG.warn("The class " + annotatedClass.getCanonicalName() + " should be annotated with " + Rule.class);
+ return null;
+ }
+
+ private Rule toRule(String repositoryKey, Class clazz, org.sonar.check.Rule ruleAnnotation) {
+ String ruleKey = StringUtils.defaultIfEmpty(ruleAnnotation.key(), clazz.getCanonicalName());
+ Rule rule = Rule.create(repositoryKey, ruleKey, ruleAnnotation.name());
+ rule.setDescription(ruleAnnotation.description());
+ rule.setRulesCategory(RulesCategory.fromIsoCategory(ruleAnnotation.isoCategory()));
+ rule.setPriority(RulePriority.fromCheckPriority(ruleAnnotation.priority()));
+
+ Field[] fields = clazz.getDeclaredFields();
+ if (fields != null) {
+ for (Field field : fields) {
+ addRuleProperty(rule, field);
+ }
+ }
+
+ return rule;
+ }
+
+ private Rule toRule(String repositoryKey, Class clazz, Check checkAnnotation) {
+ String ruleKey = StringUtils.defaultIfEmpty(checkAnnotation.key(), clazz.getCanonicalName());
+ Rule rule = Rule.create(repositoryKey, ruleKey, checkAnnotation.title());
+ rule.setDescription(checkAnnotation.description());
+ rule.setRulesCategory(RulesCategory.fromIsoCategory(checkAnnotation.isoCategory()));
+ rule.setPriority(RulePriority.fromCheckPriority(checkAnnotation.priority()));
+
+ Field[] fields = clazz.getDeclaredFields();
+ if (fields != null) {
+ for (Field field : fields) {
+ addCheckProperty(rule, field);
+ }
+ }
+ return rule;
+ }
+
+ private void addRuleProperty(Rule rule, Field field) {
+ org.sonar.check.RuleProperty propertyAnnotation = field.getAnnotation(org.sonar.check.RuleProperty.class);
+ if (propertyAnnotation != null) {
+ String fieldKey = StringUtils.defaultIfEmpty(propertyAnnotation.key(), field.getName());
+ RuleParam param = rule.createParameter(fieldKey);
+ param.setDescription(propertyAnnotation.description());
+ param.setDefaultValue(propertyAnnotation.defaultValue());
+ }
+ }
+
+ private void addCheckProperty(Rule rule, Field field) {
+ org.sonar.check.CheckProperty propertyAnnotation = field.getAnnotation(org.sonar.check.CheckProperty.class);
+ if (propertyAnnotation != null) {
+ String fieldKey = StringUtils.defaultIfEmpty(propertyAnnotation.key(), field.getName());
+ RuleParam param = rule.createParameter(fieldKey);
+ param.setDescription(propertyAnnotation.description());
+ }
+ }
+}
+++ /dev/null
-/*
- * Sonar, open source software quality management tool.
- * Copyright (C) 2009 SonarSource SA
- * mailto:contact AT sonarsource DOT com
- *
- * Sonar is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * Sonar is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with Sonar; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
- */
-package org.sonar.api.rules;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.sonar.api.utils.AnnotationUtils;
-import org.sonar.check.Check;
-
-import java.lang.reflect.Field;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @since 2.3
- */
-public final class AnnotationRuleRepository extends RuleRepository {
-
- private static final Logger LOG = LoggerFactory.getLogger(AnnotationRuleRepository.class);
-
- private Collection<Class> annotatedClasses;
-
- /**
- * Use the factory method create()
- */
- private AnnotationRuleRepository(String key, String language, String name, Collection<Class> annotatedClasses) {
- super(key, language);
- setName(name);
- this.annotatedClasses = annotatedClasses;
- }
-
- public static AnnotationRuleRepository create(String key, String language, String name, Collection<Class> annotatedClasses) {
- return new AnnotationRuleRepository(key, language, name, annotatedClasses);
- }
-
- @Override
- public List<Rule> createRules() {
- List<Rule> rules = Lists.newArrayList();
- for (Class annotatedClass : annotatedClasses) {
- rules.add(create(annotatedClass));
- }
- return rules;
- }
-
- private Rule create(Class annotatedClass) {
- org.sonar.check.Rule ruleAnnotation = AnnotationUtils.getClassAnnotation(annotatedClass, org.sonar.check.Rule.class);
- if (ruleAnnotation != null) {
- return toRule(annotatedClass, ruleAnnotation);
- }
- Check checkAnnotation = AnnotationUtils.getClassAnnotation(annotatedClass, Check.class);
- if (checkAnnotation != null) {
- return toRule(annotatedClass, checkAnnotation);
- }
- LOG.warn("The class " + annotatedClass.getCanonicalName() + " is not a check template. It should be annotated with " + Rule.class);
- return null;
- }
-
- private Rule toRule(Class clazz, org.sonar.check.Rule ruleAnnotation) {
- String key = StringUtils.defaultIfEmpty(ruleAnnotation.key(), clazz.getCanonicalName());
- Rule rule = Rule.create(getKey(), key, ruleAnnotation.name());
- rule.setDescription(ruleAnnotation.description());
- rule.setRulesCategory(RulesCategory.fromIsoCategory(ruleAnnotation.isoCategory()));
- rule.setPriority(RulePriority.fromCheckPriority(ruleAnnotation.priority()));
-
- Field[] fields = clazz.getDeclaredFields();
- if (fields != null) {
- for (Field field : fields) {
- addRuleProperty(rule, field);
- }
- }
-
- return rule;
- }
-
- private Rule toRule(Class clazz, Check checkAnnotation) {
- String key = StringUtils.defaultIfEmpty(checkAnnotation.key(), clazz.getCanonicalName());
- Rule rule = Rule.create(getKey(), key, checkAnnotation.title());
- rule.setDescription(checkAnnotation.description());
- rule.setRulesCategory(RulesCategory.fromIsoCategory(checkAnnotation.isoCategory()));
- rule.setPriority(RulePriority.fromCheckPriority(checkAnnotation.priority()));
-
- Field[] fields = clazz.getDeclaredFields();
- if (fields != null) {
- for (Field field : fields) {
- addCheckProperty(rule, field);
- }
- }
- return rule;
- }
-
- private void addRuleProperty(Rule rule, Field field) {
- org.sonar.check.RuleProperty propertyAnnotation = field.getAnnotation(org.sonar.check.RuleProperty.class);
- if (propertyAnnotation != null) {
- String fieldKey = StringUtils.defaultIfEmpty(propertyAnnotation.key(), field.getName());
- RuleParam param = rule.createParameter(fieldKey);
- param.setDescription(propertyAnnotation.description());
- param.setDefaultValue(propertyAnnotation.defaultValue());
- }
- }
-
- private void addCheckProperty(Rule rule, Field field) {
- org.sonar.check.CheckProperty propertyAnnotation = field.getAnnotation(org.sonar.check.CheckProperty.class);
- if (propertyAnnotation != null) {
- String fieldKey = StringUtils.defaultIfEmpty(propertyAnnotation.key(), field.getName());
- RuleParam param = rule.createParameter(fieldKey);
- param.setDescription(propertyAnnotation.description());
- }
- }
-}
import org.codehaus.staxmate.SMInputFactory;
import org.codehaus.staxmate.in.SMHierarchicCursor;
import org.codehaus.staxmate.in.SMInputCursor;
+import org.sonar.api.ServerComponent;
import org.sonar.api.utils.SonarException;
import javax.xml.stream.XMLInputFactory;
/**
* @since 2.3
*/
-public final class XMLRuleParser {
+public final class XMLRuleParser implements ServerComponent {
- private XMLRuleParser() {
- // only static methods
- }
-
- public static List<Rule> parseXML(File file) {
+ public List<Rule> parse(File file) {
Reader reader = null;
try {
reader = new InputStreamReader(FileUtils.openInputStream(file), CharEncoding.UTF_8);
- return parseXML(reader);
+ return parse(reader);
} catch (IOException e) {
throw new SonarException("Fail to load the file: " + file, e);
/**
* Warning : the input stream is closed in this method
*/
- public static List<Rule> parseXML(InputStream input) {
+ public List<Rule> parse(InputStream input) {
Reader reader = null;
try {
reader = new InputStreamReader(input, CharEncoding.UTF_8);
- return parseXML(reader);
+ return parse(reader);
} catch (IOException e) {
throw new SonarException("Fail to load the xml stream", e);
}
}
- public static List<Rule> parseXML(Reader reader) {
+ public List<Rule> parse(Reader reader) {
XMLInputFactory xmlFactory = XMLInputFactory2.newInstance();
xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
@Test
public void parseXml() {
- List<Rule> rules = XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/rules.xml"));
+ List<Rule> rules = new XMLRuleParser().parse(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/rules.xml"));
assertThat(rules.size(), is(2));
Rule rule = rules.get(0);
@Test(expected = SonarException.class)
public void failIfMissingRuleKey() {
- XMLRuleParser.parseXML(new StringReader("<rules><rule><name>Foo</name></rule></rules>"));
+ new XMLRuleParser().parse(new StringReader("<rules><rule><name>Foo</name></rule></rules>"));
}
@Test(expected = SonarException.class)
public void failIfMissingPropertyKey() {
- XMLRuleParser.parseXML(new StringReader("<rules><rule><key>foo</key><name>Foo</name><param></param></rule></rules>"));
+ new XMLRuleParser().parse(new StringReader("<rules><rule><key>foo</key><name>Foo</name><param></param></rule></rules>"));
}
@Test
public void utf8Encoding() {
- List<Rule> rules = XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/utf8.xml"));
+ List<Rule> rules = new XMLRuleParser().parse(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/utf8.xml"));
assertThat(rules.size(), is(1));
Rule rule = rules.get(0);
assertThat(rule.getKey(), is("com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck"));
@Test
public void supportDeprecatedFormat() {
// the deprecated format uses some attributes instead of nodes
- List<Rule> rules = XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/deprecated.xml"));
+ List<Rule> rules = new XMLRuleParser().parse(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/deprecated.xml"));
assertThat(rules.size(), is(1));
Rule rule = rules.get(0);
assertThat(rule.getPriority(), Is.is(RulePriority.CRITICAL));
import org.sonar.api.profiles.XMLProfileSerializer;
import org.sonar.api.resources.Languages;
import org.sonar.api.rules.DefaultRulesManager;
+import org.sonar.api.rules.XMLRuleParser;
import org.sonar.api.utils.HttpDownloader;
import org.sonar.api.utils.IocContainer;
import org.sonar.api.utils.TimeProfiler;
servicesContainer.as(Characteristics.CACHE).addComponent(AnnotationProfileParser.class);
servicesContainer.as(Characteristics.CACHE).addComponent(XMLProfileParser.class);
servicesContainer.as(Characteristics.CACHE).addComponent(XMLProfileSerializer.class);
+ servicesContainer.as(Characteristics.CACHE).addComponent(XMLRuleParser.class);
servicesContainer.as(Characteristics.CACHE).addComponent(DefaultRuleFinder.class);
servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedRuleRepositories.class);
servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedProfiles.class);