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

Java tutorial

Introduction

Here is the source code for edu.harvard.med.screensaver.model.libraries.PlateStatus.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.Map;
import java.util.Set;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import edu.harvard.med.screensaver.model.VocabularyTerm;
import edu.harvard.med.screensaver.model.VocabularyUserType;

/**
 * The vocabulary of values for {@link Plate} status.
 * 
 * @author <a mailto="andrew_tolopko@hms.harvard.edu">Andrew Tolopko</a>
 */
public enum PlateStatus implements VocabularyTerm {
    /**
     * Initial plate status of plates upon creation.
     */
    NOT_SPECIFIED("Not specified"),
    /**
     * {@link Plate} has not yet been created (any may never be created), and so is not available for use; implies that
     * plate is not stored at the facility and does not a {@link Plate#getLocation() location}.
     */
    NOT_CREATED("Not created"),
    /**
     * {@link Plate} has been created but is not available for use; implies that plate is stored at the facility at a
     * known {@link Plate#getLocation() location}. A plate that is "Not available" may become available at a later time.
     */
    NOT_AVAILABLE("Not available"),
    /**
     * {@link Plate} is available for use (where "use" is determined by the {@link Plate} {@link Copy}'s
     * {@link CopyUsageType}; implies that plate has been created by the facility and is stored at the facility at a known
     * {@link Plate#getLocation() location}. A plate that is "Available" may become "Not available" at a later time.
     */
    AVAILABLE("Available"),
    /**
     * {@link Plate} should no longer be used (where "use" is determined by the {@link Plate} {@link Copy}'s
     * {@link CopyUsageType}, but the plate is still stored at the facility at a known {@link Plate#getLocation()
     * location}.
     */
    RETIRED("Retired"),
    /**
     * {@link Plate} is no longer available for use as it is no longer stored at the facility; implies plate does not have
     * a {@link Plate#getLocation() location}.
     */
    GIVEN_AWAY("Given Away"),
    /**
     * {@link Plate} is no longer available for use as it has been discarded; implies plate does not have a
     * {@link Plate#getLocation() location}.
     */
    DISCARDED("Discarded"),
    /**
     * {@link Plate} is no longer available for use as it has been discarded, but its remaining reagent volume was first
     * transferred to another another {@link Plate}; implies plate does not have a {@link Plate#getLocation() location}
     */
    VOLUME_TRANSFERRED_AND_DISCARDED("Discarded (volume transferred)"),
    /**
     * The plate is no longer available for use, as its {@link Plate#getLocation() location} is no longer known.
     */
    LOST("Lost");

    private static Set<PlateStatus> allExcept(Set<PlateStatus> invalidPlateStatuses) {
        return Sets.difference(ImmutableSet.of(PlateStatus.values()), invalidPlateStatuses);
    }

    private static Map<PlateStatus, Set<PlateStatus>> Transitions = Maps.newHashMap();
    static {
        Transitions.put(NOT_SPECIFIED, ImmutableSet.of(PlateStatus.values()));
        Transitions.put(NOT_CREATED, allExcept(ImmutableSet.of(NOT_SPECIFIED)));
        Transitions.put(NOT_AVAILABLE, allExcept(ImmutableSet.of(NOT_SPECIFIED, NOT_CREATED)));
        Transitions.put(AVAILABLE, allExcept(ImmutableSet.of(NOT_SPECIFIED, NOT_CREATED)));
        Transitions.put(RETIRED,
                ImmutableSet.of(AVAILABLE, GIVEN_AWAY, DISCARDED, VOLUME_TRANSFERRED_AND_DISCARDED, LOST));
        Transitions.put(GIVEN_AWAY, ImmutableSet.<PlateStatus>of());
        Transitions.put(DISCARDED, ImmutableSet.<PlateStatus>of());
        Transitions.put(VOLUME_TRANSFERRED_AND_DISCARDED, ImmutableSet.<PlateStatus>of());
        Transitions.put(LOST, allExcept(ImmutableSet.of(NOT_SPECIFIED, NOT_CREATED)));
    }

    private static final Set<PlateStatus> InventoriedPlateStatuses = ImmutableSet.of(PlateStatus.NOT_AVAILABLE,
            PlateStatus.AVAILABLE, PlateStatus.RETIRED);

    /**
     * A Hibernate <code>UserType</code> to map the {@link PlateStatus} vocabulary.
     */
    public static class UserType extends VocabularyUserType<PlateStatus> {
        public UserType() {
            super(PlateStatus.values());
        }
    }

    private String _value;

    private PlateStatus(String value) {
        _value = value;
    }

    public String getValue() {
        return _value;
    }

    @Override
    public String toString() {
        return getValue();
    }

    public boolean canTransitionTo(PlateStatus newStatus) {
        return Transitions.get(this).contains(newStatus);
    }

    /**
     * @return true if this plate status implies that a plate is being inventoried (stored), otherwise false, implying
     *         that a plate has no location
     */
    public boolean isInventoried() {
        return InventoriedPlateStatuses.contains(this);
    }
}