Skip to content

Commit

Permalink
SONAR-6522 Consume batch/users WS to populate JSON report
Browse files Browse the repository at this point in the history
  • Loading branch information
henryju committed May 6, 2015
1 parent f6c58cf commit 3e2f029
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 90 deletions.

This file was deleted.

Expand Up @@ -19,10 +19,16 @@
*/ */
package org.sonar.batch.repository.user; package org.sonar.batch.repository.user;


import com.google.common.base.Function;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.io.InputSupplier;
import org.sonar.api.utils.HttpDownloader;
import org.sonar.batch.bootstrap.ServerClient; import org.sonar.batch.bootstrap.ServerClient;
import org.sonar.batch.protocol.GsonHelper; import org.sonar.batch.protocol.input.BatchInput;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
Expand All @@ -36,23 +42,29 @@ public UserRepository(ServerClient serverClient) {
this.serverClient = serverClient; this.serverClient = serverClient;
} }


private static class Users { public Collection<BatchInput.User> loadFromWs(List<String> userLogins) {

private List<User> users = new ArrayList<>();

public List<User> getUsers() {
return users;
}
}

public Collection<User> loadFromWs(List<String> userLogins) {
if (userLogins.isEmpty()) { if (userLogins.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
String url = "/api/users/search?format=json&includeDeactivated=true&logins=" + Joiner.on(',').join(userLogins); InputSupplier<InputStream> request = serverClient.doRequest("/batch/users?logins=" + Joiner.on(',').join(Lists.transform(userLogins, new Function<String, String>() {
String json = serverClient.request(url); @Override
Users users = GsonHelper.create().fromJson(json, Users.class); public String apply(String input) {
return users.getUsers(); return ServerClient.encodeForUrl(input);
}
})), "GET", null);
List<BatchInput.User> users = new ArrayList<>();
try (InputStream is = request.getInput()) {
BatchInput.User user = BatchInput.User.parseDelimitedFrom(is);
while (user != null) {
users.add(user);
user = BatchInput.User.parseDelimitedFrom(is);
}
} catch (HttpDownloader.HttpException e) {
throw serverClient.handleHttpException(e);
} catch (IOException e) {
throw new IllegalStateException("Unable to get user details from server", e);
}
return users;
} }


} }
Expand Up @@ -42,7 +42,7 @@
import org.sonar.api.utils.SonarException; import org.sonar.api.utils.SonarException;
import org.sonar.api.utils.text.JsonWriter; import org.sonar.api.utils.text.JsonWriter;
import org.sonar.batch.issue.IssueCache; import org.sonar.batch.issue.IssueCache;
import org.sonar.batch.repository.user.User; import org.sonar.batch.protocol.input.BatchInput;
import org.sonar.batch.repository.user.UserRepository; import org.sonar.batch.repository.user.UserRepository;
import org.sonar.batch.scan.filesystem.InputPathCache; import org.sonar.batch.scan.filesystem.InputPathCache;


Expand Down Expand Up @@ -122,7 +122,7 @@ void writeJson(Writer writer) {
writeJsonIssues(json, ruleKeys, userLogins); writeJsonIssues(json, ruleKeys, userLogins);
writeJsonComponents(json); writeJsonComponents(json);
writeJsonRules(json, ruleKeys); writeJsonRules(json, ruleKeys);
Collection<User> users = userRepository.loadFromWs(new ArrayList<String>(userLogins)); Collection<BatchInput.User> users = userRepository.loadFromWs(new ArrayList<String>(userLogins));
writeUsers(json, users); writeUsers(json, users);
json.endObject().close(); json.endObject().close();


Expand Down Expand Up @@ -214,13 +214,13 @@ private void writeJsonRules(JsonWriter json, Set<RuleKey> ruleKeys) throws IOExc
json.endArray(); json.endArray();
} }


private void writeUsers(JsonWriter json, Collection<User> users) throws IOException { private void writeUsers(JsonWriter json, Collection<BatchInput.User> users) throws IOException {
json.name("users").beginArray(); json.name("users").beginArray();
for (User user : users) { for (BatchInput.User user : users) {
json json
.beginObject() .beginObject()
.prop("login", user.login()) .prop("login", user.getLogin())
.prop("name", user.name()) .prop("name", user.getName())
.endObject(); .endObject();
} }
json.endArray(); json.endArray();
Expand Down
Expand Up @@ -19,26 +19,39 @@
*/ */
package org.sonar.batch.repository.user; package org.sonar.batch.repository.user;


import com.google.common.io.InputSupplier;
import org.junit.Test; import org.junit.Test;
import org.sonar.batch.bootstrap.ServerClient; import org.sonar.batch.bootstrap.ServerClient;
import org.sonar.batch.protocol.input.BatchInput;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;


import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;


public class UserRepositoryTest { public class UserRepositoryTest {


@Test @Test
public void testLoad() { public void testLoad() throws IOException {
ServerClient serverClient = mock(ServerClient.class); ServerClient serverClient = mock(ServerClient.class);
UserRepository userRepo = new UserRepository(serverClient); UserRepository userRepo = new UserRepository(serverClient);


when(serverClient.request("/api/users/search?format=json&includeDeactivated=true&logins=fmallet,sbrandhof")) ByteArrayOutputStream out = new ByteArrayOutputStream();
.thenReturn( BatchInput.User.Builder builder = BatchInput.User.newBuilder();
"{ \"users\": [ { \"login\": \"fmallet\", \"name\": \"Freddy Mallet\", \"active\": true, \"email\": \"f@m.com\" }, { \"login\": \"sbrandhof\", \"name\": \"Simon\", \"active\": true } ] }"); builder.setLogin("fmallet").setName("Freddy Mallet").build().writeDelimitedTo(out);
builder.setLogin("sbrandhof").setName("Simon").build().writeDelimitedTo(out);


assertThat(userRepo.loadFromWs(Arrays.asList("fmallet", "sbrandhof"))).containsOnly(new User("fmallet", "Freddy Mallet"), new User("sbrandhof", "Simon")); InputSupplier<InputStream> is = mock(InputSupplier.class);
when(serverClient.doRequest("/batch/users?logins=fmallet,sbrandhof", "GET", null))
.thenReturn(is);
when(is.getInput()).thenReturn(new ByteArrayInputStream(out.toByteArray()));

assertThat(userRepo.loadFromWs(Arrays.asList("fmallet", "sbrandhof"))).extracting("login", "name").containsOnly(tuple("fmallet", "Freddy Mallet"), tuple("sbrandhof", "Simon"));
} }
} }
Expand Up @@ -39,7 +39,7 @@
import org.sonar.api.resources.Resource; import org.sonar.api.resources.Resource;
import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleKey;
import org.sonar.batch.issue.IssueCache; import org.sonar.batch.issue.IssueCache;
import org.sonar.batch.repository.user.User; import org.sonar.batch.protocol.input.BatchInput;
import org.sonar.batch.repository.user.UserRepository; import org.sonar.batch.repository.user.UserRepository;
import org.sonar.batch.scan.filesystem.InputPathCache; import org.sonar.batch.scan.filesystem.InputPathCache;
import org.sonar.test.JsonAssert; import org.sonar.test.JsonAssert;
Expand Down Expand Up @@ -115,8 +115,8 @@ public void should_write_json() throws Exception {
.setUpdateDate(SIMPLE_DATE_FORMAT.parse("2013-04-25")) .setUpdateDate(SIMPLE_DATE_FORMAT.parse("2013-04-25"))
.setNew(false); .setNew(false);
when(jsonReport.getIssues()).thenReturn(Lists.newArrayList(issue)); when(jsonReport.getIssues()).thenReturn(Lists.newArrayList(issue));
User user1 = new User("julien", "Julien"); BatchInput.User user1 = BatchInput.User.newBuilder().setLogin("julien").setName("Julien").build();
User user2 = new User("simon", "Simon"); BatchInput.User user2 = BatchInput.User.newBuilder().setLogin("simon").setName("Simon").build();
when(userRepository.loadFromWs(anyListOf(String.class))).thenReturn(Lists.newArrayList(user1, user2)); when(userRepository.loadFromWs(anyListOf(String.class))).thenReturn(Lists.newArrayList(user1, user2));


StringWriter writer = new StringWriter(); StringWriter writer = new StringWriter();
Expand Down

0 comments on commit 3e2f029

Please sign in to comment.