Some improvements

* More decoupling interface from implementation.
* Remove unnecessary imports and comments.
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 a188982..79baa9d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/Module.java
@@ -30,8 +30,6 @@
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.Message;
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.Monitor;
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.Section;
-import com.googlesource.gerrit.plugins.rabbitmq.message.DefaultChangeListener;
-import com.googlesource.gerrit.plugins.rabbitmq.message.IdentifiedChangeListener;
 import com.googlesource.gerrit.plugins.rabbitmq.message.MessagePublisher;
 import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
 import com.googlesource.gerrit.plugins.rabbitmq.message.PublisherFactory;
@@ -41,16 +39,15 @@
 import com.googlesource.gerrit.plugins.rabbitmq.solver.SolverImpl;
 import com.googlesource.gerrit.plugins.rabbitmq.solver.Solver;
 import com.googlesource.gerrit.plugins.rabbitmq.solver.SolverFactory;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.ChangeWorker;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.ChangeWorkerFactory;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.DefaultChangeWorker;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.UserChangeWorker;
 
 class Module extends AbstractModule {
 
   @Override
   protected void configure() {
-    bind(Gerrit.class);
-    bind(SolverImpl.class);
-    bind(IdentifiedChangeListener.class);
-    bind(RabbitMQManager.class);
-
     bind(Section.class).annotatedWith(Names.named("amqp")).to(AMQP.class);
     bind(Section.class).annotatedWith(Names.named("exchange")).to(Exchange.class);
     bind(Section.class).annotatedWith(Names.named("gerrit")).to(Gerrit.class);
@@ -61,9 +58,9 @@
     install(new FactoryModuleBuilder().implement(Session.class, AMQPSession.class).build(SessionFactory.class));
     install(new FactoryModuleBuilder().implement(Publisher.class, MessagePublisher.class).build(PublisherFactory.class));
     install(new FactoryModuleBuilder().implement(Properties.class, PluginProperties.class).build(PropertiesFactory.class));
+    install(new FactoryModuleBuilder().implement(ChangeWorker.class, UserChangeWorker.class).build(ChangeWorkerFactory.class));
 
     DynamicSet.bind(binder(), LifecycleListener.class).to(RabbitMQManager.class);
-    DynamicSet.bind(binder(), LifecycleListener.class).to(DefaultChangeListener.class);
-    DynamicSet.bind(binder(), ChangeListener.class).to(DefaultChangeListener.class);
+    DynamicSet.bind(binder(), ChangeListener.class).to(DefaultChangeWorker.class);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMQManager.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMQManager.java
index 043d529..d2a1dec 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMQManager.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/RabbitMQManager.java
@@ -23,15 +23,14 @@
 import com.googlesource.gerrit.plugins.rabbitmq.config.Properties;
 import com.googlesource.gerrit.plugins.rabbitmq.config.PropertiesFactory;
 import com.googlesource.gerrit.plugins.rabbitmq.config.section.Gerrit;
-import com.googlesource.gerrit.plugins.rabbitmq.config.section.Section;
-import com.googlesource.gerrit.plugins.rabbitmq.message.DefaultChangeListener;
-import com.googlesource.gerrit.plugins.rabbitmq.message.IdentifiedChangeListener;
 import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
 import com.googlesource.gerrit.plugins.rabbitmq.message.PublisherFactory;
 import com.googlesource.gerrit.plugins.rabbitmq.solver.Solver;
 import com.googlesource.gerrit.plugins.rabbitmq.solver.SolverFactory;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.ChangeWorker;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.ChangeWorkerFactory;
+import com.googlesource.gerrit.plugins.rabbitmq.worker.DefaultChangeWorker;
 
-import org.apache.commons.lang.builder.ToStringBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,8 +52,8 @@
 
   private final String pluginName;
   private final Path pluginDataDir;
-  private final DefaultChangeListener defaultChangeListener;
-  private final IdentifiedChangeListener identifiedChangeListener;
+  private final ChangeWorker defaultChangeWorker;
+  private final ChangeWorker userChangeWorker;
   private final PublisherFactory publisherFactory;
   private final PropertiesFactory propFactory;
   private final SolverFactory solverFactory;
@@ -64,15 +63,15 @@
   public RabbitMQManager(
       @PluginName final String pluginName,
       @PluginData final File pluginData,
-      final DefaultChangeListener defaultChangeListener,
-      final IdentifiedChangeListener identifiedChangeListener,
+      final DefaultChangeWorker defaultChangeWorker,
+      final ChangeWorkerFactory changeWorkerFactory,
       final PublisherFactory publisherFactory,
       final PropertiesFactory propFactory,
       final SolverFactory solverFactory) {
     this.pluginName = pluginName;
     this.pluginDataDir = pluginData.toPath();
-    this.defaultChangeListener = defaultChangeListener;
-    this.identifiedChangeListener = identifiedChangeListener;
+    this.defaultChangeWorker = defaultChangeWorker;
+    this.userChangeWorker = changeWorkerFactory.create();
     this.publisherFactory = publisherFactory;
     this.propFactory = propFactory;
     this.solverFactory = solverFactory;
@@ -89,9 +88,9 @@
       publisher.start();
       String listenAs = properties.getSection(Gerrit.class).listenAs;
       if (!listenAs.isEmpty()) {
-        identifiedChangeListener.addPublisher(publisher, listenAs);
+        userChangeWorker.addPublisher(publisher, listenAs);
       } else {
-        defaultChangeListener.addPublisher(publisher);
+        defaultChangeWorker.addPublisher(publisher);
       }
       publisherList.add(publisher);
     }
@@ -103,9 +102,9 @@
       publisher.stop();
       String listenAs = publisher.getProperties().getSection(Gerrit.class).listenAs;
       if (!listenAs.isEmpty()) {
-        identifiedChangeListener.removePublisher(publisher);
+        userChangeWorker.removePublisher(publisher);
       } else {
-        defaultChangeListener.removePublisher(publisher);
+        defaultChangeWorker.removePublisher(publisher);
       }
     }
     publisherList.clear();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/session/Session.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/session/Session.java
index 2416ff6..6cd7e81 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/session/Session.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/session/Session.java
@@ -13,10 +13,7 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.rabbitmq.session;
 
-import com.googlesource.gerrit.plugins.rabbitmq.config.Properties;
-
 public interface Session {
-//  public Properties getProperties();
   public boolean isOpen();
   public void connect();
   public void disconnect();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorker.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorker.java
new file mode 100644
index 0000000..5bd7e91
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorker.java
@@ -0,0 +1,10 @@
+package com.googlesource.gerrit.plugins.rabbitmq.worker;
+
+import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
+
+public interface ChangeWorker {
+  public void addPublisher(Publisher publisher);
+  public void addPublisher(Publisher publisher, String userName);
+  public void removePublisher(Publisher publisher);
+  public void clear();
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorkerFactory.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorkerFactory.java
new file mode 100644
index 0000000..b6f7e0d
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/ChangeWorkerFactory.java
@@ -0,0 +1,19 @@
+// 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.googlesource.gerrit.plugins.rabbitmq.worker;
+
+public interface ChangeWorkerFactory {
+  public ChangeWorker create();
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/DefaultChangeListener.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/DefaultChangeWorker.java
similarity index 73%
rename from src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/DefaultChangeListener.java
rename to src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/DefaultChangeWorker.java
index 067a6d6..91cd705 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/DefaultChangeListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/DefaultChangeWorker.java
@@ -12,13 +12,14 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.rabbitmq.message;
+package com.googlesource.gerrit.plugins.rabbitmq.worker;
 
 import com.google.gerrit.common.ChangeListener;
-import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.server.events.ChangeEvent;
 import com.google.inject.Singleton;
 
+import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,41 +27,33 @@
 import java.util.concurrent.CopyOnWriteArraySet;
 
 @Singleton
-public class DefaultChangeListener implements ChangeListener, LifecycleListener {
+public class DefaultChangeWorker implements ChangeListener, ChangeWorker {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(DefaultChangeListener.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(DefaultChangeWorker.class);
 
   private final Set<Publisher> publishers = new CopyOnWriteArraySet<>();
 
+  @Override
   public void addPublisher(Publisher publisher) {
     publishers.add(publisher);
   }
 
+  @Override
+  public void addPublisher(Publisher publisher, String userName) {
+    LOGGER.warn("addPublisher() with username '{}' was called. Hence no operation.", userName);
+  }
+
+  @Override
   public void removePublisher(Publisher publisher) {
     publishers.remove(publisher);
   }
 
+  @Override
   public void clear() {
     publishers.clear();
   }
 
   @Override
-  public void start() {
-    LOGGER.info("Start default listener.");
-    for (Publisher publisher : publishers) {
-      publisher.start();
-    }
-  }
-
-  @Override
-  public void stop() {
-    LOGGER.info("Stop default listener.");
-    for (Publisher publisher : publishers) {
-      publisher.stop();
-    }
-  }
-
-  @Override
   public void onChangeEvent(ChangeEvent event) {
     for (Publisher publisher : publishers) {
       publisher.onChangeEvent(event);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/IdentifiedChangeListener.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/UserChangeWorker.java
similarity index 86%
rename from src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/IdentifiedChangeListener.java
rename to src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/UserChangeWorker.java
index 5f5a756..46efe58 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/message/IdentifiedChangeListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/worker/UserChangeWorker.java
@@ -12,10 +12,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package com.googlesource.gerrit.plugins.rabbitmq.message;
+package com.googlesource.gerrit.plugins.rabbitmq.worker;
 
 import com.google.gerrit.common.ChangeHooks;
-import com.google.gerrit.common.ChangeListener;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.CurrentUser;
@@ -31,12 +30,14 @@
 import com.google.inject.Provider;
 import com.google.inject.ProvisionException;
 
+import com.googlesource.gerrit.plugins.rabbitmq.message.Publisher;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class IdentifiedChangeListener {
+public class UserChangeWorker implements ChangeWorker {
 
-  private static final Logger LOGGER = LoggerFactory.getLogger(IdentifiedChangeListener.class);
+  private static final Logger LOGGER = LoggerFactory.getLogger(UserChangeWorker.class);
 
   private final ChangeHooks hooks;
   private final WorkQueue workQueue;
@@ -47,7 +48,7 @@
   private final SchemaFactory<ReviewDb> schemaFactory;
 
   @Inject
-  public IdentifiedChangeListener(
+  public UserChangeWorker(
       ChangeHooks hooks,
       WorkQueue workQueue,
       AccountResolver accountResolver,
@@ -64,6 +65,12 @@
     this.schemaFactory = schemaFactory;
   }
 
+  @Override
+  public void addPublisher(final Publisher publisher) {
+    LOGGER.warn("addPublisher() without username was called. Hence no operation.");
+  }
+
+  @Override
   public void addPublisher(final Publisher publisher, final String userName) {
     workQueue.getDefaultQueue().submit(new Runnable() {
       private ReviewDb db;
@@ -120,7 +127,13 @@
     });
   }
 
-  public void removePublisher(Publisher publisher) {
+  @Override
+  public void removePublisher(final Publisher publisher) {
     hooks.removeChangeListener(publisher);
   }
+
+  @Override
+  public void clear() {
+    // no op.
+  }
 }