View Javadoc
1   package fr.ifremer.tutti;
2   
3   /*
4    * #%L
5    * Tutti :: Persistence
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.base.Charsets;
26  import fr.ifremer.adagio.core.config.AdagioConfiguration;
27  import fr.ifremer.adagio.core.config.AdagioConfigurationOption;
28  import fr.ifremer.tutti.persistence.entities.data.SampleCategoryModel;
29  import fr.ifremer.tutti.type.CoordinateEditorType;
30  import fr.ifremer.tutti.type.WeightUnit;
31  import fr.ifremer.tutti.util.BeepFrequency;
32  import org.apache.commons.lang3.StringUtils;
33  import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
34  import org.apache.commons.logging.Log;
35  import org.apache.commons.logging.LogFactory;
36  import org.nuiton.config.ApplicationConfig;
37  import org.nuiton.config.ApplicationConfigHelper;
38  import org.nuiton.config.ApplicationConfigProvider;
39  import org.nuiton.config.ArgumentsParserException;
40  import org.nuiton.config.ConfigOptionDef;
41  import org.nuiton.jaxx.application.ApplicationConfiguration;
42  import org.nuiton.jaxx.application.ApplicationIOUtil;
43  import org.nuiton.jaxx.application.ApplicationTechnicalException;
44  import org.nuiton.version.Version;
45  
46  import javax.swing.KeyStroke;
47  import java.awt.Color;
48  import java.io.File;
49  import java.io.IOException;
50  import java.net.URL;
51  import java.util.HashMap;
52  import java.util.List;
53  import java.util.Locale;
54  import java.util.Map;
55  import java.util.Set;
56  
57  import static org.nuiton.i18n.I18n.t;
58  
59  /**
60   * Created on 11/24/13.
61   *
62   * @author Tony Chemit - chemit@codelutin.com
63   * @since 3.0
64   */
65  public class TuttiConfiguration extends ApplicationConfiguration {
66  
67      /** Logger. */
68      private static final Log log = LogFactory.getLog(TuttiConfiguration.class);
69  
70      private static TuttiConfiguration instance;
71  
72      private final boolean windowsOS;
73  
74      public static TuttiConfiguration getInstance() {
75          return instance;
76      }
77  
78      public static void setInstance(TuttiConfiguration instance) {
79          TuttiConfiguration.instance = instance;
80      }
81  
82      public static Set<ApplicationConfigProvider> getDefaultApplicationConfig(ApplicationConfig applicationConfig) {
83  
84          // get all config providers
85          Set<ApplicationConfigProvider> providers =
86                  ApplicationConfigHelper.getProviders(null,
87                                                       null,
88                                                       null,
89                                                       true);
90  
91          // load all default options
92          ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
93                                                       providers);
94  
95          // Override some adagio default config
96          Map<ConfigOptionDef, ConfigOptionDef> translateOptions = new HashMap<>();
97  
98          translateOptions.put(TuttiConfigurationOption.BASEDIR, AdagioConfigurationOption.BASEDIR);
99          translateOptions.put(TuttiConfigurationOption.DATA_DIRECTORY, AdagioConfigurationOption.DATA_DIRECTORY);
100         translateOptions.put(TuttiConfigurationOption.DB_NAME, AdagioConfigurationOption.DB_NAME);
101         translateOptions.put(TuttiConfigurationOption.JDBC_USERNAME, AdagioConfigurationOption.JDBC_USERNAME);
102         translateOptions.put(TuttiConfigurationOption.JDBC_PASSWORD, AdagioConfigurationOption.JDBC_PASSWORD);
103         translateOptions.put(TuttiConfigurationOption.JDBC_URL, AdagioConfigurationOption.JDBC_URL);
104 
105         for (Map.Entry<ConfigOptionDef, ConfigOptionDef> entry : translateOptions.entrySet()) {
106             ConfigOptionDef tuttiKey = entry.getKey();
107             ConfigOptionDef adagioKey = entry.getValue();
108             String tuttiOptionValue = String.format("${%s}", tuttiKey.getKey());
109             applicationConfig.setDefaultOption(adagioKey.getKey(), tuttiOptionValue);
110         }
111 
112         applicationConfig.setDefaultOption(AdagioConfigurationOption.DB_ENUMERATION_RESOURCE.getKey(),
113                                            "classpath*:adagio-db-enumerations.properties,classpath*:tutti-db-enumerations.properties");
114 
115         return providers;
116     }
117 
118     protected final String[] optionKeyToNotSave;
119 
120     protected File configFile;
121 
122     protected AdagioConfiguration adagioConfig;
123 
124     public TuttiConfiguration(ApplicationConfig applicationConfig) {
125         super(applicationConfig);
126         optionKeyToNotSave = null;
127         this.windowsOS = System.getProperty("os.name").startsWith("Windows");
128     }
129 
130     public TuttiConfiguration(String file, String... args) {
131         super(new ApplicationConfig());
132         this.windowsOS = System.getProperty("os.name").startsWith("Windows");
133         applicationConfig.setEncoding(Charsets.UTF_8.name());
134         Set<ApplicationConfigProvider> providers = getDefaultApplicationConfig(applicationConfig);
135 
136         // get all transient and final option keys
137         Set<String> optionToSkip =
138                 ApplicationConfigHelper.getTransientOptionKeys(providers);
139 
140         if (log.isDebugEnabled()) {
141             log.debug("Option that won't be saved: " + optionToSkip);
142         }
143         optionKeyToNotSave = optionToSkip.toArray(new String[optionToSkip.size()]);
144 
145         applicationConfig.setConfigFileName(file);
146 
147         applicationConfig.addAlias("--launch-mode", "--option", TuttiConfigurationOption.LAUNCH_MODE.getKey());
148         applicationConfig.addAlias("--basedir", "--option", TuttiConfigurationOption.BASEDIR.getKey());
149         applicationConfig.addAlias("--config-path", "--option", "config.path");
150         applicationConfig.addAlias("--db-sanity", "--option", TuttiConfigurationOption.DB_SANITY.getKey());
151 
152 
153         try {
154             applicationConfig.parse(args);
155 
156         } catch (ArgumentsParserException e) {
157             throw new ApplicationTechnicalException(t("tutti.config.parse.error"), e);
158         }
159 
160         //TODO Review this, this is very dirty to do this...
161         File tuttiBasedir = applicationConfig.getOptionAsFile(
162                 TuttiConfigurationOption.BASEDIR.getKey());
163 
164         if (tuttiBasedir == null) {
165             tuttiBasedir = new File("");
166         }
167         if (!tuttiBasedir.isAbsolute()) {
168             tuttiBasedir = new File(tuttiBasedir.getAbsolutePath());
169         }
170         if (tuttiBasedir.getName().equals("..")) {
171             tuttiBasedir = tuttiBasedir.getParentFile().getParentFile();
172         }
173         if (tuttiBasedir.getName().equals(".")) {
174             tuttiBasedir = tuttiBasedir.getParentFile();
175         }
176         if (log.isInfoEnabled()) {
177             log.info("Application basedir: " + tuttiBasedir);
178         }
179         applicationConfig.setOption(
180                 TuttiConfigurationOption.BASEDIR.getKey(),
181                 tuttiBasedir.getAbsolutePath());
182     }
183 
184     public void initConfig() {
185 
186         // Give the same applicationConfig to adagio
187         adagioConfig = new AdagioConfiguration(applicationConfig);
188         AdagioConfiguration.setInstance(adagioConfig);
189 
190         File directory = getDbDirectory();
191         ApplicationIOUtil.forceMkdir(directory, t("tutti.io.mkDir.error", directory));
192         directory = getDbAttachmentDirectory();
193         ApplicationIOUtil.forceMkdir(directory, t("tutti.io.mkDir.error", directory));
194         directory = getProtocolDirectory();
195         ApplicationIOUtil.forceMkdir(directory, t("tutti.io.mkDir.error", directory));
196         directory = getDbBackupDirectory();
197         ApplicationIOUtil.forceMkdir(directory, t("tutti.io.mkDir.error", directory));
198 
199         File dataDirectory = getDataDirectory();
200         ApplicationIOUtil.forceMkdir(dataDirectory, t("tutti.io.mkDir.error", dataDirectory));
201 
202         File tmpDirectory = getTmpDirectory();
203         if (tmpDirectory.exists()) {
204 
205             try {
206                 if (tmpDirectory.isFile()) {
207                     ApplicationIOUtil.deleteFile(tmpDirectory, t("tutti.io.deleteTempDirectory.error", tmpDirectory));
208                 } else {
209                     ApplicationIOUtil.deleteDirectory(tmpDirectory, t("tutti.io.deleteTempDirectory.error", tmpDirectory));
210                 }
211             } catch (Exception e) {
212                 if (log.isErrorEnabled()) {
213                     log.error("Can't delete temporary directory, but still go forward...",e);
214                 }
215             }
216         }
217         ApplicationIOUtil.forceMkdir(tmpDirectory, t("tutti.io.mkDir.error", tmpDirectory));
218 
219         ApplicationIOUtil.forceMkdir(getReportBackupDirectory(), t("tutti.io.mkDir.error", getReportBackupDirectory()));
220         ApplicationIOUtil.forceMkdir(getGenericFormatReportBackupDirectory(), t("tutti.io.mkDir.error", getGenericFormatReportBackupDirectory()));
221     }
222 
223     public void prepareDirectories() {
224 
225         File dataDirectory = getDataDirectory();
226         ApplicationIOUtil.forceMkdir(
227                 dataDirectory,
228                 t("tutti.io.mkDir.error", dataDirectory));
229 
230         File tmpDirectory = getTmpDirectory();
231         if (tmpDirectory.exists()) {
232 
233             try {
234                 ApplicationIOUtil.deleteDirectory(
235                         tmpDirectory,
236                         t("tutti.io.deleteTempDirectory.error", tmpDirectory));
237             } catch (Exception e) {
238                 if (log.isErrorEnabled()) {
239                     log.error("Can't delete temporary directory, but still go forward...",e);
240                 }
241             }
242             
243         }
244         ApplicationIOUtil.forceMkdir(
245                 tmpDirectory,
246                 t("tutti.io.mkDir.error", tmpDirectory));
247 
248         ApplicationIOUtil.forceMkdir(
249                 getReportBackupDirectory(),
250                 t("tutti.io.mkDir.error", getReportBackupDirectory()));
251 
252         ApplicationIOUtil.forceMkdir(
253                 getExportBackupDirectory(),
254                 t("tutti.io.mkDir.error", getExportBackupDirectory()));
255     }
256 
257     public File newTempFile(String basename) {
258         return newTempFile(basename, "");
259     }
260 
261     public File newTempFile(String basename, String extension) {
262         return new File(getTmpDirectory(), basename + "_" + System.nanoTime() + extension);
263     }
264 
265     public boolean isDbExists() {
266         File f = new File(getDbDirectory(), getDbName() + ".data");
267         return f.exists();
268     }
269 
270     public File getConfigFile() {
271         if (configFile == null) {
272             File dir = getBasedir();
273             if (dir == null || !dir.exists() || !isFullLaunchMode()) {
274                 dir = new File(applicationConfig.getUserConfigDirectory());
275             }
276             configFile = new File(dir, applicationConfig.getConfigFileName());
277         }
278         return configFile;
279     }
280 
281     public String getHelpResourceWithLocale(String value) {
282         File directory = new File(getHelpDirectory(),
283                                   getI18nLocale().getLanguage());
284         File result = new File(directory, value);
285         return result.toString();
286     }
287 
288     public void save() {
289 
290         File file = getConfigFile();
291         if (log.isInfoEnabled()) {
292             log.info("Save configuration at: " + file);
293         }
294         try {
295             applicationConfig.save(file, false, optionKeyToNotSave);
296         } catch (IOException e) {
297             throw new ApplicationTechnicalException(
298                     t("tutti.config.save.error", file), e);
299         }
300     }
301 
302     @Override
303     public String toString() {
304         return ReflectionToStringBuilder.toString(this);
305     }
306 
307     //------------------------------------------------------------------------//
308     //--- Option setter ------------------------------------------------------//
309     //------------------------------------------------------------------------//
310 
311     public void setSampleCategoryModel(SampleCategoryModel model) {
312         applicationConfig.setOption(TuttiConfigurationOption.SAMPLE_CATEGORY_MODEL.getKey(), String.valueOf(model));
313     }
314 
315     public void setCsvSeparator(char c) {
316         applicationConfig.setOption(
317                 TuttiConfigurationOption.CSV_SEPARATOR.getKey(), c + "");
318     }
319 
320     public void setExportCountry(String exportCountryId) {
321         applicationConfig.setOption(
322                 TuttiConfigurationOption.EXPORT_COUNTRY_ID.getKey(), exportCountryId);
323     }
324 
325     public void setI18nLocale(Locale locale) {
326         applicationConfig.setOption(TuttiConfigurationOption.I18N_LOCALE.getKey(), locale.toString());
327     }
328 
329     public void setProgramId(String programId) {
330         if (programId == null) {
331             programId = "";
332         }
333         applicationConfig.setOption(TuttiConfigurationOption.PROGRAM_ID.getKey(), programId);
334     }
335 
336     public void setCruiseId(Integer cruiseId) {
337         if (cruiseId == null) {
338             applicationConfig.setOption(TuttiConfigurationOption.CRUISE_ID.getKey(), "");
339         }else {
340             applicationConfig.setOption(TuttiConfigurationOption.CRUISE_ID.getKey(), cruiseId.toString());
341         }
342     }
343 
344     public void setProtocolId(String protocolId) {
345         if (protocolId == null) {
346             protocolId = "";
347         }
348         applicationConfig.setOption(TuttiConfigurationOption.PROTOCOL_ID.getKey(), protocolId);
349     }
350 
351     //------------------------------------------------------------------------//
352     //--- Option getter ------------------------------------------------------//
353     //------------------------------------------------------------------------//
354 
355     public File getDbDirectory() {
356         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DB_DIRECTORY.getKey());
357     }
358 
359     public File getDbAttachmentDirectory() {
360         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DB_ATTACHMENT_DIRECTORY.getKey());
361     }
362 
363     public File getCacheDirectory() {
364         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DB_CACHE_DIRECTORY.getKey());
365     }
366 
367     public File getDbBackupDirectory() {
368         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DB_BACKUP_DIRECTORY.getKey());
369     }
370 
371     public File getProtocolDirectory() {
372         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DB_PROTOCOL_DIRECTORY.getKey());
373     }
374 
375     public String getDbName() {
376         return applicationConfig.getOption(TuttiConfigurationOption.DB_NAME.getKey());
377     }
378 
379     public SampleCategoryModel getSampleCategoryModel() {
380         return applicationConfig.getOption(SampleCategoryModel.class, TuttiConfigurationOption.SAMPLE_CATEGORY_MODEL.getKey());
381     }
382 
383     public String getJdbcUrl() {
384         return applicationConfig.getOption(TuttiConfigurationOption.JDBC_URL.getKey());
385     }
386 
387     public Class getJdbcDriver() {
388         return applicationConfig.getOptionAsClass(TuttiConfigurationOption.JDBC_DRIVER.getKey());
389     }
390 
391     public String getJdbcUsername() {
392         return applicationConfig.getOption(TuttiConfigurationOption.JDBC_USERNAME.getKey());
393     }
394 
395     public String getJdbcPassword() {
396         return applicationConfig.getOption(TuttiConfigurationOption.JDBC_PASSWORD.getKey());
397     }
398 
399     public Class getHibernateDialect() {
400         return applicationConfig.getOptionAsClass(TuttiConfigurationOption.HIBERNATE_DIALECT.getKey());
401     }
402 
403     public boolean isSanityDb() {
404         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.DB_SANITY.getKey());
405     }
406 
407     public boolean isHibernateShowSql() {
408         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.HIBERNATE_SHOW_SQL.getKey());
409     }
410 
411     public boolean isHibernateUseSqlComment() {
412         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.HIBERNATE_USE_SQL_COMMENT.getKey());
413     }
414 
415     public boolean isHibernateFormatSql() {
416         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.HIBERNATE_FORMAT_SQL.getKey());
417     }
418 
419     public boolean isShowBatchLog() {
420         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.SHOW_BATCH_LOG.getKey());
421     }
422 
423     public boolean isShowMemoryUsage() {
424         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.SHOW_MEMORY_USAGE.getKey());
425     }
426 
427     public boolean isGenericFormatImportSkipBackup() {
428         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.GENERIC_FORMAT_IMPORT_SKIP_BACKUP.getKey());
429     }
430 
431     public int getGenericFormatImportMaximumRowsInErrorsPerFile() {
432         return applicationConfig.getOptionAsInt(TuttiConfigurationOption.GENERIC_FORMAT_IMPORT_MAXIMUM_ROWS_IN_ERROR_PER_FILE.getKey());
433     }
434 
435     public boolean isImportDbSkipBackup() {
436         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.IMPORT_DB_SKIP_BACKUP.getKey());
437     }
438 
439     @Override
440     public String getApplicationName() {
441         return "Allegro Campagne";
442     }
443 
444     /** @return {@link TuttiConfigurationOption#VERSION} value */
445     @Override
446     public Version getVersion() {
447         return applicationConfig.getOptionAsVersion(TuttiConfigurationOption.VERSION.getKey());
448     }
449 
450     /** @return {@link TuttiConfigurationOption#SITE_URL} value */
451     public URL getSiteUrl() {
452         return applicationConfig.getOptionAsURL(TuttiConfigurationOption.SITE_URL.getKey());
453     }
454 
455     /** @return {@link TuttiConfigurationOption#ORGANIZATION_NAME} value */
456     public String getOrganizationName() {
457         return applicationConfig.getOption(TuttiConfigurationOption.ORGANIZATION_NAME.getKey());
458     }
459 
460     /** @return {@link TuttiConfigurationOption#INCEPTION_YEAR} value */
461     public int getInceptionYear() {
462         return applicationConfig.getOptionAsInt(TuttiConfigurationOption.INCEPTION_YEAR.getKey());
463     }
464 
465     /** @return {@link TuttiConfigurationOption#BASEDIR} value */
466     public File getBasedir() {
467         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.BASEDIR.getKey());
468     }
469 
470     /** @return {@link TuttiConfigurationOption#DATA_DIRECTORY} value */
471     public File getDataDirectory() {
472         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.DATA_DIRECTORY.getKey());
473     }
474 
475     /** @return {@link TuttiConfigurationOption#REPORT_HOME_DIRECTORY} value */
476     public File getReportHomeDirectory() {
477         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.REPORT_HOME_DIRECTORY.getKey());
478     }
479 
480     /** @return {@link TuttiConfigurationOption#REPORT_DIRECTORY} value */
481     public File getReportDirectory() {
482         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.REPORT_DIRECTORY.getKey());
483     }
484 
485     /** @return {@link TuttiConfigurationOption#EXPORT_BACKUP_DIRECTORY} value */
486     public File getExportBackupDirectory() {
487         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.EXPORT_BACKUP_DIRECTORY.getKey());
488     }
489 
490 
491     /** @return {@link TuttiConfigurationOption#REPORT_LOG_DIRECTORY} value */
492     public File getReportLogDirectory() {
493         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.REPORT_LOG_DIRECTORY.getKey());
494     }
495 
496     /** @return {@link TuttiConfigurationOption#REPORT_BACKUP_DIRECTORY} value */
497     public File getReportBackupDirectory() {
498         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.REPORT_BACKUP_DIRECTORY.getKey());
499     }
500 
501     /** @return {@link TuttiConfigurationOption#GENERIC_FORMAT_REPORT_BACKUP_DIRECTORY} value */
502     public File getGenericFormatReportBackupDirectory() {
503         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.GENERIC_FORMAT_REPORT_BACKUP_DIRECTORY.getKey());
504     }
505 
506     public File getTmpDirectory() {
507         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.TMP_DIRECTORY.getKey());
508     }
509 
510     public char getCsvSeparator() {
511         return applicationConfig.getOption(
512                 TuttiConfigurationOption.CSV_SEPARATOR.getKey()).charAt(0);
513     }
514 
515     public String getExportCountryId() {
516         return applicationConfig.getOption(
517                 TuttiConfigurationOption.EXPORT_COUNTRY_ID.getKey());
518     }
519 
520     public List<Integer> getSamplingOrderIds() {
521         ApplicationConfig.OptionList result = applicationConfig.getOptionAsList(TuttiConfigurationOption.SAMPLING_CATEGORY_ORDER_IDS.getKey());
522         return result.getOptionAsInt();
523     }
524 
525     public WeightUnit getSpeciesWeightUnit() {
526         return applicationConfig.getOption(WeightUnit.class, TuttiConfigurationOption.WEIGHT_UNIT_SPECIES.getKey());
527     }
528 
529     public WeightUnit getBenthosWeightUnit() {
530         return applicationConfig.getOption(WeightUnit.class, TuttiConfigurationOption.WEIGHT_UNIT_BENTHOS.getKey());
531     }
532 
533     public WeightUnit getMarineLitterWeightUnit() {
534         return applicationConfig.getOption(WeightUnit.class, TuttiConfigurationOption.WEIGHT_UNIT_MARINE_LITTER.getKey());
535     }
536 
537     public WeightUnit getIndividualObservationWeightUnit() {
538         return applicationConfig.getOption(WeightUnit.class, TuttiConfigurationOption.WEIGHT_UNIT_INDIVIDUAL_OBSERVATION.getKey());
539     }
540 
541     public WeightUnit getAccidentalCatchWeightUnit() {
542         return applicationConfig.getOption(WeightUnit.class, TuttiConfigurationOption.WEIGHT_UNIT_ACCIDENTAL_CATCH.getKey());
543     }
544 
545     public boolean isFullLaunchMode() {
546         return "full".equals(getTuttiLaunchMode());
547     }
548 
549     public String getTuttiLaunchMode() {
550         return applicationConfig.getOption(TuttiConfigurationOption.LAUNCH_MODE.getKey());
551     }
552 
553     /** @return {@link TuttiConfigurationOption#UI_CONFIG_FILE} value */
554     public File getUIConfigFile() {
555         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.UI_CONFIG_FILE.getKey());
556     }
557 
558     /** @return {@link TuttiConfigurationOption#START_ACTION_FILE} value */
559     public File getStartActionFile() {
560         return applicationConfig.getOptionAsFile(TuttiConfigurationOption.START_ACTION_FILE.getKey());
561     }
562 
563     public Float getDifferenceRateBetweenSortedAndTotalWeights() {
564         return applicationConfig.getOptionAsFloat(TuttiConfigurationOption.TOTAL_SORTED_WEIGHTS_DIFFERENCE_RATE.getKey());
565     }
566 
567     public Float getDifferenceRateBetweenWeightAndRtpWeight() {
568         return applicationConfig.getOptionAsFloat(TuttiConfigurationOption.RTP_WEIGHTS_DIFFERENCE_RATE.getKey());
569     }
570 
571     public boolean getPupitriImportMissingBatches() {
572         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.PUPITRI_IMPORT_MISSING_BATCHES.getKey());
573     }
574 
575     public String getTremieCarousselVesselId() {
576         return applicationConfig.getOption(TuttiConfigurationOption.TREMIE_CAROUSSEL_VESSEL_ID.getKey());
577     }
578 
579     public boolean isAutoPopupNumberEditor() {
580         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.AUTO_POPUP_NUMBER_EDITOR.getKey());
581     }
582 
583     public boolean isShowNumberEditorButton() {
584         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.SHOW_NUMBER_EDITOR_BUTTON.getKey());
585     }
586 
587     public CoordinateEditorType getCoordinateEditorType() {
588         String value = applicationConfig.getOption(TuttiConfigurationOption.COORDINATE_EDITOR_TYPE.getKey());
589         return CoordinateEditorType.valueOf(value);
590     }
591 
592     public String getProgramId() {
593         String result = applicationConfig.getOption(TuttiConfigurationOption.PROGRAM_ID.getKey());
594         return StringUtils.isBlank(result) ? null : result;
595     }
596 
597     public Integer getCruiseId() {
598         String result = applicationConfig.getOption(TuttiConfigurationOption.CRUISE_ID.getKey());
599         return StringUtils.isBlank(result) ? null : Integer.valueOf(result);
600     }
601 
602     public String getProtocolId() {
603         String result = applicationConfig.getOption(TuttiConfigurationOption.PROTOCOL_ID.getKey());
604         return StringUtils.isBlank(result) ? null : result;
605     }
606 
607     public Color getColorRowInvalid() {
608         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_ROW_INVALID.getKey());
609     }
610 
611     public Color getColorRowReadOnly() {
612         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_ROW_READ_ONLY.getKey());
613     }
614 
615     public Color getColorCellWithValue() {
616         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_CELL_WITH_VALUE.getKey());
617     }
618 
619     public Color getColorRowToConfirm() {
620         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_ROW_TO_CONFIRM.getKey());
621     }
622 
623     public Color getColorComputedWeights() {
624         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_COMPUTED_WEIGHTS.getKey());
625     }
626 
627     public Color getColorBlockingLayer() {
628         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_BLOCKING_LAYER.getKey());
629     }
630 
631     public Color getColorAlternateRow() {
632         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_ALTERNATE_ROW.getKey());
633     }
634 
635     public Color getColorSelectedRow() {
636         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_SELECTED_ROW.getKey());
637     }
638 
639     public Color getColorWarningRow() {
640         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_WARNING_ROW.getKey());
641     }
642 
643     public Color getColorCatch() {
644         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_CATCH.getKey());
645     }
646 
647     public Color getColorSpecies() {
648         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_SPECIES.getKey());
649     }
650 
651     public Color getColorBenthos() {
652         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_BENTHOS.getKey());
653     }
654 
655     public Color getColorSpeciesOrBenthosUnsortedComputedWeightInWarning() {
656         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_SPECIES_OR_BENTHOS_UNSORTED_COMPUTED_WEIGHT_IN_WARNING.getKey());
657     }
658 
659     public Color getColorMarineLitter() {
660         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_MARINE_LITTER.getKey());
661     }
662 
663     public Color getColorHighlightInfoBackground() {
664         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_HIGHLIGHT_INFO_BACKGROUND.getKey());
665     }
666 
667     public Color getColorHighlightInfoForeground() {
668         return applicationConfig.getOptionAsColor(TuttiConfigurationOption.COLOR_HIGHLIGHT_INFO_FOREGROUND.getKey());
669     }
670 
671     @Override
672     public KeyStroke getShortcutClosePopup() {
673         return applicationConfig.getOptionAsKeyStroke(TuttiConfigurationOption.SHORTCUT_CLOSE_POPUP.getKey());
674     }
675 
676     public int getMaxIndividualObservationRowsToCreate() {
677         return applicationConfig.getOptionAsInt(TuttiConfigurationOption.MAX_INDIVIDUAL_OBSERVATION_ROW_TO_CREATE.getKey());
678     }
679 
680     public String getSamplingCodePrefix() {
681         return applicationConfig.getOption(TuttiConfigurationOption.SAMPLING_CODE_PREFIX.getKey());
682     }
683 
684     public KeyStroke getShortCut(String actionName) {
685         return applicationConfig.getOptionAsKeyStroke(
686                 "tutti.ui." + actionName);
687     }
688 
689     public String getDateFormat() {
690         return applicationConfig.getOption(TuttiConfigurationOption.DATE_FORMAT.getKey());
691     }
692 
693     public File getNewTmpDirectory(String name) {
694         return new File(getTmpDirectory(), name + "_" + System.nanoTime());
695     }
696 
697 
698     public File getI18nDirectory() {
699         return applicationConfig.getOptionAsFile(
700                 TuttiConfigurationOption.I18N_DIRECTORY.getKey());
701     }
702 
703     public Locale getI18nLocale() {
704         return applicationConfig.getOptionAsLocale(
705                 TuttiConfigurationOption.I18N_LOCALE.getKey());
706     }
707 
708     public File getHelpDirectory() {
709         return applicationConfig.getOptionAsFile(
710                 TuttiConfigurationOption.HELP_DIRECTORY.getKey());
711     }
712 
713     public String getUpdateApplicationUrl() {
714         // Trim url values, because of auk theory! (See #7946)
715         return applicationConfig.getOption(TuttiConfigurationOption.UPDATE_APPLICATION_URL.getKey()).trim();
716     }
717 
718     public String getUpdateDataUrl() {
719         // Trim url values, because of auk theory! (See #7946)
720         return applicationConfig.getOption(TuttiConfigurationOption.UPDATE_DATA_URL.getKey()).trim();
721     }
722 
723     public String getAdminPassword() {
724         return applicationConfig.getOption(TuttiConfigurationOption.ADMIN_PASSWORD.getKey());
725     }
726 
727     public boolean isFullBluetoothScan() {
728         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.FULL_BLUETOOTH_SCAN.getKey());
729     }
730 
731     public int getIchtyometerMaximumNumberOfAttemptToConnect() {
732         return applicationConfig.getOptionAsInt(TuttiConfigurationOption.ICHTYOMETER_MAXIMUM_NUMBER_OF_ATTEMPT_TO_CONNECT.getKey());
733     }
734 
735     public int getCaliperSerialPort() {
736         return applicationConfig.getOptionAsInt(TuttiConfigurationOption.CALIPER_SERIAL_PORT.getKey());
737     }
738 
739     public Boolean isExternalDevicesVoiceEnabled() {
740         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_VOICE_ENABLED.getKey());
741     }
742 
743     public Boolean isExternalDevicesReadsUnit() {
744         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_READS_UNIT.getKey());
745     }
746 
747     public Boolean isExternalDevicesDataReceptionBeepEnabled() {
748         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_ENABLED.getKey());
749     }
750 
751     public BeepFrequency getExternalDevicesDataReceptionBeepFrequency() {
752         return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.EXTERNAL_DEVICES_DATA_RECEPTION_BEEP_FREQUENCY.getKey()));
753     }
754 
755     public Boolean isExternalDevicesErrorReceptionBeepEnabled() {
756         return applicationConfig.getOptionAsBoolean(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_ENABLED.getKey());
757     }
758 
759     public BeepFrequency getExternalDevicesErrorReceptionBeepFrequency() {
760         return BeepFrequency.valueOf(applicationConfig.getOption(TuttiConfigurationOption.EXTERNAL_DEVICES_ERROR_RECEPTION_BEEP_FREQUENCY.getKey()));
761     }
762 
763     public String getJavaCommandPath() {
764         String path;
765         String commandName = windowsOS ? "java.exe" : "java";
766         if (isFullLaunchMode()) {
767             path = getBasedir().toPath().resolve("jre").resolve("bin").resolve(commandName).toFile().getAbsolutePath();
768         } else {
769             path = commandName;
770         }
771         return path;
772     }
773 
774     private File reportJarPath;
775 
776     public File getReportJarPath() {
777         if (reportJarPath == null) {
778             //FIXME Should include version in file name
779             String commandName = "tutti-report-generator.jar";
780             if (isFullLaunchMode()) {
781 
782                 reportJarPath = getBasedir().toPath().resolve("tutti").resolve("report-generator").resolve(commandName).toFile();
783 
784             } else {
785 
786                 reportJarPath = guessReportJarPath(commandName);
787 
788                 if (reportJarPath == null) {
789 
790                     if (log.isWarnEnabled()) {
791                         log.warn("You must defined yourself the path to " + commandName);
792                     }
793 
794                 } else {
795 
796                     if (log.isInfoEnabled()) {
797                         log.info("Guess reportGenerarorPath: "+reportJarPath);
798                     }
799                 }
800 
801             }
802         }
803 
804         return reportJarPath;
805 
806     }
807 
808     public void setReportJarPath(File reportJarPath) {
809         this.reportJarPath = reportJarPath;
810     }
811 
812     protected File guessReportJarPath(String commandName) {
813 
814         {
815             File file = getBasedir().toPath().resolve("tutti-report-generator").resolve(commandName).toFile();
816             if (file.exists()) {
817                 return file;
818             }
819         }
820 
821         {
822             File file = new File("").toPath().resolve("target").resolve("tutti-report-generator").resolve(commandName).toFile();
823             if (file.exists()) {
824                 return file;
825             }
826         }
827 
828         {
829             File file = new File("tutti-ui-swing").toPath().resolve("target").resolve("tutti-report-generator").resolve(commandName).toFile();
830             if (file.exists()) {
831                 return file;
832             }
833         }
834 
835         return null;
836 
837     }
838 }