View Javadoc
1   package fr.ifremer.tutti.persistence.service;
2   
3   /*
4    * #%L
5    * Tutti :: Persistence
6    * %%
7    * Copyright (C) 2012 - 2014 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the 
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public 
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
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   * TODO
47   *
48   * @author Tony Chemit - chemit@codelutin.com
49   * @since 0.3
50   */
51  public abstract class AbstractPersistenceService implements TuttiPersistenceServiceImplementor {
52  
53      /** Logger. */
54      private static final Log log = LogFactory.getLog(AbstractPersistenceService.class);
55  
56      /**
57       * Session factory.
58       *
59       * @since 0.3
60       */
61      @Resource
62      protected SessionFactory sessionFactory;
63  
64      @Resource(name = "tuttiConfiguration")
65      protected TuttiConfiguration config;
66  
67      /**
68       * Etat pour savoir si le service a ete initialise.
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          // do nothing by default
93      }
94  
95      @Override
96      public void close() {
97          // do nothing by default
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 //    protected <T> List<T> queryList2Typed(String queryName, Object... params) {
140 //
141 //        Query query = createQuery(queryName, params);
142 //        return query.list();
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         // TODO BLA : ajouter une annotation qui rejoue une méthode
177         // avec debug=true. puis repasse à faux,
178         // lorsqu'une erreur
179 //        boolean debug = false;
180 //        if (debug) {
181 //            T load = (T) getCurrentSession().get(clazz, id);
182 //            if (load == null) {
183 //                throw new DataIntegrityViolationException("Unable to load entity " + clazz.getName() + " with id=" + id + " : not found in database.");
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 //    protected Date dateWithOneMiliSecond(Date date) {
238 //        calendar.setTime(date);
239 //        calendar.add(Calendar.MILLISECOND, 1);
240 //        return calendar.getTime();
241 //    }
242 //
243 //    protected Date dateOfYearWithOneMiliSecond(int year) {
244 //        calendar.setTimeInMillis(0);
245 //        calendar.set(Calendar.YEAR, year);
246 //        calendar.set(Calendar.MILLISECOND, 1);
247 //        return calendar.getTime();
248 //    }
249 //
250 //    protected long dateOfYearWithOneMiliSecondInMili(int year) {
251 //        calendar.setTimeInMillis(0);
252 //        calendar.set(Calendar.YEAR, year);
253 //        calendar.set(Calendar.MILLISECOND, 1);
254 //        return calendar.getTimeInMillis();
255 //    }
256 
257     /**
258      * Test if the date has millisecond set. This yes, return null, then return the date itself.
259      *
260      * @param databaseValue the date stored in the database (could be fake date, not null only because of database constraints)
261      * @return null if the date is a fake date
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      * Convert a UI date, when the database value is mandatory.
281      * If the given value is null, use the default date, then set millisecond to '1', to be able to retrieve the null value later.
282      *
283      * @param uiValue                   the date used in the UI
284      * @param addOneSecondToDefaultDate TODO
285      * @param defaultNotEmptyDate       TODO
286      * @return null if the date is a fake date
287      */
288     protected Date convertUI2DatabaseMandatoryDate(Date uiValue,
289                                                    Date defaultNotEmptyDate,
290                                                    boolean addOneSecondToDefaultDate) {
291         Date result;
292 
293         // if ui date is not empty, then use it (but reset millisecond)
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 }