Remove watches from NoteDB instead of ReviewDB

Since watchers were completely moved to NoteDB we should also update our
clean up implementation and clean it instead of ReviewDB.

Change-Id: I5ee89b362075e0c7ba1cfdddc952bfbd895e3dcc
Signed-off-by: Dariusz Luksza <dluksza@collab.net>
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 d025cd6..cb1f399 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
@@ -14,22 +14,30 @@
 
 package com.googlesource.gerrit.plugins.deleteproject.database;
 
+import static java.util.Collections.singleton;
+
 import com.google.common.collect.Lists;
+import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.reviewdb.server.ReviewDbUtil;
 import com.google.gerrit.server.StarredChangesUtil;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gerrit.server.account.WatchConfig;
+import com.google.gerrit.server.account.WatchConfig.Accessor;
+import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
 import com.google.gerrit.server.change.AccountPatchReviewStore;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.MergeOpRepoManager;
 import com.google.gerrit.server.git.SubmoduleOp;
 import com.google.gerrit.server.index.change.ChangeIndexer;
 import com.google.gerrit.server.project.NoSuchChangeException;
+import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeData;
 import com.google.gerrit.server.query.change.InternalChangeQuery;
 import com.google.gwtorm.jdbc.JdbcSchema;
@@ -40,6 +48,7 @@
 
 import com.googlesource.gerrit.plugins.deleteproject.CannotDeleteProjectException;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
@@ -51,9 +60,9 @@
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.HashSet;
 
 public class DatabaseDeleteHandler {
   private static final Logger log =
@@ -67,6 +76,8 @@
   private final StarredChangesUtil starredChangesUtil;
   private final DynamicItem<AccountPatchReviewStore> accountPatchReviewStore;
   private final ChangeIndexer indexer;
+  private final Provider<InternalAccountQuery> accountQueryProvider;
+  private final Provider<Accessor> watchConfig;
 
   @Inject
   public DatabaseDeleteHandler(ReviewDb db,
@@ -76,7 +87,11 @@
       Provider<MergeOpRepoManager> ormProvider,
       StarredChangesUtil starredChangesUtil,
       DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
-      ChangeIndexer indexer) {
+      ChangeIndexer indexer,
+      Provider<InternalAccountQuery> accountQueryProvider,
+      Provider<WatchConfig.Accessor> watchConfig) {
+    this.accountQueryProvider = accountQueryProvider;
+    this.watchConfig = watchConfig;
     this.db = ReviewDbUtil.unwrapDb(db);
     this.queryProvider = queryProvider;
     this.repoManager = repoManager;
@@ -193,7 +208,20 @@
         queryProvider.get().byProject(project.getNameKey());
     deleteChanges(changes);
 
-    db.accountProjectWatches().delete(
-        db.accountProjectWatches().byProject(project.getNameKey()));
+    for (AccountState a : accountQueryProvider.get()
+        .byWatchedProject(project.getNameKey())) {
+      Account.Id accountId = a.getAccount().getId();
+      for (ProjectWatchKey watchKey : a.getProjectWatches().keySet()) {
+        if (project.getNameKey().equals(watchKey.project())) {
+          try {
+            watchConfig.get().deleteProjectWatches(accountId,
+                singleton(watchKey));
+          } catch (IOException | ConfigInvalidException e) {
+            log.error("Removing watch entry for user {} in project {} failed.",
+                a.getUserName(), project.getName(), e);
+          }
+        }
+      }
+    }
   }
 }