package de.vanitasvitae.imi.codes; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import de.vanitasvitae.imi.codes.input.InvalidOptionException; import de.vanitasvitae.imi.codes.persistence.FileRepository; import de.vanitasvitae.imi.codes.types.SampleTubeCode; import de.vanitasvitae.imi.codes.types.SampleType; import de.vanitasvitae.imi.codes.types.StudyNumber; public class CodeGenerator { private final FileRepository repository = new FileRepository(new File(".imicodes")); public CodeGenerator() { } public List generateCodes(StudyNumber studyNumber, SampleType sampleType, int numberOfCodes) throws InvalidOptionException, IOException { List codes = new ArrayList<>(); // Read the next sample code from file int nextSampleCode = repository.nextSampleCode(studyNumber); int nextTotal = nextSampleCode + numberOfCodes; // Check, if we'd have an overflow of sample numbers // We check like this to prevent integer overflows if (nextSampleCode > 9999 || numberOfCodes > 9999 || nextTotal - 1 > 9999) { throw new InvalidOptionException("Study " + studyNumber + "would have too many sample tubes" + " (" + (nextTotal - 1) + "). Aborting."); } // Write back the number of the next sample number that should be generated next time repository.writeNextSampleCode(studyNumber, nextSampleCode + numberOfCodes); // Generate codes for (int i = 0; i < numberOfCodes; i++) { codes.add(new SampleTubeCode(studyNumber, sampleType, nextSampleCode + i)); } return codes; } }