package pl.edu.icm.saos.importer.commoncourt.judgment.remove;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.common.collect.Lists;
import pl.edu.icm.saos.importer.commoncourt.judgment.SourceCcjExternalRepository;
import pl.edu.icm.saos.persistence.model.SourceCode;
import pl.edu.icm.saos.persistence.repository.JudgmentRepository;
/**
* Finder of common court judgments that have been removed
* from the external repository but are still present in the
* saos repository.
*
* @author madryk
*/
@Service
public class CcRemovedJudgmentsFinder {
private final static Logger log = LoggerFactory.getLogger(CcRemovedJudgmentsFinder.class);
private int judgmentRepositoryPageSize = 100;
private SourceCcjExternalRepository sourceCcjExternalRepository;
private JudgmentRepository judgmentRepository;
private int externalRepositoryPageSize = 1000;
//------------------------ LOGIC --------------------------
/**
* Returns a list of judgment ids that have been
* removed in the external source repository.
*/
public List<Long> findCcRemovedJudgmentSourceIds() {
log.info("Searching for ccJudgments removed from external repository");
List<Long> removedJudgmentsIds = judgmentRepository.findAllIdsBySourceCode(SourceCode.COMMON_COURT);
int pageNumber = 0;
while(true) {
List<String> judgmentExternalIdsPage = sourceCcjExternalRepository.findJudgmentIds(pageNumber, externalRepositoryPageSize, null);
log.info("Downloaded {} judgment ids from external repository", (pageNumber*externalRepositoryPageSize) + judgmentExternalIdsPage.size());
if (judgmentExternalIdsPage.isEmpty()) {
break;
}
List<Long> judgmentIdsPage = findCorrespondingJudgmentIds(judgmentExternalIdsPage);
removedJudgmentsIds.removeAll(judgmentIdsPage);
++pageNumber;
}
return removedJudgmentsIds;
}
//------------------------ PRIVATE --------------------------
private List<Long> findCorrespondingJudgmentIds(List<String> judgmentExternalIds) {
LinkedList<String> remainingExternalIds = Lists.newLinkedList(judgmentExternalIds);
List<Long> judgmentIds = Lists.newArrayList();
while (!remainingExternalIds.isEmpty()) {
List<String> externalIdsPage = Lists.newLinkedList();
while(!remainingExternalIds.isEmpty() && externalIdsPage.size() < judgmentRepositoryPageSize) {
externalIdsPage.add(remainingExternalIds.removeFirst());
}
List<Long> judgmentIdsPage = judgmentRepository.findAllIdsBySourceCodeAndSourceJudgmentIds(SourceCode.COMMON_COURT, externalIdsPage);
judgmentIds.addAll(judgmentIdsPage);
}
return judgmentIds;
}
//------------------------ SETTERS --------------------------
@Autowired
public void setSourceCcjExternalRepository(SourceCcjExternalRepository sourceCcjExternalRepository) {
this.sourceCcjExternalRepository = sourceCcjExternalRepository;
}
@Autowired
public void setJudgmentRepository(JudgmentRepository judgmentRepository) {
this.judgmentRepository = judgmentRepository;
}
/**
* Defines how many judgment source ids will be downloaded
* from external repository at one request.
* Default value is 1000. Cannot be greater than 5000.
*/
public void setExternalRepositoryPageSize(int externalRepositoryPageSize) {
this.externalRepositoryPageSize = externalRepositoryPageSize;
}
}