View Javadoc
1   package fr.ifremer.dali.config;
2   
3   /*
4    * #%L
5    * Dali :: Core
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2014 - 2015 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (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 Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
24   */
25  
26  import com.google.common.collect.Lists;
27  import fr.ifremer.common.synchro.config.SynchroConfigurationOption;
28  import fr.ifremer.dali.dto.DaliBeans;
29  import fr.ifremer.dali.map.MapMode;
30  import fr.ifremer.dali.map.MapProjection;
31  import fr.ifremer.quadrige3.core.config.QuadrigeConfigurationOption;
32  import fr.ifremer.quadrige3.core.config.QuadrigeConfigurations;
33  import fr.ifremer.quadrige3.core.config.QuadrigeCoreConfiguration;
34  import fr.ifremer.quadrige3.core.config.QuadrigeCoreConfigurationOption;
35  import fr.ifremer.quadrige3.core.dao.technical.enumeration.Enums;
36  import fr.ifremer.quadrige3.core.dao.technical.hibernate.DateType;
37  import org.apache.commons.collections4.CollectionUtils;
38  import org.apache.commons.lang3.StringUtils;
39  import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
40  import org.apache.commons.logging.Log;
41  import org.apache.commons.logging.LogFactory;
42  import org.nuiton.config.ApplicationConfig;
43  import org.nuiton.version.Version;
44  
45  import javax.swing.KeyStroke;
46  import java.awt.Color;
47  import java.io.File;
48  import java.net.URL;
49  import java.util.*;
50  
51  import static org.nuiton.i18n.I18n.t;
52  
53  /**
54   * Dali Configuration
55   *
56   * @author Lionel Touseau <lionel.touseau@e-is.pro>
57   */
58  public final class DaliConfiguration extends QuadrigeCoreConfiguration {
59  
60      /**
61       * Logger.
62       */
63      private static final Log LOG = LogFactory.getLog(DaliConfiguration.class);
64      /**
65       * Singleton pattern
66       */
67      private static DaliConfiguration instance;
68  
69      /**
70       * <p>Constructor for DaliConfiguration.</p>
71       *
72       * @param applicationConfig a {@link org.nuiton.config.ApplicationConfig} object.
73       */
74      public DaliConfiguration(ApplicationConfig applicationConfig) {
75          super(applicationConfig);
76      }
77  
78      /**
79       * <p>Constructor for DaliConfiguration.</p>
80       *
81       * @param file a {@link java.lang.String} object.
82       * @param args a {@link java.lang.String} object.
83       */
84      public DaliConfiguration(String file, String... args) {
85          super(file, args);
86  
87          // Verify base directory
88          File daliBasedir = getBaseDirectory();
89          if (daliBasedir == null) {
90              daliBasedir = new File("");
91          }
92          if (!daliBasedir.isAbsolute()) {
93              daliBasedir = new File(daliBasedir.getAbsolutePath());
94          }
95          if ("..".equals(daliBasedir.getName())) {
96              daliBasedir = daliBasedir.getParentFile().getParentFile();
97          }
98          if (".".equals(daliBasedir.getName())) {
99              daliBasedir = daliBasedir.getParentFile();
100         }
101         if (LOG.isInfoEnabled()) {
102             LOG.info("Application basedir: " + daliBasedir);
103         }
104         applicationConfig.setOption(
105                 DaliConfigurationOption.BASEDIR.getKey(),
106                 daliBasedir.getAbsolutePath());
107 
108         // Init timezone (see mantis Allegro-ObsDeb #24623)
109         initTimeZone();
110     }
111 
112     @Override
113     public File getBaseDirectory() {
114         return applicationConfig.getOptionAsFile(DaliConfigurationOption.BASEDIR.getKey());
115     }
116 
117     /**
118      * <p>Getter for the field <code>instance</code>.</p>
119      *
120      * @return a {@link DaliConfiguration} object.
121      */
122     public static DaliConfiguration getInstance() {
123         return instance;
124     }
125 
126     /**
127      * <p>Setter for the field <code>instance</code>.</p>
128      *
129      * @param instance a {@link DaliConfiguration} object.
130      */
131     public static void setInstance(DaliConfiguration instance) {
132         DaliConfiguration.instance = instance;
133         QuadrigeCoreConfiguration.setInstance(instance);
134     }
135 
136     @Override
137     protected void overrideExternalModulesDefaultOptions() {
138         super.overrideExternalModulesDefaultOptions();
139 
140         // Override quadrige3 BASE_DIRECTORY
141         applicationConfig.setDefaultOption(
142                 QuadrigeConfigurationOption.BASEDIR.getKey(),
143                 String.format("${%s}", DaliConfigurationOption.BASEDIR.getKey()));
144 
145         // Override Sites
146         applicationConfig.setDefaultOption(
147                 QuadrigeConfigurationOption.SITE_URL.getKey(),
148                 String.format("${%s}", DaliConfigurationOption.SITE_URL.getKey()));
149         // Remap :
150         //  - quadrige3.update.XXX to dali.update.XXX
151         //  - quadrige3.install.XXX to dali.install.XXX
152         //  - quadrige3.authentication.XXX to dali.authentication.XXX
153         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
154                 "quadrige3.update",
155                 DaliConfigurationOption.values(),
156                 "dali.update");
157         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
158                 "quadrige3.install",
159                 DaliConfigurationOption.values(),
160                 "dali.install");
161         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
162                 "quadrige3.authentication",
163                 DaliConfigurationOption.values(),
164                 "dali.authentication");
165 
166         // Override Hibernate queries file
167         applicationConfig.setDefaultOption(
168                 QuadrigeConfigurationOption.HIBERNATE_CLIENT_QUERIES_FILE.getKey(),
169                 "dali-queries.hbm.xml");
170 
171         // Override enumeration files
172         applicationConfig.setDefaultOption(
173                 QuadrigeConfigurationOption.DB_ENUMERATION_RESOURCE.getKey(),
174                 String.format("${%s}", DaliConfigurationOption.DB_ENUMERATION_RESOURCE.getKey()));
175 
176         // Override Db timezone
177         applicationConfig.setDefaultOption(
178                 QuadrigeConfigurationOption.DB_TIMEZONE.getKey(),
179                 String.format("${%s}", DaliConfigurationOption.DB_TIMEZONE.getKey()));
180         applicationConfig.setDefaultOption(
181                 SynchroConfigurationOption.DB_TIMEZONE.getKey(),
182                 String.format("${%s}", DaliConfigurationOption.DB_TIMEZONE.getKey()));
183 
184         // Override ALL synchronization options
185         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
186                 "synchro",
187                 DaliConfigurationOption.values(),
188                 "dali.synchro");
189         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
190                 "quadrige3.synchro",
191                 DaliConfigurationOption.values(),
192                 "dali.synchro");
193     }
194 
195     /**
196      * {@inheritDoc}
197      */
198     @Override
199     public String getApplicationName() {
200         return t("dali.application.name");
201     }
202 
203     /**
204      * {@inheritDoc}
205      */
206     @Override
207     public Version getVersion() {
208         return applicationConfig.getOptionAsVersion(DaliConfigurationOption.VERSION.getKey());
209     }
210 
211     /**
212      * {@inheritDoc}
213      */
214     @Override
215     public KeyStroke getShortcutClosePopup() {
216         return applicationConfig.getOptionAsKeyStroke(DaliConfigurationOption.SHORTCUT_CLOSE_POPUP.getKey());
217     }
218 
219     /**
220      * <p>getHelpResourceWithLocale.</p>
221      *
222      * @param value a {@link java.lang.String} object.
223      * @return a {@link java.lang.String} object.
224      */
225     public String getHelpResourceWithLocale(String value) {
226         File directory = new File(getHelpDirectory(),
227                 getI18nLocale().getLanguage());
228         File result = new File(directory, value);
229         return result.toString();
230     }
231 
232     /**
233      * Initialization default timezone, from configuration (mantis #24623)
234      */
235     private void initTimeZone() {
236 
237         String timeZone = applicationConfig.getOption(DaliConfigurationOption.TIMEZONE.getKey());
238         if (StringUtils.isNotBlank(timeZone)) {
239             if (LOG.isInfoEnabled()) {
240                 LOG.info(String.format("Using timezone [%s]", timeZone));
241             }
242             TimeZone.setDefault(TimeZone.getTimeZone(timeZone));
243             System.setProperty("user.timezone", timeZone);
244         } else if (LOG.isInfoEnabled()) {
245             LOG.info(String.format("Using default timezone [%s]", System.getProperty("user.timezone")));
246         }
247 
248         // Warn only and use user timezone if dali.persistence.db.timezone is not set (Mantis #46390)
249         String dbTimeZoneOption = applicationConfig.getOption(DaliConfigurationOption.DB_TIMEZONE.getKey());
250         TimeZone dbTimeZone;
251         if (StringUtils.isBlank(dbTimeZoneOption)) {
252             LOG.warn("Timezone for database is not set in configuration, now using user timezone");
253             dbTimeZone = TimeZone.getDefault();
254         } else {
255             dbTimeZone = TimeZone.getTimeZone(dbTimeZoneOption);
256         }
257         if (LOG.isInfoEnabled()) {
258             LOG.info(String.format("Using timezone [%s] for database", dbTimeZone.toZoneId()));
259         }
260         DateType.setTimeZone(dbTimeZone);
261 
262     }
263 
264     /**
265      * {@inheritDoc}
266      */
267     @Override
268     public String toString() {
269         return ReflectionToStringBuilder.toString(this);
270     }
271 
272     //------------------------------------------------------------------------//
273     //--- Data context-related ---------------------------------------------------------//
274     //------------------------------------------------------------------------//
275 
276     /**
277      * <p>getLastSurveyId.</p>
278      *
279      * @return a {@link java.lang.Integer} object.
280      */
281     public Integer getLastSurveyId() {
282         return applicationConfig.getOptionAsInt(DaliConfigurationOption.LAST_SURVEY_ID.getKey());
283     }
284 
285     /**
286      * <p>setLastSurveyId.</p>
287      *
288      * @param lastSurveyId a {@link java.lang.Integer} object.
289      */
290     public void setLastSurveyId(Integer lastSurveyId) {
291         applicationConfig.setOption(DaliConfigurationOption.LAST_SURVEY_ID.getKey(), lastSurveyId != null ? lastSurveyId.toString() : "");
292     }
293 
294     /**
295      * <p>getLastContextId.</p>
296      *
297      * @return a {@link java.lang.Integer} object.
298      */
299     public Integer getLastContextId() {
300         int lastContextId = applicationConfig.getOptionAsInt(DaliConfigurationOption.LAST_CONTEXT_ID.getKey());
301         return lastContextId == 0 ? null : lastContextId;
302     }
303 
304     /**
305      * <p>setLastContextId.</p>
306      *
307      * @param contextId a {@link java.lang.Integer} object.
308      */
309     public void setLastContextId(Integer contextId) {
310         String value = "";
311         if (contextId != null) {
312             value = contextId.toString();
313         }
314         applicationConfig.setOption(DaliConfigurationOption.LAST_CONTEXT_ID.getKey(), value);
315     }
316 
317     //------------------------------------------------------------------------//
318     //--- DB-related ---------------------------------------------------------//
319     //------------------------------------------------------------------------//
320 
321     /**
322      * <p>getDbBackupExternalDirectory.</p>
323      *
324      * @return a {@link java.io.File} object.
325      */
326     public File getDbBackupExternalDirectory() {
327         return applicationConfig.getOptionAsFile(DaliConfigurationOption.DB_BACKUP_EXTERNAL_DIRECTORY.getKey());
328     }
329 
330     /**
331      * <p>isDbCheckConstantsEnable.</p>
332      *
333      * @return a boolean.
334      */
335     public boolean isDbCheckConstantsEnable() {
336         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.DB_CHECK_CONSTANTS.getKey());
337     }
338 
339     /**
340      * <p>setDbCheckConstantsEnable.</p>
341      *
342      * @param check a boolean.
343      */
344     public void setDbCheckConstantsEnable(boolean check) {
345         applicationConfig.setOption(DaliConfigurationOption.DB_CHECK_CONSTANTS.getKey(), Boolean.toString(check));
346     }
347 
348     /**
349      * <p>getDbDirectory.</p>
350      *
351      * @return a {@link File} object.
352      */
353     public TimeZone getDbTimezone() {
354         String timezone = applicationConfig.getOption(DaliConfigurationOption.DB_TIMEZONE.getKey());
355         return StringUtils.isNotBlank(timezone) ? TimeZone.getTimeZone(timezone) : TimeZone.getDefault();
356     }
357 
358     /**
359      * <p>isCacheEnabledAtStartup.</p>
360      *
361      * @return a boolean.
362      */
363     public boolean isCacheEnabledAtStartup() {
364         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.CACHE_ENABLED_AT_STARTUP.getKey());
365     }
366 
367     /**
368      * <p>isCleanCacheAtStartup.</p>
369      *
370      * @return a boolean.
371      */
372     public boolean isCleanCacheAtStartup() {
373         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.CACHE_CLEAN_AT_STARTUP.getKey());
374     }
375 
376     /**
377      * <p>getSiteUrl.</p>
378      *
379      * @return {@link DaliConfigurationOption#SITE_URL} value
380      */
381     public URL getSiteUrl() {
382         return applicationConfig.getOptionAsURL(DaliConfigurationOption.SITE_URL.getKey());
383     }
384 
385     /**
386      * <p>getOrganizationName.</p>
387      *
388      * @return {@link DaliConfigurationOption#ORGANIZATION_NAME} value
389      */
390     public String getOrganizationName() {
391         return applicationConfig.getOption(DaliConfigurationOption.ORGANIZATION_NAME.getKey());
392     }
393 
394     /**
395      * <p>getInceptionYear.</p>
396      *
397      * @return {@link DaliConfigurationOption#INCEPTION_YEAR} value
398      */
399     public int getInceptionYear() {
400         return applicationConfig.getOptionAsInt(DaliConfigurationOption.INCEPTION_YEAR.getKey());
401     }
402 
403     //------------------------------------------------------------------------//
404     //--- extraction-related --------------------------------------------------//
405     //------------------------------------------------------------------------//
406 
407     /**
408      * <p>getExtractionResultFileExtension.</p>
409      *
410      * @return a {@link java.lang.String} object.
411      */
412     public String getExtractionFileExtension() {
413         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_FILE_EXTENSION.getKey());
414     }
415 
416     /**
417      * <p>getExtractionResultFileExtension.</p>
418      *
419      * @return a {@link java.lang.String} object.
420      */
421     public String getExtractionResultFileExtension() {
422         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_RESULT_FILE_EXTENSION.getKey());
423     }
424 
425     /**
426      * <p>getExtractionFileTypeCode.</p>
427      *
428      * @return a {@link java.lang.String} object.
429      */
430     public String getExtractionFileTypeCode() {
431         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_FILE_TYPE_CODE.getKey());
432     }
433 
434     /**
435      * <p>getExtractionGroupTypePmfmCode.</p>
436      *
437      * @return a {@link java.lang.String} object.
438      */
439     public String getExtractionGroupTypePmfmCode() {
440         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_GROUP_TYPE_PMFM_CODE.getKey());
441     }
442 
443     /**
444      * <p>getExtractionTableTypeCode.</p>
445      *
446      * @return a {@link java.lang.String} object.
447      */
448     public String getExtractionTableTypeCode() {
449         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_TABLE_TYPE_CODE.getKey());
450     }
451 
452     /**
453      * <p>getExtractionProjectionSystemCode.</p>
454      *
455      * @return a {@link java.lang.String} object.
456      */
457     public String getExtractionProjectionSystemCode() {
458         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_PROJECTION_SYSTEM_CODE.getKey());
459     }
460 
461     /**
462      * <p>getExtractionDefaultOrderItemTypeCode.</p>
463      *
464      * @return a {@link java.lang.String} object.
465      */
466     public String getExtractionDefaultOrderItemTypeCode() {
467         return applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_DEFAULT_ORDER_ITEM_TYPE_CODE.getKey());
468     }
469 
470     /**
471      * <p>getExtractionUnitIdsToIgnore.</p>
472      *
473      * @return a {@link java.util.List} object.
474      */
475     public List<Integer> getExtractionUnitIdsToIgnore() {
476         List<Integer> ids = Lists.newArrayList();
477         String excludeUnitIds = applicationConfig.getOption(DaliConfigurationOption.EXTRACTION_IGNORE_UNIT_IDS.getKey());
478         for (String id : DaliBeans.split(excludeUnitIds, ",")) {
479             if (StringUtils.isNumeric(id)) {
480                 ids.add(Integer.valueOf(id));
481             }
482         }
483         return ids;
484     }
485 
486     //------------------------------------------------------------------------//
487     //--- UI-related ---------------------------------------------------------//
488     //------------------------------------------------------------------------//
489 
490     /**
491      * <p>getUIConfigFile.</p>
492      *
493      * @return {@link DaliConfigurationOption#UI_CONFIG_FILE} value
494      */
495     public File getUIConfigFile() {
496         return applicationConfig.getOptionAsFile(DaliConfigurationOption.UI_CONFIG_FILE.getKey());
497     }
498 
499     /**
500      * <p>getUIRecommendedWidth.</p>
501      *
502      * @return a {@link java.lang.Integer} object.
503      */
504     public Integer getUIRecommendedWidth() {
505         return applicationConfig.getOptionAsInt(DaliConfigurationOption.UI_RECOMMENDED_WIDTH.getKey());
506     }
507 
508     /**
509      * <p>getUIRecommendedHeight.</p>
510      *
511      * @return a {@link java.lang.Integer} object.
512      */
513     public Integer getUIRecommendedHeight() {
514         return applicationConfig.getOptionAsInt(DaliConfigurationOption.UI_RECOMMENDED_HEIGHT.getKey());
515     }
516 
517     /**
518      * <p>isShowTableCheckbox.</p>
519      *
520      * @return {@link DaliConfigurationOption#TABLES_CHECKBOX} value
521      */
522     public boolean isShowTableCheckbox() {
523         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.TABLES_CHECKBOX.getKey());
524     }
525 
526     /**
527      * <p>isAutoPopupNumberEditor.</p>
528      *
529      * @return a boolean.
530      */
531     public boolean isAutoPopupNumberEditor() {
532         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.AUTO_POPUP_NUMBER_EDITOR.getKey());
533     }
534 
535     /**
536      * <p>isShowNumberEditorButton.</p>
537      *
538      * @return a boolean.
539      */
540     public boolean isShowNumberEditorButton() {
541         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.SHOW_NUMBER_EDITOR_BUTTON.getKey());
542     }
543 
544     /**
545      * <p>getColorSelectedCell.</p>
546      *
547      * @return a {@link java.awt.Color} object.
548      */
549     public Color getColorSelectedCell() {
550         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_SELECTED_CELL.getKey());
551     }
552 
553     /**
554      * <p>getColorRowInvalid.</p>
555      *
556      * @return a {@link java.awt.Color} object.
557      */
558     public Color getColorRowInvalid() {
559         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_ROW_INVALID.getKey());
560     }
561 
562     /**
563      * <p>getColorRowReadOnly.</p>
564      *
565      * @return a {@link java.awt.Color} object.
566      */
567     public Color getColorRowReadOnly() {
568         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_ROW_READ_ONLY.getKey());
569     }
570 
571     /**
572      * <p>getColorCellWithValue.</p>
573      *
574      * @return a {@link java.awt.Color} object.
575      */
576     public Color getColorCellWithValue() {
577         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_CELL_WITH_VALUE.getKey());
578     }
579 
580     /**
581      * <p>getColorComputedWeights.</p>
582      *
583      * @return a {@link java.awt.Color} object.
584      */
585     public Color getColorComputedWeights() {
586         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_COMPUTED_WEIGHTS.getKey());
587     }
588 
589     /**
590      * <p>getColorComputedRow.</p>
591      *
592      * @return a {@link java.awt.Color} object.
593      */
594     public Color getColorComputedRow() {
595         // same color as COLOR_COMPUTED_WEIGHTS
596         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_COMPUTED_WEIGHTS.getKey());
597     }
598 
599     /**
600      * <p>getColorBlockingLayer.</p>
601      *
602      * @return a {@link java.awt.Color} object.
603      */
604     public Color getColorBlockingLayer() {
605         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_BLOCKING_LAYER.getKey());
606     }
607 
608     /**
609      * <p>getColorAlternateRow.</p>
610      *
611      * @return a {@link java.awt.Color} object.
612      */
613     public Color getColorAlternateRow() {
614         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_ALTERNATE_ROW.getKey());
615     }
616 
617     /**
618      * <p>getColorSelectedRow.</p>
619      *
620      * @return a {@link java.awt.Color} object.
621      */
622     public Color getColorSelectedRow() {
623         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_SELECTED_ROW.getKey());
624     }
625 
626     /**
627      * <p>getColorSelectionPanelBackground.</p>
628      *
629      * @return a {@link java.awt.Color} object.
630      */
631     public Color getColorSelectionPanelBackground() {
632         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_SELECTION_PANEL_BACKGROUND.getKey());
633     }
634 
635     /**
636      * <p>getColorContextPanelBackground.</p>
637      *
638      * @return a {@link java.awt.Color} object.
639      */
640     public Color getColorContextPanelBackground() {
641         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_CONTEXT_PANEL_BACKGROUND.getKey());
642     }
643 
644     /**
645      * <p>getColorEditionPanelBackground.</p>
646      *
647      * @return a {@link java.awt.Color} object.
648      */
649     public Color getColorEditionPanelBackground() {
650         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_EDITION_PANEL_BACKGROUND.getKey());
651     }
652 
653     /**
654      * <p>getColorEditionPanelBorder.</p>
655      *
656      * @return a {@link java.awt.Color} object.
657      */
658     public Color getColorEditionPanelBorder() {
659         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_EDITION_PANEL_BORDER.getKey());
660     }
661 
662     /**
663      * <p>getColorThematicLabel.</p>
664      *
665      * @return a {@link java.awt.Color} object.
666      */
667     public Color getColorThematicLabel() {
668         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_THEMATIC_LABEL.getKey());
669     }
670 
671     /**
672      * <p>getColorHighlightButtonBorder.</p>
673      *
674      * @return a {@link java.awt.Color} object.
675      */
676     public Color getColorHighlightButtonBorder() {
677         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_HIGHLIGHT_BUTTON_BORDER.getKey());
678     }
679 
680     public Color getColorUnusedEditorBackground() {
681         return applicationConfig.getOptionAsColor(DaliConfigurationOption.COLOR_UNUSED_EDITOR_BACKGROUND.getKey());
682     }
683 
684     /**
685      * <p>getShortCut.</p>
686      *
687      * @param actionName a {@link java.lang.String} object.
688      * @return a {@link javax.swing.KeyStroke} object.
689      */
690     public KeyStroke getShortCut(String actionName) {
691         return applicationConfig.getOptionAsKeyStroke("dali.ui." + actionName);
692     }
693 
694     /**
695      * <p>getDateFormat.</p>
696      *
697      * @return a {@link java.lang.String} object.
698      */
699     public String getDateFormat() {
700         return applicationConfig.getOption(DaliConfigurationOption.DATE_FORMAT.getKey());
701     }
702 
703     /**
704      * <p>getDateTimeFormat.</p>
705      *
706      * @return a {@link java.lang.String} object.
707      */
708     public String getDateTimeFormat() {
709         return applicationConfig.getOption(DaliConfigurationOption.DATE_TIME_FORMAT.getKey());
710     }
711 
712     /*
713      ----  File and Directory methods ---
714      */
715 
716     /**
717      * <p>getNewTmpDirectory.</p>
718      *
719      * @param name a {@link java.lang.String} object.
720      * @return a {@link java.io.File} object.
721      */
722     public File getNewTmpDirectory(String name) {
723         return new File(getTempDirectory(), name + "_" + System.nanoTime());
724     }
725 
726     /**
727      * <p>getHelpDirectory.</p>
728      *
729      * @return a {@link java.io.File} object.
730      */
731     public File getHelpDirectory() {
732         return applicationConfig.getOptionAsFile(
733                 DaliConfigurationOption.HELP_DIRECTORY.getKey());
734     }
735 
736     /**
737      * <p>getUnknownRecorderDepartmentId.</p>
738      *
739      * @return a int.
740      */
741     public int getUnknownRecorderDepartmentId() {
742         return applicationConfig.getOptionAsInt(DaliConfigurationOption.UNKNOWN_RECORDER_DEPARTMENT.getKey());
743     }
744 
745     public int getMassiveProcessChunkSize() {
746         return applicationConfig.getOptionAsInt(DaliConfigurationOption.DB_VALIDATION_BULK_SIZE.getKey());
747     }
748 
749     // TODO les methodes suivantes sont-elles toujours utiles ?
750 
751     /**
752      * <p>getTemporaryStatusCode.</p>
753      *
754      * @return a {@link java.lang.String} object.
755      */
756     public String getTemporaryStatusCode() {
757         return "TEMPORARY";
758     }
759 
760     /**
761      * <p>getEnableStatusCode.</p>
762      *
763      * @return a {@link java.lang.String} object.
764      */
765     public String getEnableStatusCode() {
766         return "ENABLE";
767     }
768 
769     /**
770      * <p>getDisableStatusCode.</p>
771      *
772      * @return a {@link java.lang.String} object.
773      */
774     public String getDisableStatusCode() {
775         return "DISABLE";
776     }
777 
778     /**
779      * <p>getDeletedStatusCode.</p>
780      *
781      * @return a {@link java.lang.String} object.
782      */
783     public String getDeletedStatusCode() {
784         return "DELETED";
785     }
786 
787     /**
788      * <p>getDirtySynchronizationStatusCode.</p>
789      *
790      * @return a {@link java.lang.String} object.
791      */
792     public String getDirtySynchronizationStatusCode() {
793         return "DIRTY";
794     }
795 
796     /**
797      * <p>getReadySynchronizationStatusCode.</p>
798      *
799      * @return a {@link java.lang.String} object.
800      */
801     public String getReadySynchronizationStatusCode() {
802         return "READY_TO_SYNCHRONIZE";
803     }
804 
805     /**
806      * <p>getSynchronizedSynchronizationStatusCode.</p>
807      *
808      * @return a {@link java.lang.String} object.
809      */
810     public String getSynchronizedSynchronizationStatusCode() {
811         return "SYNCHRONIZED";
812     }
813 
814     /*
815      * Constants
816      */
817     public int getSurveyCalculatedLengthPmfmId() {
818         return applicationConfig.getOptionAsInt(DaliConfigurationOption.PMFM_ID_SURVEY_CALCULATED_LENGTH.getKey());
819     }
820 
821     public List<Integer[]> getCalculatedTrawlAreaPmfmTriplets() {
822 
823         List<Integer[]> result = new ArrayList<>();
824         String configOption = applicationConfig.getOption(DaliConfigurationOption.PMFM_IDS_CALCULATED_TRAWL_AREA.getKey());
825         if (StringUtils.isBlank(configOption)) return result;
826 
827         List<String> triplets = DaliBeans.split(configOption, ";");
828         for (String triplet : triplets) {
829             List<String> pmfmsIdsStr = DaliBeans.split(triplet, ",");
830             if (CollectionUtils.size(pmfmsIdsStr) == 3) {
831                 try {
832                     Integer[] pmfmIds = new Integer[3];
833                     pmfmIds[0] = Integer.parseInt(pmfmsIdsStr.get(0));
834                     pmfmIds[1] = Integer.parseInt(pmfmsIdsStr.get(1));
835                     pmfmIds[2] = Integer.parseInt(pmfmsIdsStr.get(2));
836 
837                     if (pmfmIds[0] < 0 || pmfmIds[1] < 0 || pmfmIds[2] < 0) continue;
838 
839                     result.add(pmfmIds);
840                 } catch (NumberFormatException e) {
841                     LOG.warn(String.format("Problem parsing '%s' option value : %s", DaliConfigurationOption.PMFM_IDS_CALCULATED_TRAWL_AREA.getKey(), triplet));
842                 }
843             } else {
844                 LOG.warn(String.format("Malformed '%s' option value : %s", DaliConfigurationOption.PMFM_IDS_CALCULATED_TRAWL_AREA.getKey(), triplet));
845             }
846         }
847 
848         return result;
849     }
850 
851     public Map<Integer, Integer> getCompatibleLengthUnitIdByAreaUnitId() {
852 
853         Map<Integer, Integer> result = new HashMap<>();
854         String configOption = applicationConfig.getOption(DaliConfigurationOption.UNIT_IDS_COMPATIBLE_LENGTH_BY_AREA.getKey());
855         if (StringUtils.isBlank(configOption)) return result;
856 
857         List<String> unitsList = DaliBeans.split(configOption, ";");
858         for (String units : unitsList) {
859             List<String> unitIdsStr = DaliBeans.split(units, ",");
860             if (CollectionUtils.size(unitIdsStr) == 2) {
861                 try {
862                     result.put(Integer.parseInt(unitIdsStr.get(0)), Integer.parseInt(unitIdsStr.get(1)));
863                 } catch (NumberFormatException e) {
864                     LOG.warn(String.format("Problem parsing '%s' option value : %s", DaliConfigurationOption.UNIT_IDS_COMPATIBLE_LENGTH_BY_AREA.getKey(), units));
865                 }
866             } else {
867                 LOG.warn(String.format("Malformed '%s' option value : %s", DaliConfigurationOption.UNIT_IDS_COMPATIBLE_LENGTH_BY_AREA.getKey(), units));
868             }
869         }
870 
871         return result;
872     }
873 
874     /**
875      * <p>getNoUnitId.</p>
876      *
877      * @return a int.
878      */
879     public int getNoUnitId() {
880         return applicationConfig.getOptionAsInt(DaliConfigurationOption.UNIT_ID_NO_UNIT.getKey());
881     }
882 
883     public String getFallbackLocale() {
884         return QuadrigeCoreConfigurationOption.I18N_LOCALE.getDefaultValue();
885     }
886 
887     /**
888      * <p>getTranscribingItemTypeLbForPmfmNm.</p>
889      * en_GB
890      * fr_FR
891      *
892      * @return a {@link java.lang.String} object.
893      */
894     public String getTranscribingItemTypeLbForPmfmNm() {
895         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_NM.getKey());
896     }
897 
898     public String getTranscribingItemTypeLbForPmfmExtraction() {
899         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PMFM_EXTRACTION.getKey());
900     }
901 
902     public String getTranscribingItemTypeLbForQualitativeValueNm() {
903         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_QUALITATIVE_VALUE_NM.getKey());
904     }
905 
906     public String getTranscribingItemTypeLbForQualitativeValueExtraction() {
907         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_QUALITATIVE_VALUE_EXTRACTION.getKey());
908     }
909 
910     public String getTranscribingItemTypeLbForSamplingEquipmentNm() {
911         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_SAMPLING_EQUIPMENT_NM.getKey());
912     }
913 
914     public String getTranscribingItemTypeLbForSamplingEquipmentExtraction() {
915         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_SAMPLING_EQUIPMENT_EXTRACTION.getKey());
916     }
917 
918     public String getTranscribingItemTypeLbForParameterNm() {
919         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PARAMETER_NM.getKey());
920     }
921 
922     public String getTranscribingItemTypeLbForParameterCd() {
923         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_PARAMETER_CD.getKey());
924     }
925 
926     public String getTranscribingItemTypeLbForMatrixNm() {
927         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_MATRIX_NM.getKey());
928     }
929 
930     public String getTranscribingItemTypeLbForFractionNm() {
931         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_FRACTION_NM.getKey());
932     }
933 
934     public String getTranscribingItemTypeLbForMethodNm() {
935         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_METHOD_NM.getKey());
936     }
937 
938     public String getTranscribingItemTypeLbForUnitNm() {
939         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_UNIT_NM.getKey());
940     }
941 
942     public String getTranscribingItemTypeLbForUnitSymbol() {
943         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_UNIT_SYMBOL.getKey());
944     }
945 
946     public String getTranscribingItemTypeLbForMonLocNm() {
947         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_MON_LOC_NM.getKey());
948     }
949 
950     public String getTranscribingItemTypeLbForQualFlagNm() {
951         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_QUAL_FLAG_NM.getKey());
952     }
953 
954     public String getTranscribingItemTypeLbForTaxLevelNm() {
955         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_TAX_LEVEL_NM.getKey());
956     }
957 
958     public String getTranscribingItemTypeLbForStatusNm() {
959         return getTranscribingItemTypeLbOptionByCurrentLocale(DaliConfigurationOption.TRANSCRIBING_ITEM_TYPE_LB_STATUS_NM.getKey());
960     }
961 
962     private String getTranscribingItemTypeLbOptionByCurrentLocale(String optionKey) {
963         Map<String, String> optionsByLocale = DaliBeans.splitAndMap(applicationConfig.getOption(optionKey), ";", ":");
964         return optionsByLocale.get(getI18nLocale().toString());
965     }
966 
967     /**
968      * <p>getAlternativeTaxonOriginTaxRef.</p>
969      *
970      * @return a {@link java.lang.String} object.
971      */
972     public String getAlternativeTaxonOriginTaxRef() {
973         return applicationConfig.getOption(DaliConfigurationOption.ALTERNATIVE_TAXON_ORIGIN_TAXREF.getKey());
974     }
975 
976     /**
977      * <p>getAlternativeTaxonOriginWorms.</p>
978      *
979      * @return a {@link java.lang.String} object.
980      */
981     public String getAlternativeTaxonOriginWorms() {
982         return applicationConfig.getOption(DaliConfigurationOption.ALTERNATIVE_TAXON_ORIGIN_WORMS.getKey());
983     }
984 
985     public URL getSismerURL() {
986         return applicationConfig.getOptionAsURL(DaliConfigurationOption.SISMER_WEBSITE_URL.getKey());
987     }
988 
989     public int getControlSurveyLocationMinDistanceInMeter() {
990         return applicationConfig.getOptionAsInt(DaliConfigurationOption.CONTROL_SURVEY_LOCATION_MINIMUM_DISTANCE_IN_METER.getKey());
991     }
992 
993     public MapMode getPreferredMapMode() {
994         return Enums.fromCode(MapMode.class, applicationConfig.getOption(DaliConfigurationOption.MAP_BASE_LAYER_DEFAULT.getKey()));
995     }
996 
997     public MapProjection getMapProjection() {
998         return Enums.fromCode(MapProjection.class, applicationConfig.getOption(DaliConfigurationOption.MAP_PROJECTION_CODE.getKey()));
999     }
1000 
1001     public String getMapSextantWMSUrl() {
1002         return applicationConfig.getOption(DaliConfigurationOption.MAP_SEXTANT_WMS_URL.getKey());
1003     }
1004 
1005     public String getMapSextantWMTSUrl() {
1006         return applicationConfig.getOption(DaliConfigurationOption.MAP_SEXTANT_WMTS_URL.getKey());
1007     }
1008 
1009     public String getMapOSMUrl() {
1010         return applicationConfig.getOption(DaliConfigurationOption.MAP_OSM_URL.getKey());
1011     }
1012 
1013     public String getMapOTMUrl() {
1014         return applicationConfig.getOption(DaliConfigurationOption.MAP_OTM_URL.getKey());
1015     }
1016 
1017     public String getMapCartoBaseUrl() {
1018         return applicationConfig.getOption(DaliConfigurationOption.MAP_CARTO_BASE_URL.getKey());
1019     }
1020 
1021     public String getMapSatelliteUrl() {
1022         return applicationConfig.getOption(DaliConfigurationOption.MAP_SATELLITE_URL.getKey());
1023     }
1024 
1025     public int getMaxSurveyInMap() {
1026         return applicationConfig.getOptionAsInt(DaliConfigurationOption.MAP_MAX_SELECTION.getKey());
1027     }
1028 
1029     public boolean isSamplingOperationAutoLabelEnable() {
1030         return applicationConfig.getOptionAsBoolean(DaliConfigurationOption.SAMPLING_OPERATION_AUTO_LABEL_ENABLE.getKey());
1031     }
1032 
1033     public int getGridInitializationMaxCombinationCount() {
1034         return applicationConfig.getOptionAsInt(DaliConfigurationOption.GRID_INITIALIZATION_MAX_COMBINATION_COUNT.getKey());
1035     }
1036 }