From e6cf41cccf4ae7298124cb748f9c2188df1be12c Mon Sep 17 00:00:00 2001 From: Martin Fick Date: Fri, 12 Dec 2014 14:17:54 -0700 Subject: [PATCH] Add EventDispatcher interface and use it. Define an interface to dispatch stream-events (Events) from. Currently Events are being posted on the ChangeHooks interface, but Events are not necessarily hook related. This interface makes it possible to be post Events without having a copy of the ChangeHooks interface. This is particularly useful for plugins to able to post Events. The replication plugin can use this to post Events instead of getting a copy of the ChangeHooks implementation, since it does not actually do anything hook related. This interface defines the line where Events go from being created to being posted (passed to an object ready to presumably fire them). This also paves the way to make it possible for a dispatcher to modify, filter, or route the Events elsewhere instead of firing them. This interface is intended to eventually allow plugins to modify the Event path possibly to store Events persistently, and/or to dispatch them to multiple masters. Change-Id: Ib9f7547b5790ff787852ef00cf9b0e0258afe8dc --- .../gerrit/common/ChangeHookRunner.java | 5 ++- .../com/google/gerrit/common/ChangeHooks.java | 20 --------- .../gerrit/common/DisabledChangeHooks.java | 3 +- .../google/gerrit/common/EventDispatcher.java | 44 +++++++++++++++++++ 4 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java index 8c103e2d51..6515d977ba 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHookRunner.java @@ -86,8 +86,8 @@ import java.util.concurrent.TimeoutException; /** Spawns local executables when a hook action occurs. */ @Singleton -public class ChangeHookRunner implements ChangeHooks, EventSource, - LifecycleListener { +public class ChangeHookRunner implements ChangeHooks, EventDispatcher, + EventSource, LifecycleListener { /** A logger for this class. */ private static final Logger log = LoggerFactory.getLogger(ChangeHookRunner.class); @@ -96,6 +96,7 @@ public class ChangeHookRunner implements ChangeHooks, EventSource, protected void configure() { bind(ChangeHookRunner.class); bind(ChangeHooks.class).to(ChangeHookRunner.class); + bind(EventDispatcher.class).to(ChangeHookRunner.class); bind(EventSource.class).to(ChangeHookRunner.class); listener().to(ChangeHookRunner.class); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java index 4e8a21e6f1..7f7e8b24a3 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/ChangeHooks.java @@ -22,7 +22,6 @@ 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.reviewdb.server.ReviewDb; -import com.google.gerrit.server.events.Event; import com.google.gwtorm.server.OrmException; import org.eclipse.jgit.lib.ObjectId; @@ -182,23 +181,4 @@ public interface ChangeHooks { public void doHashtagsChangedHook(Change change, Account account, Setadded, Set removed, Set hashtags, ReviewDb db) throws OrmException; - - /** - * Post a stream event that is related to a change - * - * @param change The change that the event is related to - * @param event The event to post - * @param db The database - * @throws OrmException - */ - public void postEvent(Change change, Event event, ReviewDb db) - throws OrmException; - - /** - * Post a stream event that is related to a branch - * - * @param branchName The branch that the event is related to - * @param event The event to post - */ - public void postEvent(Branch.NameKey branchName, Event event); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java b/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java index 8bbb600da5..156672eb7b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java +++ b/gerrit-server/src/main/java/com/google/gerrit/common/DisabledChangeHooks.java @@ -32,7 +32,8 @@ import java.util.Map; import java.util.Set; /** Does not invoke hooks. */ -public final class DisabledChangeHooks implements ChangeHooks, EventSource { +public final class DisabledChangeHooks implements ChangeHooks, EventDispatcher, + EventSource { @Override public void addEventListener(EventListener listener, CurrentUser user) { } diff --git a/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java b/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java new file mode 100644 index 0000000000..b74771f818 --- /dev/null +++ b/gerrit-server/src/main/java/com/google/gerrit/common/EventDispatcher.java @@ -0,0 +1,44 @@ +// Copyright (C) 2015 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gerrit.common; + +import com.google.gerrit.reviewdb.client.Branch; +import com.google.gerrit.reviewdb.client.Change; +import com.google.gerrit.reviewdb.server.ReviewDb; +import com.google.gerrit.server.events.Event; +import com.google.gwtorm.server.OrmException; + + +/** Interface for posting (dispatching) Events */ +public interface EventDispatcher { + /** + * Post a stream event that is related to a change + * + * @param change The change that the event is related to + * @param event The event to post + * @param db The database + * @throws OrmException + */ + public void postEvent(Change change, Event event, ReviewDb db) + throws OrmException; + + /** + * Post a stream event that is related to a branch + * + * @param branchName The branch that the event is related to + * @param event The event to post + */ + public void postEvent(Branch.NameKey branchName, Event event); +}