package com.epam.cisen.processor.statuschanged; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.jongo.MongoCollection; import org.jongo.MongoCursor; import com.epam.cisen.core.api.AbstractProcessor; import com.epam.cisen.core.api.Processor; import com.epam.cisen.core.api.dto.CIInitializer; import com.epam.cisen.core.api.dto.CiReport; import com.epam.cisen.core.api.dto.Constants; @Component @Service(Processor.class) public class StatusChangedProcessor extends AbstractProcessor<StatusChangedProcessorConfigDTO> { private static final StatusChangedProcessorConfigDTO CONFIG = new StatusChangedProcessorConfigDTO(); static { CONFIG.setFromFailToFail(true); CONFIG.setFromFailToGreen(true); CONFIG.setFromGreenToFail(true); CONFIG.setDescription("This reporter send message every time when CI status changed."); } @Override protected StatusChangedProcessorConfigDTO getPluginTemplateConfig() { return CONFIG; } @Override public void process() { Map<String, StatusChangedProcessorConfigDTO> jobs = getJobs(); MongoCollection collection = mongoDBService.getCollection(Constants.DB.BUILDS); for (Map.Entry<String, StatusChangedProcessorConfigDTO> entry : jobs.entrySet()) { String toSendQuery = "{jobId:'" + entry.getKey() + "', processed:'false'}"; try { MongoCursor<CiReport> ciReports = collection.find(toSendQuery).as(CiReport.class); int count = ciReports.count(); CiReport firstReport = null; for (int i = 0; i < count - 1; i++) { CiReport report = ciReports.next(); if (firstReport == null) { firstReport = report; } report.setProcessed(true); collection.update("{id:'" + report.getId() + "'}", report); } if (ciReports.hasNext()) { CiReport lastReport = ciReports.next(); CiReport.Status firstStatus = firstReport.getStatus(); generateMessage(entry.getKey(), entry.getValue(), firstStatus, lastReport); } ciReports.close(); } catch (IOException e) { e.printStackTrace(); } } } private void generateMessage(String jobId, StatusChangedProcessorConfigDTO config, CiReport.Status firstStatus, CiReport lastReport) { CiReport.Status lastStatus = lastReport.getStatus(); if (lastStatus.inProgress()) { return; } if (firstStatus.isSuccess() && lastStatus.isSuccess()) { return; } String users = collectUsers(lastReport); if (config.fromGreenToFail && firstStatus.isSuccess()) { String message = String.format("(rain) - build #%s was FAILURE after push of %s", lastReport.getBuildNumber(), users); putMessage(jobId, "Build failed", message); } else if (config.fromFailToGreen && lastStatus.isSuccess()) { String message = String.format("(sun)- build #%s was SUCCESS special thanks to %s", lastReport.getBuildNumber(), users); putMessage(jobId, "Build green", message); } else if (config.fromFailToFail && !firstStatus.isSuccess() && !lastStatus.isSuccess()) { String message = String.format("(tumbleweed) - sorry, but build #%s still FAILURE after push of %s", lastReport.getBuildNumber(), users); putMessage(jobId, "Build still failed", message); } } private String collectUsers(CiReport lastReport) { List<String> users = new ArrayList<>(); for (CIInitializer user : lastReport.getInitializers()) { users.add(user.getUserId()); } return StringUtils.join(users, ", "); } }