package pl.edu.icm.saos.enrichment.hash; import java.util.LinkedList; import java.util.List; import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemStreamException; import org.springframework.batch.item.ItemStreamReader; import org.springframework.batch.item.NonTransientResourceException; import org.springframework.batch.item.ParseException; import org.springframework.batch.item.UnexpectedInputException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import pl.edu.icm.saos.persistence.repository.JudgmentRepository; import com.google.common.collect.Lists; /** * @author madryk */ @Service public class UpdateEnrichmentHashReader implements ItemStreamReader<JudgmentEnrichmentTags> { private JudgmentRepository judgmentRepository; private JudgmentEnrichmentTagsFetcher judgmentEnrichmentTagsFetcher; private int judgmentsEnrichmentTagsPageSize = 5000; private LinkedList<Long> judgmentIds = Lists.newLinkedList(); private LinkedList<JudgmentEnrichmentTags> judgmentsEnrichmentTags = Lists.newLinkedList(); //------------------------ LOGIC -------------------------- @Override public void open(ExecutionContext executionContext) throws ItemStreamException { judgmentIds = Lists.newLinkedList( judgmentRepository.findAllIds()); } @Override public JudgmentEnrichmentTags read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException { JudgmentEnrichmentTags judgmentEnrichmentTags = judgmentsEnrichmentTags.poll(); if (judgmentEnrichmentTags == null && judgmentIds.isEmpty()) { return null; } if (judgmentEnrichmentTags == null) { fetchPageOfJudgmentsEnrichmentTags(); return read(); } return judgmentEnrichmentTags; } @Override public void update(ExecutionContext executionContext) throws ItemStreamException { } @Override public void close() throws ItemStreamException { } //------------------------ PRIVATE -------------------------- private void fetchPageOfJudgmentsEnrichmentTags() { List<Long> judgmentIdsPage = Lists.newLinkedList(); while(!judgmentIds.isEmpty() && judgmentIdsPage.size() < judgmentsEnrichmentTagsPageSize) { judgmentIdsPage.add(judgmentIds.removeFirst()); } judgmentsEnrichmentTags = Lists.newLinkedList( judgmentEnrichmentTagsFetcher.fetchEnrichmentTagsForJudgments(judgmentIdsPage)); } //------------------------ SETTERS -------------------------- @Autowired public void setJudgmentRepository(JudgmentRepository judgmentRepository) { this.judgmentRepository = judgmentRepository; } @Autowired public void setJudgmentEnrichmentTagsFetcher(JudgmentEnrichmentTagsFetcher judgmentsToRecalculateHashFetcher) { this.judgmentEnrichmentTagsFetcher = judgmentsToRecalculateHashFetcher; } @Value("${enrichment.hash.calculate.page.size:5000}") public void setJudgmentsEnrichmentTagsPageSize(int judgmentsEnrichmentTagsPageSize) { this.judgmentsEnrichmentTagsPageSize = judgmentsEnrichmentTagsPageSize; } }