]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-9084 drop some coupling on Guava
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Fri, 5 May 2017 13:54:36 +0000 (15:54 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Tue, 9 May 2017 09:54:49 +0000 (11:54 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/task/projectanalysis/issue/ScmAccountToUserLoader.java
server/sonar-server/src/main/java/org/sonar/server/es/EsUtils.java
server/sonar-server/src/main/java/org/sonar/server/es/SearchResult.java
server/sonar-server/src/main/java/org/sonar/server/issue/index/IssueIndex.java
server/sonar-server/src/main/java/org/sonar/server/test/index/TestIndex.java
server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndex.java
server/sonar-server/src/test/java/org/sonar/server/es/EsUtilsTest.java

index 765b0c5f1cf96d1c30d0ef0f845971ed6c497398..b4d240ed23c7d1a6df54a6e8014d9f73ff6b79dd 100644 (file)
  */
 package org.sonar.server.computation.task.projectanalysis.issue;
 
-import com.google.common.base.Function;
 import com.google.common.base.Joiner;
-import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Ordering;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
+import org.sonar.core.util.stream.MoreCollectors;
 import org.sonar.server.user.index.UserDoc;
 import org.sonar.server.user.index.UserIndex;
 import org.sonar.server.util.cache.CacheLoader;
@@ -55,7 +52,10 @@ public class ScmAccountToUserLoader implements CacheLoader<String, String> {
     if (!users.isEmpty()) {
       // multiple users are associated to the same SCM account, for example
       // the same email
-      Collection<String> logins = FluentIterable.from(users).transform(UserDocToLogin.INSTANCE).toSortedList(Ordering.natural());
+      Collection<String> logins = users.stream()
+        .map(UserDoc::login)
+        .sorted(Ordering.natural())
+        .collect(MoreCollectors.toList(users.size()));
       LOGGER.warn(String.format("Multiple users share the SCM account '%s': %s", scmAccount, Joiner.on(", ").join(logins)));
     }
     return null;
@@ -65,13 +65,4 @@ public class ScmAccountToUserLoader implements CacheLoader<String, String> {
   public Map<String, String> loadAll(Collection<? extends String> scmAccounts) {
     throw new UnsupportedOperationException("Loading by multiple scm accounts is not supported yet");
   }
-
-  private enum UserDocToLogin implements Function<UserDoc, String> {
-    INSTANCE;
-    @Nullable
-    @Override
-    public String apply(@Nonnull UserDoc user) {
-      return user.login();
-    }
-  }
 }
index 22e263428ce755b74d68481026466ff0fefe9afa..529329e74e4b542e1baeaa40ce5e2aea9bd71d39 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.es;
 
-import com.google.common.base.Function;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -30,6 +29,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Queue;
+import java.util.function.Function;
 import java.util.regex.Pattern;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
index a6268af4232570edeeefa8799c2db18e9bbe211a..979cc3fe39bcaaf76ddc666e3722abd11e9cc0b5 100644 (file)
@@ -19,9 +19,9 @@
  */
 package org.sonar.server.es;
 
-import com.google.common.base.Function;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 
index b1f418c6e86be68078871b6fa8d396116996f8a8..4f59937c177b5a5259e99c7dc3968820d371bf8e 100644 (file)
@@ -19,7 +19,6 @@
  */
 package org.sonar.server.issue.index;
 
-import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
@@ -59,7 +58,6 @@ import org.sonar.api.issue.Issue;
 import org.sonar.api.resources.Scopes;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.System2;
-import org.sonar.core.util.NonNullInputFunction;
 import org.sonar.core.util.stream.MoreCollectors;
 import org.sonar.db.component.ComponentDto;
 import org.sonar.db.organization.OrganizationDto;
@@ -144,16 +142,6 @@ public class IssueIndex {
   private static final Duration TWENTY_WEEKS = Duration.standardDays(20L * 7L);
   private static final Duration TWENTY_MONTHS = Duration.standardDays(20L * 30L);
 
-  /**
-   * Convert an Elasticsearch result (a map) to an {@link org.sonar.server.issue.index.IssueDoc}. It's
-   * used for {@link org.sonar.server.es.SearchResult}.
-   */
-  private static final Function<Map<String, Object>, IssueDoc> DOC_CONVERTER = new NonNullInputFunction<Map<String, Object>, IssueDoc>() {
-    @Override
-    protected IssueDoc doApply(Map<String, Object> input) {
-      return new IssueDoc(input);
-    }
-  };
   public static final String AGGREGATION_NAME_FOR_TAGS = "tags__issues";
 
   private final Sorting sorting;
@@ -213,7 +201,7 @@ public class IssueIndex {
 
     configureStickyFacets(query, options, filters, esQuery, requestBuilder);
     SearchResponse response = requestBuilder.get();
-    return new SearchResult<>(response, DOC_CONVERTER);
+    return new SearchResult<>(response, IssueDoc::new);
   }
 
   /**
@@ -691,6 +679,6 @@ public class IssueIndex {
       .setQuery(boolQuery().must(matchAllQuery()).filter(filter));
     SearchResponse response = requestBuilder.get();
 
-    return EsUtils.scroll(client, response.getScrollId(), DOC_CONVERTER);
+    return EsUtils.scroll(client, response.getScrollId(), IssueDoc::new);
   }
 }
index 11680251905bac66e105e8abcacd49932c307f1e..c2fea95ae1e983d586d540cae7073f344daa15da 100644 (file)
  */
 package org.sonar.server.test.index;
 
-import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.search.SearchHit;
-import org.sonar.core.util.NonNullInputFunction;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.es.SearchOptions;
 import org.sonar.server.es.SearchResult;
@@ -42,12 +39,6 @@ import static org.sonar.server.test.index.TestIndexDefinition.FIELD_FILE_UUID;
 import static org.sonar.server.test.index.TestIndexDefinition.FIELD_TEST_UUID;
 
 public class TestIndex {
-  private static final Function<Map<String, Object>, TestDoc> CONVERTER = new NonNullInputFunction<Map<String, Object>, TestDoc>() {
-    @Override
-    protected TestDoc doApply(Map<String, Object> fields) {
-      return new TestDoc(fields);
-    }
-  };
   private final EsClient client;
 
   public TestIndex(EsClient client) {
@@ -73,7 +64,7 @@ public class TestIndex {
       .setFrom(searchOptions.getOffset())
       .setQuery(boolQuery().must(matchAllQuery()).filter(termQuery(FIELD_FILE_UUID, testFileUuid)));
 
-    return new SearchResult<>(searchRequest.get(), CONVERTER);
+    return new SearchResult<>(searchRequest.get(), TestDoc::new);
   }
 
   public SearchResult<TestDoc> searchBySourceFileUuidAndLineNumber(String sourceFileUuid, int lineNumber, SearchOptions searchOptions) {
@@ -84,7 +75,7 @@ public class TestIndex {
         .must(termQuery(FIELD_COVERED_FILES + "." + FIELD_COVERED_FILE_UUID, sourceFileUuid))
         .must(termQuery(FIELD_COVERED_FILES + "." + FIELD_COVERED_FILE_LINES, lineNumber))));
 
-    return new SearchResult<>(searchRequest.get(), CONVERTER);
+    return new SearchResult<>(searchRequest.get(), TestDoc::new);
   }
 
   public TestDoc getByTestUuid(String testUuid) {
@@ -97,13 +88,13 @@ public class TestIndex {
   }
 
   public Optional<TestDoc> getNullableByTestUuid(String testUuid) {
-    for (SearchHit hit : client.prepareSearch(TestIndexDefinition.INDEX_TYPE_TEST)
+    SearchHit[] hits = client.prepareSearch(TestIndexDefinition.INDEX_TYPE_TEST)
       .setSize(1)
       .setQuery(boolQuery().must(matchAllQuery()).filter(termQuery(FIELD_TEST_UUID, testUuid)))
-      .get().getHits().getHits()) {
-      return Optional.of(new TestDoc(hit.sourceAsMap()));
+      .get().getHits().getHits();
+    if (hits.length > 0) {
+      return Optional.of(new TestDoc(hits[0].sourceAsMap()));
     }
-
     return Optional.absent();
   }
 
@@ -113,6 +104,6 @@ public class TestIndex {
       .setFrom(searchOptions.getOffset())
       .setQuery(boolQuery().must(matchAllQuery()).filter(termQuery(FIELD_TEST_UUID, testUuid)));
 
-    return new SearchResult<>(searchRequest.get(), CONVERTER);
+    return new SearchResult<>(searchRequest.get(), TestDoc::new);
   }
 }
index 6961dfffabf4766ed8635fed6d7c0b0896e42c3b..517e6a7e4639975898a445bbd9056c492cbedcfd 100644 (file)
  */
 package org.sonar.server.user.index;
 
-import com.google.common.base.Function;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import javax.annotation.CheckForNull;
 import org.apache.commons.lang.StringUtils;
@@ -42,7 +40,6 @@ import org.elasticsearch.search.sort.SortBuilders;
 import org.elasticsearch.search.sort.SortOrder;
 import org.sonar.api.ce.ComputeEngineSide;
 import org.sonar.api.server.ServerSide;
-import org.sonar.core.util.NonNullInputFunction;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.es.EsUtils;
 import org.sonar.server.es.SearchOptions;
@@ -64,17 +61,6 @@ import static org.sonar.server.user.index.UserIndexDefinition.FIELD_SCM_ACCOUNTS
 @ComputeEngineSide
 public class UserIndex {
 
-  /**
-   * Convert an Elasticsearch result (a map) to an {@link UserDoc}. It's
-   * used for {@link org.sonar.server.es.SearchResult}.
-   */
-  private static final Function<Map<String, Object>, UserDoc> DOC_CONVERTER = new NonNullInputFunction<Map<String, Object>, UserDoc>() {
-    @Override
-    protected UserDoc doApply(Map<String, Object> input) {
-      return new UserDoc(input);
-    }
-  };
-
   private final EsClient esClient;
 
   public UserIndex(EsClient esClient) {
@@ -88,7 +74,7 @@ public class UserIndex {
       .setRouting(login);
     GetResponse response = request.get();
     if (response.isExists()) {
-      return DOC_CONVERTER.apply(response.getSource());
+      return new UserDoc(response.getSource());
     }
     return null;
   }
@@ -109,7 +95,7 @@ public class UserIndex {
             .should(termQuery(FIELD_SCM_ACCOUNTS, scmAccount))))
         .setSize(3);
       for (SearchHit hit : request.get().getHits().getHits()) {
-        result.add(DOC_CONVERTER.apply(hit.sourceAsMap()));
+        result.add(new UserDoc(hit.sourceAsMap()));
       }
     }
     return result;
@@ -131,7 +117,7 @@ public class UserIndex {
       .setQuery(filter);
     SearchResponse response = requestBuilder.get();
 
-    return EsUtils.scroll(esClient, response.getScrollId(), DOC_CONVERTER);
+    return EsUtils.scroll(esClient, response.getScrollId(), UserDoc::new);
   }
 
   public SearchResult<UserDoc> search(UserQuery userQuery, SearchOptions options) {
@@ -161,7 +147,7 @@ public class UserIndex {
 
     request.setQuery(boolQuery().must(esQuery).filter(filter));
 
-    return new SearchResult<>(request.get(), DOC_CONVERTER);
+    return new SearchResult<>(request.get(), UserDoc::new);
   }
 
 }
index 67d5e60f3ec79582518c43024897a38a777f24c2..ed351bcc648a0e946ba6fddeb7ff9a8405510269 100644 (file)
  */
 package org.sonar.server.es;
 
-import com.google.common.base.Function;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.SearchHits;
 import org.junit.Test;
@@ -40,25 +38,15 @@ public class EsUtilsTest {
   @Test
   public void convertToDocs_empty() {
     SearchHits hits = mock(SearchHits.class, Mockito.RETURNS_MOCKS);
-    List<BaseDoc> docs = EsUtils.convertToDocs(hits, new Function<Map<String, Object>, BaseDoc>() {
-      @Override
-      public BaseDoc apply(Map<String, Object> input) {
-        return new IssueDoc(input);
-      }
-    });
+    List<BaseDoc> docs = EsUtils.convertToDocs(hits, IssueDoc::new);
     assertThat(docs).isEmpty();
   }
 
   @Test
   public void convertToDocs() {
     SearchHits hits = mock(SearchHits.class, Mockito.RETURNS_MOCKS);
-    when(hits.getHits()).thenReturn(new SearchHit[]{mock(SearchHit.class)});
-    List<BaseDoc> docs = EsUtils.convertToDocs(hits, new Function<Map<String, Object>, BaseDoc>() {
-      @Override
-      public BaseDoc apply(Map<String, Object> input) {
-        return new IssueDoc(input);
-      }
-    });
+    when(hits.getHits()).thenReturn(new SearchHit[] {mock(SearchHit.class)});
+    List<BaseDoc> docs = EsUtils.convertToDocs(hits, IssueDoc::new);
     assertThat(docs).hasSize(1);
   }