package jef.database;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import jef.accelerator.bean.BeanAccessor;
import jef.common.wrapper.Page;
import jef.database.meta.ITableMetadata;
import jef.database.meta.MetaHolder;
import jef.database.meta.TableMetadata;
import jef.database.wrapper.ResultIterator;
import jef.tools.Assert;
import org.apache.commons.lang.ObjectUtils;
@SuppressWarnings("serial")
public final class PojoWrapper extends DataObject implements Map<String, Object>, MetadataContainer {
private TableMetadata meta;
private Set<String> names;
private BeanAccessor wrapperAccessor;
private Object entity;
public PojoWrapper(Object entity, BeanAccessor metaAccessor, TableMetadata meta, boolean isQuery) {
this.meta = meta;
this.wrapperAccessor = metaAccessor;
this.entity = entity;
this.names = (Set<String>) metaAccessor.getPropertyNames();
if (isQuery)
fillQueryField();
}
private void fillQueryField() {
for (String s : names) {
Object value = wrapperAccessor.getProperty(entity, s);
if (wrapperAccessor.getPropertyType(s).isPrimitive()) {
if(!isDefaultValueOfPromitiveType(wrapperAccessor.getPropertyType(s),value)){
this.prepareUpdate(meta.getField(s), value);
}
}else{
if (value != null) {
this.prepareUpdate(meta.getField(s), value);
}
}
}
if(!this.needUpdate()){
this.getQuery().setAllRecordsCondition();
}
}
private boolean isDefaultValueOfPromitiveType(Class<?> javaClass, Object value) {
if(value==null)return true;
if (javaClass == Integer.TYPE) {
return value.equals(0);
} else if (javaClass == Short.TYPE) {
return value.equals((short) 0);
} else if (javaClass == Long.TYPE) {
return value.equals( 0L);
} else if (javaClass == Float.TYPE) {
return value.equals(0f);
} else if (javaClass == Double.TYPE) {
return value.equals(0d);
} else if (javaClass == Byte.TYPE) {
return value.equals((byte)0);
} else if (javaClass == Character.TYPE) {
return value.equals((char)0);
} else if (javaClass == Boolean.TYPE) {
return value.equals(false);
}
return false;
}
public Object get(String key) {
super.beforeGet(key);
return wrapperAccessor.getProperty(entity, key);
}
public PojoWrapper set(String key, Object value) {
Field field = meta.getField(key);
if (field != null && _recordUpdate) {
super.prepareUpdate(field, value);
}
wrapperAccessor.setProperty(entity, key, value);
return this;
}
public Object put(String key, Object value) {
Assert.notNull(entity);
Object oldValue = wrapperAccessor.getProperty(entity, key);
set(key, value);
return oldValue;
}
public int size() {
return names.size();
}
public boolean isEmpty() {
return false;
}
public boolean containsKey(Object key) {
return names.contains(key);
}
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
public Object get(Object key) {
return get(String.valueOf(key));
}
public Object remove(Object key) {
return set(String.valueOf(key), null);
}
public void putAll(Map<? extends String, ? extends Object> m) {
throw new UnsupportedOperationException();
}
public void clear() {
throw new UnsupportedOperationException();
}
public Set<String> keySet() {
return names;
}
public Collection<Object> values() {
throw new UnsupportedOperationException();
}
public Set<java.util.Map.Entry<String, Object>> entrySet() {
throw new UnsupportedOperationException();
}
public ITableMetadata getMeta() {
return meta;
}
public Object get() {
return entity;
}
/**
* 将普通类包装为PojoWrapper
* @param list
* @param isq
* @return
*/
public static <T> List<PojoWrapper> wrap(List<T> list,boolean isq){
List<PojoWrapper> result=new ArrayList<PojoWrapper>();
ITableMetadata meta=MetaHolder.getMeta(list.get(0));
for(T t:list){
result.add(meta.transfer(t, isq));
}
return result;
}
/**
* 将PojoWrapper的列表转封装为T类型的列表
* @param wrap
* @return
*/
@SuppressWarnings("unchecked")
public static <T> List<T> unwrapList(List<PojoWrapper> wrap) {
List<T> result = new ArrayList<T>(wrap.size());
for (PojoWrapper w : wrap) {
result.add((T) w.get());
}
return result;
}
/**
* 将PojoWrapper的迭代器转封装为T类型的迭代器
* @param result
* @return
*/
public static <T> ResultIterator<T> unwrapIterator(ResultIterator<PojoWrapper> result) {
return new RIWrapper<T>(result);
}
/**
* 将Wrapper的Page对象转换为真实对象
* @param page
* @return
*/
public static <T> Page<T> unwrapPage(Page<PojoWrapper> page) {
List<T> list=unwrapList(page.getList());
return new Page<T>(page.getTotalCount(),list,page.getPageSize());
};
static class RIWrapper<T> implements ResultIterator<T> {
RIWrapper(ResultIterator<PojoWrapper> inner) {
this.inner = inner;
}
private ResultIterator<PojoWrapper> inner;
public boolean hasNext() {
return inner.hasNext();
}
@SuppressWarnings("unchecked")
public T next() {
return (T) inner.next().get();
}
public void remove() {
inner.remove();
}
public void close(){
inner.close();
}
}
public void refresh() {
PojoWrapper newObj=this.meta.transfer(this.entity, false);
for(Map.Entry<String, Object> entry: newObj.entrySet()){
Object o=this.get(entry.getKey());
Object n=entry.getValue();
if(!ObjectUtils.equals(o, n)){
this.set(entry.getKey(), n);
}
}
}
}