]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-12718 move User to ws-commons.proto
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 9 Dec 2019 15:53:50 +0000 (16:53 +0100)
committerSonarTech <sonartech@sonarsource.com>
Mon, 13 Jan 2020 19:46:27 +0000 (20:46 +0100)
server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/IssueWsModule.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/SearchResponseFormat.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/ws/UserResponseFormatter.java [new file with mode: 0644]
server/sonar-webserver-webapi/src/test/java/org/sonar/server/hotspot/ws/ShowActionTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/IssueWsModuleTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionComponentsTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionFacetsTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/issue/ws/SearchActionTestOnSonarCloud.java
sonar-ws/src/main/protobuf/ws-commons.proto
sonar-ws/src/main/protobuf/ws-issues.proto

index e66b4f306914aab9884ad04e94187e67d4f3f9a0..dd92918d965dc518d92ebff402334d0dc581a3cb 100644 (file)
@@ -49,6 +49,7 @@ public class IssueWsModule extends Module {
       IssueChangelog.class,
       SearchResponseLoader.class,
       TextRangeResponseFormatter.class,
+      UserResponseFormatter.class,
       SearchResponseFormat.class,
       OperationResponseWriter.class,
       AddCommentAction.class,
index bb3f1d3af21388eda7a5968185276aecd124ee97..02ef9b94ecf48d90c1745a25da3e164df502339c 100644 (file)
@@ -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<SearchAdditionalField> fields, SearchResponseData data, Paging paging, Facets facets) {
@@ -328,22 +327,14 @@ public class SearchResponseFormat {
     Users.Builder wsUsers = Users.newBuilder();
     List<UserDto> 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 (file)
index 0000000..739725d
--- /dev/null
@@ -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();
+  }
+}
index 0c68ab3f42034c3d35ae6fe9fcfbcfe5ff1b2cec..d9b1d85b0f8da55a67de1ea8855c158384f810f9 100644 (file)
@@ -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
index 7b1220885fe2548349152e69d6fec79565a040ef..1c69abd8b52f52f6677905b3bcac9aadb9a959ab 100644 (file)
@@ -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);
   }
 }
 
index 9902e74ee9b29e3b07daefa848d6306075874758..727046b3948d12bcbce81566fa80717e5b7285f2 100644 (file)
@@ -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,
index 4cc89cf1b10a66a1458b67d23512bf46c90fd785..f9efa1812a0640abad81daf4d06deac8fe717bdd 100644 (file)
@@ -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,
index 3d1b890861be4632af1007e4e9f3774a8abd31a0..dc8b4969586c2344c78f5780192dded717eb5b97 100644 (file)
@@ -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);
index 8d71785e45066c391c7e58955eff9fbd27e229ad..544b1a04bb6fb5a857bc3461ae9a5367cfee04f7 100644 (file)
@@ -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,
index e688e6212c9e495c1f6bb274e25b312406d2a87d..f94db9af46607ebd21c423e2ad6cc05012400fab 100644 (file)
@@ -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;
index 7ab70dcbff69ff6ceaf2fcebfe40d9a16ef872da..fa6c6f65f1616ff050ee90fac69e01a2b0fe531a 100644 (file)
@@ -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