All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.paoding.rose.jade.statement.expression.util.ExqlUtils Maven / Gradle / Ivy

package net.paoding.rose.jade.statement.expression.util;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;

import net.paoding.rose.jade.statement.expression.ExprResolver;
import net.paoding.rose.jade.statement.expression.ExqlPattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 实现表达式求值时的常用方法。
 * 
 * @author han.liao
 */
public class ExqlUtils {

    // 输出日志
    private static final Log logger = LogFactory.getLog(ExqlPattern.class);

    /**
     * 返回在语句输出的内容。
     * 
     * @param exprResolver - 使用的引擎
     * @param expression - 解释的表达式
     * 
     * @return 输出的内容
     */
    public static Object execExpr(ExprResolver exprResolver, String expression) {

        try {
            // 返回输出的内容
            return exprResolver.executeExpr(expression);

        } catch (Exception e) {

            // 输出日志
            if (logger.isDebugEnabled()) {
                logger.debug("Can't resolving expression: " + expression, e);
            }
        }

        return null;
    }

    /**
     * 检查对象是否有效。
     * 
     * @param obj - 检查的对象
     * 
     * @return true / false
     */
    public static boolean isValid(Object obj) {

        return asBoolean(obj);
    }

    /**
     * 将对象转换成: Boolean 值。
     * 
     * @param obj - 用于转换的对象
     * 
     * @return true / false
     */
    public static boolean asBoolean(Object obj) {

        if (obj == null) {

            return false; // 空值永远表示无效

        } else if (obj instanceof CharSequence) {

            return ((CharSequence) obj).length() > 0; // 字符串类型, 长度 > 0 表示有效

        } else if (obj instanceof Number) {

            return ((Number) obj).doubleValue() > 0; // 数字类型, >= 0 表示有效

        } else if (obj instanceof Boolean) {

            return ((Boolean) obj).booleanValue(); // Boolean 类型, true 表示有效

        } else if (obj instanceof Collection) {

            return ((Collection) obj).size() > 0; // 容器类型, 对象数量 > 0 表示有效

        } else if (obj.getClass().isArray()) {

            return Array.getLength(obj) > 0; // 数组类型, 对象数量 > 0 表示有效
        }

        return true; // 任意对象,引用不为空就判定有效
    }

    /**
     * 将对象转换成: java.lang.Object 数组。
     * 
     * @param obj 用于转换的对象
     * 
     * @return java.lang.Object 数组
     */
    public static Object[] asArray(Object obj) {

        if (obj == null) {

            return new Object[] {}; // 返回空数组

        } else if (obj.getClass().isArray()) {

            Class componentType = obj.getClass().getComponentType();

            // 转换元素为基本类型的数组
            if (componentType.isPrimitive()) {

                final int length = Array.getLength(obj);

                Object[] array = new Object[length];

                for (int index = 0; index < length; index++) {
                    array[index] = Array.get(obj, index);
                }

                return array;
            }

            // 数组直接返回
            return (Object[]) obj;

        } else {

            return new Object[] { obj }; // 其他类型, 返回包含单个对象的数组
        }
    }

    /**
     * 将对象转换成: Collection 集合。
     * 
     * @param obj - 用于转换的对象
     * 
     * @return Collection 集合
     */
    public static Collection asCollection(Object obj) {

        if (obj == null) {

            return Collections.EMPTY_SET; // 返回空集合

        } else if (obj.getClass().isArray()) {

            return Arrays.asList(asArray(obj));

        } else if (obj instanceof Collection) {

            return (Collection) obj; // List, Set, Collection 直接返回

        } else if (obj instanceof Map) {

            return ((Map) obj).entrySet(); // 映射表, 返回条目的集合

        } else {

            return Arrays.asList(obj); // 其他类型, 返回包含单个对象的集合
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy