001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.lang3;
018    
019    import java.util.ArrayList;
020    import java.util.Arrays;
021    import java.util.LinkedHashMap;
022    import java.util.List;
023    import java.util.Map;
024    
025    /**
026     * Utility library to provide helper methods for Java enums.
027     * 
028     * <p>#ThreadSafe#</p>
029     * @author Apache Software Foundation
030     * @version $Id: EnumUtils.java 967237 2010-07-23 20:08:57Z mbenson $
031     */
032    public class EnumUtils {
033    
034        /**
035         * This constructor is public to permit tools that require a JavaBean
036         * instance to operate.
037         */
038        public EnumUtils() {
039        }
040    
041        /**
042         * Gets the <code>Map</code> of <code>enums</code> by name.
043         * <p>
044         * This method is useful when you need a map of enums by name.
045         *
046         * @param enumClass  the class of the <code>enum</code> to get, not null
047         * @return the modifiable map of enum names to enums, never null
048         */
049        public static <E extends Enum<E>> Map<String, E> getEnumMap(Class<E> enumClass) {
050            Map<String, E> map = new LinkedHashMap<String, E>();
051            for (E e: enumClass.getEnumConstants()) {
052                map.put(e.name(), e);
053            }
054            return map;
055        }
056    
057        /**
058         * Gets the <code>List</code> of <code>enums</code>.
059         * <p>
060         * This method is useful when you need a list of enums rather than an array.
061         *
062         * @param enumClass  the class of the <code>enum</code> to get, not null
063         * @return the modifiable list of enums, never null
064         */
065        public static <E extends Enum<E>> List<E> getEnumList(Class<E> enumClass) {
066            return new ArrayList<E>(Arrays.asList(enumClass.getEnumConstants()));
067        }
068    
069        /**
070         * Checks if the specified name is a valid <code>enum</code> for the class.
071         * <p>
072         * This method differs from {@link Enum#valueOf} in that checks if the name is
073         * a valid enum without needing to catch the exception.
074         *
075         * @param enumClass  the class of the <code>enum</code> to get, not null
076         * @param enumName   the enum name
077         * @return true if the enum name is valid, otherwise false
078         */
079        public static <E extends Enum<E>> boolean isValidEnum(Class<E> enumClass, String enumName) {
080            try {
081                Enum.valueOf(enumClass, enumName);
082                return true;
083            } catch (IllegalArgumentException ex) {
084                return false;
085            }
086        }
087    
088        /**
089         * Gets the <code>enum</code> for the class, returning <code>null</code> if not found.
090         * <p>
091         * This method differs from {@link Enum#valueOf} in that it does not throw an exception
092         * for an invalid enum name.
093         *
094         * @param enumClass  the class of the <code>enum</code> to get, not null
095         * @param enumName   the enum name
096         * @return the enum or null if not found
097         */
098        public static <E extends Enum<E>> E getEnum(Class<E> enumClass, String enumName) {
099            try {
100                return Enum.valueOf(enumClass, enumName);
101            } catch (IllegalArgumentException ex) {
102                return null;
103            }
104        }
105    
106    }