package edu.sjtu.infosec.ismp.manager.AM.dao.impl;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import edu.sjtu.infosec.ismp.manager.AM.dao.AssetToPositionDao;
import edu.sjtu.infosec.ismp.manager.AM.model.AssetDeviceBO;
import edu.sjtu.infosec.ismp.manager.AM.model.AssetPositionBO;
import edu.sjtu.infosec.ismp.manager.AM.model.AssetToPositionBO;
import edu.sjtu.infosec.ismp.manager.comm.model.page.Page;
/**
* AssetToPositionDao接口的实现类
*
* @author Breggor 6.25完善功能
*
*/
@SuppressWarnings("unchecked")
public class AssetToPositionDaoImpl extends HibernateDaoSupport implements
AssetToPositionDao {
/**
* 保持物理位置和设备的关联关系
*/
public void saveAssetToPosition(AssetToPositionBO entity) {
getHibernateTemplate().save(entity);
}
/**
* 更新物理位置和设备的关联关系
*/
public void updateAssetToPosition(AssetToPositionBO entity) {
getHibernateTemplate().update(entity);
}
/**
* 删除物理位置和设备的关联关系
*/
public void deleteAssetToPosition(AssetToPositionBO entity) {
getHibernateTemplate().delete(entity);
}
/**
* 根据物理位置和设备关系的Id查询
*/
public AssetToPositionBO getAssetToPosition(Serializable entityId) {
return (AssetToPositionBO) getHibernateTemplate().get(
AssetToPositionBO.class, entityId);
}
/**
* 根据物理位置和设备关系的model查询
*/
public List<AssetToPositionBO> getListByAssetToPosition(
AssetToPositionBO entity) {
return (List<AssetToPositionBO>) spliceCriteria(entity).list();
}
/**
* 根据物理位置Id查询已关联设备集合
*/
public List<AssetDeviceBO> getListByAssetDevice(Serializable positionId) {
//根据物理位置Id得到设备Id集合
List deviceIds = getAssetDeviceIds(positionId);
//没有设备Id集合,就return Null
if(deviceIds == null || deviceIds.isEmpty())
{
return null;
}
Criteria criteria = getSession().createCriteria(AssetDeviceBO.class);
criteria.add(Restrictions.in("id", deviceIds));
return criteria.list();
}
/**
* 根据设备Id查询已关联物理位置集合
*/
public List<AssetPositionBO> getListByPosition(Serializable deviceId) {
//根据设备Id得到物理位置Id集合
List posList = getAssetPositionIds(deviceId);
//没有物理位置Id集合,就return Null
if(posList == null || posList.isEmpty())
{
return null;
}
Criteria criteria = getSession().createCriteria(AssetPositionBO.class);
criteria.add(Restrictions.in("id", posList));
return criteria.list();
}
/**
* 根据物理位置Id查询没有关联设备集合
*/
public List<AssetDeviceBO> getListNotJoinAssetDevice(Serializable positionId) {
List<AssetDeviceBO> deviceList = null;
//根据物理位置Id得到设备Id集合
List deviceIds = getAssetDeviceIds(positionId);
Criteria criteria = getSession().createCriteria(AssetDeviceBO.class);
//设备Id集合为空或Null时,就return 全部的设备
if(deviceIds == null || deviceIds.isEmpty())
{
deviceList = criteria.list();
}else{
deviceList = criteria.add(Restrictions.not(Restrictions.in("id", deviceIds))).list();
}
return deviceList;
}
/**
* 根据设备Id查询没有关联的物理位置集合
*/
public List<AssetPositionBO> getListNotJoinPosition(Serializable deviceId) {
List<AssetPositionBO> positionList = null;
//根据设备Id得到物理位置Id集合
List posIds = getAssetPositionIds(deviceId);
Criteria criteria = getSession().createCriteria(AssetPositionBO.class);
//物理位置Id集合为空或Null时,就return全部的物理位置
if(posIds == null || posIds.isEmpty())
{
positionList = criteria.list();
}else
{
positionList = criteria.add(Restrictions.not(Restrictions.in("id", posIds))).list();
}
return positionList;
}
/**
* 根据物理位置Id分页查询设备
*/
public List<AssetDeviceBO> getPageListByAssetDevice(
Serializable positionId, Page page) {
//根据物理位置Id得到设备Id集合
List deviceIds = getAssetDeviceIds(positionId);
//没有设备Id集合,就return Null
if(deviceIds == null || deviceIds.isEmpty())
{
return null;
}
Criteria criteria = getSession().createCriteria(AssetDeviceBO.class);
criteria.add(Restrictions.in("id", deviceIds));
criteria.setFirstResult(page.getBeginIndex());
criteria.setMaxResults(page.getEveryPage());
return criteria.list();
}
/**
* 根据物理位置Id统计设备的总行数
*/
public int getCountByAssetDevice(Serializable positionId) {
int count = 0;
List deviceIds = getAssetDeviceIds(positionId);
if(deviceIds==null || deviceIds.isEmpty())
{
return count;
}
Criteria criteria = getSession().createCriteria(AssetDeviceBO.class);
criteria.add(Restrictions.in("id", deviceIds));
count = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
return count;
}
/**
* 生成查询条件
*/
private Criteria spliceCriteria(AssetToPositionBO assetToPosition) {
Criteria criteria = getSession()
.createCriteria(AssetToPositionBO.class);
if (null == assetToPosition) {
return criteria;
}
if (null != assetToPosition.getId()) {
criteria.add(Restrictions.eq("id", assetToPosition.getId()));
}
if (null != assetToPosition.getAssetId()) {
criteria.add(Restrictions.eq("assetId", assetToPosition
.getAssetId()));
}
if (null != assetToPosition.getPositionId()) {
criteria.add(Restrictions.eq("positionId", assetToPosition
.getPositionId()));
}
if (null != assetToPosition.getDescription()
&& assetToPosition.getDescription().trim().length() > 0) {
criteria.add(Restrictions.like("description", "%"
+ assetToPosition.getDescription().trim() + "%"));
}
return criteria;
}
/**
* 根据物理位置Id查询设备Id集合
* @param positionId
* @return
*/
private List<Integer> getAssetDeviceIds(Serializable positionId) {
List<Integer> idsList = null;
if (positionId != null && !"".equals(positionId)) {
String hql = "select device.assetId from AssetToPositionBO device where device.positionId=:positionId";
Query query = getSession().createQuery(hql);
query.setParameter("positionId", positionId);
idsList = query.list();
}
return idsList;
}
/**
* 根据设备Id查询物理位置Id集合
* @param positionId
* @return
*/
private List<Integer> getAssetPositionIds(Serializable deviceId) {
List<Integer> idsList = null;
if (deviceId != null && !"".equals(deviceId)) {
String hql = "select pos.positionId from AssetToPositionBO pos where pos.assetId=:assetId";
Query query = getSession().createQuery(hql);
query.setParameter("assetId", deviceId);
idsList = query.list();
}
return idsList;
}
public List<AssetToPositionBO> getPositionIdByDeviceId(Serializable deviceId) {
String hql = "from AssetToPositionBO assetTopos where assetTopos.assetId=?";
Query query = getSession().createQuery(hql);
query.setParameter(0, deviceId);
return query.list();
}
public List<AssetDeviceBO> getListNotJoinAssetDevice() {
List<AssetDeviceBO> deviceList = null;
//得到所有房间的id号
List<AssetPositionBO> rooms = getRooms();
//根据设备Id得到物理位置Id集合
List deviceIds = new ArrayList();
for(AssetPositionBO room:rooms){
List deviceId = getAssetDeviceIds(room.getId());
deviceIds.addAll(deviceId);
}
Criteria criteria = getSession().createCriteria(AssetDeviceBO.class);
//设备Id集合为空或Null时,就return 全部的设备
if(deviceIds == null || deviceIds.isEmpty())
{
deviceList = criteria.list();
}else{
deviceList = criteria.add(Restrictions.not(Restrictions.in("id", deviceIds))).list();
}
return deviceList;
}
//得到所有房间的信息
public List<AssetPositionBO> getRooms(){
Criteria criteria = getSession().createCriteria(AssetPositionBO.class);
return criteria.add(Restrictions.isNotNull("parentId")).list();
}
}