From e183ec7123713007b84cfae85b79645ab6337acf Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Tue, 2 Jun 2015 14:19:51 +0200 Subject: [PATCH] SONAR-6582 Refactor serialization of users out of user search WS --- .../sonar/server/issue/ws/SearchAction.java | 23 ++-- .../platformlevel/PlatformLevel4.java | 3 + .../sonar/server/user/ws/CreateAction.java | 16 ++- .../server/user/ws/DeactivateAction.java | 28 +++-- .../sonar/server/user/ws/SearchAction.java | 57 +-------- .../sonar/server/user/ws/UpdateAction.java | 30 +++-- .../sonar/server/user/ws/UserJsonWriter.java | 109 ++++++++++++++++++ .../issue/ws/SearchActionMediumTest.java | 4 + .../server/user/ws/CreateActionTest.java | 2 +- .../server/user/ws/DeactivateActionTest.java | 6 +- .../server/user/ws/SearchActionTest.java | 15 +-- .../server/user/ws/UpdateActionTest.java | 6 +- .../org/sonar/server/user/ws/UsersWsTest.java | 9 +- .../assigned_to_me_facet_sticky.json | 4 +- .../filter_by_assigned_to_me.json | 4 +- .../ws/SearchActionMediumTest/issue.json | 7 +- .../issue_with_extra_fields.json | 7 +- 17 files changed, 219 insertions(+), 111 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java index 69166273420..ab7c665bc22 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -69,6 +69,7 @@ import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.rule.Rule; import org.sonar.server.rule.RuleService; import org.sonar.server.user.UserSession; +import org.sonar.server.user.ws.UserJsonWriter; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Maps.newHashMap; @@ -100,10 +101,11 @@ public class SearchAction implements IssuesWsAction { private final Durations durations; private final Languages languages; private final UserSession userSession; + private final UserJsonWriter userWriter; public SearchAction(DbClient dbClient, IssueService service, IssueActionsWriter actionsWriter, IssueQueryService issueQueryService, RuleService ruleService, ActionPlanService actionPlanService, UserFinder userFinder, I18n i18n, Durations durations, Languages languages, - UserSession userSession) { + UserSession userSession, UserJsonWriter userWriter) { this.dbClient = dbClient; this.service = service; this.actionsWriter = actionsWriter; @@ -115,6 +117,7 @@ public class SearchAction implements IssuesWsAction { this.durations = durations; this.languages = languages; this.userSession = userSession; + this.userWriter = userWriter; } @Override @@ -541,7 +544,6 @@ public class SearchAction implements IssuesWsAction { .prop("line", issue.line()) .prop("debt", debt != null ? durations.encode(debt) : null) .prop("reporter", issue.reporter()) - .prop("assignee", issue.assignee()) .prop("author", issue.authorLogin()) .prop("actionPlan", actionPlanKey) .prop("creationDate", isoDate(issue.creationDate())) @@ -550,6 +552,9 @@ public class SearchAction implements IssuesWsAction { .prop("fUpdateAge", formatAgeDate(updateDate)) .prop("closeDate", isoDate(issue.closeDate())); + json.name("assignee"); + userWriter.write(json, usersByLogin.get(issue.assignee())); + writeTags(issue, json); writeIssueComments(commentsByIssues.get(issue.key()), usersByLogin, json); writeIssueAttributes(issue, json); @@ -560,7 +565,7 @@ public class SearchAction implements IssuesWsAction { json.endArray(); } - private void writeTags(Issue issue, JsonWriter json) { + private static void writeTags(Issue issue, JsonWriter json) { Collection tags = issue.tags(); if (tags != null && !tags.isEmpty()) { json.name("tags").beginArray(); @@ -593,7 +598,7 @@ public class SearchAction implements IssuesWsAction { } } - private void writeIssueAttributes(Issue issue, JsonWriter json) { + private static void writeIssueAttributes(Issue issue, JsonWriter json) { if (!issue.attributes().isEmpty()) { json.name("attr").beginObject(); for (Map.Entry entry : issue.attributes().entrySet()) { @@ -669,7 +674,7 @@ public class SearchAction implements IssuesWsAction { json.endArray(); } - private void writeProjects(JsonWriter json, List projects) { + private static void writeProjects(JsonWriter json, List projects) { json.name("projects").beginArray(); for (ComponentDto project : projects) { json.beginObject() @@ -754,7 +759,7 @@ public class SearchAction implements IssuesWsAction { return buildProjectsByComponentUuid(components, projectsByUuid); } - private Map buildProjectsByUuid(Collection projects) { + private static Map buildProjectsByUuid(Collection projects) { Map projectsByUuid = newHashMap(); for (ComponentDto project : projects) { if (project == null) { @@ -768,7 +773,7 @@ public class SearchAction implements IssuesWsAction { return projectsByUuid; } - private Map buildProjectsByComponentUuid(Collection components, Map projectsByUuid) { + private static Map buildProjectsByComponentUuid(Collection components, Map projectsByUuid) { Map projectsByComponentUuid = newHashMap(); for (ComponentDto component : components) { if (component.uuid() == null) { @@ -783,7 +788,7 @@ public class SearchAction implements IssuesWsAction { } @CheckForNull - private String isoDate(@Nullable Date date) { + private static String isoDate(@Nullable Date date) { if (date != null) { return DateUtils.formatDateTime(date); } @@ -817,7 +822,7 @@ public class SearchAction implements IssuesWsAction { } } - private void addZeroFacetsForSelectedItems(Request request, String facetName, Set itemsFromFacets, JsonWriter json) { + private static void addZeroFacetsForSelectedItems(Request request, String facetName, Set itemsFromFacets, JsonWriter json) { List requestParams = request.paramAsStrings(facetName); if (requestParams != null) { for (String param : requestParams) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java index 65815e09dae..4ead39284af 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java @@ -19,6 +19,8 @@ */ package org.sonar.server.platform.platformlevel; +import org.sonar.server.user.ws.UserJsonWriter; + import java.util.List; import org.sonar.api.config.EmailSettings; import org.sonar.api.issue.action.Actions; @@ -537,6 +539,7 @@ public class PlatformLevel4 extends PlatformLevel { NewUserNotifier.class, DefaultUserFinder.class, DefaultUserService.class, + UserJsonWriter.class, UsersWs.class, org.sonar.server.user.ws.CreateAction.class, org.sonar.server.user.ws.UpdateAction.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java index ac9381c4cb1..5b1ddf8353c 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java @@ -20,6 +20,7 @@ package org.sonar.server.user.ws; +import com.google.common.collect.ImmutableSet; import org.sonar.api.i18n.I18n; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; @@ -45,12 +46,14 @@ public class CreateAction implements UsersWsAction { private final UserUpdater userUpdater; private final I18n i18n; private final UserSession userSession; + private final UserJsonWriter userWriter; - public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n, UserSession userSession) { + public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n, UserSession userSession, UserJsonWriter userWriter) { this.index = index; this.userUpdater = userUpdater; this.i18n = i18n; this.userSession = userSession; + this.userWriter = userWriter; } @Override @@ -115,14 +118,9 @@ public class CreateAction implements UsersWsAction { json.endObject().close(); } - private static void writeUser(JsonWriter json, UserDoc user) { - json.name("user").beginObject() - .prop("login", user.login()) - .prop("name", user.name()) - .prop("email", user.email()) - .prop("active", user.active()) - .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray() - .endObject(); + private void writeUser(JsonWriter json, UserDoc user) { + json.name("user"); + userWriter.write(json, user, ImmutableSet.of(), UserJsonWriter.FIELDS); } private void writeReactivationMessage(JsonWriter json, String login) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java index 620208e8e76..93ddfc14296 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java @@ -20,12 +20,18 @@ package org.sonar.server.user.ws; +import com.google.common.collect.Sets; +import java.util.Arrays; +import java.util.Set; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.NewAction; import org.sonar.api.utils.text.JsonWriter; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.MyBatis; +import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.BadRequestException; import org.sonar.server.user.UserSession; import org.sonar.server.user.UserUpdater; @@ -39,11 +45,15 @@ public class DeactivateAction implements UsersWsAction { private final UserIndex index; private final UserUpdater userUpdater; private final UserSession userSession; + private final UserJsonWriter userWriter; + private final DbClient dbClient; - public DeactivateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) { + public DeactivateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession, UserJsonWriter userWriter, DbClient dbClient) { this.index = index; this.userUpdater = userUpdater; this.userSession = userSession; + this.userWriter = userWriter; + this.dbClient = dbClient; } @Override @@ -81,12 +91,14 @@ public class DeactivateAction implements UsersWsAction { } private void writeUser(JsonWriter json, UserDoc user) { - json.name("user").beginObject() - .prop("login", user.login()) - .prop("name", user.name()) - .prop("email", user.email()) - .prop("active", user.active()) - .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray() - .endObject(); + json.name("user"); + Set groups = Sets.newHashSet(); + DbSession dbSession = dbClient.openSession(false); + try { + groups.addAll(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, Arrays.asList(user.login())).get(user.login())); + } finally { + MyBatis.closeQuietly(dbSession); + } + userWriter.write(json, user, groups, UserJsonWriter.FIELDS); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java index 31de4ec6163..3639183671b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java @@ -23,11 +23,9 @@ package org.sonar.server.user.ws; import com.google.common.base.Function; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Collections2; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import java.util.Collection; import java.util.List; -import java.util.Set; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.sonar.api.server.ws.Request; @@ -35,33 +33,24 @@ import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService.Param; import org.sonar.api.utils.text.JsonWriter; -import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.MyBatis; import org.sonar.server.db.DbClient; import org.sonar.server.es.SearchOptions; import org.sonar.server.es.SearchResult; -import org.sonar.server.user.UserSession; import org.sonar.server.user.index.UserDoc; import org.sonar.server.user.index.UserIndex; public class SearchAction implements UsersWsAction { - private static final String FIELD_LOGIN = "login"; - private static final String FIELD_NAME = "name"; - private static final String FIELD_EMAIL = "email"; - private static final String FIELD_SCM_ACCOUNTS = "scmAccounts"; - private static final String FIELD_GROUPS = "groups"; - private static final Set FIELDS = ImmutableSet.of(FIELD_LOGIN, FIELD_NAME, FIELD_EMAIL, FIELD_SCM_ACCOUNTS, FIELD_GROUPS); - private final UserIndex userIndex; private final DbClient dbClient; - private final UserSession userSession; + private final UserJsonWriter userWriter; - public SearchAction(UserIndex userIndex, DbClient dbClient, UserSession userSession) { + public SearchAction(UserIndex userIndex, DbClient dbClient, UserJsonWriter userWriter) { this.userIndex = userIndex; this.dbClient = dbClient; - this.userSession = userSession; + this.userWriter = userWriter; } @Override @@ -72,7 +61,7 @@ public class SearchAction implements UsersWsAction { .setHandler(this) .setResponseExample(getClass().getResource("example-search.json")); - action.addFieldsParam(FIELDS); + action.addFieldsParam(UserJsonWriter.FIELDS); action.addPagingParams(50); action.createParam(Param.TEXT_QUERY) @@ -110,43 +99,9 @@ public class SearchAction implements UsersWsAction { json.name("users").beginArray(); for (UserDoc user : result.getDocs()) { - json.beginObject(); - writeIfNeeded(json, user.login(), FIELD_LOGIN, fields); - writeIfNeeded(json, user.name(), FIELD_NAME, fields); - writeIfNeeded(json, user.email(), FIELD_EMAIL, fields); - writeGroupsIfNeeded(json, groupsByLogin.get(user.login()), fields); - writeScmAccountsIfNeeded(json, fields, user); - json.endObject(); + Collection groups = groupsByLogin.get(user.login()); + userWriter.write(json, user, groups, fields); } json.endArray(); } - - private void writeIfNeeded(JsonWriter json, @Nullable String value, String field, @Nullable List fields) { - if (fieldIsWanted(field, fields)) { - json.prop(field, value); - } - } - - private void writeGroupsIfNeeded(JsonWriter json, Collection groups, @Nullable List fields) { - if (fieldIsWanted(FIELD_GROUPS, fields) && userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)) { - json.name(FIELD_GROUPS).beginArray(); - for (String groupName : groups) { - json.value(groupName); - } - json.endArray(); - } - } - - private void writeScmAccountsIfNeeded(JsonWriter json, List fields, UserDoc user) { - if (fieldIsWanted(FIELD_SCM_ACCOUNTS, fields)) { - json.name(FIELD_SCM_ACCOUNTS) - .beginArray() - .values(user.scmAccounts()) - .endArray(); - } - } - - private boolean fieldIsWanted(String field, @Nullable List fields) { - return fields == null || fields.isEmpty() || fields.contains(field); - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java index 22fa4a1b4ed..b56eec73f5a 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java @@ -20,11 +20,17 @@ package org.sonar.server.user.ws; +import com.google.common.collect.Sets; +import java.util.Arrays; +import java.util.Set; import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.text.JsonWriter; import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.persistence.DbSession; +import org.sonar.core.persistence.MyBatis; +import org.sonar.server.db.DbClient; import org.sonar.server.user.UpdateUser; import org.sonar.server.user.UserSession; import org.sonar.server.user.UserUpdater; @@ -42,11 +48,15 @@ public class UpdateAction implements UsersWsAction { private final UserIndex index; private final UserUpdater userUpdater; private final UserSession userSession; + private final UserJsonWriter userWriter; + private final DbClient dbClient; - public UpdateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession) { + public UpdateAction(UserIndex index, UserUpdater userUpdater, UserSession userSession, UserJsonWriter userWriter, DbClient dbClient) { this.index = index; this.userUpdater = userUpdater; this.userSession = userSession; + this.userWriter = userWriter; + this.dbClient = dbClient; } @Override @@ -105,13 +115,15 @@ public class UpdateAction implements UsersWsAction { json.endObject().close(); } - private static void writeUser(JsonWriter json, UserDoc user) { - json.name("user").beginObject() - .prop("login", user.login()) - .prop("name", user.name()) - .prop("email", user.email()) - .prop("active", user.active()) - .name("scmAccounts").beginArray().values(user.scmAccounts()).endArray() - .endObject(); + private void writeUser(JsonWriter json, UserDoc user) { + json.name("user"); + Set groups = Sets.newHashSet(); + DbSession dbSession = dbClient.openSession(false); + try { + groups.addAll(dbClient.groupMembershipDao().selectGroupsByLogins(dbSession, Arrays.asList(user.login())).get(user.login())); + } finally { + MyBatis.closeQuietly(dbSession); + } + userWriter.write(json, user, groups, UserJsonWriter.FIELDS); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java new file mode 100644 index 00000000000..e889435770c --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java @@ -0,0 +1,109 @@ +/* + * 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.user.ws; + +import com.google.common.collect.ImmutableSet; +import java.util.Collection; +import java.util.Set; +import javax.annotation.Nullable; +import org.sonar.api.user.User; +import org.sonar.api.utils.text.JsonWriter; +import org.sonar.core.permission.GlobalPermissions; +import org.sonar.server.user.UserSession; +import org.sonar.server.user.index.UserDoc; + +public class UserJsonWriter { + + private static final String FIELD_LOGIN = "login"; + private static final String FIELD_NAME = "name"; + private static final String FIELD_EMAIL = "email"; + private static final String FIELD_SCM_ACCOUNTS = "scmAccounts"; + private static final String FIELD_GROUPS = "groups"; + private static final String FIELD_ACTIVE = "active"; + + public static final Set FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_EMAIL, FIELD_SCM_ACCOUNTS, FIELD_GROUPS, FIELD_ACTIVE); + private static final Set CONCISE_FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_EMAIL, FIELD_ACTIVE); + + private final UserSession userSession; + + public UserJsonWriter(UserSession userSession) { + this.userSession = userSession; + } + + /** + * Serializes a user to the passed JsonWriter. + */ + public void write(JsonWriter json, User user, Collection groups, Collection fields) { + json.beginObject(); + json.prop(FIELD_LOGIN, user.login()); + writeIfNeeded(json, user.name(), FIELD_NAME, fields); + writeIfNeeded(json, user.email(), FIELD_EMAIL, fields); + writeIfNeeded(json, user.active(), FIELD_ACTIVE, fields); + writeGroupsIfNeeded(json, groups, fields); + writeScmAccountsIfNeeded(json, fields, user); + json.endObject(); + } + + /** + * A shortcut to {@link #write(JsonWriter, User, Collection, Collection)} with preselected fields and without group information + */ + public void write(JsonWriter json, @Nullable User user) { + if (user == null) { + json.beginObject().endObject(); + } else { + write(json, user, ImmutableSet.of(), CONCISE_FIELDS); + } + } + + private static void writeIfNeeded(JsonWriter json, @Nullable String value, String field, Collection fields) { + if (isFieldWanted(field, fields)) { + json.prop(field, value); + } + } + + private static void writeIfNeeded(JsonWriter json, @Nullable Boolean value, String field, Collection fields) { + if (isFieldWanted(field, fields)) { + json.prop(field, value); + } + } + + private void writeGroupsIfNeeded(JsonWriter json, Collection groups, @Nullable Collection fields) { + if (isFieldWanted(FIELD_GROUPS, fields) && userSession.hasGlobalPermission(GlobalPermissions.SYSTEM_ADMIN)) { + json.name(FIELD_GROUPS).beginArray(); + for (String groupName : groups) { + json.value(groupName); + } + json.endArray(); + } + } + + private static void writeScmAccountsIfNeeded(JsonWriter json, Collection fields, User user) { + if (isFieldWanted(FIELD_SCM_ACCOUNTS, fields)) { + json.name(FIELD_SCM_ACCOUNTS) + .beginArray() + .values(((UserDoc) user).scmAccounts()) + .endArray(); + } + } + + private static boolean isFieldWanted(String field, @Nullable Collection fields) { + return fields == null || fields.isEmpty() || fields.contains(field); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java index 791433a9e33..0728a09507e 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java @@ -441,6 +441,8 @@ public class SearchActionMediumTest { @Test public void filter_by_assigned_to_me() throws Exception { + db.userDao().insert(session, new UserDto().setLogin("john").setName("John").setEmail("john@email.com")); + ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject")); setDefaultProjectPermission(project); ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent")); @@ -513,6 +515,8 @@ public class SearchActionMediumTest { @Test public void assigned_to_me_facet_is_sticky_relative_to_assignees() throws Exception { + db.userDao().insert(session, new UserDto().setLogin("alice").setName("Alice").setEmail("alice@email.com")); + ComponentDto project = insertComponent(ComponentTesting.newProjectDto("ABCD").setKey("MyProject")); setDefaultProjectPermission(project); ComponentDto file = insertComponent(ComponentTesting.newFileDto(project, "BCDE").setKey("MyComponent")); diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java index 943620ae905..099700b8ffa 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java @@ -103,7 +103,7 @@ public class CreateActionTest { index = new UserIndex(esTester.client()); tester = new WsTester(new UsersWs(new CreateAction(index, new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), - i18n, userSessionRule))); + i18n, userSessionRule, new UserJsonWriter(userSessionRule)))); controller = tester.controller("api/users"); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java index d29262ac408..ae86e7aeeaa 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java @@ -33,6 +33,7 @@ import org.sonar.api.utils.System2; import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.DbTester; +import org.sonar.core.user.GroupMembershipDao; import org.sonar.core.user.UserDto; import org.sonar.server.db.DbClient; import org.sonar.server.es.EsTester; @@ -87,14 +88,15 @@ public class DeactivateActionTest { System2 system2 = new System2(); UserDao userDao = new UserDao(dbTester.myBatis(), system2); - dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao); + dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, new GroupMembershipDao(dbTester.myBatis())); session = dbClient.openSession(false); session.commit(); userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true); index = new UserIndex(esTester.client()); tester = new WsTester(new UsersWs(new DeactivateAction(index, - new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule))); + new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule, + new UserJsonWriter(userSessionRule), dbClient))); controller = tester.controller("api/users"); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java index 08f2bd4a802..067d05306ce 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java @@ -89,7 +89,7 @@ public class SearchActionTest { session = dbClient.openSession(false); index = new UserIndex(esTester.client()); - tester = new WsTester(new UsersWs(new SearchAction(index, dbClient, userSession))); + tester = new WsTester(new UsersWs(new SearchAction(index, dbClient, new UserJsonWriter(userSession)))); controller = tester.controller("api/users"); } @@ -143,22 +143,15 @@ public class SearchActionTest { .contains("scmAccounts") .doesNotContain("groups"); - assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "login").execute().outputAsString()) - .contains("login") - .doesNotContain("name") - .doesNotContain("email") - .doesNotContain("scmAccounts") - .doesNotContain("groups"); - assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "scmAccounts").execute().outputAsString()) - .doesNotContain("login") + .contains("login") .doesNotContain("name") .doesNotContain("email") .contains("scmAccounts") .doesNotContain("groups"); assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString()) - .doesNotContain("login") + .contains("login") .doesNotContain("name") .doesNotContain("email") .doesNotContain("scmAccounts") @@ -174,7 +167,7 @@ public class SearchActionTest { .contains("groups"); assertThat(tester.newGetRequest("api/users", "search").setParam(Param.FIELDS, "groups").execute().outputAsString()) - .doesNotContain("login") + .contains("login") .doesNotContain("name") .doesNotContain("email") .doesNotContain("scmAccounts") diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java index 2cce87b68eb..154dc55194f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java @@ -32,6 +32,7 @@ import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.DbTester; import org.sonar.core.user.GroupDto; +import org.sonar.core.user.GroupMembershipDao; import org.sonar.core.user.UserDto; import org.sonar.server.db.DbClient; import org.sonar.server.es.EsTester; @@ -84,7 +85,7 @@ public class UpdateActionTest { UserDao userDao = new UserDao(dbTester.myBatis(), system2); UserGroupDao userGroupDao = new UserGroupDao(); GroupDao groupDao = new GroupDao(system2); - dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, userGroupDao, groupDao); + dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, userGroupDao, groupDao, new GroupMembershipDao(dbTester.myBatis())); session = dbClient.openSession(false); groupDao.insert(session, new GroupDto().setName("sonar-users")); session.commit(); @@ -92,7 +93,8 @@ public class UpdateActionTest { userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true); index = new UserIndex(esTester.client()); tester = new WsTester(new UsersWs(new UpdateAction(index, - new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule))); + new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2, mock(SecurityRealmFactory.class)), userSessionRule, + new UserJsonWriter(userSessionRule), dbClient))); controller = tester.controller("api/users"); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java index c59fa79aabe..fdbe1d595f7 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java @@ -27,7 +27,6 @@ import org.sonar.api.i18n.I18n; import org.sonar.api.server.ws.WebService; import org.sonar.server.db.DbClient; import org.sonar.server.tester.UserSessionRule; -import org.sonar.server.user.UserSession; import org.sonar.server.user.UserUpdater; import org.sonar.server.user.index.UserIndex; import org.sonar.server.ws.WsTester; @@ -43,12 +42,12 @@ public class UsersWsTest { @Before public void setUp() { WsTester tester = new WsTester(new UsersWs( - new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class), userSessionRule), - new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule), + new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class), userSessionRule, mock(UserJsonWriter.class)), + new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule, mock(UserJsonWriter.class), mock(DbClient.class)), new CurrentAction(userSessionRule), - new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule), + new DeactivateAction(mock(UserIndex.class), mock(UserUpdater.class), userSessionRule, mock(UserJsonWriter.class), mock(DbClient.class)), new ChangePasswordAction(mock(UserUpdater.class), userSessionRule), - new SearchAction(mock(UserIndex.class), mock(DbClient.class), mock(UserSession.class)))); + new SearchAction(mock(UserIndex.class), mock(DbClient.class), mock(UserJsonWriter.class)))); controller = tester.controller("api/users"); } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json index 4db42bbaa41..b3f2e5a2e81 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json @@ -9,7 +9,9 @@ "severity": "MAJOR", "debt": "10min", "fUpdateAge": "less than a minute", - "assignee": "alice" + "assignee": { + "login": "alice" + } } ], "facets": [ diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/filter_by_assigned_to_me.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/filter_by_assigned_to_me.json index 013ff81376e..374dfb4a04f 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/filter_by_assigned_to_me.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/filter_by_assigned_to_me.json @@ -9,7 +9,9 @@ "severity": "MAJOR", "debt": "10min", "fUpdateAge": "less than a minute", - "assignee": "john" + "assignee": { + "login": "john" + } } ], "facets": [ diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue.json index ee02f787d29..84f5134fe2a 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue.json @@ -13,7 +13,12 @@ "severity": "MAJOR", "debt": "10min", "author": "John", - "assignee": "simon", + "assignee": { + "login": "simon", + "name": "Simon", + "active": true, + "email": "simon@email.com" + }, "reporter": "fabrice", "actionPlan": "AP-ABCD", "updateDate": "2017-12-04T00:00:00+0100", diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_extra_fields.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_extra_fields.json index 4c272e0d79b..fc4378b4eb6 100644 --- a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_extra_fields.json +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_extra_fields.json @@ -2,7 +2,12 @@ "issues": [ { "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2", - "assignee": "simon", + "assignee": { + "login": "simon", + "name": "Simon", + "active": true, + "email": "simon@email.com" + }, "assigneeName": "Simon", "reporter": "fabrice", "reporterName": "Fabrice", -- 2.39.5