Remove strict events-broker plugin dependency

This fixes a problem where you would get a NoClassFoundError
when loading the plugin if the events-broker plugin had not
been installed.

A previous commit 7b67529 introduced an accidental
requirement on the events-broker plugin even if not using
the rabbitMQBroker API.

Change-Id: I031572b4a36cefc0a1b003d35eb75882844b3424
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/BrokerApiManager.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/BrokerApiManager.java
new file mode 100644
index 0000000..83a61f9
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/BrokerApiManager.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2024 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.rabbitmq;
+
+import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.rabbitmq.message.BrokerApiPublisher;
+import com.googlesource.gerrit.plugins.rabbitmq.message.BrokerApiSubscribers;
+
+@Singleton
+public class BrokerApiManager implements LifecycleListener {
+
+  private final BrokerApiPublisher publisher;
+  private final BrokerApiSubscribers subscribers;
+
+  @Inject
+  public BrokerApiManager(BrokerApiPublisher publisher, BrokerApiSubscribers subscribers) {
+    this.publisher = publisher;
+    this.subscribers = subscribers;
+  }
+
+  @Override
+  public void start() {}
+
+  @Override
+  public void stop() {
+    subscribers.stop();
+    publisher.stop();
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Manager.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Manager.java
index 953fe08..f76bba7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Manager.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Manager.java
@@ -23,8 +23,6 @@
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.General;
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.Gerrit;
 import com.googlesource.gerrit.plugins.rabbitmq.message.BaseProperties;
-import com.googlesource.gerrit.plugins.rabbitmq.message.BrokerApiPublisher;
-import com.googlesource.gerrit.plugins.rabbitmq.message.BrokerApiSubscribers;
 import com.googlesource.gerrit.plugins.rabbitmq.message.GerritEventPublisherFactory;
 import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
 import com.googlesource.gerrit.plugins.rabbitmq.message.PublisherPropertiesProvider;
@@ -44,7 +42,6 @@
   private final EventWorker userEventWorker;
   private final GerritEventPublisherFactory publisherFactory;
   private final List<Publisher> publisherList = new ArrayList<>();
-  private final BrokerApiSubscribers subscribers;
   private final Properties baseProperties;
   private final PublisherPropertiesProvider publisherPropertiesProvider;
 
@@ -54,18 +51,14 @@
       final DefaultEventWorker defaultEventWorker,
       final EventWorkerFactory eventWorkerFactory,
       final GerritEventPublisherFactory publisherFactory,
-      final BrokerApiPublisher publisher,
-      final BrokerApiSubscribers subscribers,
       final @BaseProperties Properties baseProperties,
       final PublisherPropertiesProvider publisherPropertiesProvider) {
     this.pluginName = pluginName;
     this.defaultEventWorker = defaultEventWorker;
     this.userEventWorker = eventWorkerFactory.create();
     this.publisherFactory = publisherFactory;
-    this.subscribers = subscribers;
     this.baseProperties = baseProperties;
     this.publisherPropertiesProvider = publisherPropertiesProvider;
-    publisherList.add(publisher);
   }
 
   @Override
@@ -88,7 +81,6 @@
 
   @Override
   public void stop() {
-    subscribers.stop();
     for (Publisher publisher : publisherList) {
       publisher.stop();
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java
index 47b9b63..b9125ee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java
@@ -14,6 +14,9 @@
 
 package com.googlesource.gerrit.plugins.rabbitmq;
 
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.extensions.annotations.PluginData;
+import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.server.events.EventListener;
@@ -47,13 +50,26 @@
 import com.googlesource.gerrit.plugins.rabbitmq.worker.EventWorker;
 import com.googlesource.gerrit.plugins.rabbitmq.worker.EventWorkerFactory;
 import com.googlesource.gerrit.plugins.rabbitmq.worker.UserEventWorker;
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.storage.file.FileBasedConfig;
+import org.eclipse.jgit.util.FS;
 
 class Module extends AbstractModule {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   private final RabbitMqBrokerApiModule rabbitMqBrokerApiModule;
+  private final boolean brokerApiEnabled;
 
   @Inject
-  public Module(RabbitMqBrokerApiModule rabbitMqBrokerApiModule) {
+  public Module(
+      RabbitMqBrokerApiModule rabbitMqBrokerApiModule,
+      @PluginName final String pluginName,
+      @PluginData final File pluginData) {
     this.rabbitMqBrokerApiModule = rabbitMqBrokerApiModule;
+    this.brokerApiEnabled =
+        getBaseConfig(pluginName, pluginData).getBoolean("General", "enableBrokerApi", false);
   }
 
   @Override
@@ -96,6 +112,23 @@
         .annotatedWith(BaseProperties.class)
         .toProvider(BasePropertiesProvider.class);
 
-    install(rabbitMqBrokerApiModule);
+    if (brokerApiEnabled) {
+      install(rabbitMqBrokerApiModule);
+    } else {
+      logger.atInfo().log(
+          "The RabbitMqBrokerApi is disabled, set enableBrokerApi to true if you want to enable it");
+    }
+  }
+
+  private static FileBasedConfig getBaseConfig(String pluginName, File pluginData) {
+    File baseConfigFile =
+        pluginData.toPath().resolve(pluginName + BasePropertiesProvider.FILE_EXT).toFile();
+    FileBasedConfig config = new FileBasedConfig(baseConfigFile, FS.DETECTED);
+    try {
+      config.load();
+    } catch (IOException | ConfigInvalidException e) {
+      logger.atInfo().withCause(e).log("Unable to load %s", baseConfigFile.getAbsolutePath());
+    }
+    return config;
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMqBrokerApiModule.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMqBrokerApiModule.java
index ee97d02..f022b6c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMqBrokerApiModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMqBrokerApiModule.java
@@ -15,7 +15,9 @@
 package com.googlesource.gerrit.plugins.rabbitmq;
 
 import com.gerritforge.gerrit.eventbroker.BrokerApi;
+import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.lifecycle.LifecycleModule;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -31,6 +33,7 @@
 
   @Override
   protected void configure() {
+    DynamicSet.bind(binder(), LifecycleListener.class).to(BrokerApiManager.class);
     bind(Properties.class)
         .annotatedWith(BrokerApiProperties.class)
         .toProvider(BrokerApiPropertiesProvider.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BasePropertiesProvider.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BasePropertiesProvider.java
index 4dc1ed8..7070292 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BasePropertiesProvider.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BasePropertiesProvider.java
@@ -27,7 +27,6 @@
 
 @Singleton
 public class BasePropertiesProvider implements Provider<Properties> {
-
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   public static final String FILE_EXT = ".config";
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiPublisher.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiPublisher.java
index 3cdb9ac..2f2b444 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiPublisher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiPublisher.java
@@ -22,34 +22,24 @@
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.rabbitmq.config.Properties;
-import com.googlesource.gerrit.plugins.rabbitmq.config.section.General;
 import com.googlesource.gerrit.plugins.rabbitmq.session.type.AMQPPublisherSession;
 
 @Singleton
 public class BrokerApiPublisher extends MessagePublisher {
-
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
-  private final boolean enabled;
-
   @Inject
   public BrokerApiPublisher(
       AMQPPublisherSession.Factory sessionFactory,
       @EventGson Gson gson,
       @BrokerApiProperties Properties properties) {
     super(properties, sessionFactory, gson);
-    this.enabled = properties.getSection(General.class).enableBrokerApi;
   }
 
   @Override
   public void start() {
-    if (enabled) {
-      logger.atFine().log("BrokerApiPublisher is starting");
-      super.start();
-    } else {
-      logger.atWarning().log(
-          "The RabbitMqBrokerApi is disabled, set enableBrokerApi to true to enable");
-    }
+    logger.atFine().log("BrokerApiPublisher is starting");
+    super.start();
   }
 
   @Override
@@ -60,10 +50,7 @@
 
   @Override
   public ListenableFuture<Boolean> publish(String topic, Event event) {
-    if (enabled) {
-      logger.atFine().log("Message sent to topic %s with data: %s", topic, event);
-      return super.publish(topic, event);
-    }
-    return null;
+    logger.atFine().log("Message sent to topic %s with data: %s", topic, event);
+    return super.publish(topic, event);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiSubscribers.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiSubscribers.java
index bffff6d..f9bb9ce 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiSubscribers.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/BrokerApiSubscribers.java
@@ -24,7 +24,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.rabbitmq.config.Properties;
-import com.googlesource.gerrit.plugins.rabbitmq.config.section.General;
 import com.googlesource.gerrit.plugins.rabbitmq.session.SubscriberSession;
 import com.googlesource.gerrit.plugins.rabbitmq.session.type.AMQPSubscriberSession;
 import java.util.HashMap;
@@ -32,13 +31,11 @@
 
 @Singleton
 public class BrokerApiSubscribers {
-
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final SubscriberSession session;
   private final Properties properties;
   private final Gson gson;
-  private final boolean enabled;
   private final Map<TopicSubscriber, String> consumerTags = new HashMap<>();
 
   @Inject
@@ -49,7 +46,6 @@
     this.properties = properties;
     this.session = sessionFactory.create(properties);
     this.gson = gson;
-    this.enabled = properties.getSection(General.class).enableBrokerApi;
   }
 
   public void stop() {
@@ -63,29 +59,24 @@
 
   public boolean addSubscriber(TopicSubscriber topicSubscriber) {
     String topic = topicSubscriber.topic();
-    if (enabled) {
-      logger.atFine().log("RabbitMqBrokerApi used to set consumer to topic %s", topic);
-      String consumerTag =
-          session.addSubscriber(
-              topic,
-              messageBody -> {
-                logger.atFiner().log(
-                    "The RabbitMqBrokerApi consumed event from topic %s with data: %s",
-                    topic, messageBody);
-                Event event = gson.fromJson(messageBody, Event.class);
-                if (event.type != null) {
-                  topicSubscriber.consumer().accept(event);
-                } else {
-                  logger.atFine().log("Event does not have a type, ignoring Event");
-                }
-              });
-      if (consumerTag != null) {
-        consumerTags.put(topicSubscriber, consumerTag);
-        return true;
-      }
-    } else {
-      logger.atWarning().log(
-          "The RabbitMqBrokerApi is disabled, set enableBrokerApi to true to enable");
+    logger.atFine().log("RabbitMqBrokerApi used to set consumer to topic %s", topic);
+    String consumerTag =
+        session.addSubscriber(
+            topic,
+            messageBody -> {
+              logger.atFiner().log(
+                  "The RabbitMqBrokerApi consumed event from topic %s with data: %s",
+                  topic, messageBody);
+              Event event = gson.fromJson(messageBody, Event.class);
+              if (event.type != null) {
+                topicSubscriber.consumer().accept(event);
+              } else {
+                logger.atFine().log("Event does not have a type, ignoring Event");
+              }
+            });
+    if (consumerTag != null) {
+      consumerTags.put(topicSubscriber, consumerTag);
+      return true;
     }
     return false;
   }