package edu.sjtu.infosec.ismp.manager.TM.manager.dao;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.Query;
import org.infosec.ismp.manager.rmi.tm.manager.model.DomainEntity;
import org.springframework.stereotype.Component;
import org.springside.modules.orm.hibernate.HibernateDao;
@Component
public class TopoDomainDao extends HibernateDao<DomainEntity, Integer>{
private static final String QUERY_CASECADE_DOMIN = "select d from Domain d where d.parentDomain =:fDomain";
private static final String DELETE_DOMAINS = "delete from DomainEntity where id in(:ids)";
/**
* 删除域集合
* @param domainEntitys
*/
public void deleteDomains(List<DomainEntity> domainEntitys) {
if(domainEntitys == null) return;
List<Integer> ids = new ArrayList<Integer>();
for(DomainEntity domainEntity:domainEntitys) {
ids.add(domainEntity.getId());
}
Map<String, List<Integer>> map = Collections.singletonMap("ids", ids);
batchExecute(DELETE_DOMAINS,map);
}
/**
* 保存或更新域
* @param domainEntity
*/
public void saveOrUpdateDomain(DomainEntity domainEntity) {
if(getSession() != null) {
if(domainEntity.getParentDomain() != null && domainEntity.getParentDomain().getId() == null) {
domainEntity.setParentDomain(null);
}
getSession().saveOrUpdate(domainEntity);
}
}
/**
* 保存或更新域集合
* @param domainEntitys
*/
public void saveOrUpdateDomains(List<DomainEntity> domainEntitys) {
if(domainEntitys == null) return;
for(DomainEntity domainEntity : domainEntitys) {
saveOrUpdateDomain(domainEntity);
}
}
/**
* 查询域及其子域信息
* @param set
*/
@SuppressWarnings("unchecked")
public List<DomainEntity> getCasecadeDomain(Set<DomainEntity> set) {
if(set!=null&&set.size()!=0){
List result = new ArrayList(set);
// result.addAll();
for(DomainEntity domain:set){
List qr = getDomianByParent(domain,result);
result.addAll(qr);
}
return result;
}
return null;
}
/**
* 递归查询子域信息
* @param domain
* @param result
* @return
*/
@SuppressWarnings("unchecked")
private List<DomainEntity> getDomianByParent(DomainEntity domain,List result){
Query query = createQuery(QUERY_CASECADE_DOMIN);
query.setParameter("fDomain", domain);
List<DomainEntity> pr = distinct(query).list();
if(pr!=null&&pr.size()!=0){
result.addAll(pr);
for(DomainEntity yu:pr){
List<DomainEntity> anore = getDomianByParent(yu,result);
result.addAll(anore);
}
}
return result;
}
}