edu.harvard.med.screensaver.model.libraries.PlateRange.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.med.screensaver.model.libraries.PlateRange.java

Source

// $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);
    }
}