package com.xiaoleilu.hutool.db;

import java.util.Arrays;
import java.util.List;

import com.xiaoleilu.hutool.CollectionUtil;
import com.xiaoleilu.hutool.InjectUtil;
import com.xiaoleilu.hutool.StrUtil;

/**
 * 数据实体对象<br>
 * 数据实体类充当两个角色：<br>
 * 1. 数据的载体，一个Entity对应数据库中的一个row<br>
 * 2. SQL条件，Entity中的每一个字段对应一个条件，字段值对应条件的值
 * @author loolly
 *
 */
public class Entity extends Dict{
	private static final long serialVersionUID = -1951012511464327448L;
	
	//--------------------------------------------------------------- Static method start
	/**
	 * 创建Entity
	 * @param tableName 表名
	 * @return Entity
	 */
	public static Entity create(String tableName) {
		return new Entity(tableName);
	}
	
	/**
	 * 将PO对象转为Entity
	 * @param <T>
	 * @param vo 值对象
	 * @return Entity
	 */
	public static <T> Entity parse(T vo) {
		return create(null).fromVo(vo);
	}
	//--------------------------------------------------------------- Static method end
	
	/*表名*/
	private String tableName;
	/*字段名列表，用于限制加入的字段的值*/
	private List<String> fieldNames;
	
	//--------------------------------------------------------------- Constructor start
	public Entity() {
	}
	
	/**
	 * 构造
	 * @param tableName 数据表名
	 */
	
	public Entity(String tableName) {
		this.tableName = tableName;
	}
	//--------------------------------------------------------------- Constructor end
	
	//--------------------------------------------------------------- Getters and Setters start
	/**
	 * @return 获得表名
	 */
	public String getTableName() {
		return tableName;
	}
	/**
	 * 设置表名
	 * @param tableName 表名
	 * @return 本身
	 */
	public Entity setTableName(String tableName) {
		this.tableName = tableName;
		return this;
	}
	
	/**
	 * 
	 * @return 字段列表
	 */
	public List<String> getFieldNames() {
		return fieldNames;
	}
	/**
	 * 设置字段列表
	 * @param fieldNames 字段列表
	 * @return 自身
	 */
	public Entity setFieldNames(List<String> fieldNames) {
		this.fieldNames = fieldNames;
		return this;
	}
	
	/**
	 * 设置字段列表
	 * @param fieldNames 字段列表
	 * @return 自身
	 */
	public Entity setFieldNames(String... fieldNames) {
		this.fieldNames = Arrays.asList(fieldNames);
		return this;
	}
	
	/**
	 * 添加字段列表
	 * @param fieldNames 字段列表
	 * @return 自身
	 */
	public Entity addFieldNames(String... fieldNames) {
		final List<String> fieldList = Arrays.asList(fieldNames);
		if(null == this.fieldNames){
			this.fieldNames = fieldList;
		}else{
			this.fieldNames.addAll(fieldList);
		}
		return this;
	}
	
	//--------------------------------------------------------------- Getters and Setters end
	/**
	 * 将值对象转换为Entity<br>
	 * 类名会被当作表名，小写第一个字母
	 * @param <T>
	 * @param vo 值对象
	 * @return 自己
	 */
	@Override
	public <T> Entity fromVo(T vo) {
		String tableName = vo.getClass().getSimpleName();
		tableName = StrUtil.lowerFirst(tableName);
		this.setTableName(tableName);
		
		this.putAll(InjectUtil.toMap(vo, false));
		return this;
	}
	
	//-------------------------------------------------------------------- 特定类型值
	/**
	 * 设置列
	 * @param attr 属性
	 * @param value 值
	 * @return 本身
	 */
	@Override
	public Entity set(String attr, Object value) {
		if(CollectionUtil.isEmpty(fieldNames) || fieldNames.contains(attr)){
			this.put(attr, value);
		}
		return this;
	}
	//-------------------------------------------------------------------- 特定类型值
	@Override
	public Entity clone() {
		return (Entity) super.clone();
	}
	//-------------------------------------------------------------------- 特定类型值
	
	@Override
	public String toString() {
		return "Entity {tableName=" + tableName + ", fieldNames=" + fieldNames + ", fields=" + super.toString() + "}";
	}
}

@@ -124,48 +124,8 @@
 il;%0A
-import com.xiaoleilu.hutool.InjectUtil;%0A
 impo
@@ -2754,63 +2754,40 @@
 %09%0A%09%09
-this.putAll(InjectUtil.toMap(vo, false));%0A%09%09return this
+return (Entity) super.fromVo(vo)
 ;%0A%09%7D
@@ -2871,79 +2871,8 @@
 %E7%B1%BB%E5%9E%8B%E5%80%BC%0A
-%09/**%0A%09 * %E8%AE%BE%E7%BD%AE%E5%88%97%0A%09 * @param attr %E5%B1%9E%E6%80%A7%0A%09 * @param value %E5%80%BC%0A%09 * @return %E6%9C%AC%E8%BA%AB%0A%09 */%0A
 %09@Ov
@@ -2886,25 +2886,25 @@
 %09public 
-Entity se
+Object pu
 t(String
@@ -2904,20 +2904,19 @@
 (String 
-attr
+key
 , Object
@@ -2992,59 +2992,307 @@
 ins(
-attr))%7B%0A%09%09%09this.put(attr, value);%0A%09%09%7D%0A%09%09return this
+key))%7B%0A%09%09%09super.put(key, value);%0A%09%09%7D%0A%09%09return super.put(key, value);%0A%09%7D%0A%09%0A%09@Override%0A%09public Entity set(String attr, Object value) %7B%0A%09%09return (Entity) super.set(attr, value);%0A%09%7D%0A%09%0A%09@Override%0A%09public Entity setIgnoreNull(String attr, Object value) %7B%0A%09%09return (Entity) super.setIgnoreNull(attr, value)
 ;%0A%09%7D

Add EntitySetHandler