package org.molgenis.data.jobs;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.meta.SystemEntityType;
import org.molgenis.data.meta.model.EntityType;
import org.molgenis.data.meta.system.SystemEntityTypeRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static java.util.Objects.requireNonNull;
import static org.molgenis.data.jobs.model.JobExecution.Status.FAILED;
import static org.molgenis.data.jobs.model.JobExecution.Status.RUNNING;
import static org.molgenis.data.jobs.model.JobExecutionMetaData.*;
import static org.springframework.util.StringUtils.isEmpty;
/**
* Bootstraps the scheduling framework
*/
@Component
public class JobBootstrapper
{
private final SystemEntityTypeRegistry systemEntityTypeRegistry;
private final DataService dataService;
@Autowired
public JobBootstrapper(SystemEntityTypeRegistry systemEntityTypeRegistry, DataService dataService)
{
this.systemEntityTypeRegistry = requireNonNull(systemEntityTypeRegistry);
this.dataService = requireNonNull(dataService);
}
public void bootstrap()
{
systemEntityTypeRegistry.getSystemEntityTypes().filter(this::isJobExecution).forEach(this::bootstrap);
}
private void bootstrap(SystemEntityType systemEntityType)
{
dataService.query(systemEntityType.getName()).eq(STATUS, RUNNING).or().eq(STATUS, PENDING).findAll()
.forEach(this::setFailed);
}
private void setFailed(Entity jobExecutionEntity)
{
jobExecutionEntity.set(STATUS, FAILED.toString());
jobExecutionEntity.set(PROGRESS_MESSAGE, "Application terminated unexpectedly");
StringBuilder log = new StringBuilder();
if (!isEmpty(jobExecutionEntity.get(LOG)))
{
log.append(jobExecutionEntity.get(LOG));
log.append('\n');
}
log.append("FAILED - Application terminated unexpectedly");
jobExecutionEntity.set(LOG, log.toString());
dataService.update(jobExecutionEntity.getEntityType().getName(), jobExecutionEntity);
}
private boolean isJobExecution(EntityType entityType)
{
return entityType.getExtends() != null && entityType.getExtends().getName().equals(JOB_EXECUTION);
}
}