From a4200ecfa013c853f0c44b941d4365218af940fa Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Mon, 9 Dec 2019 16:53:50 +0100 Subject: [PATCH] SONAR-12718 move User to ws-commons.proto --- .../sonar/server/issue/ws/IssueWsModule.java | 1 + .../server/issue/ws/SearchResponseFormat.java | 21 +++------ .../issue/ws/UserResponseFormatter.java | 46 +++++++++++++++++++ .../server/hotspot/ws/ShowActionTest.java | 6 +-- .../server/issue/ws/IssueWsModuleTest.java | 2 +- .../issue/ws/SearchActionComponentsTest.java | 5 +- .../issue/ws/SearchActionFacetsTest.java | 5 +- .../server/issue/ws/SearchActionTest.java | 3 +- .../ws/SearchActionTestOnSonarCloud.java | 3 +- sonar-ws/src/main/protobuf/ws-commons.proto | 7 +++ sonar-ws/src/main/protobuf/ws-issues.proto | 25 ++++------ 11 files changed, 83 insertions(+), 41 deletions(-) create mode 100644 server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/UserResponseFormatter.java diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueWsModule.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueWsModule.java index e66b4f30691..dd92918d965 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueWsModule.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueWsModule.java @@ -49,6 +49,7 @@ public class IssueWsModule extends Module { IssueChangelog.class, SearchResponseLoader.class, TextRangeResponseFormatter.class, + UserResponseFormatter.class, SearchResponseFormat.class, OperationResponseWriter.class, AddCommentAction.class, diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java index bb3f1d3af21..02ef9b94ecf 100644 --- a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java @@ -42,10 +42,10 @@ import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.UserDto; import org.sonar.markdown.Markdown; import org.sonar.server.es.Facets; -import org.sonar.server.issue.AvatarResolver; import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.issue.workflow.Transition; import org.sonarqube.ws.Common; +import org.sonarqube.ws.Common.User; import org.sonarqube.ws.Issues; import org.sonarqube.ws.Issues.Actions; import org.sonarqube.ws.Issues.Comment; @@ -76,15 +76,14 @@ public class SearchResponseFormat { private final Durations durations; private final Languages languages; - private final AvatarResolver avatarFactory; private final TextRangeResponseFormatter textRangeFormatter; + private final UserResponseFormatter userFormatter; - public SearchResponseFormat(Durations durations, Languages languages, AvatarResolver avatarFactory, - TextRangeResponseFormatter textRangeFormatter) { + public SearchResponseFormat(Durations durations, Languages languages, TextRangeResponseFormatter textRangeFormatter, UserResponseFormatter userFormatter) { this.durations = durations; this.languages = languages; - this.avatarFactory = avatarFactory; this.textRangeFormatter = textRangeFormatter; + this.userFormatter = userFormatter; } SearchWsResponse formatSearch(Set fields, SearchResponseData data, Paging paging, Facets facets) { @@ -328,22 +327,14 @@ public class SearchResponseFormat { Users.Builder wsUsers = Users.newBuilder(); List users = data.getUsers(); if (users != null) { + User.Builder builder = User.newBuilder(); for (UserDto user : users) { - wsUsers.addUsers(formatUser(user)); + wsUsers.addUsers(userFormatter.formatUser(builder, user)); } } return wsUsers; } - private Users.User.Builder formatUser(UserDto user) { - Users.User.Builder builder = Users.User.newBuilder() - .setLogin(user.getLogin()) - .setName(nullToEmpty(user.getName())) - .setActive(user.isActive()); - ofNullable(emptyToNull(user.getEmail())).ifPresent(email -> builder.setAvatar(avatarFactory.create(user))); - return builder; - } - private Issues.Languages.Builder formatLanguages() { Issues.Languages.Builder wsLangs = Issues.Languages.newBuilder(); Issues.Language.Builder wsLang = Issues.Language.newBuilder(); diff --git a/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/UserResponseFormatter.java b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/UserResponseFormatter.java new file mode 100644 index 00000000000..739725d97b8 --- /dev/null +++ b/server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/UserResponseFormatter.java @@ -0,0 +1,46 @@ +/* + * SonarQube + * Copyright (C) 2009-2020 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program 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. + * + * This program 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.ws; + +import org.sonar.db.user.UserDto; +import org.sonar.server.issue.AvatarResolver; +import org.sonarqube.ws.Common; + +import static com.google.common.base.Strings.emptyToNull; +import static com.google.common.base.Strings.nullToEmpty; +import static java.util.Optional.ofNullable; + +public class UserResponseFormatter { + private final AvatarResolver avatarResolver; + + public UserResponseFormatter(AvatarResolver avatarResolver) { + this.avatarResolver = avatarResolver; + } + + public Common.User formatUser(Common.User.Builder builder, UserDto user) { + builder + .clear() + .setLogin(user.getLogin()) + .setName(nullToEmpty(user.getName())) + .setActive(user.isActive()); + ofNullable(emptyToNull(user.getEmail())).ifPresent(email -> builder.setAvatar(avatarResolver.create(user))); + return builder.build(); + } +} diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/ShowActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/ShowActionTest.java index 0c68ab3f420..d9b1d85b0f8 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/ShowActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/ShowActionTest.java @@ -52,12 +52,12 @@ import org.sonar.db.protobuf.DbCommons; import org.sonar.db.protobuf.DbIssues; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.rule.RuleTesting; -import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.es.EsTester; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.issue.IssueChangelog; import org.sonar.server.issue.IssueChangelog.ChangelogLoadingContext; +import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.organization.TestDefaultOrganizationProvider; import org.sonar.server.security.SecurityStandards; import org.sonar.server.security.SecurityStandards.SQCategory; @@ -93,11 +93,11 @@ public class ShowActionTest { private DbClient dbClient = dbTester.getDbClient(); private TestDefaultOrganizationProvider defaultOrganizationProvider = TestDefaultOrganizationProvider.from(dbTester); - private TextRangeResponseFormatter commonFormatter = new TextRangeResponseFormatter(); + private TextRangeResponseFormatter textRangeFormatter = new TextRangeResponseFormatter(); private HotspotWsResponseFormatter responseFormatter = new HotspotWsResponseFormatter(defaultOrganizationProvider); private IssueChangelog issueChangelog = Mockito.mock(IssueChangelog.class); - private ShowAction underTest = new ShowAction(dbClient, userSessionRule, responseFormatter, commonFormatter, issueChangelog); + private ShowAction underTest = new ShowAction(dbClient, userSessionRule, responseFormatter, textRangeFormatter, issueChangelog); private WsActionTester actionTester = new WsActionTester(underTest); @Test diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueWsModuleTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueWsModuleTest.java index 7b1220885fe..1c69abd8b52 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueWsModuleTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueWsModuleTest.java @@ -30,7 +30,7 @@ public class IssueWsModuleTest { public void verify_count_of_added_components() { ComponentContainer container = new ComponentContainer(); new IssueWsModule().configure(container); - assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 30); + assertThat(container.size()).isEqualTo(COMPONENTS_IN_EMPTY_COMPONENT_CONTAINER + 31); } } diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java index 9902e74ee9b..727046b3948 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java @@ -37,9 +37,9 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.issue.IssueDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; +import org.sonar.server.issue.AvatarResolverImpl; import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.es.EsTester; -import org.sonar.server.issue.AvatarResolverImpl; import org.sonar.server.issue.IssueFieldsSetter; import org.sonar.server.issue.TransitionService; import org.sonar.server.issue.index.IssueIndex; @@ -106,7 +106,8 @@ public class SearchActionComponentsTest { private IssueWorkflow issueWorkflow = new IssueWorkflow(new FunctionExecutor(issueFieldsSetter), issueFieldsSetter); private SearchResponseLoader searchResponseLoader = new SearchResponseLoader(userSession, dbClient, new TransitionService(userSession, issueWorkflow)); private Languages languages = new Languages(); - private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new AvatarResolverImpl(), new TextRangeResponseFormatter()); + private UserResponseFormatter userFormatter = new UserResponseFormatter(new AvatarResolverImpl()); + private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new TextRangeResponseFormatter(), userFormatter); private PermissionIndexerTester permissionIndexer = new PermissionIndexerTester(es, issueIndexer); private WsActionTester ws = new WsActionTester(new SearchAction(userSession, issueIndex, issueQueryFactory, searchResponseLoader, searchResponseFormat, diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionFacetsTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionFacetsTest.java index 4cc89cf1b10..f9efa1812a0 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionFacetsTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionFacetsTest.java @@ -37,10 +37,10 @@ import org.sonar.db.component.ComponentDto; import org.sonar.db.organization.OrganizationDto; import org.sonar.db.rule.RuleDefinitionDto; import org.sonar.db.user.UserDto; -import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.es.EsTester; import org.sonar.server.es.StartupIndexer; import org.sonar.server.issue.AvatarResolverImpl; +import org.sonar.server.issue.TextRangeResponseFormatter; import org.sonar.server.issue.TransitionService; import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.issue.index.IssueIndexer; @@ -88,7 +88,8 @@ public class SearchActionFacetsTest { private IssueQueryFactory issueQueryFactory = new IssueQueryFactory(db.getDbClient(), Clock.systemUTC(), userSession); private SearchResponseLoader searchResponseLoader = new SearchResponseLoader(userSession, db.getDbClient(), new TransitionService(userSession, null)); private Languages languages = new Languages(); - private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new AvatarResolverImpl(), new TextRangeResponseFormatter()); + private UserResponseFormatter userFormatter = new UserResponseFormatter(new AvatarResolverImpl()); + private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new TextRangeResponseFormatter(), userFormatter); private WsActionTester ws = new WsActionTester( new SearchAction(userSession, issueIndex, issueQueryFactory, searchResponseLoader, searchResponseFormat, diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTest.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTest.java index 3d1b890861b..dc8b4969586 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTest.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTest.java @@ -121,7 +121,8 @@ public class SearchActionTest { private IssueWorkflow issueWorkflow = new IssueWorkflow(new FunctionExecutor(issueFieldsSetter), issueFieldsSetter); private SearchResponseLoader searchResponseLoader = new SearchResponseLoader(userSession, dbClient, new TransitionService(userSession, issueWorkflow)); private Languages languages = new Languages(); - private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new AvatarResolverImpl(), new TextRangeResponseFormatter()); + private UserResponseFormatter userFormatter = new UserResponseFormatter(new AvatarResolverImpl()); + private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new TextRangeResponseFormatter(), userFormatter); private WsActionTester ws = new WsActionTester(new SearchAction(userSession, issueIndex, issueQueryFactory, searchResponseLoader, searchResponseFormat, new MapSettings().asConfig(), System2.INSTANCE, dbClient)); private StartupIndexer permissionIndexer = new PermissionIndexer(dbClient, es.client(), issueIndexer); diff --git a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud.java b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud.java index 8d71785e450..544b1a04bb6 100644 --- a/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud.java +++ b/server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud.java @@ -78,7 +78,8 @@ public class SearchActionTestOnSonarCloud { private IssueWorkflow issueWorkflow = new IssueWorkflow(new FunctionExecutor(issueFieldsSetter), issueFieldsSetter); private SearchResponseLoader searchResponseLoader = new SearchResponseLoader(userSession, dbClient, new TransitionService(userSession, issueWorkflow)); private Languages languages = new Languages(); - private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new AvatarResolverImpl(), new TextRangeResponseFormatter()); + private UserResponseFormatter userFormatter = new UserResponseFormatter(new AvatarResolverImpl()); + private SearchResponseFormat searchResponseFormat = new SearchResponseFormat(new Durations(), languages, new TextRangeResponseFormatter(), userFormatter); private PermissionIndexerTester permissionIndexer = new PermissionIndexerTester(es, issueIndexer); private SearchAction underTest = new SearchAction(userSession, issueIndex, issueQueryFactory, searchResponseLoader, searchResponseFormat, diff --git a/sonar-ws/src/main/protobuf/ws-commons.proto b/sonar-ws/src/main/protobuf/ws-commons.proto index e688e6212c9..f94db9af466 100644 --- a/sonar-ws/src/main/protobuf/ws-commons.proto +++ b/sonar-ws/src/main/protobuf/ws-commons.proto @@ -105,6 +105,13 @@ message Location { optional string msg = 3; } +message User { + optional string login = 1; + optional string name = 2; + optional string avatar = 3; + optional bool active = 4; +} + message Changelog { optional string user = 1; optional string userName = 2; diff --git a/sonar-ws/src/main/protobuf/ws-issues.proto b/sonar-ws/src/main/protobuf/ws-issues.proto index 7ab70dcbff6..fa6c6f65f16 100644 --- a/sonar-ws/src/main/protobuf/ws-issues.proto +++ b/sonar-ws/src/main/protobuf/ws-issues.proto @@ -53,49 +53,49 @@ message Operation { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message AddCommentResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message AssignResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message DeleteCommentResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message DoTransitionResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message SetSeverityResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message SetTagsResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message SetTypeResponse { optional Issue issue = 1; repeated Component components = 2; repeated sonarqube.ws.commons.Rule rules = 3; - repeated Users.User users = 4; + repeated sonarqube.ws.commons.User users = 4; } message TagsResponse { repeated string tags = 1; @@ -238,14 +238,7 @@ message BulkChangeWsResponse { } message Users { - repeated User users = 1; - - message User { - optional string login = 1; - optional string name = 2; - optional string avatar = 3; - optional bool active = 4; - } + repeated sonarqube.ws.commons.User users = 1; } // Response of GET api/issues/authors -- 2.39.5