1 /*** 2 * 3 */ 4 package hu.elte.tribus.services; 5 6 import hu.elte.tribus.interfaces.OnlineUserBean; 7 import hu.elte.tribus.interfaces.UserDao; 8 import hu.elte.tribus.interfaces.UserTracker; 9 import hu.elte.tribus.model.Conversation; 10 import hu.elte.tribus.model.User; 11 12 import java.sql.SQLException; 13 import java.util.ArrayList; 14 import java.util.Date; 15 import java.util.HashMap; 16 import java.util.Iterator; 17 import java.util.List; 18 import java.util.Map; 19 20 import org.apache.log4j.Logger; 21 import org.hibernate.HibernateException; 22 import org.hibernate.Session; 23 import org.springframework.orm.hibernate3.HibernateCallback; 24 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 25 26 /*** 27 * Very simple implementation, that fits the need of a single-server environment 28 * using a HashMap or even a clustered environment with a jcache implementation 29 * with a simple factory bean. 30 * Which is of course beyound scope for a 48-hours welding contest. 31 * 32 * @author kocka 33 */ 34 public class HashMapUserTracker extends HibernateDaoSupport implements UserTracker { 35 36 private final static Logger logger = Logger.getLogger(HashMapUserTracker.class); 37 38 private UserDao userDao; 39 40 /*** 41 * Map of users (username -> login time) 42 */ 43 private Map<String, Date> map = new HashMap<String, Date>(); 44 45 public void userLoggedIn(String username) { 46 map.put(username, new Date()); 47 if(logger.isInfoEnabled()) { 48 logger.info("User logged in:"+username); 49 } 50 } 51 52 public void userLoggedOut(String username) { 53 map.remove(username); 54 } 55 56 public Map getMap() { 57 return map; 58 } 59 60 public void setMap(Map map) { 61 this.map = map; 62 } 63 64 public List listOfOnlineUsers() { 65 return (List)getHibernateTemplate().execute(new HibernateCallback(){ 66 67 public Object doInHibernate(Session session) throws HibernateException, SQLException { 68 ArrayList list = new ArrayList(); 69 Iterator iterator = map.keySet().iterator(); 70 while(iterator.hasNext()) { 71 String userName = (String)iterator.next(); 72 User user = userDao.getUser(userName); 73 Conversation conversation = (Conversation) session.createQuery(" from "+Conversation.class.getName()+" where enddate is null").uniqueResult(); 74 OnlineUserBean onlineUserBean = new OnlineUserBean(); 75 onlineUserBean.setUser(user); 76 onlineUserBean.setOnlineSince((Date) map.get(userName)); 77 onlineUserBean.setConversation(conversation); 78 list.add(onlineUserBean); 79 } 80 return list; 81 }}); 82 } 83 84 public UserDao getUserDao() { 85 return userDao; 86 } 87 88 public void setUserDao(UserDao userDao) { 89 this.userDao = userDao; 90 } 91 92 }