View Javadoc
1   package fr.ifremer.tutti.service.genericformat;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2015 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.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   * Created on 2/22/15.
54   *
55   * @author Tony Chemit - chemit@codelutin.com
56   * @since 3.14
57   */
58  public class GenericFormatImportCruiseContext implements Closeable, Iterable<GenericFormatImportOperationContext> {
59  
60      /**
61       * The imported cruise.
62       */
63      private final Cruise cruise;
64  
65      /**
66       * The optional selection data.
67       */
68      private final CruiseDataModel selectiontCruiseData;
69  
70      /**
71       * The optional existing cruise.
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 }