View Javadoc
1   package fr.ifremer.dali.dao.referential;
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.config.DaliConfiguration;
28  import fr.ifremer.dali.dao.referential.transcribing.DaliTranscribingItemDao;
29  import fr.ifremer.dali.dao.technical.Daos;
30  import fr.ifremer.dali.dto.DaliBeanFactory;
31  import fr.ifremer.dali.dto.referential.SamplingEquipmentDTO;
32  import fr.ifremer.quadrige3.core.dao.referential.SamplingEquipmentDaoImpl;
33  import fr.ifremer.quadrige3.core.service.technical.CacheService;
34  import org.apache.commons.collections4.CollectionUtils;
35  import org.hibernate.Query;
36  import org.hibernate.SessionFactory;
37  import org.hibernate.type.IntegerType;
38  import org.hibernate.type.StringType;
39  import org.springframework.beans.factory.annotation.Autowired;
40  import org.springframework.cache.Cache;
41  import org.springframework.dao.DataRetrievalFailureException;
42  import org.springframework.stereotype.Repository;
43  
44  import javax.annotation.Resource;
45  import java.util.*;
46  
47  /**
48   * Sampling Equipment DAO
49   * <p/>
50   * Created by Ludovic on 17/07/2015.
51   */
52  
53  @Repository("daliSamplingEquipmentDao")
54  public class DaliSamplingEquipmentDaoImpl extends SamplingEquipmentDaoImpl implements DaliSamplingEquipmentDao {
55  
56      @Resource
57      protected CacheService cacheService;
58  
59      @Resource
60      protected DaliConfiguration config;
61  
62      @Resource(name = "daliTranscribingItemDao")
63      private DaliTranscribingItemDao transcribingItemDao;
64  
65      @Resource(name = "daliUnitDao")
66      private DaliUnitDao unitDao;
67  
68      @Resource(name = "daliReferentialDao")
69      protected DaliReferentialDao referentialDao;
70  
71      /**
72       * Constructor used by Spring
73       *
74       * @param sessionFactory a {@link org.hibernate.SessionFactory} object.
75       */
76      @Autowired
77      public DaliSamplingEquipmentDaoImpl(SessionFactory sessionFactory) {
78          super(sessionFactory);
79      }
80  
81      /** {@inheritDoc} */
82      @Override
83      public List<SamplingEquipmentDTO> getAllSamplingEquipments(List<String> statusCodes) {
84  
85          Cache cacheById = cacheService.getCache(SAMPLING_EQUIPMENT_BY_ID_CACHE);
86          List<SamplingEquipmentDTO> result = new ArrayList<>();
87          Map<Integer, String> transcribingNamesById = getTranscribingNames();
88  
89          Iterator<Object[]> it = Daos.queryIteratorWithStatus(createQuery("allSamplingEquipments"), statusCodes);
90  
91          while (it.hasNext()) {
92              Object[] source = it.next();
93              SamplingEquipmentDTO samplingEquipment = toSamplingEquipmentDTO(Arrays.asList(source).iterator(), transcribingNamesById);
94              result.add(samplingEquipment);
95  
96              // update cache
97              cacheById.put(samplingEquipment.getId(), samplingEquipment);
98          }
99  
100         return ImmutableList.copyOf(result);
101     }
102 
103     /** {@inheritDoc} */
104     @Override
105     public SamplingEquipmentDTO getSamplingEquipmentById(int samplingEquipmentId) {
106 
107         Object[] source = queryUnique("samplingEquipmentById", "samplingEquipmentId", IntegerType.INSTANCE, samplingEquipmentId);
108 
109         if (source == null) {
110             throw new DataRetrievalFailureException("can't load sampling equipment with id = " + samplingEquipmentId);
111         }
112 
113         return toSamplingEquipmentDTO(Arrays.asList(source).iterator(), getTranscribingNames());
114     }
115 
116     /** {@inheritDoc} */
117     @Override
118     @SuppressWarnings("unchecked")
119     public List<SamplingEquipmentDTO> getSamplingEquipmentsByIds(List<Integer> samplingEquipmentIds) {
120 
121         List<SamplingEquipmentDTO> result = new ArrayList<>();
122         if (CollectionUtils.isEmpty(samplingEquipmentIds))
123             return result;
124 
125         Map<Integer, String> transcribingNamesById = getTranscribingNames();
126 
127         Iterator<Object[]> it = createQuery("samplingEquipmentsByIds")
128                 .setParameterList("samplingEquipmentIds", samplingEquipmentIds)
129                 .iterate();
130 
131         while (it.hasNext()) {
132             Object[] row = it.next();
133             result.add(toSamplingEquipmentDTO(Arrays.asList(row).iterator(), transcribingNamesById));
134         }
135 
136         return result;
137 
138     }
139 
140     /** {@inheritDoc} */
141     @Override
142     public List<SamplingEquipmentDTO> findSamplingEquipments(List<String> statusCodes, Integer samplingEquipmentId, Integer unitId) {
143 
144         List<SamplingEquipmentDTO> result = new ArrayList<>();
145         Map<Integer, String> transcribingNamesById = getTranscribingNames();
146 
147         Query query = createQuery("samplingEquipmentsByCriteria",
148                 "samplingEquipmentId", IntegerType.INSTANCE, samplingEquipmentId,
149                 "unitId", IntegerType.INSTANCE, unitId);
150 
151         Iterator<Object[]> it = Daos.queryIteratorWithStatus(query, statusCodes);
152 
153         while (it.hasNext()) {
154             Object[] source = it.next();
155             result.add(toSamplingEquipmentDTO(Arrays.asList(source).iterator(), transcribingNamesById));
156         }
157 
158         return ImmutableList.copyOf(result);
159     }
160 
161     /** {@inheritDoc} */
162     @Override
163     public List<SamplingEquipmentDTO> findSamplingEquipmentsByName(List<String> statusCodes, String samplingEquipmentName) {
164 
165         List<SamplingEquipmentDTO> result = new ArrayList<>();
166         Map<Integer, String> transcribingNamesById = getTranscribingNames();
167 
168         Query query = createQuery("samplingEquipmentsByName",
169                 "samplingEquipmentName", StringType.INSTANCE, samplingEquipmentName);
170 
171         Iterator<Object[]> it = Daos.queryIteratorWithStatus(query, statusCodes);
172 
173         while (it.hasNext()) {
174             Object[] source = it.next();
175             result.add(toSamplingEquipmentDTO(Arrays.asList(source).iterator(), transcribingNamesById));
176         }
177 
178         return ImmutableList.copyOf(result);
179 
180     }
181 
182     private Map<Integer, String> getTranscribingNames() {
183         return transcribingItemDao.getAllTranscribingItemsById(config.getTranscribingItemTypeLbForSamplingEquipmentNm());
184     }
185 
186     private SamplingEquipmentDTO toSamplingEquipmentDTO(Iterator<Object> source, Map<Integer, String> transcribingNamesById) {
187         SamplingEquipmentDTO result = DaliBeanFactory.newSamplingEquipmentDTO();
188         result.setId((Integer) source.next());
189         result.setName((String) source.next());
190         result.setDescription((String) source.next());
191         result.setSize(Daos.convertToDouble((Float) source.next()));
192         result.setStatus(referentialDao.getStatusByCode((String) source.next()));
193         Integer unitId = (Integer) source.next();
194         if (unitId != null) result.setUnit(unitDao.getUnitById(unitId));
195         result.setComment((String) source.next());
196         result.setCreationDate(Daos.convertToDate(source.next()));
197         result.setUpdateDate(Daos.convertToDate(source.next()));
198 
199         // transcribed name
200         result.setName(transcribingNamesById.getOrDefault(result.getId(), result.getName()));
201 
202         return result;
203     }
204 
205 }