/* ================================================================== * 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.recycle.maintain; import java.lang.reflect.Method; import java.util.Iterator; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import com.jinhe.tss.component.recycle.RecycleConfig; import com.jinhe.tss.component.recycle.RecycleInterceptor; import com.jinhe.tss.component.recycle.RecycleResource; import com.jinhe.tss.component.recycle.entity.Recycle; import com.jinhe.tss.core.Global; import com.jinhe.tss.core.exception.BusinessException; import com.thoughtworks.xstream.XStream; /** * <p> RecycleService.java </p> * <p> * Recycle的service层,负责处理Recycle相关的业务逻辑 * </p> */ public class RecycleServiceImpl implements RecycleService { @Autowired private RecycleDao recycleDao; public void physicsDelete(Long recycleId) { Recycle recycle = getRecycle(recycleId); // 物理删除前先将回收拦截器在当前线程中关闭,这样删除的时候方可跳过拦截器 RecycleInterceptor.switchTL.set(RecycleInterceptor.SWITCH_CLOSE_TAG); List<?> param = (List<?>)new XStream().fromXML(recycle.getParams()); try { Object[] args = (Object[])param.get(0); Class<?>[] argTypes = (Class<?>[])param.get(1); Object dao = Global.getContext().getBean(recycle.getBeanId()); Method removeMethodInDao = dao.getClass().getMethod(recycle.getMethodName(), argTypes); removeMethodInDao.invoke(dao, args); } catch (Exception e){ throw new BusinessException("物理删除时出错:RecycleService.physicsDelete(Long)", e); } recycleDao.delete(recycle); } public void recover(Long recycleId) { Recycle recycle = getRecycle(recycleId); // 刪除回收記錄 recycleDao.delete(recycle); RecycleResource resource = RecycleConfig.getRecycleSource(recycle.getTypeId()); /* 还原一起被删除的节点(Entity的recycleId一样 说明是同一次删除操作中删除的) */ recycleDao.recoverByRecycleId(recycle.getEntityClass(), recycleId); //判断还原的对象是不是有层次结构的,如果有,则如果它的父节点也已经被删除,则需要将它的父亲节点一并还原(递归往上) if ( resource.isMultiLayer() ) { recoverParentNode(recycle.getEntityClass(), recycle.getNodeId()); } } /** * 还原父结点。 * 取出所有的父节点,遍历,如有打删除标记的则将其还原。 * * @param tableName * @param nodeId */ private void recoverParentNode(String tableName, Long nodeId) { List<?> list = recycleDao.getParentNodes(tableName, nodeId); if (list == null) return; for(Iterator<?> it = list.iterator();it.hasNext();){ Object obj[] = (Object[]) it.next(); Long parentNodeId = (Long) obj[0]; Integer deleted = (Integer) obj[1]; if ( Recycle.TRUE.equals(deleted) ) { recycleDao.recoverParent(tableName, parentNodeId); } } } public List<?> getRecyledList(Integer typeId) { return recycleDao.getRecycleList(typeId); } public void clearAll(Integer typeId) { List<?> list = recycleDao.getRecycleList(typeId); for (Iterator<?> iter = list.iterator(); iter.hasNext();) { Recycle recycle = (Recycle) iter.next(); physicsDelete(recycle.getId()); } } private Recycle getRecycle(Long recycleId){ Recycle recycle = (Recycle) recycleDao.getEntity(Recycle.class, recycleId); if(recycle == null) { throw new BusinessException("回收站中没有要还原数据的信息,请刷新页面确认是否已经还原!"); } return recycle; } }