Register ProjectDeletion events for gson serialization
ProjectDeletion events were not registered event types.
This caused failures when EventGson tried to serialize/deserialize
objects having those events as field, Throwing the JsonParseException:
```
Unknown event type: project-deletion-replication-scheduled
```
Register ProjectDeletion event types, similarly to what already done for
Ref replication events (RefReplicatedEvent, RefReplicationDoneEvent,
RefReplicationScheduledEvent).
This change cherry-picks change [1]
[1]https://gerrit-review.googlesource.com/c/plugins/replication/+/308383
Bug: Issue 14628
Change-Id: I7471e9a0f8ea8ec27d5800f785d1c7006b35055c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
index 4d2faed..75fa5b3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
@@ -32,6 +32,10 @@
import com.google.inject.Scopes;
import com.google.inject.assistedinject.FactoryModuleBuilder;
import com.google.inject.internal.UniqueAnnotations;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationDoneEvent;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationFailedEvent;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationScheduledEvent;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationSucceededEvent;
import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionState;
import com.googlesource.gerrit.plugins.replication.events.RefReplicatedEvent;
import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
@@ -105,6 +109,16 @@
EventTypes.register(RefReplicatedEvent.TYPE, RefReplicatedEvent.class);
EventTypes.register(RefReplicationDoneEvent.TYPE, RefReplicationDoneEvent.class);
EventTypes.register(ReplicationScheduledEvent.TYPE, ReplicationScheduledEvent.class);
+ EventTypes.register(
+ ProjectDeletionReplicationScheduledEvent.TYPE,
+ ProjectDeletionReplicationScheduledEvent.class);
+ EventTypes.register(
+ ProjectDeletionReplicationFailedEvent.TYPE, ProjectDeletionReplicationFailedEvent.class);
+ EventTypes.register(
+ ProjectDeletionReplicationSucceededEvent.TYPE,
+ ProjectDeletionReplicationSucceededEvent.class);
+ EventTypes.register(
+ ProjectDeletionReplicationDoneEvent.TYPE, ProjectDeletionReplicationDoneEvent.class);
bind(SshSessionFactory.class).toProvider(ReplicationSshSessionFactoryProvider.class);
bind(TransportFactory.class).to(TransportFactoryImpl.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java
index 4e66743..ebd7202 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationDoneEvent.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.replication.events;
+import com.google.common.base.Objects;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.events.ProjectEvent;
@@ -31,4 +32,18 @@
public Project.NameKey getProjectNameKey() {
return Project.nameKey(project);
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof ProjectDeletionReplicationDoneEvent)) {
+ return false;
+ }
+ ProjectDeletionReplicationDoneEvent that = (ProjectDeletionReplicationDoneEvent) o;
+ return Objects.equal(project, that.project);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(project);
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java
index e350716..da75208 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationFailedEvent.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.replication.events;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.events.ProjectEvent;
import org.eclipse.jgit.transport.URIish;
@@ -40,4 +41,18 @@
public String getTargetUri() {
return targetUri;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof ProjectDeletionReplicationFailedEvent)) {
+ return false;
+ }
+ ProjectDeletionReplicationFailedEvent that = (ProjectDeletionReplicationFailedEvent) o;
+ return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(project, targetUri);
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java
index d179106..48e621b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationScheduledEvent.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.replication.events;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.events.ProjectEvent;
import org.eclipse.jgit.transport.URIish;
@@ -40,4 +41,18 @@
public String getTargetUri() {
return targetUri;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof ProjectDeletionReplicationScheduledEvent)) {
+ return false;
+ }
+ ProjectDeletionReplicationScheduledEvent that = (ProjectDeletionReplicationScheduledEvent) o;
+ return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(project, targetUri);
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java
index 852c9fe..6f881cf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/events/ProjectDeletionReplicationSucceededEvent.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.replication.events;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
import com.google.gerrit.entities.Project;
import com.google.gerrit.server.events.ProjectEvent;
import org.eclipse.jgit.transport.URIish;
@@ -40,4 +41,18 @@
public String getTargetUri() {
return targetUri;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof ProjectDeletionReplicationSucceededEvent)) {
+ return false;
+ }
+ ProjectDeletionReplicationSucceededEvent that = (ProjectDeletionReplicationSucceededEvent) o;
+ return Objects.equal(project, that.project) && Objects.equal(targetUri, that.targetUri);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(project, targetUri);
+ }
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java
index 13afc0d..2d69a47 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationEventsIT.java
@@ -16,6 +16,7 @@
import static com.google.common.truth.Truth.assertThat;
+import com.google.common.base.Objects;
import com.google.gerrit.acceptance.PushOneCommit.Result;
import com.google.gerrit.acceptance.Sandboxed;
import com.google.gerrit.acceptance.TestPlugin;
@@ -27,9 +28,12 @@
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventDispatcher;
+import com.google.gerrit.server.events.EventGsonProvider;
import com.google.gerrit.server.events.ProjectEvent;
import com.google.gerrit.server.events.RefEvent;
+import com.google.gson.Gson;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationDoneEvent;
import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationFailedEvent;
@@ -43,6 +47,7 @@
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;
+import org.eclipse.jgit.transport.URIish;
import org.junit.Before;
import org.junit.Test;
@@ -57,6 +62,7 @@
@Inject private DynamicSet<ProjectDeletedListener> deletedListeners;
@Inject private DynamicItem<EventDispatcher> eventDispatcher;
private TestDispatcher testDispatcher;
+ private Gson eventGson;
@Before
public void setup() throws Exception {
@@ -68,6 +74,7 @@
setUpTestPlugin();
testDispatcher = new TestDispatcher();
eventDispatcher.set(testDispatcher, eventDispatcher.getPluginName());
+ eventGson = new EventGsonProvider().get();
}
@Test
@@ -252,6 +259,55 @@
e -> project.equals(e.getProjectNameKey()));
}
+ @Test
+ public void shouldSerializeObjectsHavingProjectDeletionReplicationScheduledEventAsField()
+ throws Exception {
+ EventWrapper origEvent =
+ new EventWrapper(
+ new ProjectDeletionReplicationScheduledEvent(
+ project.get(), new URIish(String.format("git://someHost/%s.git", project.get()))));
+
+ EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass());
+
+ assertThat(origEvent).isEqualTo(gotEvent);
+ }
+
+ @Test
+ public void shouldSerializeObjectsHavingProjectDeletionReplicationSucceededEventAsField()
+ throws Exception {
+ EventWrapper origEvent =
+ new EventWrapper(
+ new ProjectDeletionReplicationSucceededEvent(
+ project.get(), new URIish(String.format("git://someHost/%s.git", project.get()))));
+
+ EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass());
+
+ assertThat(origEvent).isEqualTo(gotEvent);
+ }
+
+ @Test
+ public void shouldSerializeObjectsHavingProjectDeletionReplicationFailedEventAsField()
+ throws Exception {
+ EventWrapper origEvent =
+ new EventWrapper(
+ new ProjectDeletionReplicationFailedEvent(
+ project.get(), new URIish(String.format("git://someHost/%s.git", project.get()))));
+
+ EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass());
+
+ assertThat(origEvent).isEqualTo(gotEvent);
+ }
+
+ @Test
+ public void shouldSerializeObjectsHavingProjectDeletionReplicationDoneEventAsField() {
+ EventWrapper origEvent =
+ new EventWrapper(new ProjectDeletionReplicationDoneEvent(project.get()));
+
+ EventWrapper gotEvent = eventGson.fromJson(eventGson.toJson(origEvent), origEvent.getClass());
+
+ assertThat(origEvent).isEqualTo(gotEvent);
+ }
+
private <T extends RefEvent> void waitForRefEvent(Supplier<List<T>> events, String refName)
throws InterruptedException {
WaitUtil.waitUntil(
@@ -274,4 +330,26 @@
private <T extends ProjectEvent> void assertThatAnyMatch(List<T> events, Predicate<T> p) {
assertThat(events.stream().anyMatch(p)).isTrue();
}
+
+ private static class EventWrapper {
+ private final Event event;
+
+ public EventWrapper(Event event) {
+ this.event = event;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof EventWrapper)) {
+ return false;
+ }
+ EventWrapper eventWrapper = (EventWrapper) o;
+ return Objects.equal(event, eventWrapper.event);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(event);
+ }
+ }
}