Merge branch 'stable-3.2' into stable-3.3

* stable-3.2:
  CreateProjectTask: Apply google-java formatting

Change-Id: I34dd8301c2b9fcb2a8e10964c5b8d5d448227b6a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
index e2f9515..8054eb4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -26,9 +26,9 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSet.Builder;
 import com.google.common.collect.Lists;
-import com.google.gerrit.common.data.GroupReference;
 import com.google.gerrit.entities.AccountGroup;
 import com.google.gerrit.entities.BranchNameKey;
+import com.google.gerrit.entities.GroupReference;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.entities.RefNames;
 import com.google.gerrit.exceptions.StorageException;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java
index c3556af..431c7d2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/RemoteSiteUser.java
@@ -28,10 +28,4 @@
   public GroupMembership getEffectiveGroups() {
     return effectiveGroups;
   }
-
-  @Override
-  public Object getCacheKey() {
-    // Never cache a remote user
-    return new Object();
-  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFilter.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFilter.java
index 5b4204e..28f2fba 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFilter.java
@@ -14,7 +14,7 @@
 
 package com.googlesource.gerrit.plugins.replication;
 
-import com.google.gerrit.common.data.AccessSection;
+import com.google.gerrit.entities.AccessSection;
 import com.google.gerrit.entities.Project;
 import java.util.Collections;
 import java.util.List;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
index 6af4156..990e387 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
@@ -193,10 +193,6 @@
     try {
       replaying = true;
       for (ReplicationTasksStorage.ReplicateRefUpdate t : replicationTasksStorage.listWaiting()) {
-        if (t == null) {
-          repLog.atWarning().log("Encountered null replication event in ReplicationTasksStorage");
-          continue;
-        }
         try {
           fire(new URIish(t.uri), Project.nameKey(t.project), t.ref);
         } catch (URISyntaxException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
index 35ecec6..3947ebc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
@@ -24,14 +24,15 @@
 import com.google.inject.ProvisionException;
 import com.google.inject.Singleton;
 import java.io.IOException;
-import java.nio.file.DirectoryIteratorException;
-import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.NoSuchFileException;
+import java.nio.file.NotDirectoryException;
 import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.transport.URIish;
 
@@ -61,6 +62,22 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static class ReplicateRefUpdate {
+    public static Optional<ReplicateRefUpdate> createOptionally(Path file) {
+      try {
+        return Optional.ofNullable(create(file));
+      } catch (NoSuchFileException e) {
+        logger.atFine().log("File %s not found while reading task", file);
+      } catch (IOException e) {
+        logger.atSevere().withCause(e).log("Error while reading task %s", file);
+      }
+      return Optional.empty();
+    }
+
+    public static ReplicateRefUpdate create(Path file) throws IOException {
+      String json = new String(Files.readAllBytes(file), UTF_8);
+      return GSON.fromJson(json, ReplicateRefUpdate.class);
+    }
+
     public final String project;
     public final String ref;
     public final String uri;
@@ -139,34 +156,26 @@
     return list(createDir(runningUpdates));
   }
 
-  private List<ReplicateRefUpdate> list(Path tasks) {
-    List<ReplicateRefUpdate> results = new ArrayList<>();
-    try (DirectoryStream<Path> events = Files.newDirectoryStream(tasks)) {
-      for (Path path : events) {
-        if (Files.isRegularFile(path)) {
-          try {
-            String json = new String(Files.readAllBytes(path), UTF_8);
-            results.add(GSON.fromJson(json, ReplicateRefUpdate.class));
-          } catch (NoSuchFileException ex) {
-            logger.atFine().log(
-                "File %s not found while listing waiting tasks (likely in-flight or completed by another node)",
-                path);
-          } catch (IOException e) {
-            logger.atSevere().withCause(e).log("Error when firing pending event %s", path);
-          }
-        } else if (Files.isDirectory(path)) {
-          try {
-            results.addAll(list(path));
-          } catch (DirectoryIteratorException d) {
-            // iterating over the sub-directories is expected to have dirs disappear
-            Nfs.throwIfNotStaleFileHandle(d.getCause());
-          }
-        }
-      }
-    } catch (IOException e) {
-      logger.atSevere().withCause(e).log("Error while listing tasks");
+  private List<ReplicateRefUpdate> list(Path taskDir) {
+    return streamRecursive(taskDir).collect(Collectors.toList());
+  }
+
+  private Stream<ReplicateRefUpdate> streamRecursive(Path dir) {
+    return walkNonDirs(dir)
+        .map(path -> ReplicateRefUpdate.createOptionally(path))
+        .filter(Optional::isPresent)
+        .map(Optional::get);
+  }
+
+  private static Stream<Path> walkNonDirs(Path path) {
+    try {
+      return Files.list(path).flatMap(sub -> walkNonDirs(sub));
+    } catch (NotDirectoryException e) {
+      return Stream.of(path);
+    } catch (Exception e) {
+      logger.atSevere().withCause(e).log("Error while walking directory %s", path);
+      return Stream.empty();
     }
-    return results;
   }
 
   @SuppressWarnings("deprecation")