1 package fr.ifremer.tutti.persistence.service;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import com.google.common.base.Preconditions;
26 import fr.ifremer.tutti.TuttiConfiguration;
27 import fr.ifremer.tutti.persistence.TuttiPersistenceServiceImplementor;
28 import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel;
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31 import org.hibernate.Query;
32 import org.hibernate.Session;
33 import org.hibernate.SessionFactory;
34 import org.hibernate.type.Type;
35
36 import javax.annotation.Resource;
37 import java.io.Serializable;
38 import java.sql.Timestamp;
39 import java.util.Calendar;
40 import java.util.Collection;
41 import java.util.Date;
42 import java.util.GregorianCalendar;
43 import java.util.Iterator;
44
45
46
47
48
49
50
51 public abstract class AbstractPersistenceService implements TuttiPersistenceServiceImplementor {
52
53
54 private static final Log log = LogFactory.getLog(AbstractPersistenceService.class);
55
56
57
58
59
60
61 @Resource
62 protected SessionFactory sessionFactory;
63
64 @Resource(name = "tuttiConfiguration")
65 protected TuttiConfiguration config;
66
67
68
69
70 private boolean init;
71
72 public void lazyInit() {
73
74 if (!init) {
75
76 try {
77
78 init();
79
80 } finally {
81
82 init = true;
83
84 }
85
86 }
87
88 }
89
90 @Override
91 public void init() {
92
93 }
94
95 @Override
96 public void close() {
97
98 init = false;
99 }
100
101 public void setConfig(TuttiConfiguration config) {
102 this.config = config;
103 }
104
105 protected final SessionFactory getSessionFactory() {
106 return sessionFactory;
107 }
108
109 protected final Session getCurrentSession() {
110 return getSessionFactory().getCurrentSession();
111 }
112
113 protected Object[] queryUnique(String queryName, Object... params) {
114
115 Query query = createQuery(queryName, params);
116 Object result = query.uniqueResult();
117 return (Object[]) result;
118 }
119
120 protected <T> T queryUniqueTyped(String queryName, Object... params) {
121
122 Query query = createQuery(queryName, params);
123 Object result = query.uniqueResult();
124 return (T) result;
125 }
126
127 protected Iterator<Object[]> queryList(String queryName, Object... params) {
128
129 Query query = createQuery(queryName, params);
130 return query.iterate();
131 }
132
133 protected <T> Iterator<T> queryListTyped(String queryName, Object... params) {
134
135 Query query = createQuery(queryName, params);
136 return query.iterate();
137 }
138
139
140
141
142
143
144
145 protected Query createQuery(String queryName, Object... params) {
146 Query query = getCurrentSession().getNamedQuery(queryName);
147
148 if (params.length > 0) {
149
150 Preconditions.checkArgument(
151 params.length % 3 == 0,
152 "Params must be tuple (paramName, paramType, paramValue)");
153
154 int nbParams = params.length / 3;
155
156 for (int i = 0; i < nbParams; i++) {
157 String paramName = (String) params[3 * i];
158 Type paramType = (Type) params[3 * i + 1];
159 Object paramValue = params[3 * i + 2];
160
161 if (paramValue != null && Collection.class.isAssignableFrom(paramValue.getClass())) {
162 query.setParameterList(paramName, (Collection) paramValue, paramType);
163 } else {
164 query.setParameter(paramName, paramValue, paramType);
165 }
166 if (log.isDebugEnabled()) {
167 log.debug("query [" + queryName + "] (param " + i
168 + " [" + paramName + '=' + paramValue + "])");
169 }
170 }
171 }
172 return query;
173 }
174
175 protected <T extends Serializable> T load(Class<? extends T> clazz, Serializable id) {
176
177
178
179
180
181
182
183
184
185
186 return (T) getCurrentSession().load(clazz, id);
187 }
188
189 protected <T extends Serializable> T get(Class<? extends T> clazz, Serializable id) {
190 return (T) getCurrentSession().get(clazz, id);
191 }
192
193 protected int queryUpdate(String queryName, Object... params) {
194
195 Query query = createQuery(queryName, params);
196
197 int result = query.executeUpdate();
198 if (log.isInfoEnabled()) {
199 log.info(queryName + ": " + result);
200 }
201 return result;
202 }
203
204 protected Date newCreateDate() {
205 return dateWithNoTime(new Date());
206 }
207
208 protected Date dateWithNoTime(Date date) {
209 calendar.setTime(date);
210 calendar.set(Calendar.HOUR_OF_DAY, 0);
211 calendar.set(Calendar.MINUTE, 0);
212 calendar.set(Calendar.SECOND, 0);
213 calendar.set(Calendar.MILLISECOND, 0);
214 return calendar.getTime();
215 }
216
217 protected Date dateWithNoMiliSecond(Date date) {
218 calendar.setTime(date);
219 calendar.set(Calendar.MILLISECOND, 0);
220 return calendar.getTime();
221 }
222
223 protected Date dateWithNoSecondAndMiliSecond(Date date) {
224 calendar.setTime(date);
225 calendar.set(Calendar.SECOND, 0);
226 calendar.set(Calendar.MILLISECOND, 0);
227 return calendar.getTime();
228 }
229
230 protected Date dateWithNoSecondAndOneMiliSecond(Date date) {
231 calendar.setTime(date);
232 calendar.add(Calendar.SECOND, 0);
233 calendar.add(Calendar.MILLISECOND, 1);
234 return calendar.getTime();
235 }
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263 protected Date convertDatabase2UI(Timestamp databaseValue) {
264 Date result;
265 if (databaseValue == null) {
266 result = null;
267 } else {
268
269 calendar.setTimeInMillis(databaseValue.getTime());
270 if (calendar.get(Calendar.MILLISECOND) != 0) {
271 result = null;
272 } else {
273 result = calendar.getTime();
274 }
275 }
276 return result;
277 }
278
279
280
281
282
283
284
285
286
287
288 protected Date convertUI2DatabaseMandatoryDate(Date uiValue,
289 Date defaultNotEmptyDate,
290 boolean addOneSecondToDefaultDate) {
291 Date result;
292
293
294 if (uiValue == null) {
295
296 Preconditions.checkState(
297 defaultNotEmptyDate != null,
298 "'defaultNotEmptyDate' could not be null.");
299
300
301 calendar.setTime(defaultNotEmptyDate);
302 if (addOneSecondToDefaultDate) {
303 calendar.add(Calendar.SECOND, 1);
304 }
305 calendar.set(Calendar.MILLISECOND, 1);
306 result = calendar.getTime();
307 } else {
308
309 result = dateWithNoMiliSecond(uiValue);
310 }
311
312 return result;
313 }
314
315
316 public SampleCategoryModel getSampleCategoryModel() {
317 return config.getSampleCategoryModel();
318 }
319
320 private Calendar calendar = new GregorianCalendar();
321
322
323 }