1 package fr.ifremer.tutti.service.genericformat;
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.base.Function;
28 import com.google.common.collect.ImmutableList;
29 import com.google.common.collect.Ordering;
30 import fr.ifremer.tutti.persistence.entities.CaracteristicMap;
31 import fr.ifremer.tutti.persistence.entities.data.CatchBatch;
32 import fr.ifremer.tutti.persistence.entities.data.Cruise;
33 import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
34 import fr.ifremer.tutti.persistence.entities.data.FishingOperations;
35 import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
36 import fr.ifremer.tutti.persistence.entities.referential.Gear;
37 import fr.ifremer.tutti.persistence.model.CruiseDataModel;
38 import fr.ifremer.tutti.persistence.model.OperationDataModel;
39 import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport;
40
41 import java.io.Closeable;
42 import java.io.Serializable;
43 import java.util.Collections;
44 import java.util.HashSet;
45 import java.util.Iterator;
46 import java.util.LinkedHashSet;
47 import java.util.Map;
48 import java.util.Set;
49 import java.util.TreeMap;
50 import java.util.stream.Collectors;
51
52
53
54
55
56
57
58 public class GenericFormatImportCruiseContext implements Closeable, Iterable<GenericFormatImportOperationContext> {
59
60
61
62
63 private final Cruise cruise;
64
65
66
67
68 private final CruiseDataModel selectiontCruiseData;
69
70
71
72
73 private final CruiseDataModel existingCruiseData;
74
75 private final String cruiseLabel;
76
77 private final Map<String, GenericFormatImportOperationContext> fishingOperationContexts;
78
79 private final Set<Gear> gearsWithcaracteristics;
80
81 private final Set<FishingOperation> existingOperations;
82
83 private final Set<String> skippedFishingOperationsNaturalId;
84
85 public GenericFormatImportCruiseContext(Cruise cruise, CruiseDataModel selectiontCruiseData, CruiseDataModel existingCruiseData, Set<FishingOperation> existingOperations, String cruiseLabel) {
86 this.cruise = cruise;
87 this.selectiontCruiseData = selectiontCruiseData;
88 this.existingCruiseData = existingCruiseData;
89 this.existingOperations = existingOperations == null ? Collections.<FishingOperation>emptySet() : existingOperations;
90 this.cruiseLabel = cruiseLabel;
91 this.fishingOperationContexts = new TreeMap<>();
92 this.gearsWithcaracteristics = new HashSet<>();
93 this.skippedFishingOperationsNaturalId = new LinkedHashSet<>();
94 }
95
96 public Iterable<GenericFormatImportOperationContext> orderedFishingOperationContexts() {
97
98 return Ordering.from(FishingOperations.FISHING_OPERATION_COMPARATOR).onResultOf(new Function<GenericFormatImportOperationContext, FishingOperation>() {
99
100 @Override
101 public FishingOperation apply(GenericFormatImportOperationContext input) {
102 return input.getFishingOperation();
103 }
104 }).sortedCopy(fishingOperationContexts.values());
105
106 }
107
108 @Override
109 public void close() {
110
111 fishingOperationContexts.values().forEach(GenericFormatImportOperationContext::close);
112 fishingOperationContexts.clear();
113
114 }
115
116 @Override
117 public Iterator<GenericFormatImportOperationContext> iterator() {
118 return ImmutableList.copyOf(fishingOperationContexts.values()).iterator();
119 }
120
121 public Cruise getCruise() {
122 return cruise;
123 }
124
125 public CruiseDataModel getExistingCruiseData() {
126 return existingCruiseData;
127 }
128
129 public OperationDataModel getExistingFishingOperationData(FishingOperation importRowCruise) {
130
131 OperationDataModel result = null;
132
133 String fishingOperationId = getExistingFishingOperationId(importRowCruise);
134 if (fishingOperationId != null) {
135
136 for (OperationDataModel operationDataModel : existingCruiseData) {
137 if (fishingOperationId.equals(operationDataModel.getId())) {
138 result = operationDataModel;
139 break;
140 }
141 }
142 }
143 return result;
144
145 }
146
147
148 public String getCruiseLabel() {
149 return cruiseLabel;
150 }
151
152 public Gear getGear(Gear gear, int rankOrder) {
153
154 Gear result = null;
155
156 int index = rankOrder - 1;
157 boolean gearExists = cruise.sizeGear() > index;
158 if (gearExists) {
159 Gear cruiseGear = cruise.getGear(index);
160 gearExists = cruiseGear.getId().equals(gear.getId());
161 if (gearExists) {
162 result = cruiseGear;
163 }
164 }
165 return result;
166
167 }
168
169 public void addFishingOperation(FishingOperation fishingOperation, CatchBatch catchBatch, String fishingOperationLabel) {
170
171 OperationDataModel existingFishingOperationData = getExistingFishingOperationData(fishingOperation);
172 fishingOperationContexts.put(fishingOperation.getId(), new GenericFormatImportOperationContext(fishingOperation, catchBatch, existingFishingOperationData, fishingOperationLabel));
173 }
174
175 public void addSkippedFishingOperation(FishingOperation fishingOperation) {
176
177 String naturalId = FishingOperations.getNaturalId(fishingOperation);
178 skippedFishingOperationsNaturalId.add(naturalId);
179
180 }
181
182 public boolean isFishingOperationSkipped(RowWithOperationContextSupport row) {
183
184 FishingOperation fishingOperation = row.getFishingOperation();
185 String naturalId = FishingOperations.getNaturalId(fishingOperation);
186 return skippedFishingOperationsNaturalId.contains(naturalId);
187
188 }
189
190 public boolean isFishingOperationAlreadyImported(RowWithOperationContextSupport row) {
191
192 GenericFormatImportOperationContext fishingOperationContext = getFishingOperationContext(row);
193 return fishingOperationContext != null;
194
195 }
196
197 public OperationDataModel getSelectedFishingOperation(FishingOperation row) {
198
199 OperationDataModel result = null;
200
201 for (OperationDataModel selectedFishingOperation : selectiontCruiseData) {
202 boolean equals = FishingOperations.equalsNaturalId(row, selectedFishingOperation.getId());
203 if (equals) {
204 result = selectedFishingOperation;
205 break;
206 }
207 }
208
209 return result;
210
211 }
212
213 public GenericFormatImportOperationContext getFishingOperationContext(RowWithOperationContextSupport row) {
214
215 FishingOperation fishingOperation = row.getFishingOperation();
216 GenericFormatImportOperationContext result = null;
217 for (GenericFormatImportOperationContext importOperationContext : fishingOperationContexts.values()) {
218
219 FishingOperation importedFishingOperation = importOperationContext.getFishingOperation();
220 boolean equals = FishingOperations.equals(importedFishingOperation, fishingOperation);
221 if (equals) {
222 result = importOperationContext;
223 break;
224 }
225
226 }
227
228 return result;
229
230 }
231
232 public Iterable<FishingOperation> getFishingOperations() {
233 return fishingOperationContexts.values().stream().map(GenericFormatImportOperationContext.TO_FISHING_OPERATION_FUNCTION::apply).collect(Collectors.toList());
234 }
235
236 public boolean withGearCaracteristics() {
237 return !gearsWithcaracteristics.isEmpty();
238 }
239
240 public void addGearCaracteristic(Gear gear, Caracteristic caracteristic, Serializable caracteristicValue) {
241
242 gearsWithcaracteristics.add(gear);
243
244 CaracteristicMap caracteristics = gear.getCaracteristics();
245 if (caracteristics == null) {
246 caracteristics = new CaracteristicMap();
247 gear.setCaracteristics(caracteristics);
248 }
249 caracteristics.put(caracteristic, caracteristicValue);
250
251 }
252
253 public Set<Gear> getGearsWithcaracteristics() {
254 return gearsWithcaracteristics;
255 }
256
257 protected String getExistingFishingOperationId(FishingOperation importRowCruise) {
258
259 String result = null;
260 for (FishingOperation fishingOperation : existingOperations) {
261
262 boolean equals = FishingOperations.equals(importRowCruise, fishingOperation);
263 if (equals) {
264 result = fishingOperation.getId();
265 break;
266 }
267
268 }
269 return result;
270
271 }
272 }