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.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   * @author Tony Chemit - chemit@codelutin.com
58   * @since 0.3
59   */
60  @Service("protocolPersistenceService")
61  public class ProtocolPersistenceServiceImpl extends AbstractPersistenceService implements ProtocolPersistenceService {
62  
63      /** Logger. */
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              //FIXME This
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 //        result.setLengthClassesPmfmId(TuttiEntities.getList(bean.getLengthClassesPmfmId()));
209 //        result.setVesselUseFeaturePmfmId(TuttiEntities.getList(bean.getVesselUseFeaturePmfmId()));
210 //        result.setGearUseFeaturePmfmId(TuttiEntities.getList(bean.getGearUseFeaturePmfmId()));
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 }