Add skeleton action controller unifying event handling

The approach to handling events comes with several short-comings:

* Event handling is currently separated over several listeners. Some
  allow to freely formulate preconditions (e.g.: changing an issue's
  state), other listeners had again and again introduced further
  configuration settings to allow setting fine controlled verbosity
  (linking to change/patch set), other listeners can only be turned
  on/off (e.g.: linking to gitweb). However, for all of those actions
  could benefit from freely formulated preconditions.

* The current transition format does not allow to different sets of
  conditions to fire the same action.

* The current approach to associating an issue to a patch set does not
  allow disambiguate between an issue being referenced in a commit
  message's subject line, its body, or its footer. Let alone add
  comments based on that.

* The current approach does not allow easily modify the text of the
  added its comments.

As addressing all those needs goes beyond the current event handling
design, we add an action controller and work towards replacing the old
design.

The action controller will be backed by a single, common rule base. It
will allow for different rules to fire the same action, provide was to
disambiguate between where the issue has been referenced, and allow to
modify standard text for its comments using Velocity templates.

Change-Id: I8c722f9957f1e44133a93332e71bf56deb56d6ba
diff --git a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
index fa41a86..86097ef 100644
--- a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
+++ b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/ItsHookModule.java
@@ -24,6 +24,7 @@
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterAddRelatedLinkToChangeId;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterAddRelatedLinkToGitWeb;
 import com.googlesource.gerrit.plugins.hooks.workflow.GerritHookFilterChangeState;
+import com.googlesource.gerrit.plugins.hooks.workflow.ActionController;
 
 public class ItsHookModule extends AbstractModule {
 
@@ -46,5 +47,7 @@
         GerritHookFilterAddRelatedLinkToGitWeb.class);
     DynamicSet.bind(binder(), CommitValidationListener.class).to(
         ItsValidateComment.class);
+    DynamicSet.bind(binder(), ChangeListener.class).to(
+        ActionController.class);
   }
 }
diff --git a/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/workflow/ActionController.java b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/workflow/ActionController.java
new file mode 100644
index 0000000..9d6ad99
--- /dev/null
+++ b/hooks-its/src/main/java/com/googlesource/gerrit/plugins/hooks/workflow/ActionController.java
@@ -0,0 +1,32 @@
+// Copyright (C) 2013 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.googlesource.gerrit.plugins.hooks.workflow;
+
+import com.google.gerrit.common.ChangeListener;
+import com.google.gerrit.server.events.ChangeEvent;
+
+public class ActionController implements ChangeListener {
+  public ActionController() {
+    // TODO construct rule base
+  }
+
+  @Override
+  public void onChangeEvent(ChangeEvent event) {
+    // TODO extract conditions from event
+    // TODO find rules in rule base that match the extracted conditions
+    // TODO fire actions for matched rules
+  }
+
+}