View Javadoc
1   package fr.ifremer.tutti.service.referential;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2014 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU General Public License as
13   * published by the Free Software Foundation, either version 3 of the
14   * License, or (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 General Public
22   * License along with this program.  If not, see
23   * <http://www.gnu.org/licenses/gpl-3.0.html>.
24   * #L%
25   */
26  
27  import com.google.common.collect.Lists;
28  import fr.ifremer.tutti.persistence.entities.TuttiEntities;
29  import fr.ifremer.tutti.persistence.entities.referential.Species;
30  import fr.ifremer.tutti.persistence.entities.referential.Speciess;
31  import fr.ifremer.tutti.service.AbstractTuttiService;
32  import fr.ifremer.tutti.service.DecoratorService;
33  import fr.ifremer.tutti.service.PersistenceService;
34  import fr.ifremer.tutti.service.TuttiServiceContext;
35  import fr.ifremer.tutti.service.referential.consumer.CsvConsumerForTemporarySpecies;
36  import fr.ifremer.tutti.service.referential.csv.SpeciesRow;
37  import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporarySpecies;
38  import org.apache.commons.logging.Log;
39  import org.apache.commons.logging.LogFactory;
40  import org.nuiton.csv.ImportRow;
41  import org.nuiton.jaxx.application.ApplicationTechnicalException;
42  
43  import java.io.File;
44  import java.io.IOException;
45  import java.util.List;
46  
47  import static org.nuiton.i18n.I18n.t;
48  
49  /**
50   * Created on 11/16/14.
51   *
52   * @author Tony Chemit - chemit@codelutin.com
53   * @since 3.10
54   */
55  public class ReferentialTemporarySpeciesService extends AbstractTuttiService {
56  
57      /** Logger. */
58      private static final Log log =
59              LogFactory.getLog(ReferentialTemporarySpeciesService.class);
60  
61      protected PersistenceService persistenceService;
62  
63      protected DecoratorService decoratorService;
64  
65      @Override
66      public void setServiceContext(TuttiServiceContext context) {
67          super.setServiceContext(context);
68          persistenceService = getService(PersistenceService.class);
69          decoratorService = getService(DecoratorService.class);
70      }
71  
72      public ReferentialImportRequest<Species, Integer> createReferentialImportRequest() {
73  
74          List<Species> allSpecies = persistenceService.getAllSpecies();
75          return new ReferentialImportRequest<>(allSpecies, TuttiEntities.<Species>newIdAstIntFunction(), Speciess.GET_NAME);
76  
77      }
78  
79      public ReferentialImportResult<Species> importTemporarySpecies(File file) {
80  
81          if (log.isInfoEnabled()) {
82              log.info("Will import species from file: " + file);
83          }
84  
85          ReferentialImportRequest<Species, Integer> requestResult = createReferentialImportRequest();
86  
87          try (CsvConsumerForTemporarySpecies consumer = new CsvConsumerForTemporarySpecies(file.toPath(), getCsvSeparator(), false, true)) {
88  
89              for (ImportRow<SpeciesRow> bean : consumer) {
90  
91                  consumer.checkRow(bean, persistenceService, decoratorService, requestResult);
92  
93              }
94  
95          } catch (IOException e) {
96              throw new ApplicationTechnicalException(t("tutti.service.referential.import.species.error", file), e);
97          }
98  
99          return executeImportRequest(requestResult);
100 
101     }
102 
103     public ReferentialImportResult<Species> executeImportRequest(ReferentialImportRequest<Species, Integer> requestResult) {
104 
105         ReferentialImportResult<Species> result = new ReferentialImportResult<>();
106 
107         if (requestResult.withEntitiesToDelete()) {
108 
109             List<Integer> idsToDelete = requestResult.getIdsToDelete();
110             persistenceService.deleteTemporarySpecies(idsToDelete);
111             result.setNbRefDeleted(idsToDelete.size());
112 
113         }
114 
115         if (requestResult.withEntitiesToAdd()) {
116 
117             List<Species> entitiesToAdd = requestResult.getEntitiesToAdd();
118             List<Species> entitiesAdded = persistenceService.addTemporarySpecies(entitiesToAdd);
119             result.addAllRefsAdded(entitiesAdded);
120         }
121 
122         if (requestResult.withEntitiesToUpdate()) {
123 
124             List<Species> entitiesToUpdate = requestResult.getEntitiesToUpdate();
125             List<Species> entitiesUpdated = persistenceService.updateTemporarySpecies(entitiesToUpdate);
126             result.addAllRefsUpdated(entitiesUpdated);
127 
128         }
129 
130         if (requestResult.withEntitiesToLink()) {
131 
132             List<Species> entitiesToLink = requestResult.getEntitiesToLink();
133             List<Species> entitiesLinked = persistenceService.linkTemporarySpecies(entitiesToLink);
134             result.addAllRefsLinked(entitiesLinked);
135 
136         }
137 
138         return result;
139 
140     }
141 
142     public List<Species> getTemporarySpeciess() {
143 
144         if (log.isInfoEnabled()) {
145             log.info("Getting all species from database");
146         }
147         List<Species> targetList = Lists.newArrayList(persistenceService.getAllReferentSpecies());
148 
149         if (log.isInfoEnabled()) {
150             log.info("Got " + targetList.size() + " species");
151         }
152         List<Species> toExport = persistenceService.retainTemporarySpeciesList(targetList);
153         if (log.isInfoEnabled()) {
154             log.info("Got " + toExport.size() + " temporary species");
155         }
156         return toExport;
157 
158     }
159 
160     public void exportExistingTemporarySpecies(File file) throws IOException {
161 
162         List<Species> toExport = getTemporarySpeciess();
163         exportTemporarySpecies(file, toExport);
164 
165     }
166 
167     public void exportTemporarySpeciesExample(File file) throws IOException {
168 
169         List<Species> toExport = Lists.newArrayList();
170 
171         {
172             Species s = Speciess.newSpecies();
173             s.setName("Temporary Species name 1");
174             toExport.add(s);
175         }
176         {
177             Species s = Speciess.newSpecies();
178             s.setName("Temporary Species name 2");
179             toExport.add(s);
180         }
181         {
182             Species s = Speciess.newSpecies();
183             s.setName("Temporary Species name 3");
184             toExport.add(s);
185         }
186         exportTemporarySpecies(file, toExport);
187 
188     }
189 
190     public void exportTemporarySpecies(File file, List<Species> toExport) throws IOException {
191 
192         try (CsvProducerForTemporarySpecies producerForTemporarySpecies = new CsvProducerForTemporarySpecies(file.toPath(), getCsvSeparator(), false)) {
193 
194             List<SpeciesRow> dataToExport = producerForTemporarySpecies.getDataToExport(toExport);
195             producerForTemporarySpecies.write(dataToExport);
196 
197         } catch (Exception e) {
198             throw new ApplicationTechnicalException(t("tutti.service.referential.export.species.error", file), e);
199         }
200 
201     }
202 
203     protected char getCsvSeparator() {
204         return ';';
205     }
206 }