From: simonbrandhof Date: Thu, 30 Sep 2010 09:00:18 +0000 (+0000) Subject: rename org.sonar.api.rules.StandardRuleXmlFormat to XMLRuleParser X-Git-Tag: 2.6~907 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2c7c234cf1cf4c8b104b970a5cad30089cb6c043;p=sonarqube.git rename org.sonar.api.rules.StandardRuleXmlFormat to XMLRuleParser --- diff --git a/plugins/sonar-checkstyle-plugin/src/main/java/org/sonar/plugins/checkstyle/CheckstyleRuleRepository.java b/plugins/sonar-checkstyle-plugin/src/main/java/org/sonar/plugins/checkstyle/CheckstyleRuleRepository.java index 5d7073f266e..ee533a1cffa 100644 --- a/plugins/sonar-checkstyle-plugin/src/main/java/org/sonar/plugins/checkstyle/CheckstyleRuleRepository.java +++ b/plugins/sonar-checkstyle-plugin/src/main/java/org/sonar/plugins/checkstyle/CheckstyleRuleRepository.java @@ -23,7 +23,7 @@ import org.sonar.api.platform.ServerFileSystem; import org.sonar.api.resources.Java; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleRepository; -import org.sonar.api.rules.StandardRuleXmlFormat; +import org.sonar.api.rules.XMLRuleParser; import java.io.File; import java.util.ArrayList; @@ -43,9 +43,9 @@ public final class CheckstyleRuleRepository extends RuleRepository { @Override public List createRules() { List rules = new ArrayList(); - rules.addAll(StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/plugins/checkstyle/rules.xml"))); + rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/checkstyle/rules.xml"))); for (File userExtensionXml : fileSystem.getExtensions(CheckstyleConstants.REPOSITORY_KEY, "xml")) { - rules.addAll(StandardRuleXmlFormat.parseXml(userExtensionXml)); + rules.addAll(XMLRuleParser.parseXML(userExtensionXml)); } return rules; } diff --git a/plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsRuleRepository.java b/plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsRuleRepository.java index f690c82619b..bf4b11febb6 100644 --- a/plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsRuleRepository.java +++ b/plugins/sonar-findbugs-plugin/src/main/java/org/sonar/plugins/findbugs/FindbugsRuleRepository.java @@ -26,7 +26,7 @@ import org.sonar.api.platform.ServerFileSystem; import org.sonar.api.resources.Java; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleRepository; -import org.sonar.api.rules.StandardRuleXmlFormat; +import org.sonar.api.rules.XMLRuleParser; public final class FindbugsRuleRepository extends RuleRepository { @@ -38,7 +38,7 @@ public final class FindbugsRuleRepository extends RuleRepository { @Override public List createRules() { List rules = new ArrayList(); - rules.addAll(StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml"))); + rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml"))); return rules; } } diff --git a/plugins/sonar-pmd-plugin/src/main/java/org/sonar/plugins/pmd/PmdRuleRepository.java b/plugins/sonar-pmd-plugin/src/main/java/org/sonar/plugins/pmd/PmdRuleRepository.java index 308a93b90fe..19214409b08 100644 --- a/plugins/sonar-pmd-plugin/src/main/java/org/sonar/plugins/pmd/PmdRuleRepository.java +++ b/plugins/sonar-pmd-plugin/src/main/java/org/sonar/plugins/pmd/PmdRuleRepository.java @@ -23,7 +23,7 @@ import org.sonar.api.platform.ServerFileSystem; import org.sonar.api.resources.Java; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleRepository; -import org.sonar.api.rules.StandardRuleXmlFormat; +import org.sonar.api.rules.XMLRuleParser; import java.io.File; import java.util.ArrayList; @@ -43,9 +43,9 @@ public final class PmdRuleRepository extends RuleRepository { @Override public List createRules() { List rules = new ArrayList(); - rules.addAll(StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/plugins/pmd/rules.xml"))); + rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/pmd/rules.xml"))); for (File userExtensionXml : fileSystem.getExtensions(PmdConstants.REPOSITORY_KEY, "xml")) { - rules.addAll(StandardRuleXmlFormat.parseXml(userExtensionXml)); + rules.addAll(XMLRuleParser.parseXML(userExtensionXml)); } return rules; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/rules/StandardRuleXmlFormat.java b/sonar-plugin-api/src/main/java/org/sonar/api/rules/StandardRuleXmlFormat.java deleted file mode 100644 index 9e56a4e1276..00000000000 --- a/sonar-plugin-api/src/main/java/org/sonar/api/rules/StandardRuleXmlFormat.java +++ /dev/null @@ -1,195 +0,0 @@ -/* - * 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 org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.CharEncoding; -import org.apache.commons.lang.StringUtils; -import org.codehaus.stax2.XMLInputFactory2; -import org.codehaus.staxmate.SMInputFactory; -import org.codehaus.staxmate.in.SMHierarchicCursor; -import org.codehaus.staxmate.in.SMInputCursor; -import org.sonar.api.utils.SonarException; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -/** - * @since 2.3 - */ -public final class StandardRuleXmlFormat { - - private StandardRuleXmlFormat() { - // only static methods - } - - public static List parseXml(File file) { - Reader reader = null; - try { - reader = new InputStreamReader(FileUtils.openInputStream(file), CharEncoding.UTF_8); - return parseXml(reader); - - } catch (IOException e) { - throw new SonarException("Fail to load the file: " + file, e); - - } finally { - IOUtils.closeQuietly(reader); - } - } - - /** - * Warning : the input stream is closed in this method - */ - public static List parseXml(InputStream input) { - Reader reader = null; - try { - reader = new InputStreamReader(input, CharEncoding.UTF_8); - return parseXml(reader); - - } catch (IOException e) { - throw new SonarException("Fail to load the xml stream", e); - - } finally { - IOUtils.closeQuietly(reader); - } - } - - public static List parseXml(Reader reader) { - XMLInputFactory xmlFactory = XMLInputFactory2.newInstance(); - xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); - xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE); - // just so it won't try to load DTD in if there's DOCTYPE - xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); - xmlFactory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE); - SMInputFactory inputFactory = new SMInputFactory(xmlFactory); - try { - SMHierarchicCursor rootC = inputFactory.rootElementCursor(reader); - rootC.advance(); // - List rules = new ArrayList(); - - SMInputCursor rulesC = rootC.childElementCursor("rule"); - while (rulesC.getNext() != null) { - // - Rule rule = Rule.create(); - rules.add(rule); - - processRule(rule, rulesC); - } - return rules; - - } catch (XMLStreamException e) { - throw new SonarException("XML is not valid", e); - } - } - - private static void processRule(Rule rule, SMInputCursor ruleC) throws XMLStreamException { - /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ - String keyAttribute = ruleC.getAttrValue("key"); - if (StringUtils.isNotBlank(keyAttribute)) { - rule.setKey(StringUtils.trim(keyAttribute)); - } - - /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ - String priorityAttribute = ruleC.getAttrValue("priority"); - if (StringUtils.isNotBlank(priorityAttribute)) { - rule.setPriority(RulePriority.valueOf(StringUtils.trim(priorityAttribute))); - } - - SMInputCursor cursor = ruleC.childElementCursor(); - - while (cursor.getNext() != null) { - String nodeName = cursor.getLocalName(); - - if (StringUtils.equalsIgnoreCase("name", nodeName)) { - rule.setName(StringUtils.trim(cursor.collectDescendantText(false))); - - } else if (StringUtils.equalsIgnoreCase("description", nodeName)) { - rule.setDescription(StringUtils.trim(cursor.collectDescendantText(false))); - - } else if (StringUtils.equalsIgnoreCase("key", nodeName)) { - rule.setKey(StringUtils.trim(cursor.collectDescendantText(false))); - - } else if (StringUtils.equalsIgnoreCase("configKey", nodeName)) { - rule.setConfigKey(StringUtils.trim(cursor.collectDescendantText(false))); - - } else if (StringUtils.equalsIgnoreCase("priority", nodeName)) { - rule.setPriority(RulePriority.valueOf(StringUtils.trim(cursor.collectDescendantText(false)))); - - } else if (StringUtils.equalsIgnoreCase("category", nodeName)) { - /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT : attribute "name" */ - String category = StringUtils.trim(StringUtils.defaultString(cursor.getAttrValue("name"), cursor.collectDescendantText(false))); - rule.setRulesCategory(new RulesCategory(category)); - - } else if (StringUtils.equalsIgnoreCase("cardinality", nodeName)) { - rule.setCardinality(Rule.Cardinality.valueOf(StringUtils.trim(cursor.collectDescendantText(false)))); - - } else if (StringUtils.equalsIgnoreCase("param", nodeName)) { - processParameter(rule, cursor); - } - } - if (StringUtils.isEmpty(rule.getKey())) { - throw new SonarException("Node is missing in "); - } - if (StringUtils.isEmpty(rule.getName())) { - throw new SonarException("Node is missing in "); - } - } - - private static void processParameter(Rule rule, SMInputCursor ruleC) throws XMLStreamException { - RuleParam param = rule.createParameter(); - - String keyAttribute = ruleC.getAttrValue("key"); - if (StringUtils.isNotBlank(keyAttribute)) { - /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ - param.setKey(StringUtils.trim(keyAttribute)); - } - - String typeAttribute = ruleC.getAttrValue("type"); - if (StringUtils.isNotBlank(typeAttribute)) { - /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ - param.setType(StringUtils.trim(typeAttribute)); - } - - SMInputCursor paramC = ruleC.childElementCursor(); - while (paramC.getNext() != null) { - String propNodeName = paramC.getLocalName(); - String propText = StringUtils.trim(paramC.collectDescendantText(false)); - if (StringUtils.equalsIgnoreCase("key", propNodeName)) { - param.setKey(propText); - - } else if (StringUtils.equalsIgnoreCase("description", propNodeName)) { - param.setDescription(propText); - - } else if (StringUtils.equalsIgnoreCase("type", propNodeName)) { - param.setType(propText); - - } else if (StringUtils.equalsIgnoreCase("defaultValue", propNodeName)) { - param.setDefaultValue(propText); - } - } - if (StringUtils.isEmpty(param.getKey())) { - throw new SonarException("Node is missing in "); - } - } -} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/rules/XMLRuleParser.java b/sonar-plugin-api/src/main/java/org/sonar/api/rules/XMLRuleParser.java new file mode 100644 index 00000000000..4537da54b27 --- /dev/null +++ b/sonar-plugin-api/src/main/java/org/sonar/api/rules/XMLRuleParser.java @@ -0,0 +1,195 @@ +/* + * 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 org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.CharEncoding; +import org.apache.commons.lang.StringUtils; +import org.codehaus.stax2.XMLInputFactory2; +import org.codehaus.staxmate.SMInputFactory; +import org.codehaus.staxmate.in.SMHierarchicCursor; +import org.codehaus.staxmate.in.SMInputCursor; +import org.sonar.api.utils.SonarException; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @since 2.3 + */ +public final class XMLRuleParser { + + private XMLRuleParser() { + // only static methods + } + + public static List parseXML(File file) { + Reader reader = null; + try { + reader = new InputStreamReader(FileUtils.openInputStream(file), CharEncoding.UTF_8); + return parseXML(reader); + + } catch (IOException e) { + throw new SonarException("Fail to load the file: " + file, e); + + } finally { + IOUtils.closeQuietly(reader); + } + } + + /** + * Warning : the input stream is closed in this method + */ + public static List parseXML(InputStream input) { + Reader reader = null; + try { + reader = new InputStreamReader(input, CharEncoding.UTF_8); + return parseXML(reader); + + } catch (IOException e) { + throw new SonarException("Fail to load the xml stream", e); + + } finally { + IOUtils.closeQuietly(reader); + } + } + + public static List parseXML(Reader reader) { + XMLInputFactory xmlFactory = XMLInputFactory2.newInstance(); + xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE); + xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE); + // just so it won't try to load DTD in if there's DOCTYPE + xmlFactory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); + xmlFactory.setProperty(XMLInputFactory.IS_VALIDATING, Boolean.FALSE); + SMInputFactory inputFactory = new SMInputFactory(xmlFactory); + try { + SMHierarchicCursor rootC = inputFactory.rootElementCursor(reader); + rootC.advance(); // + List rules = new ArrayList(); + + SMInputCursor rulesC = rootC.childElementCursor("rule"); + while (rulesC.getNext() != null) { + // + Rule rule = Rule.create(); + rules.add(rule); + + processRule(rule, rulesC); + } + return rules; + + } catch (XMLStreamException e) { + throw new SonarException("XML is not valid", e); + } + } + + private static void processRule(Rule rule, SMInputCursor ruleC) throws XMLStreamException { + /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ + String keyAttribute = ruleC.getAttrValue("key"); + if (StringUtils.isNotBlank(keyAttribute)) { + rule.setKey(StringUtils.trim(keyAttribute)); + } + + /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ + String priorityAttribute = ruleC.getAttrValue("priority"); + if (StringUtils.isNotBlank(priorityAttribute)) { + rule.setPriority(RulePriority.valueOf(StringUtils.trim(priorityAttribute))); + } + + SMInputCursor cursor = ruleC.childElementCursor(); + + while (cursor.getNext() != null) { + String nodeName = cursor.getLocalName(); + + if (StringUtils.equalsIgnoreCase("name", nodeName)) { + rule.setName(StringUtils.trim(cursor.collectDescendantText(false))); + + } else if (StringUtils.equalsIgnoreCase("description", nodeName)) { + rule.setDescription(StringUtils.trim(cursor.collectDescendantText(false))); + + } else if (StringUtils.equalsIgnoreCase("key", nodeName)) { + rule.setKey(StringUtils.trim(cursor.collectDescendantText(false))); + + } else if (StringUtils.equalsIgnoreCase("configKey", nodeName)) { + rule.setConfigKey(StringUtils.trim(cursor.collectDescendantText(false))); + + } else if (StringUtils.equalsIgnoreCase("priority", nodeName)) { + rule.setPriority(RulePriority.valueOf(StringUtils.trim(cursor.collectDescendantText(false)))); + + } else if (StringUtils.equalsIgnoreCase("category", nodeName)) { + /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT : attribute "name" */ + String category = StringUtils.trim(StringUtils.defaultString(cursor.getAttrValue("name"), cursor.collectDescendantText(false))); + rule.setRulesCategory(new RulesCategory(category)); + + } else if (StringUtils.equalsIgnoreCase("cardinality", nodeName)) { + rule.setCardinality(Rule.Cardinality.valueOf(StringUtils.trim(cursor.collectDescendantText(false)))); + + } else if (StringUtils.equalsIgnoreCase("param", nodeName)) { + processParameter(rule, cursor); + } + } + if (StringUtils.isEmpty(rule.getKey())) { + throw new SonarException("Node is missing in "); + } + if (StringUtils.isEmpty(rule.getName())) { + throw new SonarException("Node is missing in "); + } + } + + private static void processParameter(Rule rule, SMInputCursor ruleC) throws XMLStreamException { + RuleParam param = rule.createParameter(); + + String keyAttribute = ruleC.getAttrValue("key"); + if (StringUtils.isNotBlank(keyAttribute)) { + /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ + param.setKey(StringUtils.trim(keyAttribute)); + } + + String typeAttribute = ruleC.getAttrValue("type"); + if (StringUtils.isNotBlank(typeAttribute)) { + /* BACKWARD COMPATIBILITY WITH DEPRECATED FORMAT */ + param.setType(StringUtils.trim(typeAttribute)); + } + + SMInputCursor paramC = ruleC.childElementCursor(); + while (paramC.getNext() != null) { + String propNodeName = paramC.getLocalName(); + String propText = StringUtils.trim(paramC.collectDescendantText(false)); + if (StringUtils.equalsIgnoreCase("key", propNodeName)) { + param.setKey(propText); + + } else if (StringUtils.equalsIgnoreCase("description", propNodeName)) { + param.setDescription(propText); + + } else if (StringUtils.equalsIgnoreCase("type", propNodeName)) { + param.setType(propText); + + } else if (StringUtils.equalsIgnoreCase("defaultValue", propNodeName)) { + param.setDefaultValue(propText); + } + } + if (StringUtils.isEmpty(param.getKey())) { + throw new SonarException("Node is missing in "); + } + } +} diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/rules/StandardRuleXmlFormatTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/rules/StandardRuleXmlFormatTest.java deleted file mode 100644 index cfcc6267603..00000000000 --- a/sonar-plugin-api/src/test/java/org/sonar/api/rules/StandardRuleXmlFormatTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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 org.hamcrest.core.Is; -import org.junit.Test; -import org.sonar.api.utils.SonarException; - -import java.io.StringReader; -import java.util.List; - -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; -import static org.hamcrest.core.IsNull.nullValue; -import static org.junit.Assert.assertThat; - -public class StandardRuleXmlFormatTest { - - @Test - public void parseXml() { - List rules = StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/api/rules/StandardRuleXmlFormatTest/rules.xml")); - assertThat(rules.size(), is(2)); - - Rule rule = rules.get(0); - assertThat(rule.getName(), is("Local Variable Name")); - assertThat(rule.getDescription(), is("Checks that local, non-final variable names conform to a format specified by the format property.")); - assertThat(rule.getPriority(), Is.is(RulePriority.BLOCKER)); - assertThat(rule.getCardinality(), Is.is(Rule.Cardinality.MULTIPLE)); - assertThat(rule.getConfigKey(), is("Checker/TreeWalker/LocalVariableName")); - - assertThat(rule.getParams().size(), is(2)); - RuleParam prop = rule.getParam("ignore"); - assertThat(prop.getKey(), is("ignore")); - assertThat(prop.getDescription(), is("Ignore ?")); - assertThat(prop.getDefaultValue(), is("false")); - - Rule minimalRule = rules.get(1); - assertThat(minimalRule.getKey(), is("com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck")); - assertThat(minimalRule.getParams().size(), is(0)); - - } - - @Test(expected = SonarException.class) - public void failIfMissingRuleKey() { - StandardRuleXmlFormat.parseXml(new StringReader("Foo")); - } - - @Test(expected = SonarException.class) - public void failIfMissingPropertyKey() { - StandardRuleXmlFormat.parseXml(new StringReader("fooFoo")); - } - - @Test - public void utf8Encoding() { - List rules = StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/api/rules/StandardRuleXmlFormatTest/utf8.xml")); - assertThat(rules.size(), is(1)); - Rule rule = rules.get(0); - assertThat(rule.getKey(), is("com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck")); - assertThat(rule.getName(), is("M & M")); - assertThat(rule.getDescription().charAt(0), is('\u00E9')); - assertThat(rule.getDescription().charAt(1), is('\u00E0')); - assertThat(rule.getDescription().charAt(2), is('\u0026')); - } - - @Test - public void supportDeprecatedFormat() { - // the deprecated format uses some attributes instead of nodes - List rules = StandardRuleXmlFormat.parseXml(getClass().getResourceAsStream("/org/sonar/api/rules/StandardRuleXmlFormatTest/deprecated.xml")); - assertThat(rules.size(), is(1)); - Rule rule = rules.get(0); - assertThat(rule.getPriority(), Is.is(RulePriority.CRITICAL)); - assertThat(rule.getKey(), is("org.sonar.it.checkstyle.MethodsCountCheck")); - assertThat(rule.getParam("minMethodsCount"), not(nullValue())); - } -} diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/rules/XMLRuleParserTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/rules/XMLRuleParserTest.java new file mode 100644 index 00000000000..73f41a460e3 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/rules/XMLRuleParserTest.java @@ -0,0 +1,92 @@ +/* + * 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 org.hamcrest.core.Is; +import org.junit.Test; +import org.sonar.api.utils.SonarException; + +import java.io.StringReader; +import java.util.List; + +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.IsNull.nullValue; +import static org.junit.Assert.assertThat; + +public class XMLRuleParserTest { + + @Test + public void parseXml() { + List rules = XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/api/rules/XMLRuleParserTest/rules.xml")); + assertThat(rules.size(), is(2)); + + Rule rule = rules.get(0); + assertThat(rule.getName(), is("Local Variable Name")); + assertThat(rule.getDescription(), is("Checks that local, non-final variable names conform to a format specified by the format property.")); + assertThat(rule.getPriority(), Is.is(RulePriority.BLOCKER)); + assertThat(rule.getCardinality(), Is.is(Rule.Cardinality.MULTIPLE)); + assertThat(rule.getConfigKey(), is("Checker/TreeWalker/LocalVariableName")); + + assertThat(rule.getParams().size(), is(2)); + RuleParam prop = rule.getParam("ignore"); + assertThat(prop.getKey(), is("ignore")); + assertThat(prop.getDescription(), is("Ignore ?")); + assertThat(prop.getDefaultValue(), is("false")); + + Rule minimalRule = rules.get(1); + assertThat(minimalRule.getKey(), is("com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck")); + assertThat(minimalRule.getParams().size(), is(0)); + + } + + @Test(expected = SonarException.class) + public void failIfMissingRuleKey() { + XMLRuleParser.parseXML(new StringReader("Foo")); + } + + @Test(expected = SonarException.class) + public void failIfMissingPropertyKey() { + XMLRuleParser.parseXML(new StringReader("fooFoo")); + } + + @Test + public void utf8Encoding() { + List rules = XMLRuleParser.parseXML(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")); + assertThat(rule.getName(), is("M & M")); + assertThat(rule.getDescription().charAt(0), is('\u00E9')); + assertThat(rule.getDescription().charAt(1), is('\u00E0')); + assertThat(rule.getDescription().charAt(2), is('\u0026')); + } + + @Test + public void supportDeprecatedFormat() { + // the deprecated format uses some attributes instead of nodes + List rules = XMLRuleParser.parseXML(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)); + assertThat(rule.getKey(), is("org.sonar.it.checkstyle.MethodsCountCheck")); + assertThat(rule.getParam("minMethodsCount"), not(nullValue())); + } +} diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/deprecated.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/deprecated.xml deleted file mode 100644 index 44cf56d228a..00000000000 --- a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/deprecated.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - Methods Count Check - Checker/TreeWalker/org.sonar.it.checkstyle.MethodsCountCheck - - Count methods. - - Le nombre minimum de méthodes. 10 par défaut. - - - \ No newline at end of file diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/rules.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/rules.xml deleted file mode 100644 index 4d807407097..00000000000 --- a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/rules.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck - Local Variable Name - - - - Efficiency - Checker/TreeWalker/LocalVariableName - BLOCKER - MULTIPLE - - tokens - - - - - - ignore - - Ignore ? - - false - - - - - - - com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck - Magic Number - - - - Maintainability - - \ No newline at end of file diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/utf8.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/utf8.xml deleted file mode 100644 index 6197e030057..00000000000 --- a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/StandardRuleXmlFormatTest/utf8.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck - BLOCKER - Checker/TreeWalker/LocalVariableName - M & M - - - - - diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/deprecated.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/deprecated.xml new file mode 100644 index 00000000000..44cf56d228a --- /dev/null +++ b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/deprecated.xml @@ -0,0 +1,11 @@ + + + Methods Count Check + Checker/TreeWalker/org.sonar.it.checkstyle.MethodsCountCheck + + Count methods. + + Le nombre minimum de méthodes. 10 par défaut. + + + \ No newline at end of file diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/rules.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/rules.xml new file mode 100644 index 00000000000..4d807407097 --- /dev/null +++ b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/rules.xml @@ -0,0 +1,40 @@ + + + + com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck + Local Variable Name + + + + Efficiency + Checker/TreeWalker/LocalVariableName + BLOCKER + MULTIPLE + + tokens + + + + + + ignore + + Ignore ? + + false + + + + + + + com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck + Magic Number + + + + Maintainability + + \ No newline at end of file diff --git a/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/utf8.xml b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/utf8.xml new file mode 100644 index 00000000000..6197e030057 --- /dev/null +++ b/sonar-plugin-api/src/test/resources/org/sonar/api/rules/XMLRuleParserTest/utf8.xml @@ -0,0 +1,11 @@ + + + com.puppycrawl.tools.checkstyle.checks.naming.LocalVariableNameCheck + BLOCKER + Checker/TreeWalker/LocalVariableName + M & M + + + + +