/* ==================================================================
* 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.component.support.persistence.entityaop;
import java.util.List;
import org.aopalliance.intercept.MethodInvocation;
import com.jinhe.tss.component.support.persistence.ITreeSupportDao;
import com.jinhe.tss.core.persistence.IDao;
import com.jinhe.tss.core.persistence.IEntity;
import com.jinhe.tss.core.util.BeanUtil;
/**
* decode值维护拦截器
*/
public class DecodeInfoInterceptor extends MatchByDaoMethodNameInterceptor {
@SuppressWarnings("unchecked")
public Object invoke(MethodInvocation invocation) throws Throwable {
IDao<IEntity> dao = (IDao<IEntity>) invocation.getThis();
Object[] args = invocation.getArguments();
if(args == null || !( BeanUtil.isImplInterface(dao.getType(), IDecodable.class)) ) {
return invocation.proceed();
}
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof IDecodable) {
String methodName = invocation.getMethod().getName();
IDecodable entity = (IDecodable) args[i];
switch (judgeManipulateKind(methodName)) {
case SAVE:
case UPDATE:
String oldDecode = entity.getDecode();
((ITreeSupportDao)dao).saveDecodeableEntity(entity);
// 移动时维护(修复)所有子节点的decode值。不包括节点自身
if(methodName.startsWith("move")) {
repairChildrenDecode(entity, oldDecode, dao);
}
break;
}
}
}
return invocation.proceed();
}
/**
* 移动时维护所有子节点的decode值.不包括节点自身
* @param entity
* @param oldDecode
*/
void repairChildrenDecode(IDecodable entity, String oldDecode, IDao<IEntity> dao){
//说明为新增出来的节点,肯定没有子节点,也就没必要维护子节点了
if(oldDecode == null) return;
String newDecode = entity.getDecode();
if(oldDecode.equals(newDecode)) return;
List<?> list = dao.getEntities("from " + entity.getClass().getName() + " o where o.decode like ?", oldDecode + "%" );
DecodeUtil.repairSubNodeDecode(list, oldDecode, newDecode);
dao.flush();
}
}