package com.constellio.model.services.batch.state; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.constellio.model.entities.batchprocess.BatchProcess; import com.constellio.model.services.batch.state.BatchProcessProgressionServicesException.BatchProcessProgressionServicesException_OptimisticLocking; public class InMemoryBatchProcessProgressionServices implements BatchProcessProgressionServices { Map<String, List<StoredBatchProcessPart>> batchProcessesParts = new HashMap<>(); private List<StoredBatchProcessPart> getParts(String batchProcessId) { List<StoredBatchProcessPart> parts = batchProcessesParts.get(batchProcessId); if (parts == null) { parts = new ArrayList<>(); batchProcessesParts.put(batchProcessId, parts); } return parts; } @Override public void markNewPartAsStarted(StoredBatchProcessPart part) throws BatchProcessProgressionServicesException_OptimisticLocking { List<StoredBatchProcessPart> parts = getParts(part.getBatchProcessId()); if (parts.size() != part.getIndex()) { throw new BatchProcessProgressionServicesException_OptimisticLocking(part.getIndex()); } parts.add(part); } @Override public void markPartAsFinished(StoredBatchProcessPart part) { List<StoredBatchProcessPart> parts = getParts(part.getBatchProcessId()); parts.set(part.getIndex(), part.whichIsFinished()); } @Override public void markStartedPartsHasInStandby() { for (List<StoredBatchProcessPart> parts : batchProcessesParts.values()) { for (int i = 0; i < parts.size(); i++) { StoredBatchProcessPart part = parts.get(i); if (part.isStarted()) { parts.set(i, part.whichIsInStandby()); } } } } @Override public List<StoredBatchProcessPart> getPartsInStandby(BatchProcess batchProcess) { List<StoredBatchProcessPart> parts = getParts(batchProcess.getId()); List<StoredBatchProcessPart> partsInStandby = new ArrayList<>(); for (StoredBatchProcessPart part : parts) { while (!part.isStarted()) { partsInStandby.add(part); } } return parts; } @Override public StoredBatchProcessPart getLastBatchProcessPart(BatchProcess batchProcess) { List<StoredBatchProcessPart> parts = getParts(batchProcess.getId()); return parts.isEmpty() ? null : parts.get(parts.size() - 1); } }