Adapt to project-specific deletion of changes from index

Change-Id: I0e519ecd232651f424a0d3a32df2db7483a1ff1f
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/NoForwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/NoForwarder.java
index dc3e8ef..8e29fcf 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/NoForwarder.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/NoForwarder.java
@@ -50,7 +50,8 @@
   }
 
   @Override
-  public CompletableFuture<Result> deleteChangeFromIndex(int changeId, IndexEvent indexEvent) {
+  public CompletableFuture<Result> deleteChangeFromIndex(
+      String projectName, int changeId, IndexEvent indexEvent) {
     return recoverableFailure(EventType.INDEX_CHANGE_DELETION);
   }
 
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/autoreindex/IndexTs.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/autoreindex/IndexTs.java
index 75a9681..23a568e 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/autoreindex/IndexTs.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/autoreindex/IndexTs.java
@@ -146,7 +146,7 @@
   }
 
   @Override
-  public void onChangeDeleted(int id) {
+  public void onChangeDeleted(String projectName, int id) {
     currCtx.onlyWithContext((ctx) -> update(IndexName.CHANGE, LocalDateTime.now()));
   }
 
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java
index 80aa836..5a2c14d 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandler.java
@@ -105,7 +105,7 @@
 
     } catch (Exception e) {
       if (isCausedByNoSuchChangeException(e)) {
-        indexer.delete(parseChangeId(id));
+        indexer.delete(parseProject(id), parseChangeId(id));
         log.atWarning().withCause(e).log("Error trying to index Change %s. Deleted from index", id);
         return true;
       }
@@ -122,8 +122,8 @@
   @Override
   protected CompletableFuture<Boolean> doDelete(String id, Optional<IndexEvent> indexEvent)
       throws IOException {
+    Project.NameKey projectName = parseProject(id);
     if (ALL_CHANGES_FOR_PROJECT.equals(extractChangeId(id))) {
-      Project.NameKey projectName = parseProject(id);
       try {
         indexer.deleteAllForProject(projectName);
         log.atFine().log("All %s changes successfully deleted from index", projectName.get());
@@ -134,7 +134,7 @@
       }
     } else {
       try {
-        indexer.delete(parseChangeId(id));
+        indexer.delete(projectName, parseChangeId(id));
         log.atFine().log("Change %s successfully deleted from index", id);
       } catch (RuntimeException e) {
         log.atFine().log("Change %s could not be deleted from index", id);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java
index 3bf08b4..088f0fa 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/Forwarder.java
@@ -68,7 +68,8 @@
    * @return {@link CompletableFuture} of true if successful, otherwise {@link CompletableFuture} of
    *     false.
    */
-  CompletableFuture<Result> deleteChangeFromIndex(int changeId, IndexEvent indexEvent);
+  CompletableFuture<Result> deleteChangeFromIndex(
+      String projectName, int changeId, IndexEvent indexEvent);
 
   /**
    * Forward a group indexing event to the other primary.
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/commands/IndexChange.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/commands/IndexChange.java
index 990ae8e..df79eca 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/commands/IndexChange.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/commands/IndexChange.java
@@ -58,10 +58,6 @@
   public static class Delete extends IndexChange {
     static final EventType TYPE = EventType.INDEX_CHANGE_DELETION;
 
-    public Delete(int id, Instant eventCreatedOn) {
-      this("", id, eventCreatedOn);
-    }
-
     public Delete(String projectName, int id, Instant eventCreatedOn) {
       super(TYPE, projectName, id, false, eventCreatedOn);
     }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java
index 1c004f7..225738f 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/jgroups/JGroupsForwarder.java
@@ -97,8 +97,9 @@
   }
 
   @Override
-  public CompletableFuture<Result> deleteChangeFromIndex(int changeId, IndexEvent indexEvent) {
-    return execute(new IndexChange.Delete(changeId, indexEvent.eventCreatedOn));
+  public CompletableFuture<Result> deleteChangeFromIndex(
+      String projectName, int changeId, IndexEvent indexEvent) {
+    return execute(new IndexChange.Delete(projectName, changeId, indexEvent.eventCreatedOn));
   }
 
   @Override
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java
index ea783a6..06df702 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarder.java
@@ -120,13 +120,14 @@
   }
 
   @Override
-  public CompletableFuture<Result> deleteChangeFromIndex(final int changeId, IndexEvent event) {
+  public CompletableFuture<Result> deleteChangeFromIndex(
+      String projectName, final int changeId, IndexEvent event) {
     return execute(
         RequestMethod.DELETE,
         EventType.INDEX_CHANGE_DELETION,
         "delete change",
         "index/change",
-        buildIndexEndpoint(changeId),
+        buildIndexEndpoint(projectName, changeId),
         event,
         event.eventCreatedOn);
   }
@@ -143,10 +144,6 @@
         event.eventCreatedOn);
   }
 
-  private String buildIndexEndpoint(int changeId) {
-    return buildIndexEndpoint("", changeId);
-  }
-
   private String buildIndexEndpoint(String projectName, int changeId) {
     String escapedProjectName = Url.encode(projectName);
     return escapedProjectName + '~' + changeId;
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
index 0b1ff7f..d69bb42 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandler.java
@@ -94,9 +94,9 @@
   }
 
   @Override
-  public void onChangeDeleted(int id) {
+  public void onChangeDeleted(String projectName, int id) {
     if (!Context.isForwardedEvent()) {
-      forwarder.get().deleteChangeFromIndex(id, new IndexEvent());
+      forwarder.get().deleteChangeFromIndex(projectName, id, new IndexEvent());
     }
   }
 
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java
index 6a3a348..ea936bf 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/ForwardedIndexChangeHandlerTest.java
@@ -64,7 +64,6 @@
 
   @Mock private ChangeIndexer indexerMock;
   @Mock private ChangeNotes changeNotes;
-  @Mock private Project.NameKey projectName;
 
   @Mock(answer = RETURNS_DEEP_STUBS)
   private Configuration configMock;
@@ -76,10 +75,12 @@
   @Mock private ForwardedIndexExecutorProvider indexExecutorProviderMock;
   private ForwardedIndexChangeHandler handler;
   private Change.Id id;
+  private Project.NameKey projectName;
 
   @Before
   public void setUp() throws Exception {
     id = Change.id(TEST_CHANGE_NUMBER);
+    projectName = Project.nameKey(TEST_PROJECT);
     when(configMock.index().threadPoolSize()).thenReturn(4);
     when(configMock.index().maxTries()).thenReturn(3);
     when(configMock.index().retryInterval()).thenReturn(Duration.ofMillis(10));
@@ -110,7 +111,7 @@
   @Test
   public void changeIsDeletedFromIndex() throws Exception {
     handler.index(TEST_CHANGE_ID, Operation.DELETE, Optional.empty()).get(10, SECONDS);
-    verify(indexerMock, times(1)).delete(id);
+    verify(indexerMock, times(1)).delete(projectName, id);
   }
 
   @Test
@@ -125,7 +126,7 @@
   public void changeToIndexDoesNotExist() throws Exception {
     setupChangeAccessRelatedMocks(CHANGE_DOES_NOT_EXIST, CHANGE_OUTDATED);
     handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.empty()).get(10, SECONDS);
-    verify(indexerMock, times(0)).delete(id);
+    verify(indexerMock, times(0)).delete(projectName, id);
   }
 
   @Test
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java
index 78d21ef..88318bc 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/forwarder/rest/RestForwarderTest.java
@@ -82,8 +82,6 @@
               PLUGIN_NAME,
               "index/change/batch",
               PROJECT_NAME_URL_END + "~" + CHANGE_NUMBER);
-  private static final String DELETE_CHANGE_ENDPOINT =
-      Joiner.on("/").join(URL, PLUGINS, PLUGIN_NAME, "index/change", "~" + CHANGE_NUMBER);
   private static final String DELETE_ALL_CHANGES_ENDPOINT =
       Joiner.on("/")
           .join(
@@ -283,11 +281,11 @@
 
   @Test
   public void testChangeDeletedFromIndexOK() throws Exception {
-    when(httpSessionMock.delete(eq(DELETE_CHANGE_ENDPOINT), any()))
+    when(httpSessionMock.delete(eq(INDEX_CHANGE_ENDPOINT), any()))
         .thenReturn(new HttpResult(SUCCESSFUL, EMPTY_MSG));
     assertThat(
             forwarder
-                .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent())
+                .deleteChangeFromIndex(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent())
                 .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)
                 .result())
         .isTrue();
@@ -307,11 +305,11 @@
 
   @Test
   public void testChangeDeletedFromIndexFailed() throws Exception {
-    when(httpSessionMock.delete(eq(DELETE_CHANGE_ENDPOINT), any()))
+    when(httpSessionMock.delete(eq(INDEX_CHANGE_ENDPOINT), any()))
         .thenReturn(new HttpResult(FAILED, EMPTY_MSG));
     assertThat(
             forwarder
-                .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent())
+                .deleteChangeFromIndex(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent())
                 .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)
                 .result())
         .isFalse();
@@ -319,10 +317,10 @@
 
   @Test
   public void testChangeDeletedFromThrowsException() throws Exception {
-    when(httpSessionMock.delete(eq(DELETE_CHANGE_ENDPOINT), any())).thenThrow(IOException.class);
+    when(httpSessionMock.delete(eq(INDEX_CHANGE_ENDPOINT), any())).thenThrow(IOException.class);
     assertThat(
             forwarder
-                .deleteChangeFromIndex(CHANGE_NUMBER, new IndexEvent())
+                .deleteChangeFromIndex(PROJECT_NAME, CHANGE_NUMBER, new IndexEvent())
                 .get(TEST_TIMEOUT, TEST_TIMEOUT_UNITS)
                 .result())
         .isFalse();
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
index 22c2eb0..95e627b 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/index/IndexEventHandlerTest.java
@@ -82,7 +82,7 @@
     when(forwarder.indexAccount(eq(ACCOUNT_ID), any()))
         .thenReturn(
             CompletableFuture.completedFuture(new Result(EventType.INDEX_ACCOUNT_UPDATE, true)));
-    when(forwarder.deleteChangeFromIndex(eq(CHANGE_ID), any()))
+    when(forwarder.deleteChangeFromIndex(eq(PROJECT_NAME), eq(CHANGE_ID), any()))
         .thenReturn(
             CompletableFuture.completedFuture(new Result(EventType.INDEX_CHANGE_DELETION, true)));
     when(forwarder.indexGroup(eq(UUID), any()))
@@ -141,8 +141,8 @@
 
   @Test
   public void shouldDeleteFromIndexInRemoteOnChangeDeletedEvent() throws Exception {
-    indexEventHandler.onChangeDeleted(changeId.get());
-    verify(forwarder).deleteChangeFromIndex(eq(CHANGE_ID), any());
+    indexEventHandler.onChangeDeleted(PROJECT_NAME, changeId.get());
+    verify(forwarder).deleteChangeFromIndex(eq(PROJECT_NAME), eq(CHANGE_ID), any());
     verifyNoInteractions(changeCheckerMock); // Deleted changes should not be checked against NoteDb
   }
 
@@ -156,7 +156,7 @@
   public void shouldNotCallRemoteWhenChangeEventIsForwarded() throws Exception {
     Context.setForwardedEvent(true);
     indexEventHandler.onChangeIndexed(PROJECT_NAME, changeId.get());
-    indexEventHandler.onChangeDeleted(changeId.get());
+    indexEventHandler.onChangeDeleted(PROJECT_NAME, changeId.get());
     Context.unsetForwardedEvent();
     verifyNoInteractions(forwarder);
   }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/peers/jgroups/JGroupsPeerInfoProviderTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/peers/jgroups/JGroupsPeerInfoProviderTest.java
index a098be6..1e64918 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/peers/jgroups/JGroupsPeerInfoProviderTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/peers/jgroups/JGroupsPeerInfoProviderTest.java
@@ -169,7 +169,7 @@
   public void testStop() throws Exception {
     jGroupsPeerInfoProvider.addPeer(peerAddress, peerInfo);
     jGroupsPeerInfoProvider.stop();
-    assertThat(jGroupsPeerInfoProvider.getPeers().isEmpty());
+    assertThat(jGroupsPeerInfoProvider.getPeers()).isEmpty();
     Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
     assertThat(testPeerInfoSet).isEmpty();
   }