blob: 148d15a7a9ac755aebb5086b5004413c1275c8c2 [file] [log] [blame]
/*
* Copyright 2017 Cisco Systems, Inc.
*
* 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.cisco.gerrit.plugins.slack;
import com.cisco.gerrit.plugins.slack.client.WebhookClient;
import com.cisco.gerrit.plugins.slack.config.ProjectConfig;
import com.cisco.gerrit.plugins.slack.message.MessageGenerator;
import com.cisco.gerrit.plugins.slack.message.MessageGeneratorFactory;
import com.google.gerrit.extensions.annotations.Listen;
import com.google.gerrit.server.config.AllProjectsName;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.gerrit.server.events.ChangeMergedEvent;
import com.google.gerrit.server.events.CommentAddedEvent;
import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.EventListener;
import com.google.gerrit.server.events.PatchSetCreatedEvent;
import com.google.gerrit.server.events.ReviewerAddedEvent;
import com.google.gerrit.server.events.WorkInProgressStateChangedEvent;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** Listens for Gerrit change events and publishes messages to Slack. */
@Listen
@Singleton
public class PublishEventListener implements EventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(PublishEventListener.class);
private final PluginConfigFactory configFactory;
private final AllProjectsName allProjectsName;
@Inject
PublishEventListener(PluginConfigFactory configFactory, AllProjectsName allProjectsName) {
this.configFactory = configFactory;
this.allProjectsName = allProjectsName;
}
@Override
public void onEvent(Event event) {
try {
ProjectConfig config;
MessageGenerator messageGenerator;
if (event instanceof PatchSetCreatedEvent) {
PatchSetCreatedEvent patchSetCreatedEvent;
patchSetCreatedEvent = (PatchSetCreatedEvent) event;
config = new ProjectConfig(configFactory, patchSetCreatedEvent.change.get().project);
messageGenerator = MessageGeneratorFactory.newInstance(patchSetCreatedEvent, config);
} else if (event instanceof ChangeMergedEvent) {
ChangeMergedEvent changeMergedEvent;
changeMergedEvent = (ChangeMergedEvent) event;
config = new ProjectConfig(configFactory, changeMergedEvent.change.get().project);
messageGenerator = MessageGeneratorFactory.newInstance(changeMergedEvent, config);
} else if (event instanceof CommentAddedEvent) {
CommentAddedEvent commentAddedEvent;
commentAddedEvent = (CommentAddedEvent) event;
config = new ProjectConfig(configFactory, commentAddedEvent.change.get().project);
messageGenerator = MessageGeneratorFactory.newInstance(commentAddedEvent, config);
} else if (event instanceof ReviewerAddedEvent) {
ReviewerAddedEvent reviewerAddedEvent;
reviewerAddedEvent = (ReviewerAddedEvent) event;
config = new ProjectConfig(configFactory, reviewerAddedEvent.change.get().project);
messageGenerator = MessageGeneratorFactory.newInstance(reviewerAddedEvent, config);
} else if (event instanceof WorkInProgressStateChangedEvent) {
WorkInProgressStateChangedEvent wipStateChangedEvent;
wipStateChangedEvent = (WorkInProgressStateChangedEvent) event;
config = new ProjectConfig(configFactory, wipStateChangedEvent.change.get().project);
messageGenerator = MessageGeneratorFactory.newInstance(wipStateChangedEvent, config);
} else {
LOGGER.debug("Event " + event + " not currently supported");
config = new ProjectConfig(configFactory, allProjectsName.get());
messageGenerator = MessageGeneratorFactory.newInstance(event);
}
if (messageGenerator.shouldPublish()) {
WebhookClient client;
client = new WebhookClient(config);
client.publish(messageGenerator.generate(), config.getWebhookUrl());
}
} catch (Throwable e) {
LOGGER.error("Event " + event + " processing failed", e);
}
}
}