// ALIADA - Automatic publication under Linked Data paradigm // of library and museum data // // Component: aliada-rdfizer // Responsible: ALIADA Consortiums package eu.aliada.rdfizer.pipeline.processors; import java.math.BigDecimal; import java.sql.Timestamp; import org.apache.camel.Exchange; import org.apache.camel.Processor; import org.springframework.beans.factory.annotation.Autowired; import eu.aliada.rdfizer.Constants; import eu.aliada.rdfizer.datasource.Cache; import eu.aliada.rdfizer.datasource.rdbms.JobInstance; import eu.aliada.rdfizer.datasource.rdbms.JobInstanceRepository; import eu.aliada.rdfizer.datasource.rdbms.JobStats; import eu.aliada.rdfizer.datasource.rdbms.JobStatsRepository; import eu.aliada.rdfizer.log.MessageCatalog; import eu.aliada.rdfizer.mx.InMemoryJobResourceRegistry; import eu.aliada.rdfizer.mx.ManagementRegistrar; import eu.aliada.rdfizer.rest.JobResource; import eu.aliada.shared.log.Log; /** * A processor that checks if a given job has been completed. * This step, previously part of the RDF translator, has been implemented in this dedicated processor, * for a better cohesion. * * @author Andrea Gazzarini * @since 2.0 */ public class CheckJobCompleteness implements Processor { private final Log log = new Log(CheckJobCompleteness.class); @Autowired protected Cache cache; @Autowired protected InMemoryJobResourceRegistry jobRegistry; @Autowired protected JobInstanceRepository jobInstanceRepository; @Autowired protected JobStatsRepository jobStatsRepository; @Override public void process(final Exchange exchange) throws Exception { final Integer jobId = exchange.getIn().getHeader(Constants.JOB_ID_ATTRIBUTE_NAME, Integer.class); final JobInstance configuration = cache.getJobInstance(jobId); if (configuration == null) { log.error(MessageCatalog._00038_UNKNOWN_JOB_ID, jobId); throw new IllegalArgumentException(String.valueOf(jobId)); } checkForCompleteness(jobId); } /** * Updates the processed records on the management interface of the given job. * * @param jobId the job identifier. */ void checkForCompleteness(final Integer jobId) { final JobResource job = jobRegistry.getJobResource(jobId); if (job != null && job.isCompleted()) { markJobAsCompleted(job); persistJobStats(job); unregisterJobFromMxSystem(job); removeFromInMemoryCache(job); } } /** * Marks a given job as completed. * * @param job the job. */ void markJobAsCompleted(final JobResource job) { try { final JobInstance instance = cache.getJobInstance(job.getID()); instance.setEndDate(new Timestamp(System.currentTimeMillis())); jobInstanceRepository.save(instance); } catch (Exception ignore) { // Nothing to be done. } finally { log.info(MessageCatalog._00048_JOB_COMPLETED, job.getID()); } } /** * Records the stats of a given (completed) job. * * @param job the job. */ synchronized void persistJobStats(final JobResource job) { final JobStats stats = new JobStats(); stats.setStatusCode(0); stats.setId(job.getID()); stats.setTotalRecordsCount(job.getTotalRecordsCount()); stats.setTotalTriplesProduced(job.getOutputStatementsCount()); stats.setRecordsThroughput( job.getRecordsThroughput() > 0 ? BigDecimal.valueOf(job.getRecordsThroughput()) : BigDecimal.ZERO); stats.setTriplesThroughput( job.getStatementsThroughput() > 0 ? BigDecimal.valueOf(job.getStatementsThroughput()) : BigDecimal.ZERO); if (!jobStatsRepository.exists(stats.getId())) { jobStatsRepository.save(stats); } } /** * Unregisters a job from managemenent (sub)system. * * @param job the job. */ void unregisterJobFromMxSystem(final JobResource job) { ManagementRegistrar.unregister( ManagementRegistrar.createJobObjectName( job.getFormat(), job.getID())); jobRegistry.removeJob(job.getID()); } /** * Removes a job from local in memory cache. * * @param job the job. */ void removeFromInMemoryCache(final JobResource job) { cache.removeJobInstance(job.getID()); } }