Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Format build files with buildifier 0.15.0
  Close JDBC objects in try-with-resources
  Avoid NPE when trying to delete changes for a project
  Update bazlets to latest stable-2.14 to use 2.14.11 API
  Update bazlets to latest stable-2.14 to use 2.14.10 API
  Update bazlets to latest stable-2.14 to use 2.14.9 API

Change-Id: I3149352fdf2c2c9ac0a7e2e913df9bce8a89c1b4
diff --git a/BUILD b/BUILD
index 89097bb..46ddcfe 100644
--- a/BUILD
+++ b/BUILD
@@ -1,9 +1,9 @@
 load("//tools/bzl:junit.bzl", "junit_tests")
 load(
     "//tools/bzl:plugin.bzl",
-    "gerrit_plugin",
     "PLUGIN_DEPS",
     "PLUGIN_TEST_DEPS",
+    "gerrit_plugin",
 )
 
 gerrit_plugin(
diff --git a/bazlets.bzl b/bazlets.bzl
index e14e488..f97b72c 100644
--- a/bazlets.bzl
+++ b/bazlets.bzl
@@ -1,17 +1,16 @@
 NAME = "com_googlesource_gerrit_bazlets"
 
 def load_bazlets(
-    commit,
-    local_path = None
-  ):
-  if not local_path:
-      native.git_repository(
-          name = NAME,
-          remote = "https://gerrit.googlesource.com/bazlets",
-          commit = commit,
-      )
-  else:
-      native.local_repository(
-          name = NAME,
-          path = local_path,
-      )
+        commit,
+        local_path = None):
+    if not local_path:
+        native.git_repository(
+            name = NAME,
+            remote = "https://gerrit.googlesource.com/bazlets",
+            commit = commit,
+        )
+    else:
+        native.local_repository(
+            name = NAME,
+            path = local_path,
+        )
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 43d72aa..7efc19c 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -1,33 +1,33 @@
 load("//tools/bzl:maven_jar.bzl", "maven_jar")
 
 def external_plugin_deps():
-  maven_jar(
-    name = "mockito",
-    artifact = "org.mockito:mockito-core:2.16.0",
-    sha1 = "a022ee494c753789a1e7cae75099de81d8a5cea6",
-    deps = [
-      "@byte_buddy//jar",
-      "@byte_buddy_agent//jar",
-      "@objenesis//jar",
-    ],
-  )
+    maven_jar(
+        name = "mockito",
+        artifact = "org.mockito:mockito-core:2.16.0",
+        sha1 = "a022ee494c753789a1e7cae75099de81d8a5cea6",
+        deps = [
+            "@byte_buddy//jar",
+            "@byte_buddy_agent//jar",
+            "@objenesis//jar",
+        ],
+    )
 
-  BYTE_BUDDY_VERSION = "1.7.9"
+    BYTE_BUDDY_VERSION = "1.7.9"
 
-  maven_jar(
-    name = "byte_buddy",
-    artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
-    sha1 = "51218a01a882c04d0aba8c028179cce488bbcb58",
-  )
+    maven_jar(
+        name = "byte_buddy",
+        artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
+        sha1 = "51218a01a882c04d0aba8c028179cce488bbcb58",
+    )
 
-  maven_jar(
-    name = "byte_buddy_agent",
-    artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VERSION,
-    sha1 = "a6c65f9da7f467ee1f02ff2841ffd3155aee2fc9",
-  )
+    maven_jar(
+        name = "byte_buddy_agent",
+        artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VERSION,
+        sha1 = "a6c65f9da7f467ee1f02ff2841ffd3155aee2fc9",
+    )
 
-  maven_jar(
-    name = "objenesis",
-    artifact = "org.objenesis:objenesis:2.6",
-    sha1 = "639033469776fd37c08358c6b92a4761feb2af4b",
-  )
+    maven_jar(
+        name = "objenesis",
+        artifact = "org.objenesis:objenesis:2.6",
+        sha1 = "639033469776fd37c08358c6b92a4761feb2af4b",
+    )
diff --git a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
index bf726cb..b99735b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/deleteproject/database/DatabaseDeleteHandler.java
@@ -67,7 +67,7 @@
 public class DatabaseDeleteHandler {
   private static final Logger log = LoggerFactory.getLogger(DatabaseDeleteHandler.class);
 
-  private final ReviewDb db;
+  private final Provider<ReviewDb> dbProvider;
   private final Provider<InternalChangeQuery> queryProvider;
   private final GitRepositoryManager repoManager;
   private final SubmoduleOp.Factory subOpFactory;
@@ -80,7 +80,7 @@
 
   @Inject
   public DatabaseDeleteHandler(
-      ReviewDb db,
+      Provider<ReviewDb> dbProvider,
       Provider<InternalChangeQuery> queryProvider,
       GitRepositoryManager repoManager,
       SubmoduleOp.Factory subOpFactory,
@@ -92,7 +92,7 @@
       Provider<WatchConfig.Accessor> watchConfig) {
     this.accountQueryProvider = accountQueryProvider;
     this.watchConfig = watchConfig;
-    this.db = ReviewDbUtil.unwrapDb(db);
+    this.dbProvider = dbProvider;
     this.queryProvider = queryProvider;
     this.repoManager = repoManager;
     this.subOpFactory = subOpFactory;
@@ -115,21 +115,12 @@
   }
 
   public void delete(Project project) throws OrmException {
-    // TODO(davido): Why not to use 1.7 features?
-    // http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3.2
+    ReviewDb db = ReviewDbUtil.unwrapDb(dbProvider.get());
     Connection conn = ((JdbcSchema) db).getConnection();
     try {
       conn.setAutoCommit(false);
       try {
-        PreparedStatement changesForProject =
-            conn.prepareStatement("SELECT change_id FROM changes WHERE dest_project_name = ?");
-        changesForProject.setString(1, project.getName());
-        java.sql.ResultSet resultSet = changesForProject.executeQuery();
-        List<Change.Id> changeIds = new ArrayList<>();
-        while (resultSet.next()) {
-          changeIds.add(new Change.Id(resultSet.getInt(1)));
-        }
-        atomicDelete(project, changeIds);
+        atomicDelete(db, project, getChangesList(project, conn));
         conn.commit();
       } finally {
         conn.setAutoCommit(true);
@@ -144,7 +135,23 @@
     }
   }
 
-  private final void deleteChanges(Project.NameKey project, List<Change.Id> changeIds)
+  private List<Change.Id> getChangesList(Project project, Connection conn) throws SQLException {
+    try (PreparedStatement changesForProject =
+        conn.prepareStatement("SELECT change_id FROM changes WHERE dest_project_name = ?")) {
+      changesForProject.setString(1, project.getName());
+      try (java.sql.ResultSet resultSet = changesForProject.executeQuery()) {
+        List<Change.Id> changeIds = new ArrayList<>();
+        while (resultSet.next()) {
+          changeIds.add(new Change.Id(resultSet.getInt(1)));
+        }
+        return changeIds;
+      }
+    } catch (SQLException e) {
+      throw new SQLException("Unable to get list of changes for project " + project.getName(), e);
+    }
+  }
+
+  private final void deleteChanges(ReviewDb db, Project.NameKey project, List<Change.Id> changeIds)
       throws OrmException {
 
     for (Change.Id id : changeIds) {
@@ -153,10 +160,9 @@
       } catch (NoSuchChangeException e) {
         // we can ignore the exception during delete
       }
-      ResultSet<PatchSet> patchSets = null;
-      patchSets = db.patchSets().byChange(id);
+      ResultSet<PatchSet> patchSets = db.patchSets().byChange(id);
       if (patchSets != null) {
-        deleteFromPatchSets(patchSets);
+        deleteFromPatchSets(db, patchSets);
       }
 
       // In the future, use schemaVersion to decide what to delete.
@@ -175,7 +181,8 @@
     }
   }
 
-  private final void deleteFromPatchSets(final ResultSet<PatchSet> patchSets) throws OrmException {
+  private final void deleteFromPatchSets(ReviewDb db, final ResultSet<PatchSet> patchSets)
+      throws OrmException {
     for (PatchSet patchSet : patchSets) {
       accountPatchReviewStore.get().clearReviewed(patchSet.getId());
       db.patchSets().delete(Collections.singleton(patchSet));
@@ -207,9 +214,10 @@
     }
   }
 
-  public void atomicDelete(Project project, List<Change.Id> changeIds) throws OrmException {
+  public void atomicDelete(ReviewDb db, Project project, List<Change.Id> changeIds)
+      throws OrmException {
 
-    deleteChanges(project.getNameKey(), changeIds);
+    deleteChanges(db, project.getNameKey(), changeIds);
 
     for (AccountState a : accountQueryProvider.get().byWatchedProject(project.getNameKey())) {
       Account.Id accountId = a.getAccount().getId();
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
index dfcbe9c..d5764f7 100644
--- a/tools/bzl/classpath.bzl
+++ b/tools/bzl/classpath.bzl
@@ -1,2 +1,4 @@
-load("@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
-     "classpath_collector")
+load(
+    "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
+    "classpath_collector",
+)
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
index a2e438f..0b25d23 100644
--- a/tools/bzl/plugin.bzl
+++ b/tools/bzl/plugin.bzl
@@ -1,6 +1,6 @@
 load(
     "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
-    "gerrit_plugin",
     "PLUGIN_DEPS",
     "PLUGIN_TEST_DEPS",
+    "gerrit_plugin",
 )