1 package fr.ifremer.tutti.service.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
27 import com.google.common.collect.Lists;
28 import fr.ifremer.tutti.persistence.entities.TuttiEntities;
29 import fr.ifremer.tutti.persistence.entities.referential.Person;
30 import fr.ifremer.tutti.persistence.entities.referential.Persons;
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.CsvConsumerForTemporaryPerson;
36 import fr.ifremer.tutti.service.referential.csv.PersonRow;
37 import fr.ifremer.tutti.service.referential.producer.CsvProducerForTemporaryPerson;
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
51
52
53
54
55 public class ReferentialTemporaryPersonService extends AbstractTuttiService {
56
57
58 private static final Log log =
59 LogFactory.getLog(ReferentialTemporaryPersonService.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<Person, Integer> createReferentialImportRequest() {
73
74 List<Person> allPersons = persistenceService.getAllPerson();
75 return new ReferentialImportRequest<>(allPersons, TuttiEntities.<Person>newIdAstIntFunction(), Persons.GET_FULL_NAME);
76
77 }
78
79 public ReferentialImportResult<Person> importTemporaryPerson(File file) {
80
81 if (log.isInfoEnabled()) {
82 log.info("Will import persons from file: " + file);
83 }
84
85 ReferentialImportRequest<Person, Integer> requestResult = createReferentialImportRequest();
86
87 try (CsvConsumerForTemporaryPerson consumer = new CsvConsumerForTemporaryPerson(file.toPath(), getCsvSeparator(), true)) {
88
89 for (ImportRow<PersonRow> 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.persons.error", file), e);
97 }
98
99 return executeImportRequest(requestResult);
100
101 }
102
103 public ReferentialImportResult<Person> executeImportRequest(ReferentialImportRequest<Person, Integer> requestResult) {
104
105 ReferentialImportResult<Person> result = new ReferentialImportResult<>();
106
107 if (requestResult.withEntitiesToDelete()) {
108
109 List<Integer> idsToDelete = requestResult.getIdsToDelete();
110 persistenceService.deleteTemporaryPersons(idsToDelete);
111 result.setNbRefDeleted(idsToDelete.size());
112
113 }
114
115 if (requestResult.withEntitiesToAdd()) {
116
117 List<Person> entitiesToAdd = requestResult.getEntitiesToAdd();
118 List<Person> entitiesAdded = persistenceService.addTemporaryPersons(entitiesToAdd);
119 result.addAllRefsAdded(entitiesAdded);
120
121 }
122
123 if (requestResult.withEntitiesToUpdate()) {
124
125 List<Person> entitiesToUpdate = requestResult.getEntitiesToUpdate();
126 List<Person> entitiesUpdated = persistenceService.updateTemporaryPersons(entitiesToUpdate);
127 result.addAllRefsUpdated(entitiesUpdated);
128
129 }
130
131 if (requestResult.withEntitiesToLink()) {
132
133 List<Person> entitiesToLink = requestResult.getEntitiesToLink();
134 List<Person> entitiesLinked = persistenceService.linkTemporaryPersons(entitiesToLink);
135 result.addAllRefsLinked(entitiesLinked);
136
137 }
138
139 return result;
140
141 }
142
143 public List<Person> getTemporaryPersons() {
144
145 if (log.isInfoEnabled()) {
146 log.info("Getting all persons from database");
147 }
148 List<Person> targetList = Lists.newArrayList(persistenceService.getAllPerson());
149 if (log.isInfoEnabled()) {
150 log.info("Got " + targetList.size() + " persons");
151 }
152 List<Person> toExport = persistenceService.retainTemporaryPersonList(targetList);
153 if (log.isInfoEnabled()) {
154 log.info("Got " + toExport.size() + " temporary persons");
155 }
156 return toExport;
157
158 }
159
160 public void exportExistingTemporaryPerson(File file) throws IOException {
161
162 List<Person> toExport = getTemporaryPersons();
163 exportTemporaryPerson(file, toExport);
164
165 }
166
167 public void exportTemporaryPersonExample(File file) throws IOException {
168
169 List<Person> toExport = Lists.newArrayList();
170
171 Person p;
172
173 p = Persons.newPerson();
174 p.setFirstName("First name 1");
175 p.setLastName("Last name 1");
176 toExport.add(p);
177
178 p = Persons.newPerson();
179 p.setFirstName("First name 2");
180 p.setLastName("Last name 2");
181 toExport.add(p);
182
183 p = Persons.newPerson();
184 p.setFirstName("First name 3");
185 p.setLastName("Last name 3");
186 toExport.add(p);
187
188 exportTemporaryPerson(file, toExport);
189
190 }
191
192 public void exportTemporaryPerson(File file, List<Person> toExport) throws IOException {
193
194 try (CsvProducerForTemporaryPerson producerForTemporarySpecies = new CsvProducerForTemporaryPerson(file.toPath(), getCsvSeparator())) {
195
196 List<PersonRow> dataToExport = producerForTemporarySpecies.getDataToExport(toExport);
197 producerForTemporarySpecies.write(dataToExport);
198
199 } catch (Exception e) {
200 throw new ApplicationTechnicalException(t("tutti.service.referential.export.person.error", file), e);
201 }
202
203 }
204
205 protected char getCsvSeparator() {
206 return ';';
207 }
208 }