package edu.sjtu.infosec.ismp.manager.RAM.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.RAM.dao.DynaLeakThreDao;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoAsse;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseInfoProj;
import edu.sjtu.infosec.ismp.manager.RAM.model.AsseKnowDynaLeakThre;
import edu.sjtu.infosec.ismp.manager.comm.model.page.Page;
/**
* 数据层 动态资产漏洞威胁分析Dao实现类.
*
**/
public class DynaLeakThreDaoImpl extends HibernateDaoSupport implements DynaLeakThreDao {
/**
* 批量保存/更新动态资产漏洞威胁
*
* @param dynaLeakThreList
* 动态资产漏洞列表
**/
@SuppressWarnings("unchecked")
public void batchSaveOrUpdate(final List<AsseKnowDynaLeakThre> dynaLeakThreList) {
getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException,SQLException {
for(int i=0;i<dynaLeakThreList.size();i++) {
AsseKnowDynaLeakThre dynaLeakThre = (AsseKnowDynaLeakThre) dynaLeakThreList.get(i);
session.saveOrUpdate(dynaLeakThre);
System.out.println("batch saved dynaLeakThre:"+dynaLeakThre.toString());
if((i+1)%20 == 0){
session.flush();
session.clear();
}
}
return null;
}
});
}
/**
* 检查是否已存在该资产漏洞威胁
* @param asseInfoProjId
* 测评项目Id
* @param asseInfoAsse
* 关联资产
* @param asseKnowStatCveThreId
* 静态威胁Id
* @return 是否已存在
**/
public boolean checkExitDynaLeakThre(Integer asseInfoProjId,
AsseInfoAsse asseInfoAsse, Integer asseKnowStatCveThreId) {
boolean ret = false;
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class)
.addOrder(Order.asc("id"));
if(asseInfoProjId!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProjId));
}
if(asseInfoAsse!=null) {
criteria.add(Expression.eq("asse", asseInfoAsse));
}
if(asseKnowStatCveThreId!=null && !"".equals(asseKnowStatCveThreId)) {
criteria.add(Expression.eq("asseKnowStatCveThreId", asseKnowStatCveThreId));
}
List list = criteria.list();
if(list!=null && list.size()>0) {
ret = true;
}
return ret;
}
/**
* 查询动态资产漏洞威胁
*
* @param id
* 动态资产漏洞威胁id
* @return 动态资产漏洞威胁对象
**/
public AsseKnowDynaLeakThre find(Integer id) {
AsseKnowDynaLeakThre leakThre = null;
List list = this.getHibernateTemplate().find("from AsseKnowDynaLeakThre where id="+id);
if(list!=null&&list.size()>0){
leakThre=(AsseKnowDynaLeakThre) list.get(0);
}
return leakThre;
}
/**
* 查询动态资产漏洞威胁数量
* @param asseInfoProj
* 测评项目
* @param asseInfoAsse
* 资产
* @return 动态资产漏洞数量
**/
public int getCount(AsseInfoProj asseInfoProj, List<AsseInfoAsse> asseInfoAsse) {
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class)
.addOrder(Order.asc("id"));
if(asseInfoProj!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProj.getId()));
}
if(asseInfoAsse!=null) {
criteria.add(Expression.in("asse", asseInfoAsse));
}
return criteria.list().size();
}
/**
* 查询动态资产漏洞威胁记录
* @param asseInfoProj
* 测评项目
* @return 漏洞记录列表
**/
public List<AsseKnowDynaLeakThre> listDynaLeakThre(AsseInfoProj asseInfoProj) {
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class)
.addOrder(Order.asc("id"));
if(asseInfoProj!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProj.getId()));
}
return criteria.list();
}
/**
* 保存/更新动态资产漏洞威胁
*
* @param dynaLeakThre
* 动态资产漏洞威胁
**/
public void saveOrUpdate(AsseKnowDynaLeakThre dynaLeakThre) {
getHibernateTemplate().saveOrUpdate(dynaLeakThre);
}
/**
* 查询可能性为高的动态漏洞威胁数目
* @param asseInfoProjId
* 测评项目Id
* @return 可能性为高的动态漏洞威胁数目
*/
public Long statHighPossDynaLeakThre(Integer asseInfoProjId) {
Long count = new Long(0);
List list = getHibernateTemplate().find("select COUNT(possibility) " +
"from AsseKnowDynaLeakThre " +
"where possibility='H' and asseInfoProjId=?",asseInfoProjId);
if(list!=null && list.size()>0) {
count = (Long) list.get(0);
}
return count;
}
/**
* 查询可能性为中的动态漏洞威胁数目
* @param asseInfoProjId
* 测评项目Id
* @return 可能性为中的动态漏洞威胁数目
*/
public Long statMiddPossDynaLeakThre(Integer asseInfoProjId) {
Long count = new Long(0);
List list = getHibernateTemplate().find("select COUNT(possibility) " +
"from AsseKnowDynaLeakThre " +
"where possibility='M' and asseInfoProjId=?",asseInfoProjId);
if(list!=null && list.size()>0) {
count = (Long) list.get(0);
}
return count;
}
/**
* 查询可能性为低的动态漏洞威胁点数目
* @param asseInfoProjId
* 测评项目Id
* @return 可能性为低的动态漏洞威胁数目
*/
public Long statLowPossDynaLeakThre(Integer asseInfoProjId) {
Long count = new Long(0);
List list = getHibernateTemplate().find("select COUNT(possibility) " +
"from AsseKnowDynaLeakThre " +
"where possibility='L' and asseInfoProjId=?",asseInfoProjId);
if(list!=null && list.size()>0) {
count = (Long) list.get(0);
}
return count;
}
/**
* 不同可能性等级的漏洞威胁数量统计
* @param asseInfoProj
* 测评项目
* @param asseInfoAsse
* 资产
* @param possibility
* 严重级别
* @return 不同可能性等级的漏洞威胁数量
*/
public Integer statAsseDynaLeakThreNum(AsseInfoProj asseInfoProj, AsseInfoAsse asseInfoAsse, String possibility) {
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class);
if(asseInfoProj!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProj.getId()));
}
if(asseInfoAsse!=null) {
criteria.add(Expression.eq("asse", asseInfoAsse));
}
if(possibility!=null) {
criteria.add(Expression.eq("possibility", possibility));
}
Integer total = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
return total;
}
@SuppressWarnings({ "unchecked", "deprecation" })
public List<AsseKnowDynaLeakThre> listDynaLeakThrePage(int startResult1,
int maxResult1, AsseInfoProj asseInfoProj,List<AsseInfoAsse> asseInfo) {
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class)
.addOrder(Order.asc("id"))
.setFirstResult(startResult1)
.setMaxResults(maxResult1);
if(asseInfoProj!=null) {
criteria.add(Expression.eq("asseInfoProjId", asseInfoProj.getId()));
}
if(asseInfo!=null) {
criteria.add(Expression.in("asse", asseInfo));
}
return criteria.list();
}
@SuppressWarnings("unchecked")
public List<AsseKnowDynaLeakThre> listByDynaLeakId(int dynaLeakId) {
Criteria criteria = getSession().createCriteria(AsseKnowDynaLeakThre.class)
.addOrder(Order.asc("id"));
if(dynaLeakId>0&&!"".equals(dynaLeakId)) {
criteria.add(Expression.eq("dynaLeak.id", dynaLeakId));
}else{
criteria.add(Expression.eq("dynaLeak.id", 0));
}
return criteria.list();
}
}