package com.epam.cisen.processor.dailyreport; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; 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 org.slf4j.Logger; import org.slf4j.LoggerFactory; 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; import com.epam.cisen.processor.dailyreport.statistic.DailyStatistic; //import java.time.Duration; //import java.time.LocalDate; @Component @Service(Processor.class) public class DailyReportProcessor extends AbstractProcessor<DailyReportProcessorConfigDTO> { private static final Logger LOGGER = LoggerFactory.getLogger(DailyReportProcessor.class); private static final DailyReportProcessorConfigDTO CONFIG = new DailyReportProcessorConfigDTO(); static { CONFIG.setDescription("This report run once a day and collect information about last twenty-four hours activity on CI."); } @Override protected DailyReportProcessorConfigDTO getPluginTemplateConfig() { return CONFIG; } // private volatile LocalDate lastRun; private volatile boolean disableForDemo = true; @Override public void process() { if (!disableForDemo) { // if (lastRun == null) { // lastRun = LocalDate.now(); // } else { // if (Duration.between(lastRun, LocalDate.now()).toDays() == 0) { // return; // } // } } Map<String, DailyReportProcessorConfigDTO> jobs = getJobs(); MongoCollection collection = mongoDBService.getCollection(Constants.DB.BUILDS); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, -1); long timeInMills = calendar.getTimeInMillis(); for (Map.Entry<String, DailyReportProcessorConfigDTO> entry : jobs.entrySet()) { String query = String.format("{ $and : [" + " {jobId : '%s'}, " + " {startTime : {$gt: %d}}, " + " {processed:false}" + "]}", entry.getKey(), timeInMills); DailyStatistic statistic = new DailyStatistic(); try { MongoCursor<CiReport> dailyReports = collection.find(query).as(CiReport.class); if (dailyReports.count() > 0) { while (dailyReports.hasNext()) { CiReport report = dailyReports.next(); statistic.putReportToStatistic(report); } if (statistic.isNotEmpty()) { generateReport(entry.getKey(), statistic); } dailyReports.close(); collection.update(query).with("{processed:true}"); } } catch (IOException ex) { LOGGER.error("Fail to close db cursor", ex); } } } private void generateReport(String jobId, DailyStatistic statistic) { putMessage(jobId, statistic.getSubject(), statistic.formatReport()); } @Override protected List<DailyReportProcessorConfigDTO> getTestData() { List<DailyReportProcessorConfigDTO> result = new ArrayList<>(); DailyReportProcessorConfigDTO dto = new DailyReportProcessorConfigDTO(); result.add(dto); return result; } }