View Javadoc
1   package fr.ifremer.tutti.service.protocol;
2   
3   /*
4    * #%L
5    * Tutti :: Service
6    * %%
7    * Copyright (C) 2012 - 2014 Ifremer
8    * %%
9    * This program is free software: you can redistribute it and/or modify
10   * it under the terms of the GNU General Public License as
11   * published by the Free Software Foundation, either version 3 of the 
12   * License, or (at your option) any later version.
13   * 
14   * This program is distributed in the hope that it will be useful,
15   * but WITHOUT ANY WARRANTY; without even the implied warranty of
16   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   * GNU General Public License for more details.
18   * 
19   * You should have received a copy of the GNU General Public 
20   * License along with this program.  If not, see
21   * <http://www.gnu.org/licenses/gpl-3.0.html>.
22   * #L%
23   */
24  
25  import com.google.common.collect.Sets;
26  import fr.ifremer.tutti.persistence.entities.protocol.Rtps;
27  import fr.ifremer.tutti.persistence.entities.referential.Caracteristic;
28  import fr.ifremer.tutti.persistence.entities.referential.Species;
29  import fr.ifremer.tutti.service.csv.AbstractTuttiImportExportModel;
30  import fr.ifremer.tutti.service.csv.ForeignKeyParserFormatter;
31  import fr.ifremer.tutti.service.csv.StringParserFormatter;
32  import fr.ifremer.tutti.service.csv.TuttiCsvUtil;
33  import org.nuiton.csv.Common;
34  import org.nuiton.csv.ImportRuntimeException;
35  
36  import java.text.ParseException;
37  import java.util.Map;
38  import java.util.Set;
39  
40  import static org.nuiton.i18n.I18n.t;
41  
42  /**
43   * Model to import / export {@link SpeciesRow}.
44   *
45   * @author Tony Chemit - chemit@codelutin.com
46   * @since 1.0
47   */
48  public class SpeciesRowModel extends AbstractTuttiImportExportModel<SpeciesRow> {
49  
50      public static SpeciesRowModel forExport(char separator) {
51  
52          SpeciesRowModel result = new SpeciesRowModel(separator);
53          result.newColumnForExport(SpeciesRow.PROPERTY_SPECIES_REFERENCE_TAXON_ID, Common.INTEGER);
54          result.newColumnForExport(SpeciesRow.PROPERTY_SPECIES_REF_TAX_CODE);
55          result.newColumnForExport(SpeciesRow.PROPERTY_SPECIES_NAME);
56          result.newColumnForExport(SpeciesRow.PROPERTY_SPECIES_SURVEY_CODE);
57          result.newColumnForExport(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_ID);
58          result.newColumnForExport(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_PARAMETER_NAME);
59          result.newColumnForExport(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_MATRIX_NAME);
60          result.newColumnForExport(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_FRACTION_NAME);
61          result.newColumnForExport(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_METHOD_NAME);
62          result.newColumnForExport(SpeciesRow.PROPERTY_MANDATORY_SAMPLE_CATEGORY_ID, TuttiCsvUtil.INTEGER_LIST_PARSER_FORMATTER);
63          result.newColumnForExport(SpeciesRow.PROPERTY_WEIGHT_ENABLED, Common.PRIMITIVE_BOOLEAN);
64          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_MALE_A, Common.DOUBLE);
65          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_MALE_B, Common.FLOAT);
66          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_FEMALE_A, Common.DOUBLE);
67          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_FEMALE_B, Common.FLOAT);
68          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_UNDEFINED_A, Common.DOUBLE);
69          result.newColumnForExport(SpeciesRow.PROPERTY_RTP_UNDEFINED_B, Common.FLOAT);
70          return result;
71      }
72  
73      public static SpeciesRowModel forImport(char separator,
74                                              Map<String, Caracteristic> caracteristicMap,
75                                              Map<String, Species> speciesMap) {
76  
77          SpeciesRowModel result = new SpeciesRowModel(separator);
78          result.newMandatoryColumn(
79                  SpeciesRow.PROPERTY_SPECIES_REFERENCE_TAXON_ID,
80                  SpeciesRow.PROPERTY_SPECIES,
81                  new ForeignKeyParserFormatter<Species>(Species.class, Species.PROPERTY_REFERENCE_TAXON_ID, speciesMap) {
82  
83                      Set<Integer> taxonIds = Sets.newHashSet();
84  
85                      @Override
86                      public Species parse(String value) throws ParseException {
87                          Species species = super.parse(value);
88                          Integer referenceTaxonId = species.getReferenceTaxonId();
89                          if (taxonIds.contains(referenceTaxonId)) {
90  
91                              // duplicate reference taxon id used
92                              throw new ImportRuntimeException(t("tutti.service.protocol.import.taxonUsed.error", referenceTaxonId));
93                          }
94                          taxonIds.add(referenceTaxonId);
95                          return species;
96                      }
97                  });
98  
99          result.newOptionalColumn(SpeciesRow.PROPERTY_SPECIES_REF_TAX_CODE);
100         result.newOptionalColumn(SpeciesRow.PROPERTY_SPECIES_NAME);
101 
102         result.newForeignKeyColumn(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_ID,
103                 SpeciesRow.PROPERTY_LENGTH_STEP_PMFM,
104                 Caracteristic.class,
105                 Caracteristic.PROPERTY_ID,
106                 caracteristicMap);
107 
108         result.newIgnoredColumn(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_PARAMETER_NAME);
109         result.newIgnoredColumn(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_MATRIX_NAME);
110         result.newIgnoredColumn(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_FRACTION_NAME);
111         result.newIgnoredColumn(SpeciesRow.PROPERTY_LENGTH_STEP_PMFM_METHOD_NAME);
112         result.newIgnoredColumn(SpeciesRow.PROPERTY_CALCIFY_SAMPLE_ENABLED);
113         result.newIgnoredColumn(SpeciesRow.PROPERTY_COUNT_IF_NO_FREQUENCY_ENABLED);
114 
115         //FIXME See if really needed, otherwise just use the default String parser
116 //        result.newMandatoryColumn(SpeciesRow.PROPERTY_SPECIES_SURVEY_CODE);
117         result.newMandatoryColumn(SpeciesRow.PROPERTY_SPECIES_SURVEY_CODE, new StringParserFormatter(null, true));
118         result.newMandatoryColumn(SpeciesRow.PROPERTY_MANDATORY_SAMPLE_CATEGORY_ID, TuttiCsvUtil.INTEGER_LIST_PARSER_FORMATTER);
119         result.newMandatoryColumn(SpeciesRow.PROPERTY_WEIGHT_ENABLED, Common.PRIMITIVE_BOOLEAN);
120         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_MALE_A, Common.DOUBLE);
121         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_MALE_B, Common.FLOAT);
122         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_FEMALE_A, Common.DOUBLE);
123         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_FEMALE_B, Common.FLOAT);
124         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_UNDEFINED_A, Common.DOUBLE);
125         result.newOptionalColumn(SpeciesRow.PROPERTY_RTP_UNDEFINED_B, Common.FLOAT);
126         return result;
127     }
128 
129     public SpeciesRowModel(char separator) {
130         super(separator);
131     }
132 
133     @Override
134     public SpeciesRow newEmptyInstance() {
135         SpeciesRow speciesRow = new SpeciesRow();
136         speciesRow.setRtpMale(Rtps.newRtp());
137         speciesRow.setRtpFemale(Rtps.newRtp());
138         speciesRow.setRtpUndefined(Rtps.newRtp());
139         return speciesRow;
140     }
141 
142 }