cn.hxh.springside.orm.PropertyFilter.java Source code

Java tutorial

Introduction

Here is the source code for cn.hxh.springside.orm.PropertyFilter.java

Source

/**
 * Copyright (c) 2005-2011 springside.org.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * 
 * $Id: PropertyFilter.java 1627 2011-05-23 16:23:18Z calvinxiu $
 */
package cn.hxh.springside.orm;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import cn.hxh.springside.mapper.ObjectMapper;
import cn.hxh.springside.utils.AssertUtils;
import cn.hxh.springside.utils.web.ServletUtils;

/**
 * ORM??, ?????.
 * 
 * @author calvin
 */
public class PropertyFilter {

    /** OR. */
    public static final String OR_SEPARATOR = "_OR_";

    /** . */
    public enum MatchType {
        EQ, LIKE, LT, GT, LE, GE;
    }

    /** ?. */
    public enum PropertyType {
        S(String.class), I(Integer.class), L(Long.class), N(Double.class), D(Date.class), B(Boolean.class);

        private Class<?> clazz;

        private PropertyType(Class<?> clazz) {
            this.clazz = clazz;
        }

        public Class<?> getValue() {
            return clazz;
        }
    }

    private MatchType matchType = null;
    private Object matchValue = null;

    private Class<?> propertyClass = null;
    private String[] propertyNames = null;

    public PropertyFilter() {
    }

    /**
     * @param filterName ,???. 
     *                   eg. LIKES_NAME_OR_LOGIN_NAME
     * @param value .
     */
    public PropertyFilter(final String filterName, final String value) {

        String firstPart = StringUtils.substringBefore(filterName, "_");
        String matchTypeCode = StringUtils.substring(firstPart, 0, firstPart.length() - 1);
        String propertyTypeCode = StringUtils.substring(firstPart, firstPart.length() - 1, firstPart.length());

        try {
            matchType = Enum.valueOf(MatchType.class, matchTypeCode);
        } catch (RuntimeException e) {
            throw new IllegalArgumentException(
                    "filter??" + filterName + ",.", e);
        }

        try {
            propertyClass = Enum.valueOf(PropertyType.class, propertyTypeCode).getValue();
        } catch (RuntimeException e) {
            throw new IllegalArgumentException(
                    "filter??" + filterName + ",.", e);
        }

        String propertyNameStr = StringUtils.substringAfter(filterName, "_");
        AssertUtils.isTrue(StringUtils.isNotBlank(propertyNameStr),
                "filter??" + filterName + ",??.");
        propertyNames = StringUtils.splitByWholeSeparator(propertyNameStr, PropertyFilter.OR_SEPARATOR);

        this.matchValue = ObjectMapper.convertToObject(value, propertyClass);
    }

    /**
     * HttpRequestPropertyFilter, Filter???filter.
     * 
     * @see #buildFromHttpRequest(HttpServletRequest, String)
     */
    public static List<PropertyFilter> buildFromHttpRequest(final HttpServletRequest request) {
        return buildFromHttpRequest(request, "filter");
    }

    /**
     * HttpRequestPropertyFilter
     * PropertyFilter??Filter?__??.
     * 
     * eg.
     * filter_EQS_name
     * filter_LIKES_name_OR_email
     */
    public static List<PropertyFilter> buildFromHttpRequest(final HttpServletRequest request,
            final String filterPrefix) {
        List<PropertyFilter> filterList = new ArrayList<PropertyFilter>();

        //request??????,?????Map.
        Map<String, Object> filterParamMap = ServletUtils.getParametersStartingWith(request, filterPrefix + "_");

        //??Map,PropertyFilter
        for (Map.Entry<String, Object> entry : filterParamMap.entrySet()) {
            String filterName = entry.getKey();
            String value = (String) entry.getValue();
            //value,filter.
            if (StringUtils.isNotBlank(value)) {
                PropertyFilter filter = new PropertyFilter(filterName, value);
                filterList.add(filter);
            }
        }

        return filterList;
    }

    /**
     * ?.
     */
    public Class<?> getPropertyClass() {
        return propertyClass;
    }

    /**
     * ??.
     */
    public MatchType getMatchType() {
        return matchType;
    }

    /**
     * ?.
     */
    public Object getMatchValue() {
        return matchValue;
    }

    /**
     * ???.
     */
    public String[] getPropertyNames() {
        return propertyNames;
    }

    /**
     * ???.
     */
    public String getPropertyName() {
        AssertUtils.isTrue(propertyNames.length == 1, "There are not only one property in this filter.");
        return propertyNames[0];
    }

    /**
     * ?.
     */
    public boolean hasMultiProperties() {
        return (propertyNames.length > 1);
    }
}