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
This commit is contained in:
Martin Fick
2014-12-12 14:17:54 -07:00
committed by David Pursehouse
parent bef6c3de3e
commit e6cf41cccf
4 changed files with 49 additions and 23 deletions

View File

@@ -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);
}

View File

@@ -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,
Set<String>added, Set<String> removed, Set<String> 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);
}

View File

@@ -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) {
}

View File

@@ -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);
}