001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2011 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.api.checks.templates;
021
022 import org.apache.commons.io.IOUtils;
023 import org.sonar.api.profiles.RulesProfile;
024 import org.sonar.api.resources.Language;
025 import org.sonar.api.rules.Rule;
026 import org.sonar.api.rules.RuleParam;
027 import org.sonar.api.rules.RulePriority;
028 import org.sonar.api.rules.RulesRepository;
029
030 import java.io.InputStream;
031 import java.util.*;
032
033 /**
034 * @since 2.1 (experimental)
035 * @deprecated since 2.3
036 */
037 @Deprecated
038 public class CheckTemplateRepository implements RulesRepository {
039
040 private String key;
041 private Language language;
042 private List<CheckTemplate> templates;
043 private Map<String, CheckTemplate> templatesByKey;
044
045 public CheckTemplateRepository() {
046 }
047
048 public CheckTemplateRepository(String key) {
049 if (key == null) {
050 throw new IllegalArgumentException("Key can not be null");
051 }
052 this.key = key;
053 }
054
055 public String getKey() {
056 return key;
057 }
058
059 public CheckTemplateRepository setKey(String key) {
060 this.key = key;
061 return this;
062 }
063
064 public Language getLanguage() {
065 return language;
066 }
067
068 public CheckTemplateRepository setLanguage(Language l) {
069 this.language = l;
070 return this;
071 }
072
073 public List<CheckTemplate> getTemplates() {
074 if (templates == null) {
075 return Collections.emptyList();
076 }
077 return templates;
078 }
079
080 public CheckTemplateRepository setTemplates(List<CheckTemplate> c) {
081 this.templates = c;
082 return this;
083 }
084
085 public CheckTemplate getTemplate(String key) {
086 if (templatesByKey == null || templatesByKey.isEmpty()) {
087 templatesByKey = new HashMap<String, CheckTemplate>();
088 for (CheckTemplate template : templates) {
089 templatesByKey.put(template.getKey(), template);
090 }
091 }
092 return templatesByKey.get(key);
093 }
094
095 @Override
096 public boolean equals(Object o) {
097 if (this == o) {
098 return true;
099 }
100 if (o == null || getClass() != o.getClass()) {
101 return false;
102 }
103
104 CheckTemplateRepository that = (CheckTemplateRepository) o;
105 return key.equals(that.key);
106
107 }
108
109 @Override
110 public int hashCode() {
111 return key.hashCode();
112 }
113
114 public static CheckTemplateRepository createFromXml(String repositoryKey, Language language, String pathToXml) {
115 InputStream input = CheckTemplateRepository.class.getResourceAsStream(pathToXml);
116 try {
117 List<CheckTemplate> templates = new XmlCheckTemplateFactory().parse(input);
118 CheckTemplateRepository repository = new CheckTemplateRepository(repositoryKey);
119 repository.setTemplates(templates);
120 repository.setLanguage(language);
121 return repository;
122
123 } finally {
124 IOUtils.closeQuietly(input);
125 }
126 }
127
128 public static CheckTemplateRepository createFromAnnotatedClasses(String repositoryKey, Language language, Collection<Class> classes) {
129 AnnotationCheckTemplateFactory factory = new AnnotationCheckTemplateFactory(classes);
130 CheckTemplateRepository repository = new CheckTemplateRepository(repositoryKey);
131 repository.setTemplates(factory.create());
132 repository.setLanguage(language);
133 return repository;
134 }
135
136 /*
137 * CODE FOR BACKWARD COMPATIBLITY
138 * This class should not extend RulesRepository in next versions
139 */
140
141 public List<Rule> getInitialReferential() {
142 List<Rule> rules = new ArrayList<Rule>();
143 for (CheckTemplate checkTemplate : getTemplates()) {
144 rules.add(toRule(checkTemplate));
145 }
146 return rules;
147 }
148
149 private Rule toRule(CheckTemplate checkTemplate) {
150 Rule rule = new Rule(getKey(), checkTemplate.getKey());
151 rule.setDescription(checkTemplate.getDescription(Locale.ENGLISH));
152 rule.setName(checkTemplate.getTitle(Locale.ENGLISH));
153 rule.setSeverity(RulePriority.fromCheckPriority(checkTemplate.getPriority()));
154 for (CheckTemplateProperty checkTemplateProperty : checkTemplate.getProperties()) {
155 RuleParam param = rule.createParameter(checkTemplateProperty.getKey());
156 param.setDescription(checkTemplateProperty.getDescription(Locale.ENGLISH));
157 param.setType("s");
158 }
159
160 return rule;
161 }
162
163 public List<Rule> parseReferential(String fileContent) {
164 return Collections.emptyList();
165 }
166
167 public List<RulesProfile> getProvidedProfiles() {
168 return Collections.emptyList();
169 }
170 }