001    /**
002     * Copyright 2005-2014 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.api.document;
017    
018    import javax.xml.bind.annotation.XmlEnum;
019    import javax.xml.bind.annotation.XmlEnumValue;
020    import javax.xml.bind.annotation.XmlRootElement;
021    import javax.xml.bind.annotation.XmlType;
022    
023    import org.kuali.rice.core.api.mo.common.Coded;
024    
025    import java.util.EnumSet;
026    
027    /**
028     * An enumeration representing valid workflow document statuses.
029     * 
030     * @author Kuali Rice Team (rice.collab@kuali.org)
031     *
032     */
033    @XmlRootElement(name = "documentStatus")
034    @XmlType(name = "DocumentStatusType")
035    @XmlEnum
036    public enum DocumentStatus implements Coded {
037    
038            @XmlEnumValue("I") INITIATED("I", DocumentStatusCategory.PENDING),
039            @XmlEnumValue("S") SAVED("S", DocumentStatusCategory.PENDING),
040            @XmlEnumValue("R") ENROUTE("R", DocumentStatusCategory.PENDING),
041        @XmlEnumValue("E") EXCEPTION("E", DocumentStatusCategory.PENDING),
042            @XmlEnumValue("P") PROCESSED("P", DocumentStatusCategory.SUCCESSFUL),
043            @XmlEnumValue("F") FINAL("F", DocumentStatusCategory.SUCCESSFUL),
044            @XmlEnumValue("X") CANCELED("X", DocumentStatusCategory.UNSUCCESSFUL),
045            @XmlEnumValue("D") DISAPPROVED("D", DocumentStatusCategory.UNSUCCESSFUL),
046        /**
047         * When invoked, RECALL & CANCEL action will perform the RECALL and set the route status of the document to the new, terminal status of RECALLED
048         * @since 2.1
049         */
050        @XmlEnumValue("L") RECALLED("L", DocumentStatusCategory.UNSUCCESSFUL);
051    
052            private final String code;
053        private final DocumentStatusCategory category;
054    
055            private DocumentStatus(String code, DocumentStatusCategory category) {
056                    this.code = code;
057            this.category = category;
058            }
059    
060            @Override
061            public String getCode() {
062                    return code;
063            }
064    
065        public DocumentStatusCategory getCategory() {
066            return category;
067        }
068    
069            public String getLabel() {
070                return name();
071            }
072    
073            public static DocumentStatus fromCode(String code) {
074                    if (code == null) {
075                            return null;
076                    }
077                    for (DocumentStatus status : values()) {
078                            if (status.code.equals(code)) {
079                                    return status;
080                            }
081                    }
082                    throw new IllegalArgumentException("Failed to locate the DocumentStatus with the given code: " + code);
083            }
084    
085        public static EnumSet<DocumentStatus> getStatusesForCategory(DocumentStatusCategory category) {
086            if (category == null) {
087                throw new IllegalArgumentException("category was null");
088            }
089            EnumSet<DocumentStatus> categoryStatuses = EnumSet.noneOf(DocumentStatus.class);
090            for (DocumentStatus status : values()) {
091                            if (status.category == category) {
092                                    categoryStatuses.add(status);
093                            }
094                    }
095            return categoryStatuses;
096        }
097    
098    }