package cn.mutils.core.beans;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.mutils.core.IClearable;
/**
* Bean cache of framework
*/
public class BeanCache implements IClearable {
protected Map<String, PropertyMD5> mCache;
protected Object mTarget;
public BeanCache(Object target) {
mTarget = target;
}
public Object getTarget() {
return mTarget;
}
public void setTarget(Object target) {
mTarget = target;
if (mCache != null) {
mCache.clear();
}
}
/**
* Bring object to cache
*
* @return Properties changed
*/
public List<String> fromTarget() {
if (mTarget == null) {
return null;
}
if (mCache == null) {
mCache = new HashMap<String, PropertyMD5>();
}
ArrayList<String> changed = new ArrayList<String>();
for (BeanField f : BeanField.getFields(mTarget.getClass())) {
try {
String name = f.getName();
Object fValue = f.get(mTarget);
ObjectMD5 md5 = new ObjectMD5(fValue);
boolean isChanged = false;
PropertyMD5 propertyMD5 = mCache.get(name);
if (propertyMD5 == null) {
isChanged = true;
propertyMD5 = new PropertyMD5();
mCache.put(name, propertyMD5);
} else {
if (!propertyMD5.isValid()) {
isChanged = true;
} else {
if (!md5.equals(propertyMD5.mMD5)) {
isChanged = true;
}
}
}
if (isChanged) {
propertyMD5.mMD5 = md5;
propertyMD5.mProperty = fValue;
changed.add(name);
}
} catch (Exception e) {
// IllegalAccessException
}
}
return changed.size() != 0 ? changed : null;
}
/**
* Bring cache to target object
*
* @return Properties changed
*/
public List<String> toTarget() {
if (mTarget == null) {
return null;
}
if (mCache == null) {
mCache = new HashMap<String, PropertyMD5>();
}
ArrayList<String> changed = new ArrayList<String>();
for (BeanField f : BeanField.getFields(mTarget.getClass())) {
try {
String name = f.getName();
Object fValue = f.get(mTarget);
ObjectMD5 md5 = new ObjectMD5(fValue);
boolean isChanged = false;
PropertyMD5 propertyMD5 = mCache.get(name);
if (propertyMD5 == null) {
isChanged = true;
} else {
if (!propertyMD5.isValid()) {
isChanged = true;
propertyMD5.mProperty = null;
} else {
if (!md5.equals(propertyMD5.mMD5)) {
isChanged = true;
f.set(mTarget, propertyMD5.mProperty);
}
}
}
if (isChanged) {
changed.add(name);
}
} catch (Exception e) {
// IllegalAccessException
}
}
return changed.size() != 0 ? changed : null;
}
public void clear() {
clear(null);
}
public void clear(List<String> properties) {
if (mCache == null) {
return;
}
if (properties == null) {
mCache.clear();
} else {
for (String s : properties) {
mCache.remove(s);
}
}
}
}