diff --git a/app/controllers/Notifications.scala b/app/controllers/Notifications.scala index 92770dd..e6f1dbf 100644 --- a/app/controllers/Notifications.scala +++ b/app/controllers/Notifications.scala @@ -1,5 +1,6 @@ package controllers +import java.util.concurrent.atomic.AtomicBoolean import javax.inject.Inject import com.ysoft.odc.{Absolutizer, SetDiff} @@ -28,6 +29,8 @@ class Notifications @Inject()( private val versions = Map[String, Int]() + private val cronJobIsRunning = new AtomicBoolean() + import secureRequestConversion._ def listProjects() = SecuredAction.async { implicit req => @@ -87,24 +90,33 @@ class Notifications @Inject()( def cron(key: String, purgeCache: Boolean) = Action.async{ if(Crypto.constantTimeEquals(key, config.getString("yssdc.cronKey").get)){ - if(purgeCache){ - projectReportsProvider.purgeCache(Map()) + if(cronJobIsRunning.compareAndSet(/*expect = */false, /*update = */true)){ + // TODO: reduce the opportunity for not releasing the lock and make it clear it can't happen + if(purgeCache){ + projectReportsProvider.purgeCache(Map()) + } + val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions) + ( + for{ + (successfulReports, failedReports) <- resultsFuture + libraries <- librariesService.all + parsedReports = dependencyCheckReportsParser.parseReports(successfulReports) + lds = LibDepStatistics(dependencies = parsedReports.groupedDependencies.toSet, libraries = libraries.toSet) + issuesExportResultFuture = exportToIssueTracker(lds, parsedReports.projectsReportInfo) + mailExportResultFuture = exportToEmail(lds, parsedReports.projectsReportInfo) + (missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture + (missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture + } yield Ok( + missingTickets.mkString("\n")+"\n\n"+newTicketIds.mkString("\n")+ updatedTickets.toString+ + "\n\n" + + missingEmails.mkString("\n")+"\n\n"+newMessageIds.mkString("\n") + updatedEmails.toString + ) + ).andThen{ case _ => + cronJobIsRunning.set(false) + } + }else{ + Fut(ServiceUnavailable("A cron job seems to be running at this time")) } - val (lastRefreshTime, resultsFuture) = projectReportsProvider.resultsForVersions(versions) - for{ - (successfulReports, failedReports) <- resultsFuture - libraries <- librariesService.all - parsedReports = dependencyCheckReportsParser.parseReports(successfulReports) - lds = LibDepStatistics(dependencies = parsedReports.groupedDependencies.toSet, libraries = libraries.toSet) - issuesExportResultFuture = exportToIssueTracker(lds, parsedReports.projectsReportInfo) - mailExportResultFuture = exportToEmail(lds, parsedReports.projectsReportInfo) - (missingTickets, newTicketIds, updatedTickets) <- issuesExportResultFuture - (missingEmails, newMessageIds, updatedEmails) <- mailExportResultFuture - } yield Ok( - missingTickets.mkString("\n")+"\n\n"+newTicketIds.mkString("\n")+ updatedTickets.toString+ - "\n\n" + - missingEmails.mkString("\n")+"\n\n"+newMessageIds.mkString("\n") + updatedEmails.toString - ) }else{ Fut(Unauthorized("unauthorized")) }