/*
* Copyright (C) 2008 Universidade Federal de Campina Grande
*
* This file is part of OurGrid.
*
* OurGrid is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.ourgrid.discoveryservice;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.statistics.beans.ds.DS_PeerStatusChange;
import org.ourgrid.common.statistics.beans.status.PeerStatus;
import org.ourgrid.common.statistics.util.hibernate.HibernateUtil;
import org.ourgrid.peer.business.util.LoggerUtil;
/**
* @author alan
*
*/
public class PeerStatusChangeUtil {
public static void peerIsUp(String peerUserAtServer,
List<IResponseTO> responses) {
registerPeerStatusChange(peerUserAtServer, PeerStatus.UP,
System.currentTimeMillis(), responses);
}
public static void peerIsDown(String peerUserAtServer,
List<IResponseTO> responses) {
registerPeerStatusChange(peerUserAtServer, PeerStatus.DOWN,
System.currentTimeMillis(), responses);
}
@SuppressWarnings("unchecked")
public static List<DS_PeerStatusChange> getPeerStatusChangesHistory(long since,
List<IResponseTO> responses) {
responses.add(LoggerUtil.enter());
HibernateUtil.beginTransaction();
List<DS_PeerStatusChange> allPeerStatusChange = null;
try {
allPeerStatusChange = new ArrayList<DS_PeerStatusChange>();
Criteria criteria = HibernateUtil.getSession().createCriteria(DS_PeerStatusChange.class)
.add(Restrictions.ge("timeOfChange", since))
.addOrder(Order.asc("timeOfChange"));
allPeerStatusChange.addAll(criteria.list());
} catch (Exception e) {
responses.add(LoggerUtil.exception(e));
}
HibernateUtil.closeSession();
responses.add(LoggerUtil.leave());
return allPeerStatusChange;
}
public static void registerPeerStatusChange(String peerUserAtServer,
PeerStatus status, long timeOfChange, List<IResponseTO> responses) {
responses.add(LoggerUtil.enter());
HibernateUtil.beginTransaction();
try {
DS_PeerStatusChange change = new DS_PeerStatusChange();
change.setCurrentStatus(status);
change.setLastModified(timeOfChange);
change.setPeerAddress(peerUserAtServer);
change.setTimeOfChange(timeOfChange);
HibernateUtil.getSession().saveOrUpdate(change);
HibernateUtil.commitTransaction();
} catch (HibernateException e) {
responses.add(LoggerUtil.rollbackException(e));
HibernateUtil.rollbackTransaction();
} finally {
HibernateUtil.closeSession();
}
responses.add(LoggerUtil.leave());
}
/**
* Requirement 502
* @param responses
*/
@SuppressWarnings("unchecked")
public static void killAllActivePeers(long timeOfChange, List<IResponseTO> responses) {
responses.add(LoggerUtil.enter());
HibernateUtil.beginTransaction();
try {
Query peerQuery = HibernateUtil.getSession().createSQLQuery(
"SELECT DISTINCT psc.peerAddress FROM peer_status_change psc");
List<String> allPeers = peerQuery.list();
for (String peerAddress : allPeers) {
Query singlePeerQuery = HibernateUtil.getSession().createSQLQuery(
"SELECT currentStatus FROM peer_status_change " +
"WHERE peerAddress = '" + peerAddress + "' " +
"ORDER BY timeOfChange DESC");
singlePeerQuery.setMaxResults(1);
String lastStatus = (String) singlePeerQuery.uniqueResult();
if (PeerStatus.UP.toString().equals(lastStatus)) {
DS_PeerStatusChange change = new DS_PeerStatusChange();
change.setCurrentStatus(PeerStatus.DOWN);
change.setLastModified(timeOfChange);
change.setPeerAddress(peerAddress);
change.setTimeOfChange(timeOfChange);
HibernateUtil.getSession().save(change);
}
}
HibernateUtil.commitTransaction();
} catch (Exception e) {
responses.add(LoggerUtil.rollbackException(e));
HibernateUtil.rollbackTransaction();
} finally {
HibernateUtil.closeSession();
}
responses.add(LoggerUtil.leave());
}
}