From 4140a2e060e2c2cfe047a107be7ec71216e962a9 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 5 Sep 2014 17:50:55 +0200 Subject: [PATCH] SONAR-5561 Create query to load issue authorization from db --- .../issue/db/IssueAuthorizationDao.java | 52 +++--- .../org/sonar/server/issue/db/IssueDao.java | 1 + .../server/platform/ServerComponents.java | 155 ++---------------- .../server/search/IndexSynchronizer.java | 2 + .../issue/db/IssueAuthorizationDaoTest.java | 80 +++++++++ .../issue/db/IssueBackendMediumTest.java | 11 +- .../find_after_date.xml | 27 +++ ...fter_date_return_dtos_after_given_date.xml | 44 +++++ .../core/issue/db/IssueAuthorizationDto.java | 19 ++- .../issue/db/IssueAuthorizationMapper.java | 6 + .../issue/db/IssueAuthorizationMapper.xml | 51 +++++- 11 files changed, 279 insertions(+), 169 deletions(-) create mode 100644 server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueAuthorizationDaoTest.java create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date.xml create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date_return_dtos_after_given_date.xml diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java index 24ae9bf7d31..64074abe00d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueAuthorizationDao.java @@ -22,6 +22,7 @@ package org.sonar.server.issue.db; import com.google.common.annotations.VisibleForTesting; import org.sonar.api.utils.System2; +import org.sonar.api.web.UserRole; import org.sonar.core.issue.db.IssueAuthorizationDto; import org.sonar.core.issue.db.IssueAuthorizationMapper; import org.sonar.core.persistence.DaoComponent; @@ -30,6 +31,10 @@ import org.sonar.server.db.BaseDao; import org.sonar.server.search.IndexDefinition; import java.util.Date; +import java.util.List; +import java.util.Map; + +import static com.google.common.collect.Maps.newHashMap; public class IssueAuthorizationDao extends BaseDao implements DaoComponent { @@ -44,29 +49,38 @@ public class IssueAuthorizationDao extends BaseDao findAfterDate(DbSession session, Date date) { - @Override - protected IssueAuthorizationDto doInsert(DbSession session, IssueAuthorizationDto issueAuthorization) { - // TODO ? - // Preconditions.checkNotNull(issueAuthorization.getKey(), "Cannot insert IssueAuthorization with empty key!"); - // Preconditions.checkNotNull(issueAuthorization.getPermission(), "Cannot insert IssueAuthorization with no permission!"); - // mapper(session).insert(issueAuthorization); - return issueAuthorization; - } + Map params = newHashMap(); + params.put("date", date); + params.put("permission", UserRole.USER); - @Override - protected Iterable findAfterDate(DbSession session, Date date) { - // TODO ? - // return mapper(session).selectAfterDate(new Timestamp(date.getTime())); - return null; + Map authorizationDtoMap = newHashMap(); + + List> rows = session.selectList("org.sonar.core.issue.db.IssueAuthorizationMapper.selectAfterDate", params); + for (Map row : rows) { + String project = row.get("PROJECT"); + String user = row.get("USER"); + String group = row.get("PERMISSION_GROUP"); + IssueAuthorizationDto issueAuthorizationDto = authorizationDtoMap.get(project); + if (issueAuthorizationDto == null) { + issueAuthorizationDto = new IssueAuthorizationDto() + .setProject(project) + .setPermission(UserRole.USER); + } + if (group != null) { + issueAuthorizationDto.addGroup(group); + } + if (user != null) { + issueAuthorizationDto.addUser(user); + } + authorizationDtoMap.put(project, issueAuthorizationDto); + } + + return authorizationDtoMap.values(); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java index 390e39d49b8..45ea1ad6b33 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/db/IssueDao.java @@ -62,6 +62,7 @@ public class IssueDao extends BaseDao implements return issue; } + @Override protected Iterable findAfterDate(DbSession session, Date date) { return mapper(session).selectAfterDate(new Timestamp(date.getTime())); diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index 63ebb72d92f..153e75b83ff 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -51,13 +51,7 @@ import org.sonar.core.measure.db.MeasureFilterDao; import org.sonar.core.metric.DefaultMetricFinder; import org.sonar.core.notification.DefaultNotificationManager; import org.sonar.core.permission.PermissionFacade; -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.persistence.*; import org.sonar.core.preview.PreviewCache; import org.sonar.core.profiling.Profiling; import org.sonar.core.purge.PurgeProfiler; @@ -91,46 +85,21 @@ import org.sonar.server.charts.ChartFactory; import org.sonar.server.component.DefaultComponentFinder; import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.component.persistence.ComponentDao; -import org.sonar.server.component.ws.ComponentAppAction; -import org.sonar.server.component.ws.ComponentsWs; -import org.sonar.server.component.ws.EventsWs; -import org.sonar.server.component.ws.ProjectsWs; -import org.sonar.server.component.ws.ResourcesWs; +import org.sonar.server.component.ws.*; import org.sonar.server.config.ws.PropertiesWs; import org.sonar.server.db.DatabaseChecker; import org.sonar.server.db.DbClient; 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.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.debt.*; import org.sonar.server.duplication.ws.DuplicationsJsonWriter; import org.sonar.server.duplication.ws.DuplicationsParser; import org.sonar.server.duplication.ws.DuplicationsWs; -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.*; import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.actionplan.ActionPlanWs; +import org.sonar.server.issue.db.IssueAuthorizationDao; import org.sonar.server.issue.db.IssueDao; import org.sonar.server.issue.filter.IssueFilterService; import org.sonar.server.issue.filter.IssueFilterWriter; @@ -161,84 +130,22 @@ import org.sonar.server.platform.ws.L10nWs; import org.sonar.server.platform.ws.RestartHandler; import org.sonar.server.platform.ws.ServerWs; import org.sonar.server.platform.ws.SystemWs; -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.plugins.*; import org.sonar.server.qualitygate.QgateProjectFinder; import org.sonar.server.qualitygate.QualityGates; import org.sonar.server.qualitygate.RegisterQualityGates; -import org.sonar.server.qualitygate.ws.QGatesAppAction; -import org.sonar.server.qualitygate.ws.QGatesCopyAction; -import org.sonar.server.qualitygate.ws.QGatesCreateAction; -import org.sonar.server.qualitygate.ws.QGatesCreateConditionAction; -import org.sonar.server.qualitygate.ws.QGatesDeleteConditionAction; -import org.sonar.server.qualitygate.ws.QGatesDeselectAction; -import org.sonar.server.qualitygate.ws.QGatesDestroyAction; -import org.sonar.server.qualitygate.ws.QGatesListAction; -import org.sonar.server.qualitygate.ws.QGatesRenameAction; -import org.sonar.server.qualitygate.ws.QGatesSearchAction; -import org.sonar.server.qualitygate.ws.QGatesSelectAction; -import org.sonar.server.qualitygate.ws.QGatesSetAsDefaultAction; -import org.sonar.server.qualitygate.ws.QGatesShowAction; -import org.sonar.server.qualitygate.ws.QGatesUnsetDefaultAction; -import org.sonar.server.qualitygate.ws.QGatesUpdateConditionAction; -import org.sonar.server.qualitygate.ws.QGatesWs; -import org.sonar.server.qualityprofile.BuiltInProfiles; -import org.sonar.server.qualityprofile.QProfileBackuper; -import org.sonar.server.qualityprofile.QProfileCopier; -import org.sonar.server.qualityprofile.QProfileExporters; -import org.sonar.server.qualityprofile.QProfileFactory; -import org.sonar.server.qualityprofile.QProfileLoader; -import org.sonar.server.qualityprofile.QProfileLookup; -import org.sonar.server.qualityprofile.QProfileProjectLookup; -import org.sonar.server.qualityprofile.QProfileProjectOperations; -import org.sonar.server.qualityprofile.QProfileRepositoryExporter; -import org.sonar.server.qualityprofile.QProfileReset; -import org.sonar.server.qualityprofile.QProfileService; -import org.sonar.server.qualityprofile.QProfiles; -import org.sonar.server.qualityprofile.RegisterQualityProfiles; -import org.sonar.server.qualityprofile.RuleActivator; -import org.sonar.server.qualityprofile.RuleActivatorContextFactory; +import org.sonar.server.qualitygate.ws.*; +import org.sonar.server.qualityprofile.*; import org.sonar.server.qualityprofile.db.ActiveRuleDao; import org.sonar.server.qualityprofile.index.ActiveRuleIndex; import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer; -import org.sonar.server.qualityprofile.ws.BulkRuleActivationActions; -import org.sonar.server.qualityprofile.ws.ProfilesWs; -import org.sonar.server.qualityprofile.ws.QProfileRestoreBuiltInAction; -import org.sonar.server.qualityprofile.ws.QProfilesWs; -import org.sonar.server.qualityprofile.ws.RuleActivationActions; -import org.sonar.server.rule.DefaultRuleFinder; -import org.sonar.server.rule.DeprecatedRulesDefinition; -import org.sonar.server.rule.RegisterRules; -import org.sonar.server.rule.RubyRuleService; -import org.sonar.server.rule.RuleCreator; -import org.sonar.server.rule.RuleDefinitionsLoader; -import org.sonar.server.rule.RuleDeleter; -import org.sonar.server.rule.RuleOperations; -import org.sonar.server.rule.RuleRepositories; -import org.sonar.server.rule.RuleService; -import org.sonar.server.rule.RuleUpdater; +import org.sonar.server.qualityprofile.ws.*; +import org.sonar.server.rule.*; import org.sonar.server.rule.db.RuleDao; import org.sonar.server.rule.index.RuleIndex; import org.sonar.server.rule.index.RuleNormalizer; -import org.sonar.server.rule.ws.ActiveRuleCompleter; -import org.sonar.server.rule.ws.AppAction; -import org.sonar.server.rule.ws.DeleteAction; -import org.sonar.server.rule.ws.RuleMapping; -import org.sonar.server.rule.ws.RulesWebService; -import org.sonar.server.rule.ws.SearchAction; -import org.sonar.server.rule.ws.TagsAction; -import org.sonar.server.rule.ws.UpdateAction; -import org.sonar.server.search.IndexClient; -import org.sonar.server.search.IndexQueue; -import org.sonar.server.search.IndexSynchronizer; -import org.sonar.server.search.SearchClient; -import org.sonar.server.search.SearchHealth; +import org.sonar.server.rule.ws.*; +import org.sonar.server.search.*; import org.sonar.server.source.CodeColorizers; import org.sonar.server.source.DeprecatedSourceDecorator; import org.sonar.server.source.HtmlSourceDecorator; @@ -247,27 +154,9 @@ import org.sonar.server.source.ws.ScmAction; 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.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.RegisterServletFilters; -import org.sonar.server.startup.RenameDeprecatedPropertyKeys; -import org.sonar.server.startup.ServerMetadataPersister; +import org.sonar.server.startup.*; import org.sonar.server.test.CoverageService; -import org.sonar.server.test.ws.CoverageShowAction; -import org.sonar.server.test.ws.CoverageWs; -import org.sonar.server.test.ws.TestsCoveredFilesAction; -import org.sonar.server.test.ws.TestsShowAction; -import org.sonar.server.test.ws.TestsTestCasesAction; -import org.sonar.server.test.ws.TestsWs; +import org.sonar.server.test.ws.*; import org.sonar.server.text.MacroInterpreter; import org.sonar.server.text.RubyTextService; import org.sonar.server.ui.JRubyI18n; @@ -275,22 +164,11 @@ import org.sonar.server.ui.JRubyProfiling; import org.sonar.server.ui.PageDecorations; import org.sonar.server.ui.Views; import org.sonar.server.updatecenter.ws.UpdateCenterWs; -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.user.*; import org.sonar.server.user.ws.FavoritesWs; import org.sonar.server.user.ws.UserPropertiesWs; import org.sonar.server.user.ws.UsersWs; -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.util.*; import org.sonar.server.ws.ListingWs; import org.sonar.server.ws.WebServiceEngine; @@ -341,6 +219,7 @@ class ServerComponents { System2.INSTANCE, RuleDao.class, IssueDao.class, + IssueAuthorizationDao.class, ActiveRuleDao.class, MeasureDao.class, MetricDao.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java index 31240ef46a1..ee9caa8174d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java +++ b/server/sonar-server/src/main/java/org/sonar/server/search/IndexSynchronizer.java @@ -51,6 +51,8 @@ public class IndexSynchronizer { long start = System.currentTimeMillis(); synchronize(session, db.ruleDao(), index.get(RuleIndex.class)); synchronize(session, db.issueDao(), index.get(IssueIndex.class)); + // TODO + //synchronize(session, db.issueAuthorizationDao(), index.get(IssueAuthorizationIndex.class)); synchronize(session, db.activeRuleDao(), index.get(ActiveRuleIndex.class)); synchronize(session, db.activityDao(), index.get(ActivityIndex.class)); session.commit(); diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueAuthorizationDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueAuthorizationDaoTest.java new file mode 100644 index 00000000000..38a1d7e5d59 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueAuthorizationDaoTest.java @@ -0,0 +1,80 @@ +/* + * 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.issue.db; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.sonar.api.utils.DateUtils; +import org.sonar.api.utils.System2; +import org.sonar.core.issue.db.IssueAuthorizationDto; +import org.sonar.core.persistence.AbstractDaoTestCase; +import org.sonar.core.persistence.DbSession; + +import java.util.Date; + +import static org.fest.assertions.Assertions.assertThat; + +public class IssueAuthorizationDaoTest extends AbstractDaoTestCase { + + private IssueAuthorizationDao dao; + private DbSession session; + + @Before + public void before() throws Exception { + this.session = getMyBatis().openSession(false); + this.dao = new IssueAuthorizationDao(System2.INSTANCE); + } + + @After + public void after() { + this.session.close(); + } + + @Test(expected = IllegalStateException.class) + public void get_nullable_by_key_is_not_implemented(){ + assertThat(dao.getNullableByKey(session, "sonar")); + } + + @Test + public void find_after_date(){ + setupData("find_after_date"); + + Iterable results = dao.findAfterDate(session, new Date(0)); + assertThat(results).hasSize(1); + + IssueAuthorizationDto dto = results.iterator().next(); + assertThat(dto.getProject()).isEqualTo("org.struts:struts"); + assertThat(dto.getKey()).isEqualTo("org.struts:struts"); + assertThat(dto.getPermission()).isEqualTo("user"); + assertThat(dto.getGroups()).containsExactly("anyone", "devs"); + assertThat(dto.getUsers()).containsExactly("user1"); + } + + @Test + public void find_after_date_return_dtos_after_given_date(){ + setupData("find_after_date_return_dtos_after_given_date"); + + assertThat(dao.findAfterDate(session, new Date(0))).hasSize(2); + + assertThat(dao.findAfterDate(session, DateUtils.parseDate("2014-09-01"))).hasSize(1); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java index a3449edb748..01b25f0396a 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/db/IssueBackendMediumTest.java @@ -49,6 +49,8 @@ import org.sonar.server.search.IndexDefinition; import org.sonar.server.search.SearchClient; import org.sonar.server.tester.ServerTester; +import javax.annotation.Nullable; + import java.util.Date; import java.util.List; import java.util.Map; @@ -189,6 +191,11 @@ public class IssueBackendMediumTest { assertThat(indexClient.get(IssueIndex.class).countAll()).isEqualTo(1); } + @Test + public void synchronize_issue_authorization_index() throws Exception { + + } + @Test public void issue_authorization_on_group() throws Exception { SearchClient searchClient = tester.get(SearchClient.class); @@ -341,11 +348,11 @@ public class IssueBackendMediumTest { return issue; } - private IndexRequestBuilder addIssueAuthorization(final SearchClient searchClient, ComponentDto project, List users, List groups) { + private IndexRequestBuilder addIssueAuthorization(final SearchClient searchClient, ComponentDto project, @Nullable List users, @Nullable List groups) { return addIssueAuthorization(searchClient, project, users, groups, true); } - private IndexRequestBuilder addIssueAuthorization(final SearchClient searchClient, ComponentDto project, List users, List groups, boolean refresh) { + private IndexRequestBuilder addIssueAuthorization(final SearchClient searchClient, ComponentDto project, @Nullable List users, @Nullable List groups, boolean refresh) { Map permissionSource = newHashMap(); permissionSource.put("_parent", project.key()); permissionSource.put("permission", "read"); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date.xml new file mode 100644 index 00000000000..9236b6d6391 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date_return_dtos_after_given_date.xml b/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date_return_dtos_after_given_date.xml new file mode 100644 index 00000000000..eff050279eb --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/db/IssueAuthorizationDaoTest/find_after_date_return_dtos_after_given_date.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationDto.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationDto.java index d66f0c9d231..0c0b767c403 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationDto.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationDto.java @@ -25,16 +25,18 @@ import org.sonar.core.persistence.Dto; import java.io.Serializable; import java.util.List; +import static com.google.common.collect.Lists.newArrayList; + public final class IssueAuthorizationDto extends Dto implements Serializable { private String project; private String permission; - private List groups; - private List users; + private List groups = newArrayList(); + private List users = newArrayList(); @Override public String getKey() { - return null; + return project; } public String getProject() { @@ -64,6 +66,11 @@ public final class IssueAuthorizationDto extends Dto implements Serializ return this; } + public IssueAuthorizationDto addGroup(String group) { + groups.add(group); + return this; + } + public List getUsers() { return users; } @@ -72,4 +79,10 @@ public final class IssueAuthorizationDto extends Dto implements Serializ this.users = users; return this; } + + public IssueAuthorizationDto addUser(String user) { + users.add(user); + return this; + } + } diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationMapper.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationMapper.java index d327f7f938d..ca81eccafae 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueAuthorizationMapper.java @@ -20,8 +20,14 @@ package org.sonar.core.issue.db; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; + public interface IssueAuthorizationMapper { IssueAuthorizationDto selectByKey(String key); + IssueAuthorizationDto selectAfterDate(@Param("date") Date date, @Param("permission") String permission); + } diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueAuthorizationMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueAuthorizationMapper.xml index 59dd1496014..d4cf8ba718f 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueAuthorizationMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueAuthorizationMapper.xml @@ -4,13 +4,50 @@ - + SELECT + project_authorization.project as project, + project_authorization.login as user, + project_authorization.permission_group as permission_group, + project_authorization.permission_role as permission_role + FROM ( + -- users + SELECT + projects.kee AS project, + users.login AS login, + NULL AS permission_group, + user_roles.role as permission_role + FROM projects + INNER JOIN user_roles ON user_roles.resource_id = projects.id AND user_roles.role = #{permission} + INNER JOIN users ON users.id = user_roles.user_id + WHERE + projects.authorization_updated_at >= #{date} + UNION + -- groups without Anyone + SELECT + projects.kee AS project, + NULL AS login, + groups.name AS permission_group, + group_roles.role as permission_role + FROM projects + INNER JOIN group_roles ON group_roles.resource_id = projects.id AND group_roles.role = #{permission} + INNER JOIN groups ON groups.id = group_roles.group_id + WHERE + projects.authorization_updated_at >= #{date} + AND group_id IS NOT NULL + UNION + -- Anyone groups + SELECT + projects.kee AS project, + NULL AS login, + 'anyone' AS permission_group, + group_roles.role as permission_role + FROM projects + INNER JOIN group_roles ON group_roles.resource_id = projects.id AND group_roles.role = #{permission} + WHERE + projects.authorization_updated_at >= #{date} + AND group_roles.group_id IS NULL + ) AS project_authorization -- 2.39.5