package hamaster.gradesign.dao.impl;
import hamaster.gradesgin.util.Hash;
import hamaster.gradesign.IBECSR;
import hamaster.gradesign.dao.IDRequestDAO;
import hamaster.gradesign.entity.IDRequest;
import hamaster.gradesign.entity.User;
import hamaster.gradesign.ibe.util.Hex;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.jdbc.Work;
public abstract class IDRequestDAOHibernateImpl extends DAOSupport implements IDRequestDAO {
public IDRequestDAOHibernateImpl() {
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#getByOwner(hamaster.gradesign.entity.User, java.lang.String)
*/
@Override
public IDRequest getByOwner(User owner, String idString) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("applicant", owner))
.add(Restrictions.eq("identityString", idString))
.setMaxResults(1);
List<?> res = criteria.list();
if (res.size() == 0)
return null;
return (IDRequest) res.get(0);
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#listNewRequests(int)
*/
@Override
public List<IDRequest> listNewRequests(int amount) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("status", Integer.valueOf(IBECSR.APPLICATION_NOT_VERIFIED)))
.setMaxResults(amount);
@SuppressWarnings("unchecked")
List<IDRequest> res = criteria.list();
return res;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#list(hamaster.gradesign.entity.User, int, int)
*/
@Override
public List<IDRequest> list(User owner, int page, int amount) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.setFirstResult(page * amount)
.setMaxResults(amount);
@SuppressWarnings("unchecked")
List<IDRequest> res = criteria.list();
return res;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#list(hamaster.gradesign.entity.User, int, int, int)
*/
@Override
public List<IDRequest> list(User owner, int page, int amount, int status) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("applicant", owner))
.setFirstResult(page * amount)
.setMaxResults(amount);
if (status > 0)
criteria.add(Restrictions.eq("status", status));
@SuppressWarnings("unchecked")
List<IDRequest> res = criteria.list();
return res;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#count(hamaster.gradesign.entity.User)
*/
@Override
public int count(User onwer) {
Session session = factory.openSession();
Number n = (Number) session.createCriteria(IDRequest.class)
.add(Restrictions.eq("applicant", onwer))
.setProjection(Projections.rowCount())
.uniqueResult();
int res = n.intValue();
session.disconnect();
return res;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#listUnhandledRequests(int)
*/
@Override
public List<IDRequest> listUnhandledRequests(int amount) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("status", IBECSR.APPLICATION_STARTED))
.setMaxResults(amount);
@SuppressWarnings("unchecked")
// TODO 会出现关闭数据库连接后访问的情况
List<IDRequest> res = criteria.list();
return res;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#requestHandled(java.util.Map)
*/
public void requestHandled(Map<String, Integer> results) {
Session session = factory.openSession();
final Map<String, Integer> results0 = results;
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
requestHandledDBMSSpecImpl(connection, results0);
}
});
if (session.isConnected())
session.disconnect();
}
/**
* 处理结果的数据库相关实现
* @param conn 数据库连接
* @param results 要处理的结果
* @throws SQLException 发生SQL异常 如数据库不支持加锁或数据更新时发生异常
*/
protected abstract void requestHandledDBMSSpecImpl(Connection conn, Map<String, Integer> results) throws SQLException;
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#doesIdBelongToUser(java.lang.String, hamaster.gradesign.entity.User, java.lang.String)
*/
@Override
public int doesIdBelongToUser(String id, User user, String idPassword) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("applicant", user))
.add(Restrictions.eq("identityString", id))
.setMaxResults(1);
List<?> result = criteria.list();
if (result.size() == 0) {
session.disconnect();
return 2; // 用户尝试获取不属于自己的ID
}
IDRequest req = (IDRequest) result.iterator().next();
String hash = req.getPassword();
String exptHash = Hex.hex(Hash.sha1(idPassword));
session.disconnect();
if (!exptHash.equalsIgnoreCase(hash))
return 1; // 密码错误
return 0;
}
/*
* (non-Javadoc)
* @see hamaster.gradesign.dao.IDRequestDAO#doesIdRequestExist(java.lang.String)
*/
@Override
public int doesIdRequestExist(String id) {
Session session = factory.openSession();
Criteria criteria = session.createCriteria(IDRequest.class)
.add(Restrictions.eq("identityString", id))
.add(Restrictions.not(Restrictions.eq("status", IBECSR.APPLICATION_NOT_VERIFIED)))
.setMaxResults(1);
List<?> res = criteria.list();
int ret = 0;
if (res.size() > 0) {
IDRequest req = (IDRequest) res.iterator().next();
ret = req.getStatus() + 1;
}
session.disconnect();
return ret;
}
}