package com.epam.cisen.processor.watchdog; import java.io.IOException; import java.util.Map; 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.CiReport; import com.epam.cisen.core.api.dto.Constants; @Component @Service(Processor.class) public class StatusWatchdogProcessor extends AbstractProcessor<WatchdogProcessorConfigDTO> { private final static String SUBJECT = "Frozen build detected"; private final static String BODY = "It looks like current build is in progress from an ancient times."; private static final WatchdogProcessorConfigDTO CONFIG = new WatchdogProcessorConfigDTO(); static { CONFIG.setTimeout("Set watchdog interval in minutes"); CONFIG.setDescription("This processor run periodically and check CI on hang up builds."); } @Override protected WatchdogProcessorConfigDTO getPluginTemplateConfig() { return CONFIG; } @Override public void process() { MongoCollection builds = mongoDBService.getCollection(Constants.DB.BUILDS); for (Map.Entry<String, WatchdogProcessorConfigDTO> entry : getJobs().entrySet()) { long boundTime = System.currentTimeMillis() - Integer.parseInt(entry.getValue().getTimeout()) * 60000; String queryToSend = String.format("{jobId:'%s', processed:'false', startTime:{$lt: '%s'}, status: '%s'}", entry.getKey(), boundTime, CiReport.Status.IN_PROGRESS); try { MongoCursor<CiReport> ciReports = builds.find(queryToSend).as(CiReport.class); if (ciReports.count() > 0) { putMessage(entry.getKey(), SUBJECT, BODY); } markReportsAsProcessed(builds, ciReports); ciReports.close(); } catch (IOException e) { e.printStackTrace(); } } } private void markReportsAsProcessed(MongoCollection builds, MongoCursor<CiReport> ciReports) { while (ciReports.hasNext()) { CiReport report = ciReports.next(); report.setProcessed(true); builds.update(String.format("{id:'%s'}", report.getId()), report); } } }