import org.sonar.core.persistence.DatabaseVersion;
import javax.annotation.CheckForNull;
-
+import java.util.Collection;
import java.util.Properties;
/**
}
}
- public void addComponents(Object... components){
+ public void addComponents(Collection components) {
serverComponents.addComponents(components);
}
import org.sonar.core.metric.DefaultMetricFinder;
import org.sonar.core.notification.DefaultNotificationManager;
import org.sonar.core.permission.PermissionFacade;
-import org.sonar.core.persistence.*;
+import org.sonar.core.persistence.DaoUtils;
+import org.sonar.core.persistence.DatabaseVersion;
+import org.sonar.core.persistence.DefaultDatabase;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.persistence.PreviewDatabaseFactory;
+import org.sonar.core.persistence.SemaphoreUpdater;
+import org.sonar.core.persistence.SemaphoresImpl;
import org.sonar.core.preview.PreviewCache;
import org.sonar.core.profiling.Profiling;
import org.sonar.core.purge.PurgeProfiler;
import org.sonar.server.db.EmbeddedDatabaseFactory;
import org.sonar.server.db.migrations.DatabaseMigrations;
import org.sonar.server.db.migrations.DatabaseMigrator;
-import org.sonar.server.debt.*;
+import org.sonar.server.debt.DebtCharacteristicsXMLImporter;
+import org.sonar.server.debt.DebtModelBackup;
+import org.sonar.server.debt.DebtModelLookup;
+import org.sonar.server.debt.DebtModelOperations;
+import org.sonar.server.debt.DebtModelPluginRepository;
+import org.sonar.server.debt.DebtModelService;
+import org.sonar.server.debt.DebtModelXMLExporter;
+import org.sonar.server.debt.DebtRulesXMLImporter;
import org.sonar.server.es.ESIndex;
import org.sonar.server.es.ESNode;
-import org.sonar.server.issue.*;
+import org.sonar.server.issue.ActionService;
+import org.sonar.server.issue.AssignAction;
+import org.sonar.server.issue.CommentAction;
+import org.sonar.server.issue.DefaultIssueFinder;
+import org.sonar.server.issue.InternalRubyIssueService;
+import org.sonar.server.issue.IssueBulkChangeService;
+import org.sonar.server.issue.IssueChangelogFormatter;
+import org.sonar.server.issue.IssueChangelogService;
+import org.sonar.server.issue.IssueCommentService;
+import org.sonar.server.issue.IssueService;
+import org.sonar.server.issue.IssueStatsFinder;
+import org.sonar.server.issue.PlanAction;
+import org.sonar.server.issue.PublicRubyIssueService;
+import org.sonar.server.issue.ServerIssueStorage;
+import org.sonar.server.issue.SetSeverityAction;
+import org.sonar.server.issue.TransitionAction;
import org.sonar.server.issue.actionplan.ActionPlanService;
import org.sonar.server.issue.actionplan.ActionPlanWs;
import org.sonar.server.issue.filter.IssueFilterService;
import org.sonar.server.permission.PermissionFinder;
import org.sonar.server.platform.ws.RestartHandler;
import org.sonar.server.platform.ws.SystemWs;
-import org.sonar.server.plugins.*;
+import org.sonar.server.plugins.BatchWs;
+import org.sonar.server.plugins.InstalledPluginReferentialFactory;
+import org.sonar.server.plugins.PluginDownloader;
+import org.sonar.server.plugins.ServerExtensionInstaller;
+import org.sonar.server.plugins.ServerPluginJarInstaller;
+import org.sonar.server.plugins.ServerPluginJarsInstaller;
+import org.sonar.server.plugins.ServerPluginRepository;
+import org.sonar.server.plugins.UpdateCenterClient;
+import org.sonar.server.plugins.UpdateCenterMatrixFactory;
import org.sonar.server.qualitygate.QgateProjectFinder;
import org.sonar.server.qualitygate.QualityGates;
import org.sonar.server.qualitygate.RegisterQualityGates;
import org.sonar.server.qualitygate.ws.QgateAppHandler;
import org.sonar.server.qualitygate.ws.QualityGatesWs;
-import org.sonar.server.qualityprofile.*;
+import org.sonar.server.qualityprofile.DefaultProfilesCache;
+import org.sonar.server.qualityprofile.ESActiveRule;
+import org.sonar.server.qualityprofile.ProfilesManager;
+import org.sonar.server.qualityprofile.QProfileActiveRuleOperations;
+import org.sonar.server.qualityprofile.QProfileBackup;
+import org.sonar.server.qualityprofile.QProfileLookup;
+import org.sonar.server.qualityprofile.QProfileOperations;
+import org.sonar.server.qualityprofile.QProfileProjectLookup;
+import org.sonar.server.qualityprofile.QProfileProjectOperations;
+import org.sonar.server.qualityprofile.QProfileRepositoryExporter;
+import org.sonar.server.qualityprofile.QProfileRuleLookup;
+import org.sonar.server.qualityprofile.QProfiles;
import org.sonar.server.qualityprofile.ws.QProfileBackupWsHandler;
import org.sonar.server.qualityprofile.ws.QProfilesWs;
-import org.sonar.server.rule.*;
-import org.sonar.server.rule.ws.*;
+import org.sonar.server.rule.DeprecatedRulesDefinition;
+import org.sonar.server.rule.ESRuleTags;
+import org.sonar.server.rule.RegisterRules;
+import org.sonar.server.rule.RubyRuleService;
+import org.sonar.server.rule.RuleDefinitionsLoader;
+import org.sonar.server.rule.RuleOperations;
+import org.sonar.server.rule.RuleRegistry;
+import org.sonar.server.rule.RuleRepositories;
+import org.sonar.server.rule.RuleTagLookup;
+import org.sonar.server.rule.RuleTagOperations;
+import org.sonar.server.rule.RuleTags;
+import org.sonar.server.rule.Rules;
+import org.sonar.server.rule.ws.AddTagsWsHandler;
+import org.sonar.server.rule.ws.RemoveTagsWsHandler;
+import org.sonar.server.rule.ws.RuleSearchWsHandler;
+import org.sonar.server.rule.ws.RuleShowWsHandler;
+import org.sonar.server.rule.ws.RuleTagsWs;
+import org.sonar.server.rule.ws.RulesWs;
import org.sonar.server.rule2.RuleService;
+import org.sonar.server.rule2.ws.RulesWebService;
+import org.sonar.server.rule2.ws.SearchAction;
import org.sonar.server.search.IndexUtils;
import org.sonar.server.source.CodeColorizers;
import org.sonar.server.source.DeprecatedSourceDecorator;
import org.sonar.server.source.ws.ScmWriter;
import org.sonar.server.source.ws.ShowAction;
import org.sonar.server.source.ws.SourcesWs;
-import org.sonar.server.startup.*;
+import org.sonar.server.startup.CleanPreviewAnalysisCache;
+import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules;
+import org.sonar.server.startup.GeneratePluginIndex;
+import org.sonar.server.startup.GwtPublisher;
+import org.sonar.server.startup.JdbcDriverDeployer;
+import org.sonar.server.startup.LogServerId;
+import org.sonar.server.startup.RegisterDashboards;
+import org.sonar.server.startup.RegisterDebtModel;
+import org.sonar.server.startup.RegisterMetrics;
+import org.sonar.server.startup.RegisterNewMeasureFilters;
+import org.sonar.server.startup.RegisterPermissionTemplates;
+import org.sonar.server.startup.RegisterQualityProfiles;
+import org.sonar.server.startup.RegisterServletFilters;
+import org.sonar.server.startup.RenameDeprecatedPropertyKeys;
+import org.sonar.server.startup.ServerMetadataPersister;
import org.sonar.server.text.MacroInterpreter;
import org.sonar.server.text.RubyTextService;
import org.sonar.server.ui.JRubyI18n;
import org.sonar.server.ui.JRubyProfiling;
import org.sonar.server.ui.PageDecorations;
import org.sonar.server.ui.Views;
-import org.sonar.server.user.*;
-import org.sonar.server.util.*;
+import org.sonar.server.user.DefaultUserService;
+import org.sonar.server.user.DoPrivileged;
+import org.sonar.server.user.GroupMembershipFinder;
+import org.sonar.server.user.GroupMembershipService;
+import org.sonar.server.user.NewUserNotifier;
+import org.sonar.server.user.SecurityRealmFactory;
+import org.sonar.server.util.BooleanTypeValidation;
+import org.sonar.server.util.FloatTypeValidation;
+import org.sonar.server.util.IntegerTypeValidation;
+import org.sonar.server.util.StringListTypeValidation;
+import org.sonar.server.util.StringTypeValidation;
+import org.sonar.server.util.TextTypeValidation;
+import org.sonar.server.util.TypeValidations;
import org.sonar.server.ws.ListingWs;
import org.sonar.server.ws.WebServiceEngine;
class ServerComponents {
private final Object[] rootComponents;
- private Object[] level4AddedComponents;
+ private List level4AddedComponents = Lists.newArrayList();
ServerComponents(Object... rootComponents) {
this.rootComponents = rootComponents;
pico.addSingleton(AddTagsWsHandler.class);
pico.addSingleton(RemoveTagsWsHandler.class);
pico.addSingleton(RulesDefinitionXmlLoader.class);
+
+ // experimental rules
pico.addSingleton(RuleService.class);
+ pico.addSingleton(RulesWebService.class);
+ pico.addSingleton(SearchAction.class);
+ pico.addSingleton(org.sonar.server.rule2.ws.ShowAction.class);
// rule tags
pico.addSingleton(ESRuleTags.class);
pico.addSingleton(StringTypeValidation.class);
pico.addSingleton(StringListTypeValidation.class);
- if (level4AddedComponents != null) {
- for (Object components : level4AddedComponents) {
- pico.addSingleton(components);
- }
+ for (Object components : level4AddedComponents) {
+ pico.addSingleton(components);
}
+
ServerExtensionInstaller extensionRegistrar = pico.getComponentByType(ServerExtensionInstaller.class);
extensionRegistrar.installExtensions(pico);
executeStartupTaks(pico);
}
- void addComponents(Object... components){
- this.level4AddedComponents = components;
+ void addComponents(Collection components) {
+ this.level4AddedComponents.addAll(components);
}
private void executeStartupTaks(ComponentContainer pico) {
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import java.util.List;
+import java.util.Collection;
public class RuleQuery {
private String key;
private String queryText;
- private List<String> languages;
- private List<String> repositories;
- private List<String> severities;
- private List<RuleStatus> statuses;
- private List<String> tags;
- private List<String> debtCharacteristics;
+ private Collection<String> languages;
+ private Collection<String> repositories;
+ private Collection<String> severities;
+ private Collection<RuleStatus> statuses;
+ private Collection<String> tags;
+ private Collection<String> debtCharacteristics;
private Boolean hasDebtCharacteristic;
private SortField sortField;
private boolean ascendingSort = true;
}
@CheckForNull
- public List<String> getLanguages() {
+ public Collection<String> getLanguages() {
return languages;
}
- public RuleQuery setLanguages(@Nullable List<String> languages) {
+ public RuleQuery setLanguages(@Nullable Collection<String> languages) {
this.languages = languages;
return this;
}
@CheckForNull
- public List<String> getRepositories() {
+ public Collection<String> getRepositories() {
return repositories;
}
- public RuleQuery setRepositories(@Nullable List<String> repositories) {
+ public RuleQuery setRepositories(@Nullable Collection<String> repositories) {
this.repositories = repositories;
return this;
}
@CheckForNull
- public List<String> getSeverities() {
+ public Collection<String> getSeverities() {
return severities;
}
- public RuleQuery setSeverities(@Nullable List<String> severities) {
+ public RuleQuery setSeverities(@Nullable Collection<String> severities) {
if (severities != null) {
for (String severity : severities) {
Preconditions.checkArgument(Severity.ALL.contains(severity), "Unknown severity: " + severity);
}
@CheckForNull
- public List<RuleStatus> getStatuses() {
+ public Collection<RuleStatus> getStatuses() {
return statuses;
}
- public RuleQuery setStatuses(@Nullable List<RuleStatus> statuses) {
+ public RuleQuery setStatuses(@Nullable Collection<RuleStatus> statuses) {
this.statuses = statuses;
return this;
}
@CheckForNull
- public List<String> getTags() {
+ public Collection<String> getTags() {
return tags;
}
- public RuleQuery setTags(@Nullable List<String> tags) {
+ public RuleQuery setTags(@Nullable Collection<String> tags) {
this.tags = tags;
return this;
}
@CheckForNull
- public List<String> getDebtCharacteristics() {
+ public Collection<String> getDebtCharacteristics() {
return debtCharacteristics;
}
- public RuleQuery setDebtCharacteristics(@Nullable List<String> debtCharacteristics) {
+ public RuleQuery setDebtCharacteristics(@Nullable Collection<String> debtCharacteristics) {
this.debtCharacteristics = debtCharacteristics;
return this;
}
*/
package org.sonar.server.rule2.ws;
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
import org.sonar.api.rule.RuleStatus;
import org.sonar.api.rule.Severity;
import org.sonar.api.server.ws.Request;
import org.sonar.server.search.QueryOptions;
import org.sonar.server.search.Results;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import java.util.Collection;
+import java.util.List;
import java.util.Map;
/**
*/
public class SearchAction implements RequestHandler {
+ private static final String PARAM_TEXT_QUERY = "q";
+ private static final String PARAM_REPOSITORIES = "repositories";
+ private static final String PARAM_SEVERITIES = "severities";
+ private static final String PARAM_STATUSES = "statuses";
+ private static final String PARAM_LANGUAGES = "languages";
+ private static final String PARAM_TAGS = "tags";
+
+
private final RuleService service;
public SearchAction(RuleService service) {
.setHandler(this);
action
- .createParam("q")
+ .createParam(PARAM_TEXT_QUERY)
.setDescription("UTF-8 search query")
.setExampleValue("null pointer");
action
- .createParam("repositories")
+ .createParam(PARAM_REPOSITORIES)
.setDescription("Comma-separated list of repositories")
.setExampleValue("checkstyle,findbugs");
action
- .createParam("severities")
+ .createParam(PARAM_SEVERITIES)
.setDescription("Comma-separated list of default severities. Not the same than severity of rules in Quality profiles.")
.setPossibleValues(Severity.ALL)
.setExampleValue("CRITICAL,BLOCKER");
action
- .createParam("statuses")
+ .createParam(PARAM_STATUSES)
.setDescription("Comma-separated list of status codes")
.setPossibleValues(RuleStatus.values())
- .setExampleValue("BETA,DEPRECATED");
+ .setExampleValue(RuleStatus.READY.toString());
action
.createParam("tags")
- .setDescription("Comma-separated list of tags")
+ .setDescription("Comma-separated list of tags. Returned rules match all the tags (AND operator)")
.setExampleValue("security,java8");
action
@Override
public void handle(Request request, Response response) {
RuleQuery query = service.newRuleQuery();
- query.setQueryText(request.param("q"));
- query.setSeverities(request.paramAsStrings("severities"));
- query.setRepositories(request.paramAsStrings("repositories"));
+ query.setQueryText(request.param(PARAM_TEXT_QUERY));
+ query.setSeverities(request.paramAsStrings(PARAM_SEVERITIES));
+ query.setRepositories(request.paramAsStrings(PARAM_REPOSITORIES));
+ query.setStatuses(toStatuses(request.paramAsStrings(PARAM_STATUSES)));
+ query.setLanguages(request.paramAsStrings(PARAM_LANGUAGES));
Results results = service.search(query, new QueryOptions());
JsonWriter json = response.newJsonWriter().beginObject().name("hits").beginArray();
json.endArray();
json.endObject().close();
}
+
+ @CheckForNull
+ private Collection<RuleStatus> toStatuses(@Nullable List<String> statuses) {
+ if (statuses == null) {
+ return null;
+ }
+ return Collections2.transform(statuses, new Function<String, RuleStatus>() {
+ @Override
+ public RuleStatus apply(@Nullable String input) {
+ return input == null ? null : RuleStatus.valueOf(input);
+ }
+ });
+ }
}
*/
package org.sonar.server.rule2;
-import org.junit.Rule;
+import com.google.common.collect.Iterables;
+import org.junit.After;
+import org.junit.ClassRule;
+import org.junit.Ignore;
import org.junit.Test;
import org.sonar.api.rule.RuleKey;
import org.sonar.api.rule.RuleStatus;
import org.sonar.check.Cardinality;
import org.sonar.core.rule.RuleDto;
import org.sonar.server.search.Hit;
+import org.sonar.server.search.QueryOptions;
+import org.sonar.server.search.Results;
import org.sonar.server.tester.ServerTester;
+import java.util.Arrays;
+
import static org.fest.assertions.Assertions.assertThat;
public class RuleMediumTest {
- @Rule
- public ServerTester tester = new ServerTester();
+ @ClassRule
+ public static ServerTester tester = new ServerTester();
+ //.setProperty("sonar.es.http.port", "8888");
+
+ @After
+ public void clear_data_store() {
+ tester.clearDataStores();
+ }
@Test
- public void persist_and_index_new_rule() {
+ public void insert_in_db_and_index_in_es() {
// insert db
RuleKey ruleKey = RuleKey.of("javascript", "S001");
RuleDao dao = tester.get(RuleDao.class);
assertThat(hit.getFieldAsString(RuleNormalizer.RuleField.STATUS.key())).isEqualTo(RuleStatus.READY.toString());
}
+ @Test
+ @Ignore
+ public void search_rules_by_repositories() throws InterruptedException {
+ RuleDao dao = tester.get(RuleDao.class);
+ dao.insert(newRuleDto(RuleKey.of("javascript", "S001")));
+ dao.insert(newRuleDto(RuleKey.of("java", "S002")));
+
+ RuleService service = tester.get(RuleService.class);
+ RuleQuery query = service.newRuleQuery().setRepositories(Arrays.asList("findbugs", "java"));
+ Results results = service.search(query, new QueryOptions());
+ assertThat(results.getTotal()).isEqualTo(1);
+ assertThat(results.getHits()).hasSize(1);
+ assertThat(Iterables.getFirst(results.getHits(), null).getFieldAsString("key")).isEqualTo("S002");
+ }
+
private RuleDto newRuleDto(RuleKey ruleKey) {
return new RuleDto()
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube 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.
+ *
+ * SonarQube 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 this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+package org.sonar.server.tester;
+
+import org.elasticsearch.client.Client;
+import org.elasticsearch.index.query.QueryBuilders;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.sonar.api.ServerComponent;
+import org.sonar.core.persistence.DatabaseVersion;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.server.es.ESNode;
+
+import java.sql.Connection;
+
+public class DataStoreCleanup implements ServerComponent {
+
+ private static final Logger LOG = LoggerFactory.getLogger(DataStoreCleanup.class);
+
+ private final ESNode esNode;
+ private final MyBatis myBatis;
+
+ public DataStoreCleanup(ESNode esNode, MyBatis myBatis) {
+ this.esNode = esNode;
+ this.myBatis = myBatis;
+ }
+
+ public void clear() {
+ truncateDb();
+ truncateEs();
+ }
+
+ private void truncateDb() {
+ DbSession dbSession = myBatis.openSession(false);
+ Connection connection = dbSession.getConnection();
+ try {
+ LOG.info("Truncate db tables");
+ for (String table : DatabaseVersion.TABLES) {
+ try {
+ connection.createStatement().execute("TRUNCATE TABLE " + table.toLowerCase());
+ // commit is useless on some databases
+ connection.commit();
+ } catch (Exception e) {
+ throw new IllegalStateException("Fail to truncate db table " + table, e);
+ }
+ }
+
+ } finally {
+ dbSession.close();
+ }
+ }
+
+ private void truncateEs() {
+ LOG.info("Truncate es indices");
+ Client client = esNode.client();
+ client.prepareDeleteByQuery(
+ client.admin().cluster().prepareState().get().getState().getMetaData().concreteAllIndices()
+ ).setQuery(QueryBuilders.matchAllQuery()).get();
+
+ }
+}
*/
package org.sonar.server.tester;
+import com.google.common.collect.Lists;
import org.apache.commons.io.FileUtils;
import org.junit.rules.ExternalResource;
import org.sonar.api.CoreProperties;
import org.sonar.api.database.DatabaseProperties;
import org.sonar.server.platform.Platform;
+import javax.annotation.Nullable;
import java.io.File;
+import java.util.Arrays;
+import java.util.List;
import java.util.Properties;
/**
private Platform platform;
private File tempDir;
- private Object[] components;
+ private List components = Lists.newArrayList(DataStoreCleanup.class);
private final Properties initialProps = new Properties();
/**
* Add classes or objects to IoC container, as it could be done by plugins.
* Must be called before {@link #start()}.
*/
- public ServerTester addComponents(Object... components) {
+ public ServerTester addComponents(@Nullable Object... components) {
checkNotStarted();
- this.components = components;
+ if (components != null) {
+ this.components.addAll(Arrays.asList(components));
+ }
return this;
}
return this;
}
+ /**
+ * Truncate all db tables and es indices
+ */
+ public void clearDataStores() {
+ checkStarted();
+ get(DataStoreCleanup.class).clear();
+ }
+
/**
* Get a component from the platform
*/