diff options
author | simonbrandhof <simon.brandhof@gmail.com> | 2010-09-10 12:27:33 +0000 |
---|---|---|
committer | simonbrandhof <simon.brandhof@gmail.com> | 2010-09-10 12:27:33 +0000 |
commit | 5cd839bbecd061d9463694d025788754bfca0f08 (patch) | |
tree | 6140b78f770fd0ab9654784e2068e80dadfb6345 /sonar-plugin-api | |
parent | 5c90df84c8d4c69c38868736bd28cb61f89d4b31 (diff) | |
download | sonarqube-5cd839bbecd061d9463694d025788754bfca0f08.tar.gz sonarqube-5cd839bbecd061d9463694d025788754bfca0f08.zip |
simplify ValidationMessages and ProfileDefinition
Diffstat (limited to 'sonar-plugin-api')
8 files changed, 168 insertions, 71 deletions
diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/AnnotationProfileDefinition.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/AnnotationProfileDefinition.java index b071a24df8e..c33c9bff795 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/AnnotationProfileDefinition.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/AnnotationProfileDefinition.java @@ -30,18 +30,21 @@ import java.util.Collection; */ public abstract class AnnotationProfileDefinition extends ProfileDefinition { + private String name; + private String language; private String repositoryKey; private Collection<Class> annotatedClasses; protected AnnotationProfileDefinition(String repositoryKey, String profileName, String language, Collection<Class> annotatedClasses) { - super(profileName, language); + this.name = profileName; + this.language = language; this.repositoryKey = repositoryKey; this.annotatedClasses = annotatedClasses; } @Override public ProfilePrototype createPrototype() { - ProfilePrototype profile = ProfilePrototype.create(); + ProfilePrototype profile = ProfilePrototype.create(name, language); if (annotatedClasses != null) { for (Class aClass : annotatedClasses) { BelongsToProfile belongsToProfile = (BelongsToProfile) aClass.getAnnotation(BelongsToProfile.class); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileDefinition.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileDefinition.java index c722e5f7c5e..8a8043c720f 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileDefinition.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileDefinition.java @@ -26,40 +26,6 @@ import org.sonar.api.ServerExtension; */ public abstract class ProfileDefinition implements ServerExtension { - private String name; - private String language; - - protected ProfileDefinition() { - } - - protected ProfileDefinition(String profileName, String language) { - this.name = profileName; - this.language = language; - } - - public final String getName() { - return name; - } - - public final ProfileDefinition setName(String s) { - this.name = s; - return this; - } - - public final String getLanguage() { - return language; - } - - public final ProfileDefinition setLanguage(String s) { - this.language = s; - return this; - } - public abstract ProfilePrototype createPrototype(); - - @Override - public final String toString() { - return new StringBuilder().append("[name=").append(name).append(",language=").append(language).append("]").toString(); - } }
\ No newline at end of file diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileExporter.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileExporter.java index 58e9a6b0b0e..6a495bb508a 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileExporter.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfileExporter.java @@ -20,6 +20,8 @@ package org.sonar.api.profiles; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; import org.sonar.api.BatchExtension; import org.sonar.api.ServerExtension; @@ -102,4 +104,14 @@ public abstract class ProfileExporter implements BatchExtension, ServerExtension public final int hashCode() { return key != null ? key.hashCode() : 0; } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) + .append("key", key) + .append("name", name) + .append("mimeType", mimeType) + .append("languages", supportedLanguages) + .toString(); + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfilePrototype.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfilePrototype.java index 979981a85b8..cab5516bebe 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfilePrototype.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/ProfilePrototype.java @@ -20,6 +20,9 @@ package org.sonar.api.profiles; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.sonar.api.BatchComponent; import org.sonar.api.rules.RulePriority; import java.util.ArrayList; @@ -30,8 +33,10 @@ import java.util.Map; /** * @since 2.3 */ -public final class ProfilePrototype { +public final class ProfilePrototype implements BatchComponent { + private String name; + private String language; private List<RulePrototype> rules = new ArrayList<RulePrototype>(); private ProfilePrototype() { @@ -41,6 +46,28 @@ public final class ProfilePrototype { return new ProfilePrototype(); } + public static ProfilePrototype create(String name, String language) { + return new ProfilePrototype().setName(name).setLanguage(language); + } + + public final String getName() { + return name; + } + + public final ProfilePrototype setName(String s) { + this.name = s; + return this; + } + + public final String getLanguage() { + return language; + } + + public final ProfilePrototype setLanguage(String s) { + this.language = s; + return this; + } + public List<RulePrototype> getRules() { return rules; } @@ -57,7 +84,8 @@ public final class ProfilePrototype { public RulePrototype getRule(String repositoryKey, String key) { for (RulePrototype rule : rules) { - if (StringUtils.equals(repositoryKey, rule.getRepositoryKey()) && StringUtils.equals(key, rule.getKey())) { + if (StringUtils.equals(repositoryKey, rule.getRepositoryKey()) && + StringUtils.equals(key, rule.getKey())) { return rule; } } @@ -66,7 +94,8 @@ public final class ProfilePrototype { public RulePrototype getRuleByConfigKey(String repositoryKey, String configKey) { for (RulePrototype rule : rules) { - if (StringUtils.equals(repositoryKey, rule.getRepositoryKey()) && StringUtils.equals(configKey, rule.getConfigKey())) { + if (StringUtils.equals(repositoryKey, rule.getRepositoryKey()) && + StringUtils.equals(configKey, rule.getConfigKey())) { return rule; } } @@ -74,7 +103,6 @@ public final class ProfilePrototype { } /** - * * @param repositoryKey * @param key * @param nullablePriority if null, then the default rule priority is used. @@ -92,11 +120,23 @@ public final class ProfilePrototype { return rule; } + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) + .append("name", name) + .append("language", language) + .toString(); + } + public static final class RulePrototype { private String repositoryKey; + private String key; + private String configKey; + private RulePriority priority = null; + private Map<String, String> parameters = new HashMap<String, String>(); private RulePrototype() { diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileDefinition.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileDefinition.java index fec2423c0f9..24888c0086d 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileDefinition.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileDefinition.java @@ -34,11 +34,14 @@ import java.util.List; */ public abstract class XMLProfileDefinition extends ProfileDefinition { + private String name; + private String language; private ClassLoader classloader; private String xmlClassPath; protected XMLProfileDefinition(String name, String language, ClassLoader classloader, String xmlClassPath) { - super(name, language); + this.name = name; + this.language = language; this.classloader = classloader; this.xmlClassPath = xmlClassPath; } @@ -49,6 +52,8 @@ public abstract class XMLProfileDefinition extends ProfileDefinition { try { ValidationMessages validation = ValidationMessages.create(); ProfilePrototype profile = XMLProfileImporter.create().importProfile(reader, validation); + profile.setName(name); + profile.setLanguage(language); if (validation.hasErrors()) { // TODO do not loose messages throw new SonarException("Fail to parse the file: " + xmlClassPath); @@ -59,8 +64,4 @@ public abstract class XMLProfileDefinition extends ProfileDefinition { IOUtils.closeQuietly(reader); } } - -// public static XMLProfileDefinition create(String name, String language, ClassLoader classloader, String xmlClassloaderPath) { -// return new XMLProfileDefinition(name, language).setClassloader(classloader).setXmlClassPath(xmlClassloaderPath); -// } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileImporter.java b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileImporter.java index b00a1bb0ffc..92f3946b4a6 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileImporter.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/profiles/XMLProfileImporter.java @@ -67,7 +67,7 @@ public final class XMLProfileImporter { } } } catch (XMLStreamException e) { - messages.addError("unvalidXml", "XML is not valid: " + e.getMessage()); + messages.addErrorText("XML is not valid: " + e.getMessage()); } return profile; } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java index 4813f447fd3..c76c0bfcaf9 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/ValidationMessages.java @@ -19,15 +19,22 @@ */ package org.sonar.api.utils; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.slf4j.Logger; + import java.util.ArrayList; import java.util.List; public final class ValidationMessages { - private List<Message> errors = new ArrayList<Message>(); - private List<Message> warnings = new ArrayList<Message>(); - private List<Message> infos = new ArrayList<Message>(); + private List<String> errors = new ArrayList<String>(); + private List<String> warnings = new ArrayList<String>(); + private List<String> infos = new ArrayList<String>(); + /** + * Use the factory method <code>create()</code> + */ ValidationMessages() { } @@ -39,16 +46,16 @@ public final class ValidationMessages { return !errors.isEmpty(); } - public List<Message> getErrors() { + public List<String> getErrors() { return errors; } - public ValidationMessages addError(String key, String label) { - errors.add(new Message(key, label)); + public ValidationMessages addErrorText(String text) { + errors.add(text); return this; } - public List<Message> getWarnings() { + public List<String> getWarnings() { return warnings; } @@ -56,12 +63,12 @@ public final class ValidationMessages { return !warnings.isEmpty(); } - public ValidationMessages addWarning(String key, String label) { - warnings.add(new Message(key, label)); + public ValidationMessages addWarningText(String text) { + warnings.add(text); return this; } - public List<Message> getInfos() { + public List<String> getInfos() { return infos; } @@ -69,26 +76,29 @@ public final class ValidationMessages { return !infos.isEmpty(); } - public ValidationMessages addInfo(String key, String label) { - infos.add(new Message(key, label)); + public ValidationMessages addInfoText(String text) { + infos.add(text); return this; } - public static final class Message { - private String key; - private String label; - - private Message(String key, String label) { - this.key = key; - this.label = label; + public void log(Logger logger) { + for (String error : getErrors()) { + logger.error(error); } - - public String getKey() { - return key; + for (String warning : getWarnings()) { + logger.warn(warning); } - - public String getLabel() { - return label; + for (String info : getInfos()) { + logger.info(info); } } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) + .append("errors", errors) + .append("warnings", warnings) + .append("infos", infos) + .toString(); + } } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java new file mode 100644 index 00000000000..ea52c4c3c73 --- /dev/null +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/ValidationMessagesTest.java @@ -0,0 +1,65 @@ +/* + * 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.utils; + +import org.junit.Test; +import org.slf4j.Logger; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.junit.internal.matchers.IsCollectionContaining.hasItem; +import static org.junit.internal.matchers.StringContains.containsString; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; + +public class ValidationMessagesTest { + + @Test + public void emptyMessages() { + ValidationMessages messages = ValidationMessages.create(); + assertThat(messages.hasErrors(), is(false)); + assertThat(messages.hasWarnings(), is(false)); + assertThat(messages.hasInfos(), is(false)); + + Logger logger = mock(Logger.class); + messages.log(logger); + verify(logger, never()).error(anyString()); + verify(logger, never()).warn(anyString()); + verify(logger, never()).info(anyString()); + } + + @Test + public void addError() { + ValidationMessages messages = ValidationMessages.create(); + messages.addErrorText("my error"); + assertThat(messages.hasErrors(), is(true)); + assertThat(messages.hasWarnings(), is(false)); + assertThat(messages.hasInfos(), is(false)); + assertThat(messages.getErrors().size(), is(1)); + assertThat(messages.getErrors(), hasItem("my error")); + assertThat(messages.toString(), containsString("my error")); + + Logger logger = mock(Logger.class); + messages.log(logger); + verify(logger, times(1)).error("my error"); + verify(logger, never()).warn(anyString()); + verify(logger, never()).info(anyString()); + } +} |