package org.nutz.dao;
import java.util.HashMap;
import java.util.Map;
import org.nutz.lang.Lang;
import org.nutz.trans.Atom;
/**
* 定制 POJO 的字段过滤配置。
* <p>
* 通过这类,可以指明当前线程的 DAO 操作,哪些对象,的哪些字段会被忽略
* <p>
*
* <pre>
* 调用例子:
* <code>
* @Table("jax_pf_fold")
* public class JaxFold implements Serializable {
* private static final long serialVersionUID = 5990870005316924017L;
* @Column
* @Name
* //字符类型主键,用name来表示
* private String mldh;
* @Column
* private String mlmc;
* @Column
* private String sjmldh;
* @Column
* private Integer sxh;
* @Column
* private String bz;
* }
* </code>
* 例子1,一般表达式
* <code>
* FieldFilter.create(JaxFold.class, "bz|mlmc|mldh").run(new Atom() {
* public void run() {
* nutDao.update(fold);
* }
* });
* </code>
* 执行的sql是:
* UPDATE jax_pf_fold SET sjmldh='235',bz='备注',mlmc='信息打印' WHERE mldh='2353'
* 由于 sjmldh 和 mldh 匹配因此,也会被认定为参与操作的字段.
* <br>
* 例子2,更严格的正则表达式
* <code>
* FieldFilter.create(JaxFold.class, "ˆ(bz|mlmc|mldh)$").run(new Atom() {
* public void run() {
* nutDao.update(fold);
* }
* });
* </code>
* 执行的sql是:
* UPDATE jax_pf_fold SET bz='备注',mlmc='信息打印',sxh=2343 WHERE mldh='2353'
*
* </pre>
*
* @author zozoh(zozohtnt@gmail.com)
*/
public class FieldFilter {
private static ThreadLocal<FieldFilter> FF = new ThreadLocal<FieldFilter>();
/**
* 创建一个过滤器
*
* @param type
* POJO 类型
* @param locked
* 正则表达式,哪些字段会被忽略,语法请参看 Pattern 类的 JavaDoc
* @return 字段过滤器
*/
public static FieldFilter locked(Class<?> type, String locked) {
return create(type, null, locked, true);
}
/**
* 创建一个过滤器
*
* @param type
* POJO 类型
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 字段过滤器
*/
public static FieldFilter create(Class<?> type, boolean ignoreNull) {
return create(type, null, null, ignoreNull);
}
/**
* 创建一个默认不忽略 NULL 值字段的过滤器
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @return 字段过滤器
*
* @see java.util.regex.Pattern
*/
public static FieldFilter create(Class<?> type, String actived) {
return create(type, actived, null, false);
}
/**
* 创建一个过滤器
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 字段过滤器
*
* @see java.util.regex.Pattern
*/
public static FieldFilter create(Class<?> type, String actived, boolean ignoreNull) {
return create(type, actived, null, ignoreNull);
}
/**
* 创建一个过滤器
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @param locked
* 正则表达式,哪些字段会被忽略,语法请参看 Pattern 类的 JavaDoc
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 字段过滤器
*
* @see java.util.regex.Pattern
*/
public static FieldFilter create( Class<?> type,
String actived,
String locked,
boolean ignoreNull) {
return create(type, FieldMatcher.make(actived, locked, ignoreNull));
}
/**
* 创建一个过滤器
*
* @param type
* POJO 类型
* @param mathcer
* 字段匹配器
* @return 字段过滤器
*/
public static FieldFilter create(Class<?> type, FieldMatcher mathcer) {
FieldFilter ff = new FieldFilter();
ff.set(type, mathcer);
return ff;
}
private FieldFilter() {
map = new HashMap<Class<?>, FieldMatcher>();
}
private Map<Class<?>, FieldMatcher> map;
/**
* 为自身增加一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 自身
*/
public FieldFilter set(Class<?> type, boolean ignoreNull) {
map.put(type, FieldMatcher.make(null, null, ignoreNull));
return this;
}
/**
* 为自身增加一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @return 自身
*/
public FieldFilter set(Class<?> type, String actived) {
map.put(type, FieldMatcher.make(actived, null, false));
return this;
}
/**
* 为自身增加一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 自身
*/
public FieldFilter set(Class<?> type, String actived, boolean ignoreNull) {
map.put(type, FieldMatcher.make(actived, null, ignoreNull));
return this;
}
/**
* 为自身增加一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @param actived
* 正则表达式,哪些字段会被操作,语法请参看 Pattern 类的 JavaDoc
* @param locked
* 正则表达式,哪些字段会被忽略,语法请参看 Pattern 类的 JavaDoc
* @param ignoreNull
* 是否忽略 NULL 值字段
* @return 自身
*/
public FieldFilter set(Class<?> type, String actived, String locked, boolean ignoreNull) {
map.put(type, FieldMatcher.make(actived, locked, ignoreNull));
return this;
}
/**
* 为自身增加一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @param matcher
* 字段匹配器
* @return 自身
*/
public FieldFilter set(Class<?> type, FieldMatcher matcher) {
map.put(type, matcher);
return this;
}
/**
* 移除一个 POJO 的字段过滤设置
*
* @param type
* POJO 类型
* @return 自身
*/
public FieldFilter remove(Class<?> type) {
map.remove(type);
return this;
}
/**
* 根据 POJO 的类型,从 ThreadLocal 中获取字段过滤器
*
* @param type
* POJO 的类型
* @return 字段过滤器
*/
public static FieldMatcher get(Class<?> type) {
FieldFilter ff = FF.get();
if (null == ff)
return null;
return ff.map.get(type);
}
/**
* @return 内部的文件类型与过滤器的映射表
*/
public Map<Class<?>, FieldMatcher> map() {
return map;
}
/**
* 运行模板函数
*
* @param atom
* 运行原子
*/
public void run(Atom atom) {
FF.set(this);
try {
atom.run();
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
finally {
FF.remove();
}
}
}