Merge branch 'stable-2.16'

* stable-2.16:
  LocalLargeFileRepository: Rename DEFAULT_TIMEOUT to DEFAULT_EXPIRATION_SECONDS
  LocalLargeFileRepository#getContentPath: Avoid String concatentation
  Upgrade bazlets to latest stable-2.16
  LfsBackend: Add implementation of toString
  LfsGlobalConfig: Use native Java Stream API instead of guava
  LfsBackend: Make constructor and DEFAULT private
  Upgrade bazlets to latest stable-2.15
  Use Logger's built-in formatting where appropriate
  Align Eclipse compiler settings with core Gerrit's
  Upgrade bazlets to latest stable-2.14
  Update bazlets to fix build with bazel 0.23

Change-Id: I66b9c2f53c91ff82b086031bf51fc5b656165fa8
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..40e022d
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,126 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=enabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.processAnnotations=enabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsApiServlet.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsApiServlet.java
index 08b1662..75e35af 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsApiServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsApiServlet.java
@@ -134,9 +134,7 @@
       String op = request.getOperation().toLowerCase();
       String project = state.getProject().getName();
       String userName = user.getUserName().orElse("anonymous");
-      log.debug(
-          String.format(
-              "operation %s unauthorized for user %s on project %s", op, userName, project));
+      log.debug("operation {} unauthorized for user {} on project {}", op, userName, project);
       throw new LfsUnauthorized(op, project);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsBackend.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsBackend.java
index a2fbfe2..4971bcb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsBackend.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsBackend.java
@@ -14,23 +14,39 @@
 
 package com.googlesource.gerrit.plugins.lfs;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
+
 import com.google.common.base.Strings;
+import com.google.gerrit.common.Nullable;
 import java.util.Objects;
 
 public class LfsBackend {
-  public static final String DEFAULT = "default";
+  private static final String DEFAULT = "default";
 
   public final String name;
   public final LfsBackendType type;
 
-  public LfsBackend(String name, LfsBackendType type) {
+  public static LfsBackend create(@Nullable String name, LfsBackendType type) {
+    return new LfsBackend(name, type);
+  }
+
+  public static LfsBackend createDefault(LfsBackendType type) {
+    return create(null, type);
+  }
+
+  private LfsBackend(String name, LfsBackendType type) {
     this.name = name;
     this.type = type;
   }
 
+  /** @return the backend name, or the default name if null. */
+  public String name() {
+    return Strings.isNullOrEmpty(name) ? DEFAULT : name;
+  }
+
   @Override
   public int hashCode() {
-    return Objects.hash(Strings.isNullOrEmpty(name) ? DEFAULT : name, type);
+    return Objects.hash(name, type);
   }
 
   @Override
@@ -42,4 +58,9 @@
 
     return false;
   }
+
+  @Override
+  public String toString() {
+    return toStringHelper(this).add("name", name()).add("type", type).toString();
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsGlobalConfig.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsGlobalConfig.java
index 6283c9e..610334d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsGlobalConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsGlobalConfig.java
@@ -14,9 +14,9 @@
 
 package com.googlesource.gerrit.plugins.lfs;
 
-import com.google.common.collect.FluentIterable;
+import static java.util.stream.Collectors.toMap;
+
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
 import java.util.Map;
 import org.eclipse.jgit.lib.Config;
 
@@ -30,15 +30,16 @@
   }
 
   public LfsBackend getDefaultBackend() {
-    LfsBackendType type = cfg.getEnum("storage", null, "backend", LfsBackendType.FS);
-    return new LfsBackend(null, type);
+    return LfsBackend.createDefault(cfg.getEnum("storage", null, "backend", LfsBackendType.FS));
   }
 
   public Map<String, LfsBackend> getBackends() {
-    Builder<String, LfsBackend> builder = ImmutableMap.builder();
+    ImmutableMap.Builder<String, LfsBackend> builder = ImmutableMap.builder();
     for (LfsBackendType type : LfsBackendType.values()) {
       Map<String, LfsBackend> backendsOfType =
-          FluentIterable.from(cfg.getSubsections(type.name())).toMap(s -> new LfsBackend(s, type));
+          cfg.getSubsections(type.name())
+              .stream()
+              .collect(toMap(name -> name, name -> LfsBackend.create(name, type)));
       builder.putAll(backendsOfType);
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsRepositoryResolver.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsRepositoryResolver.java
index 914e638..3e97db3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsRepositoryResolver.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/LfsRepositoryResolver.java
@@ -14,8 +14,6 @@
 
 package com.googlesource.gerrit.plugins.lfs;
 
-import static com.googlesource.gerrit.plugins.lfs.LfsBackend.DEFAULT;
-
 import com.google.common.base.Strings;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
@@ -49,10 +47,7 @@
     } else {
       backend = backends.get(backendName);
       if (backend == null) {
-        log.error(
-            String.format(
-                "Project %s is configured with not existing" + " backend %s",
-                project, Strings.isNullOrEmpty(backendName) ? DEFAULT : backendName));
+        log.error("Project {} is configured with not existing backend {}", project, backendName);
         throw new LfsRepositoryNotFound(project.get());
       }
     }
@@ -64,9 +59,10 @@
 
     // this is unlikely situation as cache is pre-populated from config but...
     log.error(
-        String.format(
-            "Project %s is configured with not existing" + " backend %s of type %s",
-            project, Strings.isNullOrEmpty(backendName) ? DEFAULT : backendName, backend.type));
+        "Project {} is configured with not existing backend {} of type {}",
+        project,
+        backend.name(),
+        backend.type);
     throw new LfsRepositoryNotFound(project.get());
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/Lifecycle.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/Lifecycle.java
index 73302ad..ec386f1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/Lifecycle.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/Lifecycle.java
@@ -49,10 +49,10 @@
 
   private void warn(String msg) {
     log.warn(
-        String.format(
-            "%s; LFS will not be enabled. Run site initialization, or manually set"
-                + " lfs.plugin to '%s' in gerrit.config",
-            msg, name));
+        "{}; LFS will not be enabled. Run site initialization, or manually set"
+            + " lfs.plugin to '{}' in gerrit.config",
+        msg,
+        name);
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/lfs/fs/LocalLargeFileRepository.java b/src/main/java/com/googlesource/gerrit/plugins/lfs/fs/LocalLargeFileRepository.java
index 172861b..0a6ef34 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/lfs/fs/LocalLargeFileRepository.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/lfs/fs/LocalLargeFileRepository.java
@@ -14,7 +14,6 @@
 
 package com.googlesource.gerrit.plugins.lfs.fs;
 
-import static com.googlesource.gerrit.plugins.lfs.LfsBackend.DEFAULT;
 import static org.eclipse.jgit.lfs.lib.Constants.DOWNLOAD;
 import static org.eclipse.jgit.lfs.lib.Constants.UPLOAD;
 
@@ -42,8 +41,8 @@
     LocalLargeFileRepository create(LfsBackend backendConfig);
   }
 
-  public static final String CONTENT_PATH = "content";
-  private static final int DEFAULT_TIMEOUT = 10; // in seconds
+  private static final String CONTENT_PATH_TEMPLATE = "content/%s/";
+  private static final int DEFAULT_EXPIRATION_SECONDS = 10;
 
   private final String servletUrlPattern;
   private final LfsFsRequestAuthorizer authorizer;
@@ -66,7 +65,11 @@
         (long)
             configFactory
                 .getGlobalConfig()
-                .getInt(backend.type.name(), backend.name, "expirationSeconds", DEFAULT_TIMEOUT);
+                .getInt(
+                    backend.type.name(),
+                    backend.name,
+                    "expirationSeconds",
+                    DEFAULT_EXPIRATION_SECONDS);
   }
 
   public String getServletUrlPattern() {
@@ -94,10 +97,7 @@
   }
 
   private static String getContentPath(LfsBackend backend) {
-    return CONTENT_PATH
-        + "/"
-        + (Strings.isNullOrEmpty(backend.name) ? DEFAULT : backend.name)
-        + "/";
+    return String.format(CONTENT_PATH_TEMPLATE, backend.name());
   }
 
   private static Path getOrCreateDataDir(