]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6582 Refactor serialization of users out of user search WS
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Tue, 2 Jun 2015 12:19:51 +0000 (14:19 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Thu, 18 Jun 2015 07:34:34 +0000 (09:34 +0200)
17 files changed:
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/DeactivateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/UserJsonWriter.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/CreateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/DeactivateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/SearchActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/UpdateActionTest.java
server/sonar-server/src/test/java/org/sonar/server/user/ws/UsersWsTest.java
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/assigned_to_me_facet_sticky.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/filter_by_assigned_to_me.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue.json
server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_with_extra_fields.json

index 691662734201e8e152db0807eee92f85bb4a8864..ab7c665bc22bb6567a0b9587f15c2909da381cdb 100644 (file)
@@ -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<String> 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<String, String> entry : issue.attributes().entrySet()) {
@@ -669,7 +674,7 @@ public class SearchAction implements IssuesWsAction {
     json.endArray();
   }
 
-  private void writeProjects(JsonWriter json, List<ComponentDto> projects) {
+  private static void writeProjects(JsonWriter json, List<ComponentDto> 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<String, ComponentDto> buildProjectsByUuid(Collection<ComponentDto> projects) {
+  private static Map<String, ComponentDto> buildProjectsByUuid(Collection<ComponentDto> projects) {
     Map<String, ComponentDto> projectsByUuid = newHashMap();
     for (ComponentDto project : projects) {
       if (project == null) {
@@ -768,7 +773,7 @@ public class SearchAction implements IssuesWsAction {
     return projectsByUuid;
   }
 
-  private Map<String, ComponentDto> buildProjectsByComponentUuid(Collection<ComponentDto> components, Map<String, ComponentDto> projectsByUuid) {
+  private static Map<String, ComponentDto> buildProjectsByComponentUuid(Collection<ComponentDto> components, Map<String, ComponentDto> projectsByUuid) {
     Map<String, ComponentDto> 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<String> itemsFromFacets, JsonWriter json) {
+  private static void addZeroFacetsForSelectedItems(Request request, String facetName, Set<String> itemsFromFacets, JsonWriter json) {
     List<String> requestParams = request.paramAsStrings(facetName);
     if (requestParams != null) {
       for (String param : requestParams) {
index 65815e09dae5ba7cb5a9c4a11fc8a046ec351455..4ead39284afd0cd0b021eef35580de654df78d4b 100644 (file)
@@ -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,
index ac9381c4cb1d813ab9ac606551a18e7d7d41751f..5b1ddf8353c89a5a70e53b4e4da12f6a81e2bcb5 100644 (file)
@@ -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.<String>of(), UserJsonWriter.FIELDS);
   }
 
   private void writeReactivationMessage(JsonWriter json, String login) {
index 620208e8e76e5127d4d65035ba0224eecbcba278..93ddfc1429636ee1b5541c234c17fb9df453185c 100644 (file)
 
 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<String> 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);
   }
 }
index 31de4ec616369d8deb69f693181cb02e96575c8f..3639183671b250dcff8b3a1092e7641e20e52bdf 100644 (file)
@@ -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<String> 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<String> 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<String> fields) {
-    if (fieldIsWanted(field, fields)) {
-      json.prop(field, value);
-    }
-  }
-
-  private void writeGroupsIfNeeded(JsonWriter json, Collection<String> groups, @Nullable List<String> 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<String> 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<String> fields) {
-    return fields == null || fields.isEmpty() || fields.contains(field);
-  }
 }
index 22fa4a1b4ed8e67ca9752cce12497fe198d47fc2..b56eec73f5a0ecda27eacd9fee7b30678a25de01 100644 (file)
 
 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<String> 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 (file)
index 0000000..e889435
--- /dev/null
@@ -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<String> FIELDS = ImmutableSet.of(FIELD_NAME, FIELD_EMAIL, FIELD_SCM_ACCOUNTS, FIELD_GROUPS, FIELD_ACTIVE);
+  private static final Set<String> 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<String> groups, Collection<String> 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.<String>of(), CONCISE_FIELDS);
+    }
+  }
+
+  private static void writeIfNeeded(JsonWriter json, @Nullable String value, String field, Collection<String> fields) {
+    if (isFieldWanted(field, fields)) {
+      json.prop(field, value);
+    }
+  }
+
+  private static void writeIfNeeded(JsonWriter json, @Nullable Boolean value, String field, Collection<String> fields) {
+    if (isFieldWanted(field, fields)) {
+      json.prop(field, value);
+    }
+  }
+
+  private void writeGroupsIfNeeded(JsonWriter json, Collection<String> groups, @Nullable Collection<String> 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<String> 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<String> fields) {
+    return fields == null || fields.isEmpty() || fields.contains(field);
+  }
+}
index 791433a9e332601ef18052ba15f2b420e8631ed7..0728a09507eb9a222f8a7a077f212a29f16748ac 100644 (file)
@@ -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"));
index 943620ae905292c8a862ee7d5c5bf343fb77249b..099700b8ffae4f1f82874f035473d40a9e9a4e14 100644 (file)
@@ -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");
 
   }
index d29262ac408cc271ca4632df99f25de3ec173842..ae86e7aeeaaf28e5257eeb8d2cff389f7d5d50cc 100644 (file)
@@ -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");
 
   }
index 08f2bd4a802bb5fba9ded9919c3af23e361b3a91..067d05306ced76c89badd8fae0a20d679863d924 100644 (file)
@@ -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")
index 2cce87b68ebc6b2a09085d22993744a381679f97..154dc55194fa623d2ee6c4c09a93ce3277adfbb3 100644 (file)
@@ -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");
   }
 
index c59fa79aabef4ff890be2281e826353ff7273f6d..fdbe1d595f795c9d98c9cc79423ab8dea9eeeb72 100644 (file)
@@ -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");
   }
 
index 4db42bbaa41de1502910c7c0705c49078e0a7027..b3f2e5a2e8193a4d0b8ff4ba0c93d9fc105d54da 100644 (file)
@@ -9,7 +9,9 @@
       "severity": "MAJOR",
       "debt": "10min",
       "fUpdateAge": "less than a minute",
-      "assignee": "alice"
+      "assignee": {
+        "login": "alice"
+      }
     }
   ],
   "facets": [
index 013ff81376e2c44b435031b09918072f1e8da99b..374dfb4a04f77009e1216c84bae7fb391326a5e4 100644 (file)
@@ -9,7 +9,9 @@
       "severity": "MAJOR",
       "debt": "10min",
       "fUpdateAge": "less than a minute",
-      "assignee": "john"
+      "assignee": {
+        "login": "john"
+      }
     }
   ],
   "facets": [
index ee02f787d29a76ce251810e5542c2c1756cb0ab6..84f5134fe2a31ea3153651e59c5bf7b6a1a249a8 100644 (file)
       "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",
index 4c272e0d79bb64f4fa65eb079c9aa765ab4850f6..fc4378b4eb65fbeddcc89c02fc6ab26bfe50cba8 100644 (file)
@@ -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",