com.feilong.commons.core.lang.EnumUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.feilong.commons.core.lang.EnumUtil.java

Source

/*
 * Copyright (C) 2008 feilong (venusdrogon@163.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.feilong.commons.core.lang;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.feilong.commons.core.bean.BeanUtilException;
import com.feilong.commons.core.bean.PropertyUtil;
import com.feilong.commons.core.net.HttpMethodType;
import com.feilong.commons.core.tools.json.JsonUtil;
import com.feilong.commons.core.util.Validator;

/**
 * enum.
 * 
 * @author <a href="mailto:venusdrogon@163.com">feilong</a>
 * @version 1.0.6 201458 ?3:30:51
 * @version 1.0.8 2014-7-22 13:43 add {@link EnumUtil#getEnumByPropertyValueIgnoreCase(Class, String, Object)}
 * @see org.apache.commons.lang.enums.EnumUtils
 * @see org.apache.commons.lang3.EnumUtils
 * @since 1.0.6
 */
public final class EnumUtil {

    /** The Constant log. */
    private static final Logger log = LoggerFactory.getLogger(EnumUtil.class);

    /** Don't let anyone instantiate this class. */
    private EnumUtil() {
        //AssertionError?. ?????. ???.
        //see Effective Java 2nd
        throw new AssertionError("No " + getClass().getName() + " instances for you!");
    }

    /**
     * fieldName value(?) (equalsIgnoreCase)<br>
     * 
     * <pre>
     * 
     * ?{@link HttpMethodType} ,?:
     * 
     * {@code
     *    EnumUtil.getEnumByField(HttpMethodType.class, "method", "get")
     * }
     * </pre>
     *
     * @param <E>
     *            the element type
     * @param <T>
     *            the generic type
     * @param enumClass
     *            the enum class  {@link HttpMethodType}
     * @param propertyName
     *            ??, {@link HttpMethodType}method,javabean 
     * @param value
     *             post
     * @return  enum constant
     * @throws IllegalArgumentException
     *             if Validator.isNullOrEmpty(enumClass) or Validator.isNullOrEmpty(propertyName)
     * @throws NoSuchFieldException
     *             ??
     * @throws BeanUtilException
     *             the bean util exception
     */
    public static <E extends Enum<?>, T> E getEnumByPropertyValueIgnoreCase(Class<E> enumClass, String propertyName,
            T value) throws IllegalArgumentException, NoSuchFieldException, BeanUtilException {
        boolean ignoreCase = true;
        return getEnumByPropertyValue(enumClass, propertyName, value, ignoreCase);
    }

    /**
     * fieldName value (equals)<br>
     * 
     * <pre>
     * 
     * ?{@link HttpMethodType} ,?:
     * 
     * {@code
     *    EnumUtil.getEnumByField(HttpMethodType.class, "method", "get")
     * }
     * </pre>
     *
     * @param <E>
     *            the element type
     * @param <T>
     *            the generic type
     * @param enumClass
     *            the enum class  {@link HttpMethodType}
     * @param propertyName
     *            ??, {@link HttpMethodType}method,javabean 
     * @param value
     *             post
     * @return  enum constant
     * @throws IllegalArgumentException
     *             if Validator.isNullOrEmpty(enumClass) or Validator.isNullOrEmpty(propertyName)
     * @throws NoSuchFieldException
     *             ??
     * @throws BeanUtilException
     *             the bean util exception
     * @since 1.0.8
     */
    public static <E extends Enum<?>, T> E getEnumByPropertyValue(Class<E> enumClass, String propertyName, T value)
            throws IllegalArgumentException, NoSuchFieldException, BeanUtilException {
        boolean ignoreCase = false;
        return getEnumByPropertyValue(enumClass, propertyName, value, ignoreCase);
    }

    /**
     * fieldName value <br>
     * 
     * <pre>
     * 
     * ?{@link HttpMethodType} ,?:
     * 
     * {@code
     *    EnumUtil.getEnumByField(HttpMethodType.class, "method", "get")
     * }
     * </pre>
     *
     * @param <E>
     *            the element type
     * @param <T>
     *            the generic type
     * @param enumClass
     *            the enum class  {@link HttpMethodType}
     * @param propertyName
     *            ??, {@link HttpMethodType}method,javabean 
     * @param value
     *             post
     * @param ignoreCase
     *            ??
     * @return  enum constant
     * @throws IllegalArgumentException
     *             if Validator.isNullOrEmpty(enumClass) or Validator.isNullOrEmpty(propertyName)
     * @throws NoSuchFieldException
     *             ??
     * @throws BeanUtilException
     *             the bean util exception
     * @see com.feilong.commons.core.bean.BeanUtil#getProperty(Object, String)
     * @since 1.0.8
     */
    private static <E extends Enum<?>, T> E getEnumByPropertyValue(Class<E> enumClass, String propertyName, T value,
            boolean ignoreCase) throws IllegalArgumentException, NoSuchFieldException, BeanUtilException {

        if (Validator.isNullOrEmpty(enumClass)) {
            throw new IllegalArgumentException("enumClass is null or empty!");
        }

        if (Validator.isNullOrEmpty(propertyName)) {
            throw new IllegalArgumentException("the fieldName is null or empty!");
        }

        // An enum is a kind of class
        // and an annotation is a kind of interface
        //  Class ? null.
        E[] enumConstants = enumClass.getEnumConstants();

        for (E e : enumConstants) {
            if (log.isDebugEnabled()) {
                log.debug("e:{}", JsonUtil.format(e));
            }

            Object propertyValue = PropertyUtil.getProperty(e, propertyName);

            if (null == propertyValue && null == value) {
                return e;
            }
            if (null != propertyValue && null != value) {
                if (ignoreCase && propertyValue.toString().equalsIgnoreCase(value.toString())) {
                    return e;
                } else if (propertyValue.equals(value)) {
                    return e;
                }
            }
        }

        throw new NoSuchFieldException("can not found the enum constants,enumClass:[" + enumClass
                + "],propertyName:[" + propertyName + "],value:[" + value + "],ignoreCase:[" + ignoreCase + "]");
    }
}