// $HeadURL$ // $Id$ // // Copyright © 2006, 2010, 2011, 2012 by the President and Fellows of Harvard College. // // Screensaver is an open-source project developed by the ICCB-L and NSRB labs // at Harvard Medical School. This software is distributed under the terms of // the GNU General Public License. package edu.harvard.med.screensaver.model.libraries; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.SortedSet; import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.PeekingIterator; import com.google.common.collect.Sets; import edu.harvard.med.screensaver.model.libraries.Library; import edu.harvard.med.screensaver.model.libraries.LibraryScreeningStatus; import edu.harvard.med.screensaver.model.libraries.Plate; import edu.harvard.med.screensaver.model.libraries.PlateStatus; public class PlateRange implements Iterable<Plate> { private SortedSet<Plate> _plates; public static List<PlateRange> splitIntoPlateCopyRanges(SortedSet<Plate> plates) { PeekingIterator<Plate> iter = Iterators.peekingIterator(plates.iterator()); List<PlateRange> plateRanges = Lists.newArrayList();; while (iter.hasNext()) { PlateRange plateRange = PlateRange.findNextPlateRange(iter); plateRanges.add(plateRange); } return plateRanges; } private static PlateRange findNextPlateRange(PeekingIterator<Plate> iter) { SortedSet<Plate> platesScreened = Sets.newTreeSet(); platesScreened.add(iter.next()); while (iter.hasNext()) { Plate next = iter.peek(); Plate last = platesScreened.last(); if (next.getPlateNumber() > last.getPlateNumber() + 1) { break; } else if (!next.getCopy().equals(last.getCopy())) { break; } platesScreened.add(iter.next()); } return new PlateRange(platesScreened); } private PlateRange(SortedSet<Plate> platesScreened) { _plates = platesScreened; } public Plate getStartPlate() { return _plates.first(); } public Plate getEndPlate() { return _plates.last(); } public int getSize() { return _plates.size(); } public SortedSet<Plate> getPlates() { return _plates; } public Iterator<Plate> iterator() { return _plates.iterator(); } public Library getLibrary() { return _plates.first().getCopy().getLibrary(); } public String getAdminLibraryWarning() { List<String> warnings = Lists.newArrayList(); Library library = getLibrary(); if (library.getScreeningStatus() != LibraryScreeningStatus.ALLOWED) { // TODO: do not show warning if Screen.getLibrariesPermitted() contains this library warnings.add("Library status is " + library.getScreeningStatus().getValue()); } Predicate<Plate> plateStatusIsOtherThanAvailable = new Predicate<Plate>() { @Override public boolean apply(Plate p) { return p.getStatus() != PlateStatus.AVAILABLE; } }; Set<Plate> invalidPlates = Sets.newTreeSet(Iterables.filter(_plates, plateStatusIsOtherThanAvailable)); if (!invalidPlates.isEmpty()) { Set<PlateStatus> invalidStatuses = Sets.newTreeSet(Iterables.transform(invalidPlates, Plate.ToStatus)); warnings.add("Plate(s) have invalid status(es): " + Joiner.on(", ").join(invalidStatuses)); } return Joiner.on(". ").join(warnings); } @Override public String toString() { return toString(_plates.first().getPlateNumber(), _plates.last().getPlateNumber()); } public static String toString(Integer firstPlateNumber, Integer lastPlateNumber) { return String.format("[%d..%d]", firstPlateNumber, lastPlateNumber); } }