/*
* 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.peer.business.dao;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.ourgrid.common.internal.IResponseTO;
import org.ourgrid.common.statistics.beans.peer.Peer;
import org.ourgrid.common.statistics.beans.peer.User;
import org.ourgrid.common.statistics.util.hibernate.HibernateUtil;
import org.ourgrid.common.util.CommonUtils;
import org.ourgrid.peer.business.dao.statistics.EntityDAO;
import org.ourgrid.peer.business.dao.statistics.PeerDAO;
import org.ourgrid.peer.business.util.LoggerUtil;
import org.ourgrid.peer.to.PeerUser;
import org.ourgrid.peer.to.PeerUserReference;
import org.ourgrid.reqtrace.Req;
/**
* Stores users info
*/
public class UsersDAO extends EntityDAO {
private final Map<String, PeerUserReference> loggedUsersByPubKey = CommonUtils.createSerializableMap();
/**
* Retrieves a map containing the registered users of the Peer
* @return A map linking login and PeerUser
*/
@Req({"REQ022", "REQ038a", "REQ106"})
public Map<String,PeerUser> getUsers(List<IResponseTO> responses) {
responses.add(LoggerUtil.enter());
List<User> users = null;
Criteria criteria = HibernateUtil.getSession().createCriteria(User.class);
criteria.add(Restrictions.isNull("deletionDate"));
users = criteria.list();
responses.add(LoggerUtil.leave());
return fillPeerUsersMap(users);
}
private Map<String, PeerUser> fillPeerUsersMap(List<User> users) {
Map<String, PeerUser> result = new TreeMap<String, PeerUser>();
if (users != null) {
for (Iterator<User> iterator = users.iterator(); iterator.hasNext();) {
User user = (User) iterator.next();
result.put(user.getAddress(), parseToPeerUser(user));
}
}
return result;
}
private PeerUser parseToPeerUser(User user){
if(user == null){
return null;
}
String[] splitedAddress = user.getAddress().split("@");
String userName = splitedAddress[0];
String server = splitedAddress[1];
String publicKey = user.getPublicKey();
boolean logged = loggedUsersByPubKey.get(publicKey) != null;
return new PeerUser(userName, server, publicKey, logged);
}
/**
* Retrieves information about a user
* @param login The login of the user
* @return Information about the user
*/
@Req("REQ108")
public PeerUser getUser(List<IResponseTO> responses, String login) {
return parseToPeerUser(findByUserAtServer(responses, login));
}
/**
* Retrieves information about a user
* @param userPublicKey The public key of the user
* @return Information about the user
*/
@Req("REQ027")
public PeerUser getUserByPublicKey(List<IResponseTO> responses, String userPublicKey) {
if (userPublicKey == null) throw new IllegalArgumentException("Informed user public key is null");
return parseToPeerUser(findByUserPublicKey(responses, userPublicKey));
}
public User findByUserPublicKey(List<IResponseTO> responses, String userPublicKey) {
responses.add(LoggerUtil.enter());
Criteria criteria = HibernateUtil.getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("publicKey", userPublicKey));
criteria.add(Restrictions.isNull("deletionDate"));
User user = (User) criteria.uniqueResult();
responses.add(LoggerUtil.leave());
return user;
}
public User findByUserAtServer(List<IResponseTO> responses, String userAtServer) {
responses.add(LoggerUtil.enter());
Criteria criteria = HibernateUtil.getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("address", userAtServer));
criteria.add(Restrictions.isNull("deletionDate"));
User user = (User) criteria.uniqueResult();
responses.add(LoggerUtil.leave());
return user;
}
public User findByID(List<IResponseTO> responses, long id) {
responses.add(LoggerUtil.enter());
Criteria criteria = HibernateUtil.getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("id", id));
User user = (User) criteria.uniqueResult();
responses.add(LoggerUtil.leave());
return user;
}
public void insert(List<IResponseTO> responses, User user) {
responses.add(LoggerUtil.enter());
Session session = HibernateUtil.getSession();
session.save(user);
session.flush();
responses.add(LoggerUtil.leave());
}
public void update(List<IResponseTO> responses, User user) {
responses.add(LoggerUtil.enter());
Session session = HibernateUtil.getSession();
session.update(user);
session.flush();
responses.add(LoggerUtil.leave());
}
/**
* @param userPublicKey
* @return
*/
public boolean userExists(List<IResponseTO> responses, String userPublicKey){
return getUserByPublicKey(responses, userPublicKey) != null;
}
/**
* Registers a user's PublicKey.
* This method is called once, when the user first logins in the peer
* @param user The user that logged for the first time
* @param publicKey The PublicKey to be registered
* @throws IOException Throwed when there is a problem when trying to persist users file
*/
@Req("REQ108")
public void registerPublicKey(List<IResponseTO> responses, PeerUser user, String publicKey) throws IOException {
User peerUser = findByUserAtServer(responses, user.getLogin());
peerUser.setPublicKey(publicKey);
update(responses, peerUser);
}
@Req("REQ108")
public void addLoggedUser(String lwpcPubKey, PeerUserReference workerProviderClient) {
loggedUsersByPubKey.put(lwpcPubKey, workerProviderClient);
}
/**
* @param pubKey
* @return
*/
@Req("REQ022")
public PeerUserReference removeLoggedUser(String pubKey){
return loggedUsersByPubKey.remove(pubKey);
}
/**
* @param pubKey
* @return
*/
@Req("REQ112")
public PeerUserReference getLoggedUser(String pubKey){
return loggedUsersByPubKey.get(pubKey);
}
@Req({"REQ106", "REQ038a"})
public boolean isLoggedUser(String pubKey){
return loggedUsersByPubKey.containsKey(pubKey);
}
public User insertUser(List<IResponseTO> responses, String login, Peer peer) {
User user = new User();
user.setAddress(login);
user.setCreationDate(now());
user.setDeletionDate(null);
user.setLastModified(now());
user.setPeer(peer);
user.setPublicKey("");
insert(responses, user);
return user;
}
public User addUser(List<IResponseTO> responses, String login, String myUserAtServer, String myCertSubjectDN,
String description, String email, String label, String latitude,
String longitude) {
PeerDAO peerDao = PeerDAOFactory.getInstance().getPeerDAO();
Peer peer = peerDao.updatePeer(responses,myUserAtServer, myCertSubjectDN,
description, email, label, latitude,
longitude);
User user = findByUserAtServer(responses, login);
if (user == null) {
user = insertUser(responses, login, peer);
} else {
//throw new CommuneRuntimeException("The user is already added: " + login);
throw new RuntimeException("The user is already added: " + login);
}
return user;
}
public void removeUser(List<IResponseTO> responses,String login) {
responses.add(LoggerUtil.enter());
User user = findByUserAtServer(responses, login);
if (user == null) {
//throw new CommuneRuntimeException("The user is not added: " + login);
throw new RuntimeException("The user is not added: " + login);
} else {
user.setAddress(login);
user.setDeletionDate(now());
user.setLastModified(now());
update(responses, user);
}
responses.add(LoggerUtil.leave());
}
}