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 fr.ifremer.tutti.persistence.entities.data.Cruise;
28  import fr.ifremer.tutti.persistence.entities.data.FishingOperation;
29  import fr.ifremer.tutti.persistence.entities.referential.Gear;
30  import fr.ifremer.tutti.service.TuttiValidationDataContextSupport;
31  import fr.ifremer.tutti.service.ValidationService;
32  import fr.ifremer.tutti.service.csv.CsvComsumer;
33  import fr.ifremer.tutti.service.genericformat.consumer.CruiseNotFoundException;
34  import fr.ifremer.tutti.service.genericformat.consumer.FishingOperationNotFoundInCruiseException;
35  import fr.ifremer.tutti.service.genericformat.consumer.GearNotFoundInCruiseException;
36  import fr.ifremer.tutti.service.genericformat.csv.RowWithCruiseContextSupport;
37  import fr.ifremer.tutti.service.genericformat.csv.RowWithOperationContextSupport;
38  import org.apache.commons.io.IOUtils;
39  import org.nuiton.csv.ImportRow;
40  import org.nuiton.validator.NuitonValidatorResult;
41  import org.nuiton.validator.NuitonValidatorScope;
42  
43  import java.io.Closeable;
44  import java.util.ArrayList;
45  import java.util.LinkedHashSet;
46  import java.util.List;
47  import java.util.Set;
48  import java.util.StringTokenizer;
49  
50  import static org.nuiton.i18n.I18n.t;
51  
52  /**
53   * Created on 2/19/15.
54   *
55   * @author Tony Chemit - chemit@codelutin.com
56   * @since 3.14
57   */
58  public class GenericFormatImportValidationHelper implements Closeable {
59  
60      private final ValidationService validationService;
61  
62      private final TuttiValidationDataContextSupport originalValidationDataContextSupport;
63  
64      private final GenericFormatImportValidationDataContext validationDataContext;
65  
66      public GenericFormatImportValidationHelper(GenericFormatContextSupport importContext, ValidationService validationService) {
67          this.validationService = validationService;
68          this.validationDataContext = new GenericFormatImportValidationDataContext(importContext);
69          this.originalValidationDataContextSupport = TuttiValidationDataContextSupport.setValidationContext(validationDataContext, true);
70      }
71  
72      public static String getMessage(String prefix, Set<String> messages) {
73  
74          StringBuilder builder = new StringBuilder(prefix);
75          builder.append("<ul>");
76          for (String message : messages) {
77              builder.append("<li>").append(message).append("</li>");
78  
79          }
80          builder.append("</ul>");
81          return builder.toString();
82  
83      }
84  
85      public Set<String> getMessages(NuitonValidatorResult validatorResult, NuitonValidatorScope scope) {
86  
87          Set<String> result = null;
88          if (validatorResult.hasMessagesForScope(scope)) {
89  
90              result = new LinkedHashSet<>();
91  
92              List<String> messagesForScope = validatorResult.getMessagesForScope(scope);
93              for (String message : messagesForScope) {
94  
95                  String i18nError = getI18nError(message);
96                  result.add(i18nError);
97              }
98  
99          }
100         return result;
101 
102     }
103 
104     protected String getI18nError(String error) {
105         String text;
106         if (!error.contains("##")) {
107             text = t(error);
108         } else {
109             StringTokenizer stk = new StringTokenizer(error, "##");
110             String errorName = stk.nextToken();
111             List<String> args = new ArrayList<>();
112             while (stk.hasMoreTokens()) {
113                 args.add(stk.nextToken());
114             }
115             text = t(errorName, args.toArray());
116         }
117         return text;
118     }
119 
120     @Override
121     public void close() {
122 
123         IOUtils.closeQuietly(validationService);
124 
125         TuttiValidationDataContextSupport.setValidationContext(originalValidationDataContextSupport, true);
126 
127     }
128 
129 //    public void useFishingOperationInValidation(FishingOperation fishingOperation) {
130 //        validationDataContext.setFishingOperation(fishingOperation);
131 //    }
132 
133     public NuitonValidatorResult validateCruise(Cruise cruise) {
134         return validationService.validateEditCruise(cruise);
135     }
136 
137     public NuitonValidatorResult validateFishingOperation(FishingOperation fishingOperation) {
138 
139         Cruise previousCruise = validationDataContext.getCruise();
140         try {
141             Cruise cruise = fishingOperation.getCruise();
142             validationDataContext.setCruise(cruise);
143             validationDataContext.setFishingOperation(fishingOperation);
144             return validationService.validateEditFishingOperation(fishingOperation);
145         } finally {
146             validationDataContext.setCruise(previousCruise);
147         }
148     }
149 
150     public <R extends RowWithCruiseContextSupport> GenericFormatImportCruiseContext getCruise(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatContextSupport importContext) {
151 
152         GenericFormatImportCruiseContext cruiseContext = null;
153 
154         if (row.isValid()) {
155 
156             R bean = row.getBean();
157 
158             boolean cruiseSkipped = importContext instanceof GenericFormatImportContext
159                                     && importContext.isCruiseSkipped(bean);
160 
161             if (!cruiseSkipped) {
162 
163                 cruiseContext = importContext.getCruiseContext(bean);
164 
165                 if (cruiseContext == null) {
166 
167                     consumer.addCheckError(row, new CruiseNotFoundException(bean.getCruise()));
168 
169                 } else {
170 
171                     Cruise cruise = cruiseContext.getCruise();
172                     bean.setCruise(cruise);
173                     if (bean instanceof RowWithOperationContextSupport) {
174                         ((RowWithOperationContextSupport) bean).getFishingOperation().setCruise(cruise);
175 
176                     }
177 
178                 }
179 
180             }
181 
182         }
183 
184         return cruiseContext;
185 
186     }
187 
188     public <R extends RowWithOperationContextSupport> GenericFormatImportOperationContext getFishingOperationContext(CsvComsumer<R, ?> consumer, ImportRow<R> row, GenericFormatContextSupport importContext) {
189 
190         GenericFormatImportOperationContext fishingOperationContext = null;
191 
192         GenericFormatImportCruiseContext cruiseContext = getCruise(consumer, row, importContext);
193 
194         if (cruiseContext != null) {
195 
196             R bean = row.getBean();
197 
198             boolean fishingOperationSkipped = importContext instanceof GenericFormatImportContext
199                                               && cruiseContext.isFishingOperationSkipped(bean);
200 
201             if (!fishingOperationSkipped) {
202 
203                 fishingOperationContext = cruiseContext.getFishingOperationContext(bean);
204 
205                 if (fishingOperationContext == null) {
206 
207                     consumer.addCheckError(row, new FishingOperationNotFoundInCruiseException(bean.getFishingOperation()));
208 
209                 } else {
210 
211                     bean.setFishingOperation(fishingOperationContext.getFishingOperation());
212 
213                 }
214 
215             }
216 
217         }
218 
219         return fishingOperationContext;
220 
221     }
222 
223     public <R extends RowWithCruiseContextSupport> Gear getGear(CsvComsumer<R, ?> consumer, GenericFormatContextSupport importContext, ImportRow<R> row, Gear gear, short rankOrder) {
224 
225         Gear cruiseGear = null;
226 
227         Cruise cruise = row.getBean().getCruise();
228         GenericFormatImportCruiseContext cruiseContext = importContext.getCruiseContext(cruise);
229         if (cruiseContext != null) {
230             cruiseGear = cruiseContext.getGear(gear, rankOrder);
231             if (cruiseGear == null) {
232                 consumer.addCheckError(row, new GearNotFoundInCruiseException(cruise, gear, rankOrder));
233             }
234         }
235 
236         return cruiseGear;
237 
238     }
239 
240 }