package edu.sjtu.infosec.ismp.manager.EM.dao.impl;
import java.io.Serializable;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.EM.comm.Page;
import edu.sjtu.infosec.ismp.manager.EM.dao.IEventrealdispDao;
import edu.sjtu.infosec.ismp.manager.EM.dao.Status;
import edu.sjtu.infosec.ismp.manager.EM.dao.queryCondition.EventrealdispCondition;
import edu.sjtu.infosec.ismp.manager.EM.dao.queryCondition.RuleCondition;
import edu.sjtu.infosec.ismp.manager.EM.dao.queryResult.EventrealdispResult;
import edu.sjtu.infosec.ismp.manager.EM.model.Eventrealdisp;
import edu.sjtu.infosec.ismp.manager.EM.util.PageUtil;
import edu.sjtu.infosec.ismp.manager.SYSM.user.self.comm.SecurityUserHolder;
import edu.sjtu.infosec.ismp.security.Domain;
public class EventrealdispDao extends HibernateDaoSupport implements
IEventrealdispDao {
public void add(Eventrealdisp data) {
getHibernateTemplate().save(data);
}
public void add(List<Eventrealdisp> data) {
getHibernateTemplate().saveOrUpdateAll(data);
}
public void delete(Eventrealdisp data) {
getHibernateTemplate().delete(data);
}
public void delete(List<Serializable> ids) {
Iterator<Serializable> it = ids.iterator();
StringBuffer buffer = new StringBuffer();
buffer.append("delete from Eventrealdisp e where e.id in (");
while (it.hasNext()) {
buffer.append("?");
it.next();
if (it.hasNext()) {
buffer.append(",");
}
}
buffer.append(")");
getHibernateTemplate().bulkUpdate(buffer.toString(), ids.toArray());
}
public Eventrealdisp get(Serializable id) {
return (Eventrealdisp) getHibernateTemplate().get(Eventrealdisp.class,
id);
}
@SuppressWarnings("unchecked")
public EventrealdispResult queryEventrealdispByCondition(
final EventrealdispCondition condition) {
return (EventrealdispResult) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
EventrealdispResult res = new EventrealdispResult();
Page page = condition.getPage();
Page p = new Page();
Criteria criteria = session.createCriteria(Eventrealdisp.class);
if (condition.getBureauId()!=null && condition.getBureauId()>0){
List<Domain> managerBo = (List<Domain>)SecurityUserHolder.getCurrentUser().getDomainList();
for(Domain d:managerBo){
if(d.getId().equals(condition.getBureauId())){
criteria.add(Restrictions.eq("domain", d));
}
}
}
// 查找事件描述符合的字符串
if (condition.getDescrip() != null
&& condition.getDescrip().trim().length() > 0) {
String str = condition.getDescrip();
criteria.add(Restrictions.like("descrip", "%" + str + "%"));
}
//事件的源IP地址
if (condition.getSrc_ip()!=null && condition.getSrc_ip().trim().length()>0) {
criteria.add(Restrictions.eq("srcIp", condition.getSrc_ip()));
}
//事件的威胁等级为条件
if (condition.getThre_rank()!=null && condition.getThre_rank()>0) {
criteria.add(Restrictions.eq("threRank", condition.getThre_rank()));
}
//事伯的源端口为条件
if (condition.getSrc_port()!= null && condition.getSrc_port() > 0) {
criteria
.add(Restrictions.eq("srcPort", condition.getSrc_port()));
}
// 事件目的端口为条件
if (condition.getDest_port()!= null && condition.getDest_port() > 0) {
criteria
.add(Restrictions.eq("destPort", condition.getDest_port()));
}
// 数据流方向,向内( 0 ) 或向外 ( 1 )
// if (condition.getDirection() != null) {
// if (condition.getDirection() == true) {
// criteria.add(Restrictions.eq("direction", 0));
// } else {
// criteria.add(Restrictions.eq("direction", 1));
// }
// }
// 按起始日期时间和结束日期时间查询
System.out.println("------查询前的-bureauId-------" + condition.getBureauId());
System.out.println("------查询前的-时间-------" + condition.getStarttime() + "---" + condition.getEndtime());
if (condition.getStarttime() != null && condition.getEndtime() != null) {
criteria.add(Restrictions.between("eventTime", condition.getStarttime(),
condition.getEndtime()));
} else if (condition.getStarttime() != null) {
criteria.add(Restrictions.ge("eventTime", condition.getStarttime()));
} else if (condition.getEndtime() != null) {
criteria.add(Restrictions.le("eventTime", condition.getEndtime()));
}
// 事件类型条件查询
if (condition.getEvent_type() != null
&& condition.getEvent_type().trim().length() > 0) {
criteria.add(Restrictions.eq("eventType", condition
.getEvent_type()));
}
// 安全设备IP查询
if (condition.getFaci_ip() != null
&& condition.getFaci_ip().trim().length() > 0) {
criteria.add(Restrictions.eq("faciIp", condition.getFaci_ip()));
}
// 根据安全设备类型查询
if (condition.getFaci_type() != null
&& condition.getFaci_type().trim().length() > 0) {
criteria
.add(Restrictions.eq("faciType", condition.getFaci_type()));
}
//总记录数
int totalCount = (Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult();
if (totalCount == 0) {
page.setTotalPage(1);
res.setPage(page);
res.setStatus(Status.NORESULT);
return res;
}
criteria.setProjection(null);
int startIndex = page.getEveryPage() * (page.getCurrentPage() - 1);
p.setBeginIndex(startIndex + 1);
criteria.setFirstResult(startIndex);
criteria.setMaxResults(page.getEveryPage());
criteria.addOrder(Order.desc("eventTime"));
p = PageUtil.createPage(page.getEveryPage(), page.getCurrentPage(),
totalCount);
List<Eventrealdisp> list = criteria.list();
res.setPage(p);
res.setResults(list);
res.setStatus(Status.SUCCESS);
return res;
}
});
}
public void update(Eventrealdisp data) {
getHibernateTemplate().update(data);
}
public void update(List<Eventrealdisp> datas) {
getHibernateTemplate().saveOrUpdateAll(datas);
}
@SuppressWarnings("unchecked")
public List<Object> staticticsEventType(final Timestamp starttime,
final Timestamp endtime, final Integer bureauId) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(Eventrealdisp.class);
if (bureauId != null && bureauId > 0) {
List<Domain> managerBo = (List<Domain>)SecurityUserHolder.getCurrentUser().getDomainList();
for(Domain d:managerBo){
if(d.getId().equals(bureauId)){
criteria.add(Restrictions.eq("domain", d));
}
}
}
if (starttime != null && endtime != null) {
criteria.add(Restrictions.between("eventTime", starttime, endtime));
} else if (starttime != null) {
criteria.add(Restrictions.ge("eventTime", starttime));
} else if (endtime != null) {
criteria.add(Restrictions.le("eventTime", endtime));
}
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("eventType"));
projectionList.add(Projections.rowCount(),"eventType");
criteria.setProjection(projectionList);
criteria.addOrder(Order.desc("eventType"));
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List<Object> list = criteria.list();
return list;
}
});
}
@SuppressWarnings("unchecked")
public List<Object> staticticsSafety(final Timestamp starttime,final Timestamp endtime,final Integer bureauId) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(Eventrealdisp.class);
if (bureauId != null && bureauId > 0) {
List<Domain> managerBo = (List<Domain>)SecurityUserHolder.getCurrentUser().getDomainList();
for(Domain d:managerBo){
if(d.getId().equals(bureauId)){
criteria.add(Restrictions.eq("domain", d));
}
}
}
if (starttime != null && endtime != null) {
criteria.add(Restrictions.between("eventTime", starttime, endtime));
} else if (starttime != null) {
criteria.add(Restrictions.ge("eventTime", starttime));
} else if (endtime != null) {
criteria.add(Restrictions.le("eventTime", endtime));
}
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("faciType"));
projectionList.add(Projections.rowCount(),"faciType");
criteria.setProjection(projectionList);
criteria.addOrder(Order.desc("faciType"));
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List<Object> list = criteria.list();
return list;
}
});
}
@SuppressWarnings({ "unchecked" })
public List<Eventrealdisp> queryBycorrrule(final RuleCondition condition){
DetachedCriteria dc = DetachedCriteria.forClass(Eventrealdisp.class);
dc.setProjection(Projections.max("eventTime"));
final Timestamp endtime = (Timestamp) getHibernateTemplate().findByCriteria(dc).get(0);
if (endtime==null) {
return null;
}
long time = endtime.getTime();
long tt = time-condition.getRulelength();
final Timestamp starttime = new Timestamp((long)tt);
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(Eventrealdisp.class);
if (condition.getBureauId()!=null && condition.getBureauId().length > 0) {
List<Domain> managerBo = (List<Domain>)SecurityUserHolder.getCurrentUser().getDomainList();
// for(Domain d:managerBo){
// if(d.getId().equals(condition.getBureauId())){
// criteria.add(Restrictions.eq("domain", d));
// }
// }
criteria.add(Restrictions.in("domain", managerBo));
}
criteria.add(Restrictions.between("eventTime", starttime, endtime));
// System.out.println(starttime.toString());
// System.out.println(endtime.toString());
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.projectionList().add(Projections.property("id")).add(
Projections.property("eventTime")));
//源IP是否相同
if (condition.isSrcip_same()) {
projectionList.add(Projections.groupProperty("srcIp"));
}else {
projectionList.add(Projections.property("srcIp"));
}
//源端口
projectionList.add(Projections.projectionList().add(
Projections.property("srcPort")));
//目的端口是否相同
if (condition.isDestport_same()) {
projectionList.add(Projections.groupProperty("destPort"));
}else {
projectionList.add(Projections.property("destPort"));
}
// 威胁等级,安全设备类型
projectionList.add(Projections.projectionList().add(
Projections.property("threRank")).add(
Projections.property("faciType")));
//事件类型是否相同
if (condition.isEventtype_same()) {
projectionList.add(Projections.groupProperty("eventType"));
}else {
projectionList.add(Projections.property("eventType"));
}
// 协议类型是否相同
if (condition.isProtocol_same()) {
projectionList.add(Projections.groupProperty("prot_type"));
}else {
projectionList.add(Projections.property("prot_type"));
}
//目的IP是否相同
if (condition.isDestip_same()) {
projectionList.add(Projections.groupProperty("destIp"));
}else {
projectionList.add(Projections.property("destIp"));
}
//描述
projectionList.add(Projections.projectionList().add(
Projections.property("descrip")));
if (condition.isDestip_same() || condition.isDestport_same()
|| condition.isEventtype_same() || condition.isProtocol_same()
|| condition.isSrcip_same()) {
projectionList.add(Projections.rowCount());
}
criteria.setProjection(projectionList);
List<Eventrealdisp> list = (List<Eventrealdisp>) criteria.list();
return list;
}
});
}
}