View Javadoc
1   package fr.ifremer.dali.dao.data.survey;
2   
3   /*
4    * #%L
5    * Dali :: Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.ImmutableList;
27  import fr.ifremer.dali.dao.administration.user.DaliDepartmentDao;
28  import fr.ifremer.dali.dao.administration.user.DaliQuserDao;
29  import fr.ifremer.dali.dao.technical.Daos;
30  import fr.ifremer.dali.dto.DaliBeanFactory;
31  import fr.ifremer.dali.dto.data.survey.CampaignDTO;
32  import fr.ifremer.dali.dto.data.survey.OccasionDTO;
33  import fr.ifremer.dali.service.DaliDataContext;
34  import fr.ifremer.quadrige3.core.dao.administration.user.QuserImpl;
35  import fr.ifremer.quadrige3.core.dao.data.survey.Campaign;
36  import fr.ifremer.quadrige3.core.dao.data.survey.CampaignDaoImpl;
37  import fr.ifremer.quadrige3.core.dao.technical.Assert;
38  import fr.ifremer.quadrige3.core.dao.technical.hibernate.TemporaryDataHelper;
39  import org.apache.commons.collections4.CollectionUtils;
40  import org.hibernate.Query;
41  import org.hibernate.SessionFactory;
42  import org.hibernate.type.StringType;
43  import org.springframework.beans.factory.annotation.Autowired;
44  import org.springframework.stereotype.Repository;
45  
46  import javax.annotation.Resource;
47  import java.util.*;
48  
49  /**
50   * <p>DaliCampaignDaoImpl class.</p>
51   *
52   * @author Ludovic
53   */
54  @Repository("daliCampaignDao")
55  public class DaliCampaignDaoImpl extends CampaignDaoImpl implements DaliCampaignDao {
56  
57      @Resource(name = "daliQuserDao")
58      private DaliQuserDao quserDao;
59  
60      @Resource(name = "daliDepartmentDao")
61      private DaliDepartmentDao departmentDao;
62  
63      @Resource(name = "daliDataContext")
64      private DaliDataContext dataContext;
65  
66      /**
67       * <p>Constructor for DaliCampaignDaoImpl.</p>
68       *
69       * @param sessionFactory a {@link org.hibernate.SessionFactory} object.
70       */
71      @Autowired
72      public DaliCampaignDaoImpl(SessionFactory sessionFactory) {
73          super(sessionFactory);
74      }
75  
76      /**
77       * {@inheritDoc}
78       */
79      @Override
80      public List<CampaignDTO> getAllCampaigns() {
81          Iterator<Object[]> it = queryIterator("allCampaigns");
82  
83          List<CampaignDTO> result = new ArrayList<>();
84          while (it.hasNext()) {
85              result.add(toCampaignDTO(Arrays.asList(it.next()).iterator()));
86          }
87  
88          return ImmutableList.copyOf(result); // return an immutable list to avoid concurrency modification against cache
89      }
90  
91      @Override
92      @SuppressWarnings("unchecked")
93      public List<CampaignDTO> getCampaignsByIds(List<Integer> campaignIds) {
94          List<CampaignDTO> result = new ArrayList<>();
95          if (CollectionUtils.isNotEmpty(campaignIds)) {
96              Query query = createQuery("campaignsByIds").setParameterList("campaignIds", campaignIds);
97              Iterator<Object[]> it = query.iterate();
98              while (it.hasNext()) {
99                  result.add(toCampaignDTO(Arrays.asList(it.next()).iterator()));
100             }
101         }
102         return result;
103     }
104 
105     @Override
106     @SuppressWarnings("unchecked")
107     public List<CampaignDTO> getCampaignsByCriteria(String name,
108                                                     Date startDate1, Date startDate2, boolean strictStartDate,
109                                                     Date endDate1, Date endDate2, boolean strictEndDate, boolean canEndDateBeNull) {
110 
111         // load query from named query
112         StringBuilder queryString = new StringBuilder(getSession().getNamedQuery("campaignsByCriteria").getQueryString());
113 
114         // add start date restriction
115         StringBuilder startDateString = new StringBuilder();
116         if (startDate1 != null && startDate2 != null) {
117             if (startDate1 == startDate2) {
118                 // equals
119                 startDateString.append("campaignStartDt = ").append(Daos.convertDateOnlyToSQLString(startDate1));
120             } else {
121                 // between
122                 startDateString.append("campaignStartDt >= ").append(Daos.convertDateOnlyToSQLString(startDate1));
123                 startDateString.append("AND campaignStartDt <= ").append(Daos.convertDateOnlyToSQLString(startDate2));
124             }
125         } else if (startDate1 != null) {
126             // >= or >
127             startDateString.append("campaignStartDt ").append((strictStartDate ? "> " : ">= ")).append(Daos.convertDateOnlyToSQLString(startDate1));
128         } else if (startDate2 != null) {
129             // <= or <
130             startDateString.append("campaignStartDt ").append((strictStartDate ? "< " : "<= ")).append(Daos.convertDateOnlyToSQLString(startDate2));
131         }
132         if (startDateString.length() > 0) {
133             queryString.append(System.lineSeparator()).append(" AND ").append(startDateString);
134         }
135 
136         // add end date restriction
137         StringBuilder endDateString = new StringBuilder();
138         if (endDate1 != null && endDate2 != null) {
139             if (endDate1 == endDate2) {
140                 // equals
141                 endDateString.append("campaignEndDt = ").append(Daos.convertDateOnlyToSQLString(endDate1));
142             } else {
143                 // between
144                 endDateString.append("campaignEndDt >= ").append(Daos.convertDateOnlyToSQLString(endDate1));
145                 endDateString.append("AND campaignEndDt <= ").append(Daos.convertDateOnlyToSQLString(endDate2));
146             }
147         } else if (endDate1 != null) {
148             // >= or >
149             endDateString.append("campaignEndDt ").append((strictEndDate ? "> " : ">= ")).append(Daos.convertDateOnlyToSQLString(endDate1));
150         } else if (endDate2 != null) {
151             // <= or <
152             endDateString.append("campaignEndDt ").append((strictEndDate ? "< " : "<= ")).append(Daos.convertDateOnlyToSQLString(endDate2));
153         }
154         if (endDateString.length() > 0) {
155             queryString.append(System.lineSeparator()).append(" AND ");
156             if (canEndDateBeNull) {
157                 queryString.append("(campaignEndDt is null OR (").append(endDateString).append("))");
158             }
159              else {
160                 queryString.append(endDateString);
161             }
162         }
163 
164         // crete new query from query string
165         Query q = getSession().createQuery(queryString.toString());
166         setQueryParams(q, "campaignsByCriteria",
167                 "name", StringType.INSTANCE, name);
168 
169         Iterator<Object[]> it = q.iterate();
170 
171         List<CampaignDTO> result = new ArrayList<>();
172         while (it.hasNext()) {
173             Object[] row = it.next();
174             result.add(toCampaignDTO(Arrays.asList(row).iterator()));
175         }
176 
177         return result;
178     }
179 
180     @Override
181     public List<CampaignDTO> getCampaignsByName(String name) {
182 
183         Iterator<Object[]> it = queryIterator("campaignsByName",
184                 "name", StringType.INSTANCE, name);
185 
186         List<CampaignDTO> result = new ArrayList<>();
187         while (it.hasNext()) {
188             Object[] row = it.next();
189             result.add(toCampaignDTO(Arrays.asList(row).iterator()));
190         }
191         return result;
192     }
193 
194     /**
195      * {@inheritDoc}
196      */
197     @Override
198     public List<OccasionDTO> getAllOccasions() {
199 
200         Iterator<Object[]> it = queryIterator("allOccasions");
201 
202         List<OccasionDTO> result = new ArrayList<>();
203         while (it.hasNext()) {
204             Object[] row = it.next();
205             result.add(toOccasionDTO(Arrays.asList(row).iterator()));
206         }
207 
208         return result;
209     }
210 
211     @Override
212     public void saveCampaign(CampaignDTO campaign) {
213 
214         Assert.notNull(campaign);
215 
216         Campaign target = null;
217         boolean isNew = false;
218         if (campaign.getId() != null) {
219             target = get(campaign.getId());
220         }
221         if (target == null) {
222             target = Campaign.Factory.newInstance();
223             target.setCampaignId(TemporaryDataHelper.getNewNegativeIdForTemporaryData(getSession(), target.getClass()));
224             isNew = true;
225         }
226 
227         beanToEntity(campaign, target);
228 
229         if (isNew) {
230             getSession().save(target);
231             campaign.setId(target.getCampaignId());
232         } else {
233             getSession().update(target);
234         }
235     }
236 
237     // Private Methods
238 
239     private void beanToEntity(CampaignDTO source, Campaign target) {
240 
241         target.setCampaignNm(source.getName());
242         target.setCampaignStartDt(source.getStartDate());
243         target.setCampaignEndDt(source.getEndDate());
244         target.setCampaignSismerLk(source.getSismerLink());
245         target.setCampaignCm(source.getComment());
246 
247         target.setQuser(load(QuserImpl.class, source.getManager().getId()));
248 
249         // Recorder Department (Mantis #42614 Only if REC_DEP_ID is null)
250         if (target.getRecorderDepartment() == null) {
251             Assert.notNull(dataContext.getRecorderDepartmentId());
252             target.setRecorderDepartment(departmentDao.get(dataContext.getRecorderDepartmentId()));
253         }
254 
255     }
256 
257     private CampaignDTO toCampaignDTO(Iterator<Object> iterator) {
258         CampaignDTO result = DaliBeanFactory.newCampaignDTO();
259         result.setId((Integer) iterator.next());
260         result.setName((String) iterator.next());
261         result.setStartDate(Daos.convertToDate(iterator.next()));
262         result.setEndDate(Daos.convertToDate(iterator.next()));
263         result.setSismerLink((String) iterator.next());
264         result.setComment((String) iterator.next());
265         result.setManager(quserDao.getUserById((Integer) iterator.next()));
266         result.setRecorderDepartment(departmentDao.getDepartmentById((Integer) iterator.next()));
267         result.setUpdateDate(Daos.convertToDate(iterator.next()));
268         return result;
269     }
270 
271     private OccasionDTO toOccasionDTO(Iterator<Object> iterator) {
272         OccasionDTO result = DaliBeanFactory.newOccasionDTO();
273         result.setId((Integer) iterator.next());
274         result.setName((String) iterator.next());
275         return result;
276     }
277 }