cloud-notifications: fix stable-2.15

Change-Id: I8d561c5af09f95329ba55cf2525919172ff07ece
Signed-off-by: Jorge Ruesga <j.ruesga.criado@gmail.com>
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/AssigneeChangedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/AssigneeChangedEventHandler.java
index af788c1..9f195bd 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/AssigneeChangedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/AssigneeChangedEventHandler.java
@@ -18,11 +18,14 @@
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.events.AssigneeChangedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -50,19 +53,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeAbandonedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeAbandonedEventHandler.java
index 86c6bf6..74530e1 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeAbandonedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeAbandonedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.ChangeAbandonedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -37,25 +40,31 @@
 
     @Inject
     public ChangeAbandonedEventHandler(
-          @PluginName String pluginName,
+            @PluginName String pluginName,
             FcmUploaderWorker uploader,
             AllProjectsName allProjectsName,
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeMergedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeMergedEventHandler.java
index 5570996..10536c4 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeMergedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeMergedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.ChangeMergedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRestoredEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRestoredEventHandler.java
index 2fa44aa..ddf1a11 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRestoredEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRestoredEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.ChangeRestoredListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRevertedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRevertedEventHandler.java
index c46aadd..847a642 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRevertedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ChangeRevertedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.ChangeRevertedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/CommentAddedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/CommentAddedEventHandler.java
index b047fc6..c15926f 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/CommentAddedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/CommentAddedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.CommentAddedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -45,19 +48,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/EventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/EventHandler.java
index 99a8cdf..b8a946b 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/EventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/EventHandler.java
@@ -22,9 +22,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.common.data.GroupDescription;
 import com.google.gerrit.common.data.GroupReference;
+import com.google.gerrit.common.errors.NoSuchGroupException;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.api.changes.NotifyHandling;
 import com.google.gerrit.extensions.client.ReviewerState;
@@ -37,16 +37,19 @@
 import com.google.gerrit.index.query.QueryResult;
 import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountGroup;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.AccountState;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
-import com.google.gerrit.server.account.ProjectWatches.ProjectWatchKey;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
+import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey;
 import com.google.gerrit.server.config.AllProjectsName;
 import com.google.gerrit.server.git.NotifyConfig;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
@@ -77,22 +80,28 @@
     private final ChangeQueryProcessor cqp;
     private final ProjectCache projectCache;
     private final GroupBackend groupBackend;
+    private final GroupIncludeCache groupIncludes;
+    private final Provider<ReviewDb> db;
     private final Provider<InternalAccountQuery> accountQueryProvider;
     private final GenericFactory identifiedUserFactory;
     private final Provider<AnonymousUser> anonymousProvider;
+    private final Groups groups;
     private final Gson gson;
 
     public EventHandler(
-            @PluginName String pluginName,
-            FcmUploaderWorker uploader,
-            AllProjectsName allProjectsName,
-            ChangeQueryBuilder cqb,
-            ChangeQueryProcessor cqp,
-            ProjectCache projectCache,
-            GroupBackend groupBackend,
-            Provider<InternalAccountQuery> accountQueryProvider,
-            GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+        @PluginName String pluginName,
+        FcmUploaderWorker uploader,
+        AllProjectsName allProjectsName,
+        ChangeQueryBuilder cqb,
+        ChangeQueryProcessor cqp,
+        ProjectCache projectCache,
+        GroupIncludeCache groupIncludes,
+        GroupBackend groupBackend,
+        Provider<ReviewDb> db,
+        Provider<InternalAccountQuery> accountQueryProvider,
+        GenericFactory identifiedUserFactory,
+        Provider<AnonymousUser> anonymousProvider,
+        Groups groups) {
         super();
         this.pluginName = pluginName;
         this.uploader = uploader;
@@ -100,10 +109,13 @@
         this.cqb = cqb;
         this.cqp = cqp;
         this.projectCache = projectCache;
+        this.groupIncludes = groupIncludes;
         this.groupBackend = groupBackend;
+        this.db = db;
         this.accountQueryProvider = accountQueryProvider;
         this.identifiedUserFactory = identifiedUserFactory;
         this.anonymousProvider = anonymousProvider;
+        this.groups = groups;
         this.gson = new GsonBuilder().create();
     }
 
@@ -205,7 +217,7 @@
             for (AccountState a : accountQueryProvider.get().byWatchedProject(
                     change.project())) {
                 Account.Id accountId = a.getAccount().getId();
-                for (Map.Entry<ProjectWatchKey, ImmutableSet<NotifyType>> e : a.getProjectWatches().entrySet()) {
+                for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : a.getProjectWatches().entrySet()) {
                     if (change.project().equals(e.getKey().project())
                             && add(watchers, accountId, e.getKey(), e.getValue(), type, change)) {
                         // We only want to prevent matching All-Projects if this filter hits
@@ -215,7 +227,7 @@
             }
 
             for (AccountState a : accountQueryProvider.get().byWatchedProject(allProjectsName)) {
-              for (Map.Entry<ProjectWatchKey, ImmutableSet<NotifyType>> e : a.getProjectWatches().entrySet()) {
+              for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : a.getProjectWatches().entrySet()) {
                     if (allProjectsName.equals(e.getKey().project())) {
                         Account.Id accountId = a.getAccount().getId();
                         if (!projectWatchers.contains(accountId)) {
@@ -326,7 +338,9 @@
         return null;
     }
 
-    private void deliverToMembers(Set<Integer> watchers, AccountGroup.UUID startUUID) {
+    private void deliverToMembers(Set<Integer> watchers, AccountGroup.UUID startUUID)
+            throws OrmException {
+        ReviewDb db = this.db.get();
         Set<AccountGroup.UUID> seen = new HashSet<>();
         List<AccountGroup.UUID> q = new ArrayList<>();
 
@@ -337,21 +351,23 @@
             AccountGroup.UUID uuid = q.remove(q.size() - 1);
             GroupDescription.Basic group = groupBackend.get(uuid);
             if (group == null) {
-                continue;
+              continue;
             }
 
             if (!(group instanceof GroupDescription.Internal)) {
-                // Non-internal groups cannot be expanded by the server.
-                continue;
+              // Non-internal groups cannot be expanded by the server.
+              continue;
             }
 
             GroupDescription.Internal ig = (GroupDescription.Internal) group;
-            for (Account.Id id : ig.getMembers()) {
-                watchers.add(id.get());
+            try {
+                groups.getMembers(db, ig.getGroupUUID()).forEach(g -> watchers.add(g.get()));
+            } catch (NoSuchGroupException e) {
+                continue;
             }
-            for (AccountGroup.UUID m : ig.getSubgroups()) {
+            for (AccountGroup.UUID m : groupIncludes.subgroupsOf(uuid)) {
                 if (seen.add(m)) {
-                    q.add(m);
+                  q.add(m);
                 }
             }
         }
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/HashtagsEditedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/HashtagsEditedEventHandler.java
index d112072..e137543 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/HashtagsEditedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/HashtagsEditedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.HashtagsEditedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -49,19 +52,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java
index eb32e45..2d1999c 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.PrivateStateChangedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerAddedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerAddedEventHandler.java
index 49e66c1..d75006f 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerAddedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerAddedEventHandler.java
@@ -20,11 +20,14 @@
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.events.ReviewerAddedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -46,19 +49,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerDeletedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerDeletedEventHandler.java
index 1ea1258..f1e8428 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerDeletedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/ReviewerDeletedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.ReviewerDeletedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/RevisionCreatedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/RevisionCreatedEventHandler.java
index e410510..587fc9b 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/RevisionCreatedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/RevisionCreatedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.RevisionCreatedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/TopicEditedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/TopicEditedEventHandler.java
index 24102b6..92ab9ab 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/TopicEditedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/TopicEditedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.TopicEditedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -48,19 +51,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/VoteDeletedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/VoteDeletedEventHandler.java
index 3f639d8..7248952 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/VoteDeletedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/VoteDeletedEventHandler.java
@@ -20,11 +20,14 @@
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.common.ApprovalInfo;
 import com.google.gerrit.extensions.events.VoteDeletedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -56,19 +59,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java
index 9179b1f..a6325be 100644
--- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java
+++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java
@@ -17,11 +17,14 @@
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener;
+import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.AnonymousUser;
 import com.google.gerrit.server.IdentifiedUser.GenericFactory;
 import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.ProjectWatches.NotifyType;
+import com.google.gerrit.server.account.GroupIncludeCache;
+import com.google.gerrit.server.account.WatchConfig.NotifyType;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.group.Groups;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.query.account.InternalAccountQuery;
 import com.google.gerrit.server.query.change.ChangeQueryBuilder;
@@ -43,19 +46,25 @@
             ChangeQueryBuilder cqb,
             ChangeQueryProcessor cqp,
             ProjectCache projectCache,
+            GroupIncludeCache groupIncludes,
             GroupBackend groupBackend,
+            Provider<ReviewDb> db,
             Provider<InternalAccountQuery> accountQueryProvider,
             GenericFactory identifiedUserFactory,
-            Provider<AnonymousUser> anonymousProvider) {
+            Provider<AnonymousUser> anonymousProvider,
+            Groups groups) {
         super(pluginName,
                 uploader,
                 allProjectsName,
                 cqb, cqp,
                 projectCache,
+                groupIncludes,
                 groupBackend,
+                db,
                 accountQueryProvider,
                 identifiedUserFactory,
-                anonymousProvider);
+                anonymousProvider,
+                groups);
     }
 
     protected int getEventType() {