com.blue.ssh.core.orm.PropertyFilter.java Source code

Java tutorial

Introduction

Here is the source code for com.blue.ssh.core.orm.PropertyFilter.java

Source

/**
 * Copyright (c) 2005-20010 springside.org.cn
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * 
 * $Id: PropertyFilter.java,v 1.1 2012/03/13 04:05:42 yanchangyong Exp $
 */
package com.blue.ssh.core.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 org.springframework.util.Assert;

import com.blue.ssh.core.utils.reflection.ConvertUtils;
import com.blue.ssh.core.utils.web.ServletUtils;

/**
 * ORM??, ?????.
 * 
 * @author bluegongrui@gmail.com
 */
public class PropertyFilter {

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

    /** . */
    public enum MatchType {
        EQ, LIKE, LT, GT, LE, GE, NE; //eq=equal like=like lt=lowerthan gt=greatthan le=lowerandequal ge=greaterandequal ne=notequal
    }

    /** ?. */
    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, "_");
        Assert.isTrue(StringUtils.isNotBlank(propertyNameStr),
                "filter??" + filterName + ",??.");
        propertyNames = StringUtils.splitByWholeSeparator(propertyNameStr, PropertyFilter.OR_SEPARATOR);

        this.matchValue = ConvertUtils.convertStringToObject(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() {
        Assert.isTrue(propertyNames.length == 1, "There are not only one property in this filter.");
        return propertyNames[0];
    }

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