package com.norteksoft.product.orm;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;
/**
* 与具体ORM实现无关的属性过滤条件封装类.
*
* PropertyFilter主要记录页面中简单的搜索过滤条件,比Hibernate的Criterion要简单.
*
* TODO:扩展其他对比方式如大于、小于及其他数据类型如数字和日期.
*
*/
public class PropertyFilter {
/**
* 多个属性间OR关系的分隔符.
*/
private 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), F(Float.class), D(Date.class);
PropertyType(Class<?> clazz) {
this.clazz = clazz;
}
private Class<?> clazz;
public Class<?> getValue() {
return clazz;
}
}
private String[] propertyNames = null;
private Class<?> propertyType = null;
private Object propertyValue = null;
private MatchType matchType = MatchType.EQ;
public PropertyFilter() {
}
/**
* @param filterName 比较属性字符串,含待比较的比较类型、属性值类型及属性列表.
* eg LIKES_NAME_OR_LOGIN_NAME
* @param value 待比较的值.
*/
public PropertyFilter(final String filterName, final Object value) {
String matchTypeStr = StringUtils.substringBefore(filterName, "_");
String matchTypeCode = StringUtils.substring(matchTypeStr, 0, matchTypeStr.length() - 1);
String propertyTypeCode = StringUtils.substring(matchTypeStr, matchTypeStr.length() - 1, matchTypeStr.length());
try {
matchType = Enum.valueOf(MatchType.class, matchTypeCode);
} catch (RuntimeException e) {
throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性比较类型.", e);
}
try {
propertyType = Enum.valueOf(PropertyType.class, propertyTypeCode).getValue();
} catch (RuntimeException e) {
throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性值类型.", e);
}
String propertyNameStr = StringUtils.substringAfter(filterName, "_");
propertyNames = StringUtils.split(propertyNameStr, PropertyFilter.OR_SEPARATOR);
Assert.isTrue(propertyNames.length > 0, "filter名称" + filterName + "没有按规则编写,无法得到属性名称.");
this.propertyValue = value;
}
/**
* 是否有多个属性.
*/
public boolean isMultiProperty() {
return (propertyNames.length > 1);
}
/**
* 获取比较属性名称列表.
*/
public String[] getPropertyNames() {
return propertyNames;
}
/**
* 获取唯一的属性名称.
*/
public String getPropertyName() {
if (propertyNames.length > 1)
throw new IllegalArgumentException("There are not only one property");
return propertyNames[0];
}
/**
* 获取比较值.
*/
public Object getPropertyValue() {
return propertyValue;
}
/**
* 获取比较值的类型.
*/
public Class<?> getPropertyType() {
return propertyType;
}
/**
* 获取比较类型.
*/
public MatchType getMatchType() {
return matchType;
}
}