package com.robonobo.sonar;
import static com.robonobo.common.util.TimeUtil.*;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.*;
import org.hibernate.criterion.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import com.robonobo.core.api.proto.CoreApi.EndPoint;
import com.robonobo.core.api.proto.CoreApi.Node;
import com.robonobo.sonar.beans.SonarEndPoint;
import com.robonobo.sonar.beans.SonarNode;
@Repository("nodeDao")
public class NodeDaoImpl extends HibernateDaoSupport implements NodeDao {
Log log = LogFactory.getLog(getClass());
@Override
public List<Node> getAllSupernodes(Node except) {
Criteria criteria = getSession().createCriteria(SonarNode.class);
criteria.add(Restrictions.eq("supernode", true));
if(except != null)
criteria.add(Restrictions.ne("id", except.getId()));
criteria.add(Restrictions.gt("lastSeen", new Date(new Date().getTime() - 300000)));
criteria.addOrder(Order.desc("lastSeen"));
List<SonarNode> sonarNodes = criteria.list();
List<Node> result = new ArrayList<Node>();
for (SonarNode sn : sonarNodes) {
result.add(sn.toMsg());
}
return result;
}
@Override
public void deleteAllNodes() {
Session s = getSession();
Criteria c = s.createCriteria(SonarNode.class);
Iterator i = c.list().iterator();
while(i.hasNext()) {
Object node = i.next();
s.delete(node);
}
}
@Override
public void deleteDuplicateNodes(Node n) {
Set<SonarNode> nodesToDelete = new HashSet<SonarNode>();
for (EndPoint ep : n.getEndPointList()) {
Criteria crit = getSession().createCriteria(SonarEndPoint.class);
crit.add(Restrictions.eq("url", ep.getUrl()));
List<SonarEndPoint> matchingEps = crit.list();
for (SonarEndPoint mEp : matchingEps) {
nodesToDelete.add(mEp.getNode());
getSession().delete(mEp);
}
}
for (SonarNode nd : nodesToDelete) {
getSession().delete(nd);
}
}
@Override
public void saveNode(Node n) {
SonarNode sn = getSonarNode(n.getId());
if(sn != null)
getSession().delete(sn);
sn = new SonarNode(n);
sn.setLastSeen(now());
getSession().saveOrUpdate(sn);
}
private SonarNode getSonarNode(String id) {
Criteria crit = getSession().createCriteria(SonarNode.class);
crit.add(Restrictions.eq("id", id));
return (SonarNode) crit.uniqueResult();
}
@Override
public void deleteNodesOlderThan(long maxAgeMs) {
Date date = timeInPast(maxAgeMs);
Criteria criteria = getSession().createCriteria(SonarNode.class);
criteria.add(Restrictions.lt("lastSeen", date));
List nodes = criteria.list();
Iterator i = nodes.iterator();
while(i.hasNext())
getSession().delete(i.next());
if(nodes.size() > 0)
log.info(nodes.size()+" old nodes deleted");
}
@Autowired
public void injectSessionFactory(SessionFactory sessionFactory) {
setSessionFactory(sessionFactory);
}
}