1 package fr.ifremer.dali.dao.referential;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
49
50
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
73
74
75
76 @Autowired
77 public DaliSamplingEquipmentDaoImpl(SessionFactory sessionFactory) {
78 super(sessionFactory);
79 }
80
81
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
97 cacheById.put(samplingEquipment.getId(), samplingEquipment);
98 }
99
100 return ImmutableList.copyOf(result);
101 }
102
103
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
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
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
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
200 result.setName(transcribingNamesById.getOrDefault(result.getId(), result.getName()));
201
202 return result;
203 }
204
205 }