/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.core.cachepool.proxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.jinhe.tss.core.cachepool.AbstractCacheableKey;
import com.jinhe.tss.core.cachepool.Cacheable;
import com.jinhe.tss.core.cachepool.CacheableKey;
import com.jinhe.tss.core.cachepool.DefaultCacheableKey;
import com.jinhe.tss.core.util.BeanUtil;
/**
* <p> ProxyContainer.java </p>
* <p>
* 对缓存池容器进行动态代理封装,使得容器执行put,get,remove等方法时, <br>
* key 值如果为String或其它非CacheableKey类型,则自动转换为DefaultCacheableKey。<br>
*
* 如果调用的是put方法,则取缓存项的name属性,不为空的话,设置到CacheableKey的getName()中。<br>
* </p>
*
* @author Jon.King 2007-1-9
*/
public class ProxyContainer {
public static Object wrap(Object object) {
Class<?>[] interfaces = ProxyUtil.getInterfaces(object.getClass());
String[] invokeMethods = new String[]{"put", "get", "remove"};
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
interfaces, new BaseInvocationHandler(object, invokeMethods) {
//参考父类,执行invokeMethods包含的方法时,before方法将被触发
protected Object before(Object target, Method method, Object[] args){
if(!(args[0] instanceof CacheableKey)) {
args[0] = new DefaultCacheableKey(args[0].toString());
}
//特殊处理put方法,将value中的name属性值取出作为key的name。
if(method.getName().equals("put")){
final CacheableKey key = (CacheableKey) args[0];
final String name = getCacheItemName((Cacheable) args[1]);
args[0] = new AbstractCacheableKey(){
private static final long serialVersionUID = 213500451687728342L;
public String getKey() {
return key.getKey();
}
public String getName() {
return name;
}
public String getRemark() {
return key.getRemark();
}
};
}
return null;
}
protected void after(Object target, Method method, Object[] args, Object beforeReturnVal){
}
private String getCacheItemName(Cacheable item){
try{
return BeanUtil.getPropertyValue(item.getValue(), "name").toString();
}catch(Exception e){
return null;
}
}
});
}
}