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.collect.Lists;
26 import fr.ifremer.adagio.core.service.technical.CacheService;
27 import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocol;
28 import fr.ifremer.tutti.persistence.entities.protocol.SpeciesProtocols;
29 import fr.ifremer.tutti.persistence.entities.protocol.Strata;
30 import fr.ifremer.tutti.persistence.entities.protocol.Stratas;
31 import fr.ifremer.tutti.persistence.entities.protocol.SubStrata;
32 import fr.ifremer.tutti.persistence.entities.protocol.SubStratas;
33 import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocol;
34 import fr.ifremer.tutti.persistence.entities.protocol.TuttiProtocols;
35 import fr.ifremer.tutti.persistence.entities.protocol.Zone;
36 import fr.ifremer.tutti.persistence.entities.protocol.Zones;
37 import org.apache.commons.io.FileUtils;
38 import org.apache.commons.logging.Log;
39 import org.apache.commons.logging.LogFactory;
40 import org.nuiton.jaxx.application.ApplicationIOUtil;
41 import org.nuiton.util.beans.Binder;
42 import org.nuiton.util.beans.BinderFactory;
43 import org.springframework.stereotype.Service;
44
45 import javax.annotation.Resource;
46 import java.io.File;
47 import java.util.ArrayList;
48 import java.util.Collection;
49 import java.util.Collections;
50 import java.util.List;
51 import java.util.UUID;
52 import java.util.stream.Collectors;
53
54 import static org.nuiton.i18n.I18n.t;
55
56
57
58
59
60 @Service("protocolPersistenceService")
61 public class ProtocolPersistenceServiceImpl extends AbstractPersistenceService implements ProtocolPersistenceService {
62
63
64 private static final Log log =
65 LogFactory.getLog(ProtocolPersistenceServiceImpl.class);
66
67 public static final String TUTTI_PROTOCOL_EXTENSION = "tuttiProtocol";
68
69 public static TuttiProtocol sharedProtocol;
70
71 @Resource(name = "cacheService")
72 protected CacheService cacheService;
73
74 public TuttiProtocol getProtocol() {
75 return sharedProtocol;
76 }
77
78 public void setProtocol(TuttiProtocol protocol) {
79 if (log.isDebugEnabled()) {
80 log.debug("Set shared protocol: " + protocol);
81 }
82 sharedProtocol = protocol;
83
84 try {
85 cacheService.clearCache("species");
86 cacheService.clearCache("referentSpecies");
87 cacheService.clearCache("referentSpeciesById");
88 cacheService.clearCache("referentSpeciesByIdVernacular");
89 cacheService.clearCache("obsoleteReferentTaxons");
90 } catch (Exception e) {
91
92
93 if (log.isErrorEnabled()) {
94 log.error("Could not clear caches", e);
95 }
96 }
97 }
98
99 @Override
100 public boolean isProtocolExist(String id) {
101 return getAllProtocolId().contains(id);
102 }
103
104 @Override
105 public String getFirstAvailableName(String protocolName) {
106
107 List<String> allProtocolNames = getAllProtocolNames();
108
109 String availableName;
110
111 if (allProtocolNames.contains(protocolName)) {
112
113 availableName = TuttiProtocols.getFirstAvailableName(protocolName, allProtocolNames);
114
115 } else {
116
117 availableName = protocolName;
118 }
119
120 return availableName;
121
122 }
123
124 @Override
125 public TuttiProtocol getProtocolByName(String protocolName) {
126
127 TuttiProtocol result = null;
128 for (TuttiProtocol protocol : getAllProtocol()) {
129 if (protocolName.equals(protocol.getName()))
130 result = protocol;
131 }
132 return result;
133
134 }
135
136 @Override
137 public List<String> getAllProtocolId() {
138
139 File protocolDirectory = config.getProtocolDirectory();
140 Collection<File> files = FileUtils.listFiles(
141 protocolDirectory,
142 new String[]{TUTTI_PROTOCOL_EXTENSION}, false);
143 List<String> result = Lists.newArrayListWithCapacity(files.size());
144 if (log.isDebugEnabled()) {
145 log.debug("Found " + files.size() + " protocol(s).");
146 }
147 int suffixLength = TUTTI_PROTOCOL_EXTENSION.length() + 1;
148 for (File file : files) {
149 String fileName = file.getName();
150 result.add(fileName.substring(0,
151 fileName.length() - suffixLength));
152 }
153 return Collections.unmodifiableList(result);
154 }
155
156 @Override
157 public List<String> getAllProtocolNames() {
158
159 List<String> result = Lists.newArrayList();
160 result.addAll(getAllProtocol().stream().map(TuttiProtocol::getName).collect(Collectors.toList()));
161 return Collections.unmodifiableList(result);
162 }
163
164 @Override
165 public List<TuttiProtocol> getAllProtocol() {
166 List<TuttiProtocol> result = Lists.newArrayList();
167 for (String id : getAllProtocolId()) {
168 TuttiProtocol protocol = getProtocol(id);
169 result.add(protocol);
170 }
171 return Collections.unmodifiableList(result);
172 }
173
174 @Override
175 public List<TuttiProtocol> getAllProtocol(String programId) {
176 List<TuttiProtocol> result = Lists.newArrayList();
177 for (String id : getAllProtocolId()) {
178 TuttiProtocol protocol = getProtocol(id);
179 if (TuttiProtocols.matchProgramId(protocol, programId)) {
180 if (log.isDebugEnabled()) {
181 log.debug("Keep protocol: " + protocol.getName() + ", programId: " + programId + " matches!");
182 }
183 result.add(protocol);
184 } else {
185 if (log.isDebugEnabled()) {
186 log.debug("Remove protocol: " + protocol.getName() + ", programId: " + programId + " does not match!");
187 }
188 }
189 }
190 return Collections.unmodifiableList(result);
191 }
192
193 @Override
194 public TuttiProtocol getProtocol(String id) {
195 File file = getProtocolFile(id);
196 return TuttiProtocols.fromFile(file);
197 }
198
199 @Override
200 public TuttiProtocol createProtocol(TuttiProtocol bean) {
201 Binder<TuttiProtocol, TuttiProtocol> protocolBinder =
202 BinderFactory.newBinder(TuttiProtocol.class);
203
204 TuttiProtocol result = TuttiProtocols.newTuttiProtocol();
205 protocolBinder.copy(bean, result);
206 result.setId(UUID.randomUUID().toString());
207
208
209
210
211 result.setLengthClassesPmfmId(bean.getLengthClassesPmfmId());
212 result.setCaracteristicMapping(bean.getCaracteristicMapping());
213
214 Binder<SpeciesProtocol, SpeciesProtocol> speciesProtocolBinder =
215 BinderFactory.newBinder(SpeciesProtocol.class);
216
217 List<SpeciesProtocol> species = Lists.newArrayList();
218 if (!bean.isSpeciesEmpty()) {
219 for (SpeciesProtocol speciesProtocol : bean.getSpecies()) {
220 SpeciesProtocol s = SpeciesProtocols.newSpeciesProtocol();
221 speciesProtocolBinder.copy(speciesProtocol, s);
222 s.setId(UUID.randomUUID().toString());
223 species.add(s);
224 }
225 }
226 result.setSpecies(species);
227
228 List<SpeciesProtocol> benthos = Lists.newArrayList();
229 if (!bean.isBenthosEmpty()) {
230 for (SpeciesProtocol speciesProtocol : bean.getBenthos()) {
231 SpeciesProtocol s = SpeciesProtocols.newSpeciesProtocol();
232 speciesProtocolBinder.copy(speciesProtocol, s);
233 s.setId(UUID.randomUUID().toString());
234 benthos.add(s);
235 }
236 }
237 result.setBenthos(benthos);
238
239 List<Zone> zones = new ArrayList<>();
240 if (!bean.isZoneEmpty()) {
241 for (Zone zone : bean.getZone()) {
242 Zone z = Zones.newZone(zone);
243
244 zones.add(z);
245
246 List<Strata> stratas = new ArrayList<>();
247 if (!zone.isStrataEmpty()) {
248 for (Strata strata : zone.getStrata()) {
249 Strata s = Stratas.newStrata(strata);
250 stratas.add(s);
251
252 List<SubStrata> subStratas = new ArrayList<>();
253 if (!strata.isSubstrataEmpty()) {
254 for (SubStrata subStrata : strata.getSubstrata()) {
255 SubStrata ss = SubStratas.newSubStrata(subStrata);
256 subStratas.add(ss);
257 }
258 }
259 s.setSubstrata(subStratas);
260 }
261 }
262 z.setStrata(stratas);
263 }
264 }
265 result.setZone(zones);
266
267 String id = result.getId();
268
269 File file = getProtocolFile(id);
270 TuttiProtocols.toFile(result, file);
271 return result;
272 }
273
274 @Override
275 public TuttiProtocol saveProtocol(TuttiProtocol bean) {
276 String id = bean.getId();
277
278 File file = getProtocolFile(id);
279 TuttiProtocols.toFile(bean, file);
280 return bean;
281 }
282
283 @Override
284 public void deleteProtocol(String protocolId) {
285 File file = getProtocolFile(protocolId);
286
287 if (file.exists()) {
288 ApplicationIOUtil.deleteFile(
289 file,
290 t("tutti.persistence.protocol.delete.error", protocolId, file));
291 }
292 }
293
294 protected File getProtocolFile(String id) {
295 File protocolDirectory = config.getProtocolDirectory();
296 return new File(protocolDirectory, id + "." + TUTTI_PROTOCOL_EXTENSION);
297 }
298 }