cloud-notifications: update to api 2.15 Change-Id: I60a708e68be51f20a84fe94452d385122d84468a Signed-off-by: Jorge Ruesga <j.ruesga.criado@gmail.com>
diff --git a/BUILD b/BUILD index ab3b9b8..70dd404 100644 --- a/BUILD +++ b/BUILD
@@ -29,11 +29,10 @@ resources = RESOURCES, manifest_entries = [ 'Gerrit-PluginName: cloud-notifications', - 'Gerrit-ApiVersion: 2.14-SNAPSHOT', + 'Gerrit-ApiVersion: 2.15', 'Gerrit-Module: com.ruesga.gerrit.plugins.fcm.ApiModule', 'Implementation-Title: Firebase Cloud Notifications Plugin', - 'Implementation-URL: https://gerrit.googlesource.com/plugins/cloud-notifications', - 'Implementation-Version: 2.14-SNAPSHOT' + 'Implementation-URL: https://gerrit.googlesource.com/plugins/cloud-notifications' ], deps = DEPS )
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/ApiModule.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/ApiModule.java index 9947f29..5ddff04 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/ApiModule.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/ApiModule.java
@@ -20,39 +20,12 @@ import static com.ruesga.gerrit.plugins.fcm.server.DeviceResource.DEVICE_KIND; import static com.ruesga.gerrit.plugins.fcm.server.TokenResource.TOKEN_KIND; -import com.google.gerrit.extensions.events.AssigneeChangedListener; -import com.google.gerrit.extensions.events.ChangeAbandonedListener; -import com.google.gerrit.extensions.events.ChangeMergedListener; -import com.google.gerrit.extensions.events.ChangeRestoredListener; -import com.google.gerrit.extensions.events.ChangeRevertedListener; -import com.google.gerrit.extensions.events.CommentAddedListener; -import com.google.gerrit.extensions.events.DraftPublishedListener; -import com.google.gerrit.extensions.events.HashtagsEditedListener; -import com.google.gerrit.extensions.events.LifecycleListener; -import com.google.gerrit.extensions.events.ReviewerAddedListener; -import com.google.gerrit.extensions.events.ReviewerDeletedListener; -import com.google.gerrit.extensions.events.RevisionCreatedListener; -import com.google.gerrit.extensions.events.TopicEditedListener; -import com.google.gerrit.extensions.events.VoteDeletedListener; +import com.google.gerrit.extensions.events.*; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.extensions.restapi.RestApiModule; import com.google.inject.Scopes; -import com.ruesga.gerrit.plugins.fcm.DatabaseManager; -import com.ruesga.gerrit.plugins.fcm.handlers.AssigneeChangedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ChangeAbandonedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ChangeMergedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ChangeRestoredEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ChangeRevertedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.CommentAddedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.DraftPublishedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.HashtagsEditedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.LifeCycleHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ReviewerAddedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.ReviewerDeletedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.RevisionCreatedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.TopicEditedEventHandler; -import com.ruesga.gerrit.plugins.fcm.handlers.VoteDeletedEventHandler; +import com.ruesga.gerrit.plugins.fcm.handlers.*; import com.ruesga.gerrit.plugins.fcm.server.DeleteToken; import com.ruesga.gerrit.plugins.fcm.server.Devices; import com.ruesga.gerrit.plugins.fcm.server.GetCloudNotificationsConfigInfo; @@ -89,8 +62,6 @@ .to(ChangeRevertedEventHandler.class); DynamicSet.bind(binder(), CommentAddedListener.class) .to(CommentAddedEventHandler.class); - DynamicSet.bind(binder(), DraftPublishedListener.class) - .to(DraftPublishedEventHandler.class); DynamicSet.bind(binder(), HashtagsEditedListener.class) .to(HashtagsEditedEventHandler.class); DynamicSet.bind(binder(), ReviewerDeletedListener.class) @@ -103,6 +74,10 @@ .to(TopicEditedEventHandler.class); DynamicSet.bind(binder(), VoteDeletedListener.class) .to(VoteDeletedEventHandler.class); + DynamicSet.bind(binder(), PrivateStateChangedListener.class) + .to(PrivateStateChangedEventHandler.class); + DynamicSet.bind(binder(), WorkInProgressStateChangedListener.class) + .to(WIPStateChangedEventHandler.class); // Configure the Rest API DynamicMap.mapOf(binder(), DEVICE_KIND);
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 fa050ea..af788c1 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,10 +18,12 @@ 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.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -47,16 +49,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 6a7a859..86c6bf6 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.ChangeAbandonedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -35,21 +37,25 @@ @Inject public ChangeAbandonedEventHandler( - @PluginName String pluginName, + @PluginName String pluginName, FcmUploaderWorker uploader, AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 bf8bc5a..5570996 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.ChangeMergedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -40,16 +42,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 a0976d9..2fa44aa 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.ChangeRestoredListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -40,16 +42,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 e859a17..c46aadd 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.ChangeRevertedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -40,16 +42,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 0ebe7dc..b047fc6 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
@@ -15,14 +15,14 @@ */ package com.ruesga.gerrit.plugins.fcm.handlers; -import org.apache.commons.lang.StringUtils; - import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.CommentAddedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -32,6 +32,8 @@ import com.ruesga.gerrit.plugins.fcm.rest.CloudNotificationEvents; import com.ruesga.gerrit.plugins.fcm.workers.FcmUploaderWorker; +import org.apache.commons.lang.StringUtils; + public class CommentAddedEventHandler extends EventHandler implements CommentAddedListener { @@ -42,16 +44,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } protected int getEventType() { @@ -66,11 +72,11 @@ public void onCommentAdded(Event event) { Notification notification = createNotification(event); if (event.getComment() != null) { - notification.extra = - StringUtils.abbreviate(event.getComment(), 250); + notification.extra = + StringUtils.abbreviate(event.getComment(), 250); } notification.body = formatAccount(event.getWho()) - + " commented on this change"; + + " commented on this change"; notify(notification, event); }
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 9c28cb2..99a8cdf 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,10 +22,9 @@ import java.util.Map; import java.util.Set; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import com.google.common.collect.ImmutableSet; +import com.google.gerrit.common.data.GroupDescription; +import com.google.gerrit.common.data.GroupReference; import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.api.changes.NotifyHandling; import com.google.gerrit.extensions.client.ReviewerState; @@ -33,22 +32,28 @@ import com.google.gerrit.extensions.common.ChangeInfo; import com.google.gerrit.extensions.events.ChangeEvent; import com.google.gerrit.extensions.events.RevisionEvent; +import com.google.gerrit.index.query.Predicate; +import com.google.gerrit.index.query.QueryParseException; +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.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.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; -import com.google.gerrit.server.account.WatchConfig.ProjectWatchKey; +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.config.AllProjectsName; -import com.google.gerrit.server.query.Predicate; -import com.google.gerrit.server.query.QueryParseException; -import com.google.gerrit.server.query.QueryResult; +import com.google.gerrit.server.git.NotifyConfig; +import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.project.ProjectState; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; +import com.google.gerrit.server.query.change.SingleGroupUser; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gwtorm.server.OrmException; @@ -56,9 +61,13 @@ import com.ruesga.gerrit.plugins.fcm.messaging.Notification; import com.ruesga.gerrit.plugins.fcm.workers.FcmUploaderWorker; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public abstract class EventHandler { - static final Logger log = + private static final Logger log = LoggerFactory.getLogger(EventHandler.class); private final String pluginName; @@ -66,8 +75,11 @@ private final AllProjectsName allProjectsName; private final ChangeQueryBuilder cqb; private final ChangeQueryProcessor cqp; + private final ProjectCache projectCache; + private final GroupBackend groupBackend; private final Provider<InternalAccountQuery> accountQueryProvider; private final GenericFactory identifiedUserFactory; + private final Provider<AnonymousUser> anonymousProvider; private final Gson gson; public EventHandler( @@ -76,17 +88,22 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(); this.pluginName = pluginName; this.uploader = uploader; this.allProjectsName = allProjectsName; this.cqb = cqb; this.cqp = cqp; + this.projectCache = projectCache; + this.groupBackend = groupBackend; this.accountQueryProvider = accountQueryProvider; this.identifiedUserFactory = identifiedUserFactory; + this.anonymousProvider = anonymousProvider; this.gson = new GsonBuilder().create(); } @@ -94,7 +111,7 @@ protected abstract NotifyType getNotifyType(); - protected Gson getSerializer() { + Gson getSerializer() { return this.gson; } @@ -169,7 +186,10 @@ // 3.- Watchers ChangeData changeData = obtainChangeData(change); - notifiedUsers.addAll(getWatchers(getNotifyType(), changeData)); + if (changeData != null) { + notifiedUsers.addAll(getWatchers(getNotifyType(), changeData, + !safeBoolean(change.workInProgress) && !safeBoolean(change.isPrivate))); + } // 4.- Remove the author of this event (he doesn't need to get // the notification) @@ -178,14 +198,14 @@ return new ArrayList<>(notifiedUsers); } - public final Set<Integer> getWatchers(NotifyType type, ChangeData change) { + private Set<Integer> getWatchers(NotifyType type, ChangeData change, boolean includeWatchersFromNotifyConfig) { Set<Integer> watchers = new HashSet<>(); try { Set<Account.Id> projectWatchers = new HashSet<>(); for (AccountState a : accountQueryProvider.get().byWatchedProject( change.project())) { Account.Id accountId = a.getAccount().getId(); - for (Map.Entry<ProjectWatchKey, Set<NotifyType>> e : a.getProjectWatches().entrySet()) { + for (Map.Entry<ProjectWatchKey, ImmutableSet<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 @@ -194,16 +214,37 @@ } } - for (AccountState a : accountQueryProvider.get().byWatchedProject( - allProjectsName)) { - 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)) { - add(watchers, accountId, e.getKey(), e.getValue(), type, change); - } + for (AccountState a : accountQueryProvider.get().byWatchedProject(allProjectsName)) { + for (Map.Entry<ProjectWatchKey, ImmutableSet<NotifyType>> e : a.getProjectWatches().entrySet()) { + if (allProjectsName.equals(e.getKey().project())) { + Account.Id accountId = a.getAccount().getId(); + if (!projectWatchers.contains(accountId)) { + add(watchers, accountId, e.getKey(), e.getValue(), type, change); + } + } } - } + } + + if (includeWatchersFromNotifyConfig) { + ProjectState projectState = projectCache.get(change.project()); + if (projectState != null) { + for (ProjectState state : projectState.tree()) { + for (NotifyConfig nc : state.getConfig().getNotifyConfigs()) { + if (nc.isNotify(type)) { + try { + add(watchers, nc, change); + } catch (QueryParseException e) { + log.warn( + "Project {} has invalid notify {} filter \"{}\": {}", + state.getName(), + nc.getName(), + nc.getFilter(), + e.getMessage()); + } + } + } + } + } } } catch (OrmException ex) { @@ -233,11 +274,27 @@ return false; } + private void add(Set<Integer> watchers, NotifyConfig nc, ChangeData change) + throws OrmException, QueryParseException { + for (GroupReference ref : nc.getGroups()) { + CurrentUser user = new SingleGroupUser(ref.getUUID()); + if (filterMatch(user, nc.getFilter(), change)) { + deliverToMembers(watchers, ref.getUUID()); + } + } + } + private boolean filterMatch( CurrentUser user, String filter, ChangeData change) throws OrmException, QueryParseException { - ChangeQueryBuilder qb = cqb.asUser(user); - Predicate<ChangeData> p = qb.is_visible(); + ChangeQueryBuilder qb; + Predicate<ChangeData> p = null; + if (user == null) { + qb = cqb.asUser(anonymousProvider.get()); + } else { + qb = cqb.asUser(user); + p = qb.is_visible(); + } if (filter != null) { Predicate<ChangeData> filterPredicate = qb.parse(filter); @@ -269,6 +326,37 @@ return null; } + private void deliverToMembers(Set<Integer> watchers, AccountGroup.UUID startUUID) { + Set<AccountGroup.UUID> seen = new HashSet<>(); + List<AccountGroup.UUID> q = new ArrayList<>(); + + seen.add(startUUID); + q.add(startUUID); + + while (!q.isEmpty()) { + AccountGroup.UUID uuid = q.remove(q.size() - 1); + GroupDescription.Basic group = groupBackend.get(uuid); + if (group == null) { + continue; + } + + if (!(group instanceof GroupDescription.Internal)) { + // 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()); + } + for (AccountGroup.UUID m : ig.getSubgroups()) { + if (seen.add(m)) { + q.add(m); + } + } + } + } + protected String formatAccount(AccountInfo account) { if (account.name != null) { return account.name; @@ -278,4 +366,8 @@ } return account.email; } + + boolean safeBoolean(Boolean value) { + return value != null && value; + } }
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 992fd5d..d112072 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.HashtagsEditedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -46,16 +48,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } protected int getEventType() { @@ -70,12 +76,10 @@ public void onHashtagsEdited(Event event) { HashtagsInfo hashtags = new HashtagsInfo(); if (event.getRemovedHashtags() != null) { - hashtags.removed = event.getRemovedHashtags().toArray( - new String[event.getRemovedHashtags().size()]); + hashtags.removed = event.getRemovedHashtags().toArray(new String[0]); } if (event.getAddedHashtags() != null) { - hashtags.added = event.getAddedHashtags().toArray( - new String[event.getAddedHashtags().size()]); + hashtags.added = event.getAddedHashtags().toArray(new String[0]); } Notification notification = createNotification(event); notification.extra = getSerializer().toJson(hashtags);
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java similarity index 66% rename from src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java rename to src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java index eaffee9..eb32e45 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/PrivateStateChangedEventHandler.java
@@ -16,11 +16,13 @@ package com.ruesga.gerrit.plugins.fcm.handlers; import com.google.gerrit.extensions.annotations.PluginName; -import com.google.gerrit.extensions.events.DraftPublishedListener; +import com.google.gerrit.extensions.events.PrivateStateChangedListener; +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.config.AllProjectsName; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -30,30 +32,34 @@ import com.ruesga.gerrit.plugins.fcm.rest.CloudNotificationEvents; import com.ruesga.gerrit.plugins.fcm.workers.FcmUploaderWorker; -public class DraftPublishedEventHandler extends EventHandler - implements DraftPublishedListener { +public class PrivateStateChangedEventHandler extends EventHandler + implements PrivateStateChangedListener { @Inject - public DraftPublishedEventHandler( + public PrivateStateChangedEventHandler( @PluginName String pluginName, FcmUploaderWorker uploader, AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } protected int getEventType() { - return CloudNotificationEvents.DRAFT_PUBLISHED_EVENT; + return CloudNotificationEvents.PRIVATE_STATE_CHANGED_EVENT; } protected NotifyType getNotifyType() { @@ -61,11 +67,11 @@ } @Override - public void onDraftPublished(Event event) { + public void onPrivateStateChanged(Event event) { Notification notification = createNotification(event); notification.body = formatAccount(event.getWho()) - + " published a draft on this change"; - + + " change state of this change to " + + (safeBoolean(event.getChange().isPrivate) ? "private" : "public"); notify(notification, event); }
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 bb4b561..49e66c1 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,10 +20,12 @@ 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.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -43,16 +45,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 ffbabcf..1ea1258 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.ReviewerDeletedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -40,16 +42,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 946d113..e410510 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.RevisionCreatedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -40,16 +42,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 e255b6b..24102b6 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,10 +17,12 @@ import com.google.gerrit.extensions.annotations.PluginName; import com.google.gerrit.extensions.events.TopicEditedListener; +import com.google.gerrit.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -45,16 +47,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } 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 a54b3c9..3f639d8 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,10 +20,12 @@ 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.server.AnonymousUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.account.GroupBackend; +import com.google.gerrit.server.account.ProjectWatches.NotifyType; import com.google.gerrit.server.config.AllProjectsName; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -53,16 +55,20 @@ AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } protected int getEventType() { @@ -91,11 +97,11 @@ private VoteDeletedInfo toVoteDeletedInfo(Event event) { VoteDeletedInfo info = new VoteDeletedInfo(); - Collection<ApprovalInfo> approvals = event.getRemoved().values(); + Collection<ApprovalInfo> approvals = event.getOldApprovals().values(); int count = approvals.size(); info.votes = new VoteDeletedEntryInfo[count]; for (int i = 0; i < count; i++) - for (ApprovalInfo approval : event.getRemoved().values()) { + for (ApprovalInfo approval : event.getOldApprovals().values()) { info.votes[i] = new VoteDeletedEntryInfo(); info.votes[i].vote = approval.tag + + approval.value; info.votes[i].account = formatAccount(approval);
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java similarity index 66% copy from src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java copy to src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java index eaffee9..9179b1f 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/DraftPublishedEventHandler.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/handlers/WIPStateChangedEventHandler.java
@@ -16,11 +16,13 @@ package com.ruesga.gerrit.plugins.fcm.handlers; import com.google.gerrit.extensions.annotations.PluginName; -import com.google.gerrit.extensions.events.DraftPublishedListener; +import com.google.gerrit.extensions.events.WorkInProgressStateChangedListener; +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.config.AllProjectsName; -import com.google.gerrit.server.account.CapabilityControl; -import com.google.gerrit.server.account.WatchConfig.NotifyType; +import com.google.gerrit.server.project.ProjectCache; import com.google.gerrit.server.query.account.InternalAccountQuery; import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.ChangeQueryProcessor; @@ -30,30 +32,34 @@ import com.ruesga.gerrit.plugins.fcm.rest.CloudNotificationEvents; import com.ruesga.gerrit.plugins.fcm.workers.FcmUploaderWorker; -public class DraftPublishedEventHandler extends EventHandler - implements DraftPublishedListener { +public class WIPStateChangedEventHandler extends EventHandler + implements WorkInProgressStateChangedListener { @Inject - public DraftPublishedEventHandler( + public WIPStateChangedEventHandler( @PluginName String pluginName, FcmUploaderWorker uploader, AllProjectsName allProjectsName, ChangeQueryBuilder cqb, ChangeQueryProcessor cqp, + ProjectCache projectCache, + GroupBackend groupBackend, Provider<InternalAccountQuery> accountQueryProvider, - CapabilityControl.Factory capabilityControlFactory, - GenericFactory identifiedUserFactory) { + GenericFactory identifiedUserFactory, + Provider<AnonymousUser> anonymousProvider) { super(pluginName, uploader, allProjectsName, cqb, cqp, + projectCache, + groupBackend, accountQueryProvider, - capabilityControlFactory, - identifiedUserFactory); + identifiedUserFactory, + anonymousProvider); } protected int getEventType() { - return CloudNotificationEvents.DRAFT_PUBLISHED_EVENT; + return CloudNotificationEvents.WIP_STATE_CHANGED_EVENT; } protected NotifyType getNotifyType() { @@ -61,11 +67,11 @@ } @Override - public void onDraftPublished(Event event) { + public void onWorkInProgressStateChanged(Event event) { Notification notification = createNotification(event); notification.body = formatAccount(event.getWho()) - + " published a draft on this change"; - + + " change state of this change to " + + (safeBoolean(event.getChange().isPrivate) ? "WIP" : "ready"); notify(notification, event); }
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/messaging/Notification.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/messaging/Notification.java index cfe4a92..69a45ba 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/messaging/Notification.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/messaging/Notification.java
@@ -35,7 +35,7 @@ @Override public Object clone() { - Notification other = new Notification(); + Notification other = new Notification(); other.when = when; other.who = who; other.token = token;
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/rest/CloudNotificationEvents.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/rest/CloudNotificationEvents.java index 0aa40b3..4fe7b0e 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/rest/CloudNotificationEvents.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/rest/CloudNotificationEvents.java
@@ -21,7 +21,7 @@ public static final int CHANGE_RESTORED_EVENT = 0x04; public static final int CHANGE_REVERTED_EVENT = 0x08; public static final int COMMENT_ADDED_EVENT = 0x10; - public static final int DRAFT_PUBLISHED_EVENT = 0x20; + // removed => public static final int DRAFT_PUBLISHED_EVENT = 0x20; public static final int HASHTAG_CHANGED_EVENT = 0x40; public static final int REVIEWER_ADDED_EVENT = 0x80; public static final int REVIEWER_DELETED_EVENT = 0x100; @@ -29,4 +29,6 @@ public static final int TOPIC_CHANGED_EVENT = 0x400; public static final int ASSIGNEE_CHANGED_EVENT = 0x800; public static final int VOTE_DELETED_EVENT = 0x1000; + public static final int PRIVATE_STATE_CHANGED_EVENT = 0x2000; + public static final int WIP_STATE_CHANGED_EVENT = 0x4000; }
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/server/DeviceResource.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/server/DeviceResource.java index a6cd2e7..d090140 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/server/DeviceResource.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/server/DeviceResource.java
@@ -26,7 +26,7 @@ private final String device; - public DeviceResource(IdentifiedUser user, String device) { + DeviceResource(IdentifiedUser user, String device) { super(user); this.device = device; }
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/server/TokenResource.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/server/TokenResource.java index 336343f..e91c3b6 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/server/TokenResource.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/server/TokenResource.java
@@ -24,7 +24,7 @@ private final String token; - public TokenResource(DeviceResource rsrc, String token) { + TokenResource(DeviceResource rsrc, String token) { super(rsrc.getUser(), rsrc.getDevice()); this.token = token; }
diff --git a/src/main/java/com/ruesga/gerrit/plugins/fcm/workers/FcmUploaderWorker.java b/src/main/java/com/ruesga/gerrit/plugins/fcm/workers/FcmUploaderWorker.java index b03aa65..ee0b4de 100644 --- a/src/main/java/com/ruesga/gerrit/plugins/fcm/workers/FcmUploaderWorker.java +++ b/src/main/java/com/ruesga/gerrit/plugins/fcm/workers/FcmUploaderWorker.java
@@ -17,7 +17,6 @@ import java.io.BufferedReader; import java.io.DataOutputStream; -import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; @@ -92,12 +91,7 @@ } for (final Integer accountId : notifiedAccounts) { - this.executor.submit(new Runnable() { - @Override - public void run() { - asyncNotify(accountId, notification); - } - }); + this.executor.submit(() -> asyncNotify(accountId, notification)); } } @@ -133,34 +127,20 @@ conn.setRequestProperty( "Content-Length", Integer.toString(data.length())); - DataOutputStream os = new DataOutputStream(conn.getOutputStream()); - try { + try (DataOutputStream os = new DataOutputStream(conn.getOutputStream())) { os.write(data.getBytes()); os.flush(); - } finally { - try { - os.close(); - } catch (IOException ex) { - // Ignore - } } int responseCode = conn.getResponseCode(); if (responseCode == 200) { StringBuilder response = new StringBuilder(); - BufferedReader in = new BufferedReader( - new InputStreamReader(conn.getInputStream())); - try { + try (BufferedReader in = new BufferedReader( + new InputStreamReader(conn.getInputStream()))) { String inputLine; while ((inputLine = in.readLine()) != null) { response.append(inputLine); } - } finally { - try { - in.close(); - } catch (IOException ex) { - // Ignore - } } // Process the server response @@ -280,12 +260,8 @@ log.debug("[%s] Retry fcm notification to %s after %d seconds", pluginName, submit.request.to, retryAfter); } - this.delayedExecutor.schedule(new Runnable() { - @Override - public void run() { - sendNotification(submit); - } - }, retryAfter, TimeUnit.SECONDS); + this.delayedExecutor.schedule(() -> + sendNotification(submit), retryAfter, TimeUnit.SECONDS); } }
diff --git a/src/main/resources/Documentation/api.md b/src/main/resources/Documentation/api.md index d61d4c1..feaf9d2 100644 --- a/src/main/resources/Documentation/api.md +++ b/src/main/resources/Documentation/api.md
@@ -200,7 +200,7 @@ `COMMENT_ADDED_EVENT = 0x08` -`DRAFT_PUBLISHED_EVENT = 0x10` +`DRAFT_PUBLISHED_EVENT = 0x10 (deprecated in 2.15)` `HASHTAG_CHANGED_EVENT = 0x20` @@ -216,6 +216,10 @@ `VOTE_DELETED_EVENT = 0x1000` +`PRIVATE_STATE_CHANGED_EVENT = 0x2000` + +`WIP_STATE_CHANGED_EVENT = 0x4000` + *** **CloudNotificationResponseMode**