1   
2   
3   
4   
5   
6   
7   
8   
9   package com.buckosoft.BSAccount.db;
10  
11  import java.util.Timer;
12  import java.util.TimerTask;
13  
14  import org.apache.commons.logging.Log;
15  import org.apache.commons.logging.LogFactory;
16  import org.hibernate.HibernateException;
17  import org.hibernate.Session;
18  
19  import com.buckosoft.BSAccount.domain.AppJumper;
20  import com.buckosoft.BSAccount.domain.BSAccount;
21  
22  
23  
24  
25  
26  public class DatabaseImpl implements Database {
27  	protected final Log log = LogFactory.getLog(getClass());
28  	private Timer		dbTimer = new Timer("BSAccountDBCheck", true);
29  	private TimerTask	dbTimerTask = new DBTimerTask();
30  	private	boolean		refreshNeeded = true;
31  	private	int			timerDelay = 60*5;
32  
33  	private HibernateUtil	hibernateUtil;
34  
35  	public DatabaseImpl() {
36  		hibernateUtil = new HibernateUtil();
37  		hibernateUtil.initialize(null);
38  		log.info("Initialize database timer to " + timerDelay);
39  		dbTimer.schedule(dbTimerTask, timerDelay*1000, timerDelay*1000);
40  	}
41  
42  	class DBTimerTask extends TimerTask {
43  		@Override
44  		public void run() {
45  			if (refreshNeeded) {
46  				log.debug("Refresh database");
47  				getAccountCount();
48  			}
49  			refreshNeeded = true;
50  		}
51  	}
52  
53  	
54  
55  
56  	@Override
57  	public BSAccount getAccount(String username, String password) {
58  		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
59  		session.getTransaction().begin();
60  		BSAccount a = null;
61  		try {
62  			a = (BSAccount)session.createQuery("from BSAccount a where a.username = :username and password = PASSWORD(:password)")
63  									.setParameter("username", username)
64  									.setParameter("password", password)
65  									.uniqueResult();
66  			if (a != null) {
67  				a.setLastAccess(null);
68  				session.update(a);
69  			}
70  			refreshNeeded = false;
71  		} catch (HibernateException e) {
72  			e.printStackTrace();
73  		} finally {
74  			session.getTransaction().commit();
75  		}
76  		return(a);
77  	}
78  
79  	
80  
81  
82  	@Override
83  	public BSAccount getAccount(int userId) {
84  		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
85  		session.getTransaction().begin();
86  		BSAccount a = null;
87  		try {
88  			a = (BSAccount)session.createQuery("from BSAccount a where a.userId = :userId")
89  									.setParameter("userId", userId)
90  									.uniqueResult();
91  			if (a != null) {
92  				a.setLastAccess(null);
93  				session.update(a);
94  			}
95  			refreshNeeded = false;
96  		} catch (HibernateException e) {
97  			e.printStackTrace();
98  		} finally {
99  			session.getTransaction().commit();
100 		}
101 		return(a);
102 	}
103 
104 	
105 	
106 
107 
108 	@Override
109 	public int getAccountCount() {
110 		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
111 		session.getTransaction().begin();
112 		try {
113 			Long count = (Long)session.createQuery("select count(*) from BSAccount").uniqueResult();
114 			refreshNeeded = false;
115 			int c = count.intValue();
116 			return(c);
117 		} catch (Exception e) {
118 			e.printStackTrace();
119 		} finally {
120 			session.getTransaction().commit();
121 		}
122 		return(0);
123 	}
124 
125 	
126 
127 
128 	@Override
129 	public int getAppJumperUser(long appJumper) {
130 		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
131 		session.getTransaction().begin();
132 		AppJumper a = null;	
133 			try {
134 				a = (AppJumper)session.createQuery("from AppJumper a where a.jumpToken = :toke")
135 						.setParameter("toke", (Long)appJumper)
136 						.uniqueResult();
137 
138 						
139 
140 				if (a != null)
141 					return(a.getUserId());
142 			} catch (HibernateException e) {
143 				e.printStackTrace();
144 			} finally {
145 				session.getTransaction().commit();
146 			}
147 		return 0;
148 	}
149 
150 	
151 
152 
153 	@Override
154 	public void setAppJumper(int userId, long appJumper) {
155 		AppJumper a = new AppJumper(userId, appJumper);
156 		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
157 		session.getTransaction().begin();
158 		try {
159 			session.saveOrUpdate(a);
160 			refreshNeeded = false;
161 		} catch (Exception e) {
162 			session.getTransaction().rollback();
163 			e.printStackTrace();
164 			return;
165 		} finally {
166 			session.getTransaction().commit();
167 		}
168 	}
169 	
170 
171 
172 	@Override
173 	public void deleteAppJumper(int userId, long appJumper) {
174 		Session session = hibernateUtil.getSessionFactory().getCurrentSession();
175 		session.getTransaction().begin();
176 		try {
177 			session.createQuery("delete from AppJumper a where a.jumpToken = :token and a.userId = :id")
178 				.setParameter("id", userId)
179 				.setParameter("token", appJumper)
180 				.executeUpdate();
181 
182 		} catch (Exception e) {
183 			session.getTransaction().rollback();
184 			e.printStackTrace();
185 			return;
186 		} finally {
187 			session.getTransaction().commit();
188 		}
189 	}
190 
191 }