*/
package org.sonar.plugins.checkstyle;
+import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.profiles.XMLProfileDefinition;
-import org.sonar.api.resources.Java;
-import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.profiles.XMLProfileParser;
+import org.sonar.api.utils.ValidationMessages;
-public final class SonarWayProfile extends XMLProfileDefinition {
+public final class SonarWayProfile extends ProfileDefinition {
- public SonarWayProfile(RuleFinder ruleFinder) {
- super(SunConventionsProfile.class.getClassLoader(), "org/sonar/plugins/checkstyle/profile-sonar-way.xml", ruleFinder);
+ private XMLProfileParser xmlProfileParser;
+
+ public SonarWayProfile(XMLProfileParser xmlProfileParser) {
+ this.xmlProfileParser = xmlProfileParser;
+ }
+
+ public RulesProfile createProfile(ValidationMessages messages) {
+ return xmlProfileParser.parseResource(getClass().getClassLoader(), "org/sonar/plugins/checkstyle/profile-sonar-way.xml", messages);
}
}
import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.profiles.XMLProfileDefinition;
-import org.sonar.api.resources.Java;
-import org.sonar.api.rules.RuleFinder;
import org.sonar.api.utils.ValidationMessages;
public class SonarWayWithFindbugsProfile extends ProfileDefinition {
*/
package org.sonar.plugins.checkstyle;
+import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.RulesProfile;
-import org.sonar.api.profiles.XMLProfileDefinition;
-import org.sonar.api.resources.Java;
-import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.profiles.XMLProfileParser;
+import org.sonar.api.utils.ValidationMessages;
-public final class SunConventionsProfile extends XMLProfileDefinition {
+public final class SunConventionsProfile extends ProfileDefinition {
- public SunConventionsProfile(RuleFinder ruleFinder) {
- super(SunConventionsProfile.class.getClassLoader(), "org/sonar/plugins/checkstyle/profile-sun-conventions.xml", ruleFinder);
+ private XMLProfileParser xmlProfileParser;
+
+ public SunConventionsProfile(XMLProfileParser xmlProfileParser) {
+ this.xmlProfileParser = xmlProfileParser;
}
+
+
+ public RulesProfile createProfile(ValidationMessages messages) {
+ return xmlProfileParser.parseResource(getClass().getClassLoader(), "org/sonar/plugins/checkstyle/profile-sun-conventions.xml", messages);
+ }
+
}
import org.mockito.stubbing.Answer;
import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.profiles.XMLProfileParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.utils.ValidationMessages;
public class SonarWayProfileTest {
@Test
- public void create() {
- ProfileDefinition sonarWay = new SonarWayProfile(newRuleFinder());
+ public void shouldCreateProfile() {
+ ProfileDefinition sonarWay = new SonarWayProfile(new XMLProfileParser(newRuleFinder()));
ValidationMessages validation = ValidationMessages.create();
RulesProfile profile = sonarWay.createProfile(validation);
assertThat(profile.getActiveRulesByRepository(CheckstyleConstants.REPOSITORY_KEY).size(), greaterThan(1));
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.profiles.XMLProfileParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.utils.ValidationMessages;
-import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
public class SonarWayWithFindbugsProfileTest {
@Test
- public void sameAsSonarWay() {
+ public void shouldBeSameAsSonarWay() {
RuleFinder ruleFinder = newRuleFinder();
- SonarWayProfile sonarWay = new SonarWayProfile(ruleFinder);
+ SonarWayProfile sonarWay = new SonarWayProfile(new XMLProfileParser(ruleFinder));
RulesProfile withoutFindbugs = sonarWay.createProfile(ValidationMessages.create());
RulesProfile withFindbugs = new SonarWayWithFindbugsProfile(sonarWay).createProfile(ValidationMessages.create());
assertThat(withFindbugs.getActiveRules().size(), is(withoutFindbugs.getActiveRules().size()));
import org.mockito.stubbing.Answer;
import org.sonar.api.profiles.ProfileDefinition;
import org.sonar.api.profiles.RulesProfile;
+import org.sonar.api.profiles.XMLProfileParser;
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RuleFinder;
import org.sonar.api.utils.ValidationMessages;
public class SunConventionsProfileTest {
@Test
- public void create() {
- ProfileDefinition definition = new SunConventionsProfile(newRuleFinder());
+ public void shouldCreateProfile() {
+ ProfileDefinition definition = new SunConventionsProfile(new XMLProfileParser(newRuleFinder()));
ValidationMessages validation = ValidationMessages.create();
RulesProfile sunProfile = definition.createProfile(validation);
assertThat(sunProfile.getActiveRulesByRepository(CheckstyleConstants.REPOSITORY_KEY).size(), greaterThan(1));
*/
package org.sonar.plugins.findbugs;
-import java.util.ArrayList;
-import java.util.List;
-
-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.XMLRuleParser;
+import java.util.List;
+
public final class FindbugsRuleRepository extends RuleRepository {
public FindbugsRuleRepository() {
@Override
public List<Rule> createRules() {
- List<Rule> rules = new ArrayList<Rule>();
- rules.addAll(XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml")));
- return rules;
+ return XMLRuleParser.parseXML(getClass().getResourceAsStream("/org/sonar/plugins/findbugs/rules.xml"));
}
}
public class SonarWayWithFindbugsProfileTest {
@Test
- public void create() {
+ public void shouldCreateProfile() {
FindbugsProfileImporter importer = new FindbugsProfileImporter(new FindbugsRuleFinder());
SonarWayWithFindbugsProfile sonarWayWithFindbugs = new SonarWayWithFindbugsProfile(importer);
ValidationMessages validation = ValidationMessages.create();
public class SonarWayProfileTest {
@Test
- public void create() {
+ public void shouldCreateProfile() {
ProfileDefinition sonarWay = new SonarWayProfile(createPmdProfileImporter());
ValidationMessages validation = ValidationMessages.create();
RulesProfile profile = sonarWay.createProfile(validation);
public class SonarWayWithFindbugsProfileTest {
@Test
- public void create() {
+ public void shouldCreateProfile() {
SonarWayWithFindbugsProfile sonarWayWithFindbugs = new SonarWayWithFindbugsProfile(new SonarWayProfile(createPmdProfileImporter()));
ValidationMessages validation = ValidationMessages.create();
RulesProfile profile = sonarWayWithFindbugs.createProfile(validation);
public class SunConventionsProfileTest {
@Test
- public void create() {
+ public void shouldCreateProfile() {
SunConventionsProfile sunConvention = new SunConventionsProfile(createPmdProfileImporter());
ValidationMessages validation = ValidationMessages.create();
RulesProfile profile = sunConvention.createProfile(validation);
+++ /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.profiles;
-
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleAnnotationUtils;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RulePriority;
-import org.sonar.api.utils.ValidationMessages;
-import org.sonar.check.BelongsToProfile;
-
-import java.util.Collection;
-
-/**
- * @since 2.3
- */
-public abstract class AnnotationProfileDefinition extends ProfileDefinition {
-
- private String name;
- private String language;
- private String repositoryKey;
- private Collection<Class> annotatedClasses;
- private RuleFinder ruleFinder;
-
- protected AnnotationProfileDefinition(String repositoryKey, String profileName, String language, Collection<Class> annotatedClasses, RuleFinder ruleFinder) {
- this.name = profileName;
- this.language = language;
- this.repositoryKey = repositoryKey;
- this.annotatedClasses = annotatedClasses;
- this.ruleFinder = ruleFinder;
- }
-
- @Override
- public RulesProfile createProfile(ValidationMessages validation) {
- RulesProfile profile = RulesProfile.create(name, language);
- if (annotatedClasses != null) {
- for (Class aClass : annotatedClasses) {
- BelongsToProfile belongsToProfile = (BelongsToProfile) aClass.getAnnotation(BelongsToProfile.class);
- registerRule(aClass, belongsToProfile, profile, validation);
- }
- }
- return profile;
- }
-
- private void registerRule(Class aClass, BelongsToProfile belongsToProfile, RulesProfile profile, ValidationMessages validation) {
- if (belongsToProfile != null) {
- String ruleKey = RuleAnnotationUtils.getRuleKey(aClass);
- Rule rule = ruleFinder.findByKey(repositoryKey, ruleKey);
- if (rule == null) {
- validation.addErrorText("Rule not found: [repository=" + repositoryKey + ", key=" + ruleKey + "]");
-
- } else {
- RulePriority priority = null;
- if (belongsToProfile.priority() != null) {
- priority = RulePriority.fromCheckPriority(belongsToProfile.priority());
- }
- profile.activateRule(rule, priority);
- }
- }
- }
-}
--- /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.profiles;
+
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleAnnotationUtils;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.ValidationMessages;
+import org.sonar.check.BelongsToProfile;
+
+import java.util.Collection;
+
+/**
+ * @since 2.3
+ */
+public final class AnnotationProfileParser implements ServerComponent {
+
+ private RuleFinder ruleFinder;
+
+ public AnnotationProfileParser(RuleFinder ruleFinder) {
+ this.ruleFinder = ruleFinder;
+ }
+
+ public RulesProfile parse(String repositoryKey, String profileName, String language, Collection<Class> annotatedClasses, ValidationMessages messages) {
+ RulesProfile profile = RulesProfile.create(profileName, language);
+ for (Class aClass : annotatedClasses) {
+ BelongsToProfile belongsToProfile = (BelongsToProfile) aClass.getAnnotation(BelongsToProfile.class);
+ addRule(aClass, belongsToProfile, profile, repositoryKey, messages);
+ }
+ return profile;
+ }
+
+ private void addRule(Class aClass, BelongsToProfile annotation, RulesProfile profile, String repositoryKey, ValidationMessages messages) {
+ if (annotation != null && StringUtils.equals(annotation.title(), profile.getName())) {
+ String ruleKey = RuleAnnotationUtils.getRuleKey(aClass);
+ Rule rule = ruleFinder.findByKey(repositoryKey, ruleKey);
+ if (rule == null) {
+ messages.addWarningText("Rule not found: [repository=" + repositoryKey + ", key=" + ruleKey + "]");
+
+ } else {
+ RulePriority priority = null;
+ if (annotation.priority() != null) {
+ priority = RulePriority.fromCheckPriority(annotation.priority());
+ }
+ profile.activateRule(rule, priority);
+ }
+ }
+ }
+}
import org.sonar.api.utils.ValidationMessages;
/**
+ * Define a profile which is automatically registered during sonar startup.
+ * The components <code>AnnotationProfileParser</code> and <code>XMLProfileParser</code> can be used to help implementing the method create().
+ *
* @since 2.3
*/
public abstract class ProfileDefinition implements ServerExtension {
+++ /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.profiles;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.CharEncoding;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.utils.SonarException;
-import org.sonar.api.utils.ValidationMessages;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.util.List;
-
-/**
- * @since 2.3
- */
-public abstract class XMLProfileDefinition extends ProfileDefinition {
-
- private RuleFinder ruleFinder;
- private ClassLoader classloader;
- private String xmlClassPath;
-
- protected XMLProfileDefinition(ClassLoader classloader, String xmlClassPath, RuleFinder ruleFinder) {
- this.ruleFinder = ruleFinder;
- this.classloader = classloader;
- this.xmlClassPath = xmlClassPath;
- }
-
- @Override
- public final RulesProfile createProfile(ValidationMessages validation) {
- Reader reader = new InputStreamReader(classloader.getResourceAsStream(xmlClassPath), Charset.forName(CharEncoding.UTF_8));
- try {
- return XMLProfileImporter.create(ruleFinder).importProfile(reader, validation);
-
- } finally {
- IOUtils.closeQuietly(reader);
- }
- }
-}
+++ /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.profiles;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.rules.ActiveRule;
-import org.sonar.api.rules.ActiveRuleParam;
-import org.sonar.api.utils.SonarException;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * @since 2.3
- */
-public final class XMLProfileExporter {
-
- public static XMLProfileExporter create() {
- return new XMLProfileExporter();
- }
-
- public void exportProfile(RulesProfile profile, Writer writer) {
- try {
- appendHeader(profile, writer);
- appendRules(profile, writer);
- appendFooter(writer);
-
- } catch (IOException e) {
- throw new SonarException("Fail to export the profile " + profile, e);
- }
- }
-
- private void appendHeader(RulesProfile profile, Writer writer) throws IOException {
- writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
- + "<!-- Generated by Sonar -->"
- + "<profile><name>");
- StringEscapeUtils.escapeXml(writer, profile.getName());
- writer.append("</name><language>");
- StringEscapeUtils.escapeXml(writer, profile.getLanguage());
- writer.append("</language>");
- }
-
- private void appendRules(RulesProfile profile, Writer writer) throws IOException {
- if (!profile.getActiveRules().isEmpty()) {
- writer.append("<rules>");
- for (ActiveRule activeRule : profile.getActiveRules()) {
- appendRule(activeRule, writer);
- }
- writer.append("</rules>");
- }
- }
-
- private void appendRule(ActiveRule activeRule, Writer writer) throws IOException {
- writer.append("<rule><repositoryKey>");
- writer.append(activeRule.getRepositoryKey());
- writer.append("</repositoryKey><key>");
- StringEscapeUtils.escapeXml(writer, activeRule.getRuleKey());
- writer.append("</key>");
- if (activeRule.getPriority() != null) {
- writer.append("<priority>");
- writer.append(activeRule.getPriority().name());
- writer.append("</priority>");
- }
- appendRuleParameters(activeRule, writer);
- writer.append("</rule>");
- }
-
- private void appendRuleParameters(ActiveRule activeRule, Writer writer) throws IOException {
- if (activeRule.getActiveRuleParams() != null && !activeRule.getActiveRuleParams().isEmpty()) {
- writer.append("<parameters>");
- for (ActiveRuleParam activeRuleParam : activeRule.getActiveRuleParams()) {
- appendRuleParameter(writer, activeRuleParam);
- }
- writer.append("</parameters>");
- }
- }
-
- private void appendRuleParameter(Writer writer, ActiveRuleParam activeRuleParam) throws IOException {
- if (StringUtils.isNotBlank(activeRuleParam.getValue())) {
- writer.append("<parameter><key>");
- StringEscapeUtils.escapeXml(writer, activeRuleParam.getKey());
- writer.append("</key><value>");
- StringEscapeUtils.escapeXml(writer, activeRuleParam.getValue());
- writer.append("</value>");
- writer.append("</parameter>");
- }
- }
-
- private void appendFooter(Writer writer) throws IOException {
- writer.append("</profile>");
- }
-}
+++ /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.profiles;
-
-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.rules.ActiveRule;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RulePriority;
-import org.sonar.api.utils.ValidationMessages;
-
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-import java.io.Reader;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @since 2.3
- */
-public final class XMLProfileImporter {
-
- private RuleFinder ruleFinder;
-
- private XMLProfileImporter(RuleFinder ruleFinder) {
- this.ruleFinder = ruleFinder;
- }
-
- public static XMLProfileImporter create(RuleFinder ruleFinder) {
- return new XMLProfileImporter(ruleFinder);
- }
-
- public RulesProfile importProfile(Reader reader, ValidationMessages messages) {
- RulesProfile profile = RulesProfile.create();
- SMInputFactory inputFactory = initStax();
- try {
- SMHierarchicCursor rootC = inputFactory.rootElementCursor(reader);
- rootC.advance(); // <profile>
- SMInputCursor cursor = rootC.childElementCursor();
- while (cursor.getNext() != null) {
- String nodeName = cursor.getLocalName();
- if (StringUtils.equals("rules", nodeName)) {
- SMInputCursor rulesCursor = cursor.childElementCursor("rule");
- processRules(rulesCursor, profile, messages);
-
- } else if (StringUtils.equals("name", nodeName)) {
- profile.setName(StringUtils.trim(cursor.collectDescendantText(false)));
-
- } else if (StringUtils.equals("language", nodeName)) {
- profile.setLanguage(StringUtils.trim(cursor.collectDescendantText(false)));
- }
- }
- } catch (XMLStreamException e) {
- messages.addErrorText("XML is not valid: " + e.getMessage());
- }
- checkProfile(profile, messages);
- return profile;
- }
-
- private void checkProfile(RulesProfile profile, ValidationMessages messages) {
- if (StringUtils.isBlank(profile.getName())) {
- messages.addErrorText("The mandatory node <name> is missing.");
- }
- if (StringUtils.isBlank(profile.getLanguage())) {
- messages.addErrorText("The mandatory node <language> is missing.");
- }
- }
-
- private SMInputFactory initStax() {
- 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);
- return inputFactory;
- }
-
- private void processRules(SMInputCursor rulesCursor, RulesProfile profile, ValidationMessages messages) throws XMLStreamException {
- Map<String, String> parameters = new HashMap<String, String>();
- while (rulesCursor.getNext() != null) {
- SMInputCursor ruleCursor = rulesCursor.childElementCursor();
-
- String repositoryKey = null, key = null;
- RulePriority priority = null;
- parameters.clear();
-
- while (ruleCursor.getNext() != null) {
- String nodeName = ruleCursor.getLocalName();
-
- if (StringUtils.equals("repositoryKey", nodeName)) {
- repositoryKey = StringUtils.trim(ruleCursor.collectDescendantText(false));
-
- } else if (StringUtils.equals("key", nodeName)) {
- key = StringUtils.trim(ruleCursor.collectDescendantText(false));
-
- } else if (StringUtils.equals("priority", nodeName)) {
- priority = RulePriority.valueOf(StringUtils.trim(ruleCursor.collectDescendantText(false)));
-
- } else if (StringUtils.equals("parameters", nodeName)) {
- SMInputCursor propsCursor = ruleCursor.childElementCursor("parameter");
- processParameters(propsCursor, parameters);
- }
- }
-
- Rule rule = ruleFinder.findByKey(repositoryKey, key);
- if (rule == null) {
- messages.addWarningText("Rule not found: [repository=" + repositoryKey + ", key=" + key + "]");
-
- } else {
- ActiveRule activeRule = profile.activateRule(rule, priority);
- for (Map.Entry<String, String> entry : parameters.entrySet()) {
- if (rule.getParam(entry.getKey()) == null) {
- messages.addWarningText("The parameter '" + entry.getKey() + "' does not exist in the rule: [repository=" + repositoryKey + ", key=" + key + "]");
- } else {
- activeRule.setParameter(entry.getKey(), entry.getValue());
- }
- }
- }
- }
- }
-
- private void processParameters(SMInputCursor propsCursor, Map<String, String> parameters) throws XMLStreamException {
- while (propsCursor.getNext() != null) {
- SMInputCursor propCursor = propsCursor.childElementCursor();
- String key = null;
- String value = null;
- while (propCursor.getNext() != null) {
- String nodeName = propCursor.getLocalName();
- if (StringUtils.equals("key", nodeName)) {
- key = StringUtils.trim(propCursor.collectDescendantText(false));
-
- } else if (StringUtils.equals("value", nodeName)) {
- value = StringUtils.trim(propCursor.collectDescendantText(false));
- }
- }
- if (key != null) {
- parameters.put(key, value);
- }
- }
- }
-
-
-}
--- /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.profiles;
+
+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.ServerComponent;
+import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.ValidationMessages;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @since 2.3
+ */
+public final class XMLProfileParser implements ServerComponent {
+
+ private RuleFinder ruleFinder;
+
+ public XMLProfileParser(RuleFinder ruleFinder) {
+ this.ruleFinder = ruleFinder;
+ }
+
+ public RulesProfile parseResource(ClassLoader classloader, String xmlClassPath, ValidationMessages messages) {
+ Reader reader = new InputStreamReader(classloader.getResourceAsStream(xmlClassPath), Charset.forName(CharEncoding.UTF_8));
+ try {
+ return parse(reader, messages);
+
+ } finally {
+ IOUtils.closeQuietly(reader);
+ }
+ }
+
+ public RulesProfile parse(Reader reader, ValidationMessages messages) {
+ RulesProfile profile = RulesProfile.create();
+ SMInputFactory inputFactory = initStax();
+ try {
+ SMHierarchicCursor rootC = inputFactory.rootElementCursor(reader);
+ rootC.advance(); // <profile>
+ SMInputCursor cursor = rootC.childElementCursor();
+ while (cursor.getNext() != null) {
+ String nodeName = cursor.getLocalName();
+ if (StringUtils.equals("rules", nodeName)) {
+ SMInputCursor rulesCursor = cursor.childElementCursor("rule");
+ processRules(rulesCursor, profile, messages);
+
+ } else if (StringUtils.equals("name", nodeName)) {
+ profile.setName(StringUtils.trim(cursor.collectDescendantText(false)));
+
+ } else if (StringUtils.equals("language", nodeName)) {
+ profile.setLanguage(StringUtils.trim(cursor.collectDescendantText(false)));
+ }
+ }
+ } catch (XMLStreamException e) {
+ messages.addErrorText("XML is not valid: " + e.getMessage());
+ }
+ checkProfile(profile, messages);
+ return profile;
+ }
+
+ private void checkProfile(RulesProfile profile, ValidationMessages messages) {
+ if (StringUtils.isBlank(profile.getName())) {
+ messages.addErrorText("The mandatory node <name> is missing.");
+ }
+ if (StringUtils.isBlank(profile.getLanguage())) {
+ messages.addErrorText("The mandatory node <language> is missing.");
+ }
+ }
+
+ private SMInputFactory initStax() {
+ 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);
+ return inputFactory;
+ }
+
+ private void processRules(SMInputCursor rulesCursor, RulesProfile profile, ValidationMessages messages) throws XMLStreamException {
+ Map<String, String> parameters = new HashMap<String, String>();
+ while (rulesCursor.getNext() != null) {
+ SMInputCursor ruleCursor = rulesCursor.childElementCursor();
+
+ String repositoryKey = null, key = null;
+ RulePriority priority = null;
+ parameters.clear();
+
+ while (ruleCursor.getNext() != null) {
+ String nodeName = ruleCursor.getLocalName();
+
+ if (StringUtils.equals("repositoryKey", nodeName)) {
+ repositoryKey = StringUtils.trim(ruleCursor.collectDescendantText(false));
+
+ } else if (StringUtils.equals("key", nodeName)) {
+ key = StringUtils.trim(ruleCursor.collectDescendantText(false));
+
+ } else if (StringUtils.equals("priority", nodeName)) {
+ priority = RulePriority.valueOf(StringUtils.trim(ruleCursor.collectDescendantText(false)));
+
+ } else if (StringUtils.equals("parameters", nodeName)) {
+ SMInputCursor propsCursor = ruleCursor.childElementCursor("parameter");
+ processParameters(propsCursor, parameters);
+ }
+ }
+
+ Rule rule = ruleFinder.findByKey(repositoryKey, key);
+ if (rule == null) {
+ messages.addWarningText("Rule not found: [repository=" + repositoryKey + ", key=" + key + "]");
+
+ } else {
+ ActiveRule activeRule = profile.activateRule(rule, priority);
+ for (Map.Entry<String, String> entry : parameters.entrySet()) {
+ if (rule.getParam(entry.getKey()) == null) {
+ messages.addWarningText("The parameter '" + entry.getKey() + "' does not exist in the rule: [repository=" + repositoryKey + ", key=" + key + "]");
+ } else {
+ activeRule.setParameter(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+ }
+ }
+
+ private void processParameters(SMInputCursor propsCursor, Map<String, String> parameters) throws XMLStreamException {
+ while (propsCursor.getNext() != null) {
+ SMInputCursor propCursor = propsCursor.childElementCursor();
+ String key = null;
+ String value = null;
+ while (propCursor.getNext() != null) {
+ String nodeName = propCursor.getLocalName();
+ if (StringUtils.equals("key", nodeName)) {
+ key = StringUtils.trim(propCursor.collectDescendantText(false));
+
+ } else if (StringUtils.equals("value", nodeName)) {
+ value = StringUtils.trim(propCursor.collectDescendantText(false));
+ }
+ }
+ if (key != null) {
+ parameters.put(key, value);
+ }
+ }
+ }
+
+
+}
--- /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.profiles;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.ServerComponent;
+import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.ActiveRuleParam;
+import org.sonar.api.utils.SonarException;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * @since 2.3
+ */
+public final class XMLProfileSerializer implements ServerComponent {
+
+ public void write(RulesProfile profile, Writer writer) {
+ try {
+ appendHeader(profile, writer);
+ appendRules(profile, writer);
+ appendFooter(writer);
+
+ } catch (IOException e) {
+ throw new SonarException("Fail to export the profile " + profile, e);
+ }
+ }
+
+ private void appendHeader(RulesProfile profile, Writer writer) throws IOException {
+ writer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ + "<!-- Generated by Sonar -->"
+ + "<profile><name>");
+ StringEscapeUtils.escapeXml(writer, profile.getName());
+ writer.append("</name><language>");
+ StringEscapeUtils.escapeXml(writer, profile.getLanguage());
+ writer.append("</language>");
+ }
+
+ private void appendRules(RulesProfile profile, Writer writer) throws IOException {
+ if (!profile.getActiveRules().isEmpty()) {
+ writer.append("<rules>");
+ for (ActiveRule activeRule : profile.getActiveRules()) {
+ appendRule(activeRule, writer);
+ }
+ writer.append("</rules>");
+ }
+ }
+
+ private void appendRule(ActiveRule activeRule, Writer writer) throws IOException {
+ writer.append("<rule><repositoryKey>");
+ writer.append(activeRule.getRepositoryKey());
+ writer.append("</repositoryKey><key>");
+ StringEscapeUtils.escapeXml(writer, activeRule.getRuleKey());
+ writer.append("</key>");
+ if (activeRule.getPriority() != null) {
+ writer.append("<priority>");
+ writer.append(activeRule.getPriority().name());
+ writer.append("</priority>");
+ }
+ appendRuleParameters(activeRule, writer);
+ writer.append("</rule>");
+ }
+
+ private void appendRuleParameters(ActiveRule activeRule, Writer writer) throws IOException {
+ if (activeRule.getActiveRuleParams() != null && !activeRule.getActiveRuleParams().isEmpty()) {
+ writer.append("<parameters>");
+ for (ActiveRuleParam activeRuleParam : activeRule.getActiveRuleParams()) {
+ appendRuleParameter(writer, activeRuleParam);
+ }
+ writer.append("</parameters>");
+ }
+ }
+
+ private void appendRuleParameter(Writer writer, ActiveRuleParam activeRuleParam) throws IOException {
+ if (StringUtils.isNotBlank(activeRuleParam.getValue())) {
+ writer.append("<parameter><key>");
+ StringEscapeUtils.escapeXml(writer, activeRuleParam.getKey());
+ writer.append("</key><value>");
+ StringEscapeUtils.escapeXml(writer, activeRuleParam.getValue());
+ writer.append("</value>");
+ writer.append("</parameter>");
+ }
+ }
+
+ private void appendFooter(Writer writer) throws IOException {
+ writer.append("</profile>");
+ }
+}
return name;
}
- public abstract Model create();
+ public abstract Model createModel();
@Override
public final boolean equals(Object o) {
+++ /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.profiles;
-
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RulePriority;
-import org.sonar.api.utils.ValidationMessages;
-import org.sonar.check.BelongsToProfile;
-import org.sonar.check.Check;
-import org.sonar.check.IsoCategory;
-import org.sonar.check.Priority;
-
-import java.util.Arrays;
-import java.util.Collection;
-
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AnnotationProfileDefinitionTest {
-
- @Test
- public void importProfile() {
- RuleFinder ruleFinder = mock(RuleFinder.class);
- when(ruleFinder.findByKey(anyString(), anyString())).thenAnswer(new Answer<Rule>(){
- public Rule answer(InvocationOnMock iom) throws Throwable {
- return Rule.create((String)iom.getArguments()[0], (String)iom.getArguments()[1], (String)iom.getArguments()[1]);
- }
- });
-
- ProfileDefinition definition = new FakeDefinition(ruleFinder);
- ValidationMessages validation = ValidationMessages.create();
- RulesProfile profile = definition.createProfile(validation);
- assertThat(profile.getActiveRule("squid", "fake").getPriority(), is(RulePriority.BLOCKER));
- assertThat(validation.hasErrors(), is(false));
- }
-}
-
-@BelongsToProfile(title = "not used !", priority = Priority.BLOCKER)
-@Check(key = "fake", isoCategory = IsoCategory.Efficiency, priority = Priority.CRITICAL)
-class FakeRule {
-
-}
-
-
-class FakeDefinition extends AnnotationProfileDefinition {
-
- public FakeDefinition(RuleFinder ruleFinder) {
- super("squid", "sonar way", "java", Arrays.<Class>asList(FakeRule.class), ruleFinder);
- }
-}
\ No newline at end of file
--- /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.profiles;
+
+import com.google.common.collect.Lists;
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.ValidationMessages;
+import org.sonar.check.BelongsToProfile;
+import org.sonar.check.IsoCategory;
+import org.sonar.check.Priority;
+
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class AnnotationProfileParserTest {
+
+ @Test
+ public void shouldParseAnnotatedClasses() {
+ RuleFinder ruleFinder = mock(RuleFinder.class);
+ when(ruleFinder.findByKey(anyString(), anyString())).thenAnswer(new Answer<Rule>() {
+ public Rule answer(InvocationOnMock iom) throws Throwable {
+ return Rule.create((String) iom.getArguments()[0], (String) iom.getArguments()[1], (String) iom.getArguments()[1]);
+ }
+ });
+
+ ValidationMessages messages = ValidationMessages.create();
+ RulesProfile profile = new AnnotationProfileParser(ruleFinder).parse("squid", "Foo way", "java", Lists.<Class>newArrayList(FakeRule.class), messages);
+
+ assertThat(profile.getName(), is("Foo way"));
+ assertThat(profile.getLanguage(), is("java"));
+ assertThat(profile.getActiveRule("squid", "fake").getPriority(), is(RulePriority.BLOCKER));
+ assertThat(messages.hasErrors(), is(false));
+ }
+
+ @Test
+ public void shouldParseOnlyWantedProfile() {
+ RuleFinder ruleFinder = mock(RuleFinder.class);
+ when(ruleFinder.findByKey(anyString(), anyString())).thenAnswer(new Answer<Rule>() {
+ public Rule answer(InvocationOnMock iom) throws Throwable {
+ return Rule.create((String) iom.getArguments()[0], (String) iom.getArguments()[1], (String) iom.getArguments()[1]);
+ }
+ });
+
+ ValidationMessages messages = ValidationMessages.create();
+ RulesProfile profile = new AnnotationProfileParser(ruleFinder).parse("squid", "Foo way", "java", Lists.<Class>newArrayList(FakeRule.class, RuleOnOtherProfile.class), messages);
+
+ assertNotNull(profile.getActiveRule("squid", "fake"));
+ assertNull(profile.getActiveRule("squid", "other"));
+ }
+}
+
+@BelongsToProfile(title = "Other profile", priority = Priority.BLOCKER)
+@org.sonar.check.Rule(key = "other", isoCategory = IsoCategory.Efficiency, priority = Priority.CRITICAL)
+class RuleOnOtherProfile {
+}
+
+@BelongsToProfile(title = "Foo way", priority = Priority.BLOCKER)
+@org.sonar.check.Rule(key = "fake", isoCategory = IsoCategory.Efficiency, priority = Priority.CRITICAL)
+class FakeRule {
+}
+++ /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.profiles;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.CharUtils;
-import org.custommonkey.xmlunit.Diff;
-import org.custommonkey.xmlunit.XMLUnit;
-import org.junit.Test;
-import org.sonar.api.rules.ActiveRule;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RulePriority;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.io.Writer;
-
-import static org.junit.Assert.assertTrue;
-
-public class XMLProfileExporterTest {
-
- @Test
- public void exportEmptyProfile() throws IOException, SAXException {
- Writer writer = new StringWriter();
- RulesProfile profile = RulesProfile.create("sonar way", "java");
- XMLProfileExporter.create().exportProfile(profile, writer);
-
- assertSimilarXml("/org/sonar/api/profiles/XMLProfileExporterTest/exportEmptyProfile.xml", writer.toString());
- }
-
- @Test
- public void exportProfile() throws IOException, SAXException {
- Writer writer = new StringWriter();
- RulesProfile profile = RulesProfile.create("sonar way", "java");
- profile.activateRule(Rule.create("checkstyle", "IllegalRegexp", "illegal regexp"), RulePriority.BLOCKER);
- XMLProfileExporter.create().exportProfile(profile, writer);
-
- assertSimilarXml("/org/sonar/api/profiles/XMLProfileExporterTest/exportProfile.xml", writer.toString());
- }
-
- @Test
- public void exportRuleParameters() throws IOException, SAXException {
- Writer writer = new StringWriter();
- RulesProfile profile = RulesProfile.create("sonar way", "java");
- Rule rule = Rule.create("checkstyle", "IllegalRegexp", "illegal regexp");
- rule.createParameter("format");
- rule.createParameter("message");
- rule.createParameter("tokens");
-
- ActiveRule activeRule = profile.activateRule(rule, RulePriority.BLOCKER);
- activeRule.setParameter("format", "foo");
- activeRule.setParameter("message", "with special characters < > &");
- // the tokens parameter is not set
- XMLProfileExporter.create().exportProfile(profile, writer);
-
- assertSimilarXml("/org/sonar/api/profiles/XMLProfileExporterTest/exportRuleParameters.xml", writer.toString());
- }
-
- public static void assertSimilarXml(String pathToExpectedXml, String xml) throws IOException, SAXException {
- InputStream stream = XMLProfileExporterTest.class.getResourceAsStream(pathToExpectedXml);
- try {
- Diff diff = isSimilarXml(IOUtils.toString(stream), xml);
- String message = "Diff: " + diff.toString() + CharUtils.LF + "XML: " + xml;
- assertTrue(message, diff.similar());
-
- } finally {
- IOUtils.closeQuietly(stream);
- }
- }
-
- static Diff isSimilarXml(String expectedXml, String xml) throws IOException, SAXException {
- XMLUnit.setIgnoreWhitespace(true);
- Diff diff = XMLUnit.compareXML(xml, expectedXml);
- return diff;
- }
-}
+++ /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.profiles;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.CharEncoding;
-import org.junit.Test;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-import org.sonar.api.rules.ActiveRule;
-import org.sonar.api.rules.Rule;
-import org.sonar.api.rules.RuleFinder;
-import org.sonar.api.rules.RulePriority;
-import org.sonar.api.utils.ValidationMessages;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.internal.matchers.StringContains.containsString;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class XMLProfileImporterTest {
-
- @Test
- public void importProfile() throws UnsupportedEncodingException {
- Reader reader = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/api/profiles/XMLProfileImporterTest/importProfile.xml"), CharEncoding.UTF_8);
- try {
- ValidationMessages validation = ValidationMessages.create();
- RuleFinder ruleFinder = newRuleFinder();
- RulesProfile profile = XMLProfileImporter.create(ruleFinder).importProfile(reader, validation);
-
- assertThat(profile.getLanguage(), is("java"));
- assertThat(profile.getName(), is("sonar way"));
- assertThat(validation.hasErrors(), is(false));
- assertNotNull(profile);
- assertThat(profile.getActiveRule("checkstyle", "IllegalRegexp").getPriority(), is(RulePriority.CRITICAL));
-
- } finally {
- IOUtils.closeQuietly(reader);
- }
- }
-
- @Test
- public void nameAndLanguageShouldBeMandatory() throws UnsupportedEncodingException {
- Reader reader = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/api/profiles/XMLProfileImporterTest/nameAndLanguageShouldBeMandatory.xml"), CharEncoding.UTF_8);
- try {
- ValidationMessages validation = ValidationMessages.create();
- RuleFinder ruleFinder = newRuleFinder();
- RulesProfile profile = XMLProfileImporter.create(ruleFinder).importProfile(reader, validation);
-
- assertThat(validation.getErrors().size(), is(2));
- assertThat(validation.getErrors().get(0) , containsString(""));
-
- } finally {
- IOUtils.closeQuietly(reader);
- }
- }
-
- @Test
- public void importProfileWithRuleParameters() throws UnsupportedEncodingException {
- Reader reader = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/api/profiles/XMLProfileImporterTest/importProfileWithRuleParameters.xml"), CharEncoding.UTF_8);
- try {
- ValidationMessages validation = ValidationMessages.create();
- RuleFinder ruleFinder = newRuleFinder();
- RulesProfile profile = XMLProfileImporter.create(ruleFinder).importProfile(reader, validation);
-
- assertThat(validation.hasErrors(), is(false));
- assertThat(validation.hasWarnings(), is(false));
- ActiveRule rule = profile.getActiveRule("checkstyle", "IllegalRegexp");
- assertThat(rule.getParameter("format"), is("foo"));
- assertThat(rule.getParameter("message"), is("with special characters < > &"));
-
- } finally {
- IOUtils.closeQuietly(reader);
- }
- }
-
- @Test
- public void importProfileWithUnknownRuleParameter() throws UnsupportedEncodingException {
- Reader reader = new InputStreamReader(getClass().getResourceAsStream("/org/sonar/api/profiles/XMLProfileImporterTest/importProfileWithUnknownRuleParameter.xml"), CharEncoding.UTF_8);
- try {
- ValidationMessages validation = ValidationMessages.create();
- RuleFinder ruleFinder = newRuleFinder();
- RulesProfile profile = XMLProfileImporter.create(ruleFinder).importProfile(reader, validation);
-
- assertThat(validation.getWarnings().size(), is(1));
- ActiveRule rule = profile.getActiveRule("checkstyle", "IllegalRegexp");
- assertThat(rule.getParameter("unknown"), nullValue());
-
- } finally {
- IOUtils.closeQuietly(reader);
- }
- }
-
- private RuleFinder newRuleFinder() {
- RuleFinder ruleFinder = mock(RuleFinder.class);
- when(ruleFinder.findByKey(anyString(), anyString())).thenAnswer(new Answer<Rule>(){
- public Rule answer(InvocationOnMock iom) throws Throwable {
- Rule rule = Rule.create((String) iom.getArguments()[0], (String) iom.getArguments()[1], (String) iom.getArguments()[1]);
- rule.createParameter("format");
- rule.createParameter("message");
- return rule;
- }
- });
- return ruleFinder;
- }
-}
\ No newline at end of file
--- /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.profiles;
+
+import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RuleFinder;
+import org.sonar.api.rules.RulePriority;
+import org.sonar.api.utils.ValidationMessages;
+
+import java.io.UnsupportedEncodingException;
+
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.internal.matchers.StringContains.containsString;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class XMLProfileParserTest {
+
+ @Test
+ public void importProfile() throws UnsupportedEncodingException {
+ ValidationMessages validation = ValidationMessages.create();
+ RuleFinder ruleFinder = newRuleFinder();
+ RulesProfile profile = new XMLProfileParser(ruleFinder).parseResource(getClass().getClassLoader(), "org/sonar/api/profiles/XMLProfileParserTest/importProfile.xml", validation);
+
+ assertThat(profile.getLanguage(), is("java"));
+ assertThat(profile.getName(), is("sonar way"));
+ assertThat(validation.hasErrors(), is(false));
+ assertNotNull(profile);
+ assertThat(profile.getActiveRule("checkstyle", "IllegalRegexp").getPriority(), is(RulePriority.CRITICAL));
+ }
+
+ @Test
+ public void nameAndLanguageShouldBeMandatory() throws UnsupportedEncodingException {
+ ValidationMessages validation = ValidationMessages.create();
+ RuleFinder ruleFinder = newRuleFinder();
+ RulesProfile profile = new XMLProfileParser(ruleFinder).parseResource(getClass().getClassLoader(), "org/sonar/api/profiles/XMLProfileParserTest/nameAndLanguageShouldBeMandatory.xml", validation);
+
+ assertThat(validation.getErrors().size(), is(2));
+ assertThat(validation.getErrors().get(0), containsString(""));
+
+ }
+
+ @Test
+ public void importProfileWithRuleParameters() throws UnsupportedEncodingException {
+ ValidationMessages validation = ValidationMessages.create();
+ RuleFinder ruleFinder = newRuleFinder();
+ RulesProfile profile = new XMLProfileParser(ruleFinder).parseResource(getClass().getClassLoader(), "org/sonar/api/profiles/XMLProfileParserTest/importProfileWithRuleParameters.xml", validation);
+
+ assertThat(validation.hasErrors(), is(false));
+ assertThat(validation.hasWarnings(), is(false));
+ ActiveRule rule = profile.getActiveRule("checkstyle", "IllegalRegexp");
+ assertThat(rule.getParameter("format"), is("foo"));
+ assertThat(rule.getParameter("message"), is("with special characters < > &"));
+ }
+
+ @Test
+ public void importProfileWithUnknownRuleParameter() throws UnsupportedEncodingException {
+ ValidationMessages validation = ValidationMessages.create();
+ RuleFinder ruleFinder = newRuleFinder();
+ RulesProfile profile = new XMLProfileParser(ruleFinder).parseResource(getClass().getClassLoader(), "org/sonar/api/profiles/XMLProfileParserTest/importProfileWithUnknownRuleParameter.xml", validation);
+
+ assertThat(validation.getWarnings().size(), is(1));
+ ActiveRule rule = profile.getActiveRule("checkstyle", "IllegalRegexp");
+ assertThat(rule.getParameter("unknown"), nullValue());
+ }
+
+ private RuleFinder newRuleFinder() {
+ RuleFinder ruleFinder = mock(RuleFinder.class);
+ when(ruleFinder.findByKey(anyString(), anyString())).thenAnswer(new Answer<Rule>() {
+ public Rule answer(InvocationOnMock iom) throws Throwable {
+ Rule rule = Rule.create((String) iom.getArguments()[0], (String) iom.getArguments()[1], (String) iom.getArguments()[1]);
+ rule.createParameter("format");
+ rule.createParameter("message");
+ return rule;
+ }
+ });
+ return ruleFinder;
+ }
+}
\ No newline at end of file
--- /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.profiles;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.CharUtils;
+import org.custommonkey.xmlunit.Diff;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Test;
+import org.sonar.api.rules.ActiveRule;
+import org.sonar.api.rules.Rule;
+import org.sonar.api.rules.RulePriority;
+import org.xml.sax.SAXException;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import static org.junit.Assert.assertTrue;
+
+public class XMLProfileSerializerTest {
+
+ @Test
+ public void exportEmptyProfile() throws IOException, SAXException {
+ Writer writer = new StringWriter();
+ RulesProfile profile = RulesProfile.create("sonar way", "java");
+ new XMLProfileSerializer().write(profile, writer);
+
+ assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportEmptyProfile.xml", writer.toString());
+ }
+
+ @Test
+ public void exportProfile() throws IOException, SAXException {
+ Writer writer = new StringWriter();
+ RulesProfile profile = RulesProfile.create("sonar way", "java");
+ profile.activateRule(Rule.create("checkstyle", "IllegalRegexp", "illegal regexp"), RulePriority.BLOCKER);
+ new XMLProfileSerializer().write(profile, writer);
+
+ assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportProfile.xml", writer.toString());
+ }
+
+ @Test
+ public void exportRuleParameters() throws IOException, SAXException {
+ Writer writer = new StringWriter();
+ RulesProfile profile = RulesProfile.create("sonar way", "java");
+ Rule rule = Rule.create("checkstyle", "IllegalRegexp", "illegal regexp");
+ rule.createParameter("format");
+ rule.createParameter("message");
+ rule.createParameter("tokens");
+
+ ActiveRule activeRule = profile.activateRule(rule, RulePriority.BLOCKER);
+ activeRule.setParameter("format", "foo");
+ activeRule.setParameter("message", "with special characters < > &");
+ // the tokens parameter is not set
+ new XMLProfileSerializer().write(profile, writer);
+
+ assertSimilarXml("/org/sonar/api/profiles/XMLProfileSerializerTest/exportRuleParameters.xml", writer.toString());
+ }
+
+ public static void assertSimilarXml(String pathToExpectedXml, String xml) throws IOException, SAXException {
+ InputStream stream = XMLProfileSerializerTest.class.getResourceAsStream(pathToExpectedXml);
+ try {
+ Diff diff = isSimilarXml(IOUtils.toString(stream), xml);
+ String message = "Diff: " + diff.toString() + CharUtils.LF + "XML: " + xml;
+ assertTrue(message, diff.similar());
+
+ } finally {
+ IOUtils.closeQuietly(stream);
+ }
+ }
+
+ static Diff isSimilarXml(String expectedXml, String xml) throws IOException, SAXException {
+ XMLUnit.setIgnoreWhitespace(true);
+ Diff diff = XMLUnit.compareXML(xml, expectedXml);
+ return diff;
+ }
+}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>BLOCKER</priority>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>BLOCKER</priority>
- <parameters>
- <parameter>
- <key>format</key>
- <value>foo</value>
- </parameter>
- <parameter>
- <key>message</key>
- <value>with special characters < > &</value>
- </parameter>
- </parameters>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>CRITICAL</priority>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>BLOCKER</priority>
- <parameters>
- <parameter>
- <key>format</key>
- <value>foo</value>
- </parameter>
- <parameter>
- <key>message</key>
- <value>with special characters < > &</value>
- </parameter>
- </parameters>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <name>sonar way</name>
- <language>java</language>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>BLOCKER</priority>
- <parameters>
- <parameter>
- <key>unknown</key>
- <value>foo</value>
- </parameter>
- </parameters>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated by Sonar -->
-<profile>
- <rules>
- <rule>
- <repositoryKey>checkstyle</repositoryKey>
- <key>IllegalRegexp</key>
- <priority>CRITICAL</priority>
- </rule>
- </rules>
-</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>CRITICAL</priority>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>BLOCKER</priority>
+ <parameters>
+ <parameter>
+ <key>format</key>
+ <value>foo</value>
+ </parameter>
+ <parameter>
+ <key>message</key>
+ <value>with special characters < > &</value>
+ </parameter>
+ </parameters>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>BLOCKER</priority>
+ <parameters>
+ <parameter>
+ <key>unknown</key>
+ <value>foo</value>
+ </parameter>
+ </parameters>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>CRITICAL</priority>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>BLOCKER</priority>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated by Sonar -->
+<profile>
+ <name>sonar way</name>
+ <language>java</language>
+ <rules>
+ <rule>
+ <repositoryKey>checkstyle</repositoryKey>
+ <key>IllegalRegexp</key>
+ <priority>BLOCKER</priority>
+ <parameters>
+ <parameter>
+ <key>format</key>
+ <value>foo</value>
+ </parameter>
+ <parameter>
+ <key>message</key>
+ <value>with special characters < > &</value>
+ </parameter>
+ </parameters>
+ </rule>
+ </rules>
+</profile>
\ No newline at end of file
import org.sonar.api.database.configuration.DatabaseConfiguration;
import org.sonar.api.platform.Environment;
import org.sonar.api.platform.Server;
+import org.sonar.api.profiles.AnnotationProfileParser;
+import org.sonar.api.profiles.XMLProfileParser;
+import org.sonar.api.profiles.XMLProfileSerializer;
import org.sonar.api.resources.Languages;
import org.sonar.api.rules.DefaultRulesManager;
import org.sonar.api.utils.HttpDownloader;
servicesContainer.as(Characteristics.NO_CACHE).addComponent(Backup.class);
servicesContainer.as(Characteristics.CACHE).addComponent(AuthenticatorFactory.class);
servicesContainer.as(Characteristics.CACHE).addComponent(ServerLifecycleNotifier.class);
+ 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(DefaultRuleFinder.class);
servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedRuleRepositories.class);
servicesContainer.as(Characteristics.CACHE).addComponent(DeprecatedProfiles.class);
for (ModelDefinition definition : definitions) {
if (StringUtils.isNotBlank(definition.getName()) && !exists(session, definition.getName())) {
Logs.INFO.info("Register quality model: " + definition.getName());
- Model model = definition.create();
+ Model model = definition.createModel();
if (StringUtils.isBlank(model.getName())) {
model.setName(definition.getName());
}
}
LoggerFactory.getLogger(getClass()).info("Reset quality model: " + name);
- Model model = definition.create();
+ Model model = definition.createModel();
return reset(model);
}
public final class ProfilesConsole implements ServerComponent {
private DatabaseSessionFactory sessionFactory;
- private RuleFinder ruleFinder;
+ private XMLProfileParser xmlProfileParser;
+ private XMLProfileSerializer xmlProfileSerializer;
private List<ProfileExporter> exporters = new ArrayList<ProfileExporter>();
private List<ProfileImporter> importers = new ArrayList<ProfileImporter>();
- public ProfilesConsole(DatabaseSessionFactory sessionFactory, RuleFinder ruleFinder,
+ public ProfilesConsole(DatabaseSessionFactory sessionFactory, XMLProfileParser xmlProfileParser, XMLProfileSerializer xmlProfileSerializer,
ProfileExporter[] exporters, DeprecatedProfileExporters deprecatedExporters,
ProfileImporter[] importers, DeprecatedProfileImporters deprecatedImporters) {
- this.ruleFinder = ruleFinder;
+ this.xmlProfileParser = xmlProfileParser;
+ this.xmlProfileSerializer = xmlProfileSerializer;
this.sessionFactory = sessionFactory;
initProfileExporters(exporters, deprecatedExporters);
initProfileImporters(importers, deprecatedImporters);
RulesProfile profile = loadProfile(session, profileId);
if (profile != null) {
Writer writer = new StringWriter();
- XMLProfileExporter.create().exportProfile(profile, writer);
+ xmlProfileSerializer.write(profile, writer);
return writer.toString();
}
return null;
public ValidationMessages restoreProfile(String xmlBackup) {
ValidationMessages messages = ValidationMessages.create();
- RulesProfile profile = XMLProfileImporter.create(ruleFinder).importProfile(new StringReader(xmlBackup), messages);
+ RulesProfile profile = xmlProfileParser.parse(new StringReader(xmlBackup), messages);
if (profile != null) {
DatabaseSession session = sessionFactory.getSession();
RulesProfile existingProfile = session.getSingleResult(RulesProfile.class, "name", profile.getName(), "language", profile.getLanguage());
*/
package org.sonar.server.startup;
+import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOGGER = LoggerFactory.getLogger(RegisterProvidedProfiles.class);
private DatabaseSessionFactory sessionFactory;
- private List<ProfileDefinition> definitions = new ArrayList<ProfileDefinition>();
+ private List<ProfileDefinition> definitions = Lists.newArrayList();
private DeprecatedProfiles deprecatedProfiles = null;
private RuleFinder ruleFinder;
}
List<RulesProfile> createProfiles() {
- List<RulesProfile> result = new ArrayList<RulesProfile>();
+ List<RulesProfile> result = Lists.newArrayList();
// this must not be moved in the constructor, because rules are still not saved
definitions.addAll(deprecatedProfiles.getProfiles());
}
@Override
- public Model create() {
+ public Model createModel() {
return model;
}
import org.sonar.api.rules.Rule;
import org.sonar.api.rules.RulePriority;
import org.sonar.api.utils.ValidationMessages;
-import org.sonar.server.rules.DeprecatedProfiles;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsNull.nullValue;
public class DeprecatedProfilesTest {
@Test
- public void testCreate() {
+ public void shouldCreateProfile() {
DeprecatedProfiles.DefaultProfileDefinition def = DeprecatedProfiles.DefaultProfileDefinition.create("sonar way", "java");
assertThat(def.createProfile(ValidationMessages.create()).getName(), is("sonar way"));
assertThat(def.createProfile(ValidationMessages.create()).getLanguage(), is("java"));