View Javadoc
1   package fr.ifremer.quadrige3.core.config;
2   
3   /*-
4    * #%L
5    * Quadrige3 Core :: Quadrige3 Core Shared
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2017 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  
27  
28  
29  import com.google.common.base.Charsets;
30  import com.google.common.base.Joiner;
31  import com.google.common.base.Splitter;
32  import com.google.common.collect.ImmutableSet;
33  import com.google.common.collect.Sets;
34  import fr.ifremer.quadrige3.core.dao.technical.Daos;
35  import fr.ifremer.quadrige3.core.dao.technical.hibernate.DateType;
36  import fr.ifremer.quadrige3.core.dao.technical.spring.Springs;
37  import fr.ifremer.quadrige3.core.exception.QuadrigeTechnicalException;
38  import org.apache.commons.lang3.ArrayUtils;
39  import org.apache.commons.lang3.StringUtils;
40  import org.apache.commons.logging.Log;
41  import org.apache.commons.logging.LogFactory;
42  import org.nuiton.config.ApplicationConfig;
43  import org.nuiton.config.ApplicationConfigHelper;
44  import org.nuiton.config.ApplicationConfigProvider;
45  import org.nuiton.config.ArgumentsParserException;
46  import org.nuiton.version.Version;
47  import org.springframework.beans.BeansException;
48  import org.springframework.beans.factory.BeanInitializationException;
49  import org.springframework.beans.factory.InitializingBean;
50  import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
51  import org.springframework.context.ApplicationContext;
52  import org.springframework.context.ApplicationContextAware;
53  import org.springframework.core.io.Resource;
54  import org.springframework.util.CollectionUtils;
55  
56  import java.io.File;
57  import java.io.IOException;
58  import java.io.InputStream;
59  import java.net.MalformedURLException;
60  import java.net.URL;
61  import java.util.*;
62  
63  import static org.nuiton.i18n.I18n.t;
64  
65  /**
66   * Access to configuration options
67   *
68   * @author Benoit Lavenier <benoit.lavenier@e-is.pro>
69   */
70  public class QuadrigeConfiguration extends PropertyPlaceholderConfigurer implements ApplicationContextAware, InitializingBean {
71      /** Logger. */
72      private static final Log log = LogFactory.getLog(QuadrigeConfiguration.class);
73  
74      private static final String DEFAULT_SHARED_CONFIG_FILE = "quadrige3-core-shared.config";
75  
76      /**
77       * Delegate application config.
78       */
79      protected final ApplicationConfig applicationConfig;
80  
81      private ApplicationContext appContext = null;
82  
83      private boolean isInitialize = false;
84  
85      private static QuadrigeConfiguration instance;
86  
87      /**
88       * <p>Getter for the field <code>instance</code>.</p>
89       *
90       * @return a {@link QuadrigeConfiguration} object.
91       */
92      public static QuadrigeConfiguration getInstance() {
93          return instance;
94      }
95  
96      /**
97       * <p>Setter for the field <code>instance</code>.</p>
98       *
99       * @param instance a {@link QuadrigeConfiguration} object.
100      */
101     public static void setInstance(QuadrigeConfiguration instance) {
102         QuadrigeConfiguration.instance = instance;
103     }
104 
105     private File configFile;
106 
107     /**
108      * <p>Constructor for QuadrigeConfiguration.</p>
109      *
110      * @param applicationConfig a {@link org.nuiton.config.ApplicationConfig} object.
111      */
112     public QuadrigeConfiguration(ApplicationConfig applicationConfig) {
113         super();
114         this.applicationConfig = applicationConfig;
115     }
116 
117     /**
118      * <p>Constructor for QuadrigeConfiguration.</p>
119      *
120      * @param file a {@link java.lang.String} object.
121      * @param args a {@link java.lang.String} object.
122      */
123     public QuadrigeConfiguration(String file, String... args) {
124         super();
125         this.applicationConfig = new ApplicationConfig();
126         this.applicationConfig.setEncoding(Charsets.UTF_8.name());
127         this.applicationConfig.setConfigFileName(file);
128 
129         // get all config providers
130         Set<ApplicationConfigProvider> providers =
131                 ApplicationConfigHelper.getProviders(null,
132                         null,
133                         null,
134                         true);
135 
136         // load all default options
137         ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
138                 providers);
139 
140         // Load actions
141         for (ApplicationConfigProvider provider : providers) {
142             applicationConfig.loadActions(provider.getActions());
143         }
144 
145         // Define Alias
146         addAlias(applicationConfig);
147 
148         // Override some external module default config (quadrige3)
149         overrideExternalModulesDefaultOptions(applicationConfig);
150 
151         try {
152             applicationConfig.parse(args);
153 
154         } catch (ArgumentsParserException e) {
155             throw new QuadrigeTechnicalException(t("quadrige3.config.parse.error"), e);
156         }
157 
158         // TODO Review this, this is very dirty to do this...
159         File appBasedir = applicationConfig.getOptionAsFile(
160                 QuadrigeConfigurationOption.BASEDIR.getKey());
161 
162         if (appBasedir == null) {
163             appBasedir = new File("");
164         }
165         if (!appBasedir.isAbsolute()) {
166             appBasedir = new File(appBasedir.getAbsolutePath());
167         }
168         if (appBasedir.getName().equals("..")) {
169             appBasedir = appBasedir.getParentFile().getParentFile();
170         }
171         if (appBasedir.getName().equals(".")) {
172             appBasedir = appBasedir.getParentFile();
173         }
174         if (log.isInfoEnabled()) {
175             log.info("Application basedir: " + appBasedir);
176         }
177         applicationConfig.setOption(
178                 QuadrigeConfigurationOption.BASEDIR.getKey(),
179                 appBasedir.getAbsolutePath());
180     }
181 
182     /**
183      * Add alias to the given ApplicationConfig. <p/>
184      * This method could be override to add specific alias
185      *
186      * @param applicationConfig a {@link org.nuiton.config.ApplicationConfig} object.
187      */
188     protected void addAlias(ApplicationConfig applicationConfig) {
189         applicationConfig.addAlias("-u", "--option", QuadrigeConfigurationOption.JDBC_USERNAME.getKey());
190         applicationConfig.addAlias("--user", "--option", QuadrigeConfigurationOption.JDBC_USERNAME.getKey());
191         applicationConfig.addAlias("-p", "--option", QuadrigeConfigurationOption.JDBC_PASSWORD.getKey());
192         applicationConfig.addAlias("--password", "--option", QuadrigeConfigurationOption.JDBC_PASSWORD.getKey());
193         applicationConfig.addAlias("-db", "--option", QuadrigeConfigurationOption.JDBC_URL.getKey());
194         applicationConfig.addAlias("--database", "--option", QuadrigeConfigurationOption.JDBC_URL.getKey());
195 
196         applicationConfig.addAlias("--output", "--option", QuadrigeConfigurationOption.LIQUIBASE_OUTPUT_FILE.getKey());
197         applicationConfig.addAlias("-f", "--option", QuadrigeConfigurationOption.LIQUIBASE_FORCE_OUTPUT_FILE.getKey(), "true");
198 
199         applicationConfig.addAlias("--port", "--option", QuadrigeConfigurationOption.SERVER_PORT.getKey());
200     }
201 
202     // Could be subclasses
203     /**
204      * <p>overrideExternalModulesDefaultOptions.</p>
205      *
206      * @param applicationConfig a {@link org.nuiton.config.ApplicationConfig} object.
207      */
208     protected void overrideExternalModulesDefaultOptions(ApplicationConfig applicationConfig) {
209         // Map synchro.persistence.XXX to quadrige3.persistence.XXX
210         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
211                 "synchro.persistence",
212                 QuadrigeConfigurationOption.values(),
213                 "quadrige3.persistence");
214 
215         // Map synchro.XXX to quadrige3.synchro.XXX
216         QuadrigeConfigurations.remapOptionsToPrefix(applicationConfig,
217                 "synchro",
218                 QuadrigeConfigurationOption.values(),
219                 "quadrige3.synchro");
220 
221         applicationConfig.setDefaultOption("synchro.tempQueryParameter.userId.column", "QUSER_ID");
222     }
223 
224     /** {@inheritDoc} */
225     @Override
226     public void setApplicationContext(ApplicationContext appContext) throws BeansException {
227         this.appContext = appContext;
228     }
229 
230     /** {@inheritDoc} */
231     @Override
232     public void afterPropertiesSet() throws Exception {
233 
234         if (isInitialize) {
235             return;
236         }
237         isInitialize = true;
238 
239         // Retrieve paths from configuration
240         String[] enumerationFilePaths = getEnumerationFilesPath();
241         if (ArrayUtils.isEmpty(enumerationFilePaths)) {
242             throw new BeanInitializationException(
243                     String.format(
244                             "No enumeration files path has been set in the configuration. This is required to initialize enumeration values. Please set the option [%s] in configuration file.",
245                             QuadrigeConfigurationOption.DB_ENUMERATION_RESOURCE));
246         }
247         if (log.isDebugEnabled()) {
248             log.debug(String.format("Getting enumeration files from path: %s", Arrays.toString(enumerationFilePaths)));
249         }
250 
251         // For each path, retrieve corresponding resources
252         List<Resource> resources = Springs.getResourcesFromPaths(enumerationFilePaths, appContext, true);
253 
254         // Check if some files has been found
255         if (CollectionUtils.isEmpty(resources)) {
256             throw new BeanInitializationException(String.format("No enumeration files could be found from path %s",
257                     Arrays.toString(enumerationFilePaths)));
258         }
259         if (log.isDebugEnabled()) {
260             log.debug(String.format("%s enumeration files found from path: %s", resources.size(), Arrays.toString(enumerationFilePaths)));
261         }
262 
263         // Set enumeration default values (from enumeration file)
264         QuadrigeEnumerationHelper.reload(applicationConfig, resources);
265 
266         // Init the application version
267         initVersion(applicationConfig);
268 
269         // Init time zone
270         initTimeZone();
271     }
272 
273     /**
274      * Initialization default timezone, from configuration (mantis #24623)
275      */
276     protected void initTimeZone() {
277 
278         String dbTimeZone = applicationConfig.getOption(QuadrigeConfigurationOption.DB_TIMEZONE.getKey());
279         if (StringUtils.isNotBlank(dbTimeZone)) {
280             if (log.isInfoEnabled()) {
281                 log.info(String.format("Using timezone [%s] for database", dbTimeZone));
282             }
283             DateType.setTimeZone(TimeZone.getTimeZone(dbTimeZone));
284         } else if (log.isInfoEnabled()) {
285             log.info(String.format("Using default timezone [%s] for database", System.getProperty("user.timezone")));
286         }
287     }
288 
289 
290     /**
291      * Make sure the version default value is the implementation version (using a properties file, filtered by Maven
292      * at build time). This avoid to manually update the version default value, in enumeration QuadrigeConfigurationOption)
293      *
294      * @param applicationConfig a {@link org.nuiton.config.ApplicationConfig} object.
295      */
296     protected void initVersion(ApplicationConfig applicationConfig) {
297 
298         try {
299             // Load the properties file, from classpath
300             Properties sharedConfigFile = new Properties();
301             InputStream fis = getClass().getClassLoader().getResourceAsStream(DEFAULT_SHARED_CONFIG_FILE);
302             sharedConfigFile.load(fis);
303             fis.close();
304 
305             // If version property has been filled, use it as default version
306             String defaultVersion = applicationConfig.getOption(QuadrigeConfigurationOption.VERSION.getKey());
307             String implementationVersion = sharedConfigFile.getProperty(QuadrigeConfigurationOption.VERSION.getKey());
308             if (StringUtils.isNotBlank(implementationVersion)
309                     && StringUtils.isNotBlank(defaultVersion)
310                     && !Objects.equals(implementationVersion, defaultVersion)) {
311                 if (log.isDebugEnabled()) {
312                     log.debug(String.format("Replace default version option value [%s] with implementation value [%s] found in file [%s]",
313                             defaultVersion,
314                             implementationVersion,
315                             DEFAULT_SHARED_CONFIG_FILE));
316                 }
317                 applicationConfig.setDefaultOption(
318                         QuadrigeConfigurationOption.VERSION.getKey(),
319                         implementationVersion);
320             }
321             else if (StringUtils.isNotBlank(implementationVersion)) {
322                 if (log.isInfoEnabled()) {
323                     log.info("Version: " + implementationVersion);
324                 }
325                 applicationConfig.setDefaultOption(
326                         QuadrigeConfigurationOption.VERSION.getKey(),
327                         implementationVersion);
328             }
329             else if (StringUtils.isNotBlank(defaultVersion)) {
330                 if (log.isInfoEnabled()) {
331                     log.info("Version: " + defaultVersion);
332                 }
333             }
334             else if (log.isErrorEnabled()) {
335                 log.error(String.format("Could init version, from classpath file [%s]", DEFAULT_SHARED_CONFIG_FILE));
336             }
337         } catch (IOException e) {
338             log.warn(String.format("Could not load implementation version from file [%s]", DEFAULT_SHARED_CONFIG_FILE));
339         }
340 
341     }
342 
343     /**
344      * <p>Getter for the field <code>configFile</code>.</p>
345      *
346      * @return a {@link java.io.File} object.
347      */
348     public File getConfigFile() {
349         if (configFile == null) {
350             File dir = getBasedir();
351             if (dir == null || !dir.exists()) {
352                 dir = new File(applicationConfig.getUserConfigDirectory());
353             }
354             configFile = new File(dir, applicationConfig.getConfigFileName());
355         }
356         return configFile;
357     }
358 
359     /**
360      * <p>getBasedir.</p>
361      *
362      * @return a {@link java.io.File} object.
363      */
364     public File getBasedir() {
365         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.BASEDIR.getKey());
366     }
367 
368     /**
369      * <p>getDataDirectory.</p>
370      *
371      * @return a {@link java.io.File} object.
372      */
373     public File getDataDirectory() {
374         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DATA_DIRECTORY.getKey());
375     }
376 
377     /**
378      * <p>Getter for the field <code>applicationConfig</code>.</p>
379      *
380      * @return a {@link org.nuiton.config.ApplicationConfig} object.
381      */
382     public ApplicationConfig getApplicationConfig() {
383         return applicationConfig;
384     }
385 
386     /** {@inheritDoc} */
387     @Override
388     protected String resolvePlaceholder(String placeholder, Properties props) {
389         if (applicationConfig == null) {
390             throw new QuadrigeTechnicalException(
391                     "Configuration.applicationConfig must not be null. Please initialize Configuration instance with a not null applicationConfig BEFORE starting Spring.");
392         }
393 
394         // Try to resolve placeholder from application configuration
395         String optionValue = applicationConfig.getOption(placeholder);
396         if (optionValue != null) {
397             return optionValue;
398         }
399 
400         // If not found in configuration, delegate to the default Spring mecanism
401         return super.resolvePlaceholder(placeholder, props);
402     }
403 
404     /**
405      * <p>getTempDirectory.</p>
406      *
407      * @return a {@link java.io.File} object.
408      */
409     public File getTempDirectory() {
410         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.TMP_DIRECTORY.getKey());
411     }
412 
413     /**
414      * <p>getDbDirectory.</p>
415      *
416      * @return a {@link java.io.File} object.
417      */
418     public File getDbDirectory() {
419         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DB_DIRECTORY.getKey());
420     }
421 
422     /**
423      * <p>setDbDirectory.</p>
424      *
425      * @param dbDirectory a {@link java.io.File} object.
426      */
427     public void setDbDirectory(File dbDirectory) {
428         applicationConfig.setOption(QuadrigeConfigurationOption.DB_DIRECTORY.getKey(), dbDirectory.getPath());
429     }
430 
431     /**
432      * <p>setJdbcUrl.</p>
433      *
434      * @param jdbcUrl a {@link java.lang.String} object.
435      */
436     public void setJdbcUrl(String jdbcUrl) {
437         applicationConfig.setOption(QuadrigeConfigurationOption.JDBC_URL.getKey(), jdbcUrl);
438     }
439 
440     /**
441      * <p>getDbTimezone.</p>
442      *
443      * @return a {@link java.util.TimeZone} object.
444      */
445     public TimeZone getDbTimezone() {
446         String tz = applicationConfig.getOption(QuadrigeConfigurationOption.DB_TIMEZONE.getKey());
447         return StringUtils.isNotBlank(tz) ? TimeZone.getTimeZone(tz) : TimeZone.getDefault();
448     }
449 
450     /**
451      * <p>getDbAttachmentDirectory.</p>
452      *
453      * @return a {@link java.io.File} object.
454      */
455     public File getDbAttachmentDirectory() {
456         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DB_ATTACHMENT_DIRECTORY.getKey());
457     }
458 
459     public File getDbPhotoDirectory() {
460         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DB_PHOTO_DIRECTORY.getKey());
461     }
462 
463     /**
464      * <p>getCacheDirectory.</p>
465      *
466      * @return a {@link java.io.File} object.
467      */
468     public File getCacheDirectory() {
469         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DB_CACHE_DIRECTORY.getKey());
470     }
471 
472     /**
473      * <p>getDbBackupDirectory.</p>
474      *
475      * @return a {@link java.io.File} object.
476      */
477     public File getDbBackupDirectory() {
478         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.DB_BACKUP_DIRECTORY.getKey());
479     }
480 
481     /**
482      * <p>getAdminEmail.</p>
483      *
484      * @return a {@link java.lang.String} object, the admin email.
485      */
486     public String getAdminEmail() {
487         return applicationConfig.getOption(QuadrigeConfigurationOption.ADMIN_EMAIL.getKey());
488     }
489 
490     /**
491      * <p>getSynchroExportDirectoryByUser.</p>
492      *
493      * @param userId a int.
494      * @return a {@link java.io.File} object.
495      */
496     public File getSynchroExportDirectoryByUser(int userId) {
497         return new File(
498                 getSynchronizationDirectory(),
499                 new StringBuilder()
500                         .append(userId)
501                         .append(File.separator)
502                         .append("export")
503                         .toString());
504     }
505 
506     /**
507      * <p>getSynchroImportDirectoryByUser.</p>
508      *
509      * @param userId a int.
510      * @return a {@link java.io.File} object.
511      */
512     public File getSynchroImportDirectoryByUser(int userId) {
513         return new File(
514                 getSynchronizationDirectory(),
515                 new StringBuilder()
516                         .append(userId)
517                         .append(File.separator)
518                         .append("import")
519                         .toString());
520     }
521 
522     /**
523      * <p>useLiquibaseAutoRun.</p>
524      *
525      * @return a boolean.
526      */
527     public boolean useLiquibaseAutoRun() {
528         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.LIQUIBASE_RUN_AUTO.getKey());
529     }
530 
531     /**
532      * <p>getLiquibaseChangeLogPath.</p>
533      *
534      * @return a {@link java.lang.String} object.
535      */
536     public String getLiquibaseChangeLogPath() {
537         return applicationConfig.getOption(QuadrigeConfigurationOption.LIQUIBASE_CHANGE_LOG_PATH.getKey());
538     }
539 
540     /**
541      * <p>getDbCreateScriptPath.</p>
542      *
543      * @return a {@link java.lang.String} object.
544      */
545     public String getDbCreateScriptPath() {
546         return applicationConfig.getOption(QuadrigeConfigurationOption.DB_CREATE_SCRIPT_PATH.getKey());
547     }
548 
549     public String getPostgisSchema() {
550         return applicationConfig.getOption(QuadrigeConfigurationOption.POSTGIS_SCHEMA.getKey());
551     }
552 
553     /**
554      * <p>getHibernateDialect.</p>
555      *
556      * @return a {@link java.lang.String} object.
557      */
558     public String getHibernateDialect() {
559         return applicationConfig.getOption(QuadrigeConfigurationOption.HIBERNATE_DIALECT.getKey());
560     }
561 
562     /**
563      * <p>getHibernateClientQueriesFile.</p>
564      *
565      * @return a {@link java.lang.String} object.
566      */
567     public String getHibernateClientQueriesFile() {
568         return applicationConfig.getOption(QuadrigeConfigurationOption.HIBERNATE_CLIENT_QUERIES_FILE.getKey());
569     }
570 
571     /**
572      * <p>getJdbcDriver.</p>
573      *
574      * @return a {@link java.lang.String} object.
575      */
576     public String getJdbcDriver() {
577         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_DRIVER.getKey());
578     }
579 
580     /**
581      * <p>getJdbcURL.</p>
582      *
583      * @return a {@link java.lang.String} object.
584      */
585     public String getJdbcURL() {
586         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_URL.getKey());
587     }
588 
589     /**
590      * <p>getJdbcCatalog.</p>
591      *
592      * @return a {@link java.lang.String} object.
593      */
594     public String getJdbcCatalog() {
595         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_CATALOG.getKey());
596     }
597 
598     /**
599      * <p>getJdbcSchema.</p>
600      *
601      * @return a {@link java.lang.String} object.
602      */
603     public String getJdbcSchema() {
604         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_SCHEMA.getKey());
605     }
606 
607     /**
608      * <p>debugEntityLoad.</p>
609      *
610      * @return a boolean.
611      */
612     public boolean debugEntityLoad() {
613         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.DEBUG_ENTITY_LOAD.getKey());
614     }
615 
616     /**
617      * <p>getDbName.</p>
618      *
619      * @return a {@link java.lang.String} object.
620      */
621     public String getDbName() {
622         return applicationConfig.getOption(QuadrigeConfigurationOption.DB_NAME.getKey());
623     }
624 
625     /**
626      * <p>getDbValidationQuery.</p>
627      *
628      * @return a {@link java.lang.String} object.
629      */
630     public String getDbValidationQuery() {
631         return applicationConfig.getOption(QuadrigeConfigurationOption.DB_VALIDATION_QUERY.getKey());
632     }
633 
634     /**
635      * <p>getJdbcUsername.</p>
636      *
637      * @return a {@link java.lang.String} object.
638      */
639     public String getJdbcUsername() {
640         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_USERNAME.getKey());
641     }
642 
643     /**
644      * <p>getJdbcPassword.</p>
645      *
646      * @return a {@link java.lang.String} object.
647      */
648     public String getJdbcPassword() {
649         return applicationConfig.getOption(QuadrigeConfigurationOption.JDBC_PASSWORD.getKey());
650     }
651 
652     /**
653      * <p>getJdbcBatchSize.</p>
654      *
655      * @return a int.
656      */
657     public int getJdbcBatchSize() {
658         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.JDBC_BATCH_SIZE.getKey());
659     }
660 
661     /**
662      * <p>getStatusCodeTemporary.</p>
663      *
664      * @return a {@link java.lang.String} object.
665      */
666     public String getStatusCodeTemporary() {
667         return applicationConfig.getOption(QuadrigeConfigurationOption.STATUS_CODE_TEMPORARY.getKey());
668     }
669 
670     /**
671      * <p>getStatusCodeValid.</p>
672      *
673      * @return a {@link java.lang.String} object.
674      */
675     public String getStatusCodeValid() {
676         return applicationConfig.getOption(QuadrigeConfigurationOption.STATUS_CODE_ENABLE.getKey());
677     }
678 
679     /**
680      * <p>getVersion.</p>
681      *
682      * @return a {@link org.nuiton.version.Version} object.
683      */
684     public Version getVersion() {
685         return applicationConfig.getOptionAsVersion(QuadrigeConfigurationOption.VERSION.getKey());
686     }
687 
688     /**
689      * <p>getI18nDirectory.</p>
690      *
691      * @return a {@link java.io.File} object.
692      */
693     public File getI18nDirectory() {
694         return applicationConfig.getOptionAsFile(
695                 QuadrigeConfigurationOption.I18N_DIRECTORY.getKey());
696     }
697 
698     /**
699      * <p>getI18nLocale.</p>
700      *
701      * @return a {@link java.util.Locale} object.
702      */
703     public Locale getI18nLocale() {
704         return applicationConfig.getOptionAsLocale(
705                 QuadrigeConfigurationOption.I18N_LOCALE.getKey());
706     }
707 
708     /**
709      * <p>setI18nLocale.</p>
710      *
711      * @param locale a {@link java.util.Locale} object.
712      */
713     public void setI18nLocale(Locale locale) {
714         applicationConfig.setOption(QuadrigeConfigurationOption.I18N_LOCALE.getKey(), locale.toString());
715     }
716 
717 
718     /**
719      * <p>getImportDataTablesIncludes.</p>
720      *
721      * @return a {@link java.util.Set} object.
722      */
723     public Set<String> getImportDataTablesIncludes() {
724         String dataTablesStr = applicationConfig.getOption(QuadrigeConfigurationOption.IMPORT_TABLES_DATA_INCLUDES.getKey());
725         Set<String> result = null;
726         if (StringUtils.isNotBlank(dataTablesStr)) {
727             result = ImmutableSet.<String> builder()
728                     .add(dataTablesStr.toUpperCase().split("\\s*,\\s*"))
729                     .build();
730         }
731         return result;
732     }
733 
734     /**
735      * <p>getImportReferentialTablesIncludes.</p>
736      *
737      * @return a {@link java.util.Set} object.
738      */
739     public Set<String> getImportReferentialTablesIncludes() {
740         String referentialTablesStr = applicationConfig.getOption(QuadrigeConfigurationOption.IMPORT_TABLES_REFERENTIAL_INCLUDES.getKey());
741         Set<String> result = null;
742         if (StringUtils.isNotBlank(referentialTablesStr)) {
743             result = ImmutableSet.<String> builder().add(referentialTablesStr.split("\\s*,\\s*")).build();
744         }
745         return result;
746     }
747 
748     /**
749      * <p>isEnableImportTablesRules.</p>
750      *
751      * @return true if RULE_* table must be imported
752      */
753     public boolean isEnableImportTablesRules() {
754         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.IMPORT_TABLES_RULES_ENABLE.getKey());
755     }
756 
757     /**
758      * <p>getImportDataPkIncludes.</p>
759      *
760      * @return a {@link java.lang.String} object.
761      */
762     public String getImportDataPkIncludes() {
763         return applicationConfig.getOption(QuadrigeConfigurationOption.IMPORT_DATA_PK_INCLUDES.getKey());
764     }
765 
766     /**
767      * <p>getImportNbYearDataHistory.</p>
768      *
769      * @return a int.
770      */
771     public int getImportNbYearDataHistory() {
772         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.IMPORT_NB_YEARS_DATA_HISTORY.getKey());
773     }
774 
775     /**
776      * <p>getExportDataUpdateDateDelayInSecond.</p>
777      *
778      * @return a int.
779      */
780     public int getExportDataUpdateDateDelayInSecond() {
781         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.EXPORT_DATA_UPDATE_DATE_DELAY.getKey());
782     }
783 
784     /**
785      * <p>getExportDataUpdateDateShortDelayInSecond.</p>
786      *
787      * @return a int.
788      */
789     public int getExportDataUpdateDateShortDelayInSecond() {
790         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.EXPORT_DATA_UPDATE_DATE_SHORT_DELAY.getKey());
791     }
792 
793     public long getExportDataFileMaxUploadSize() {
794         return applicationConfig.getOptionAsLong(QuadrigeConfigurationOption.EXPORT_DATA_FILE_MAX_UPLOAD_SIZE.getKey());
795     }
796 
797     /**
798      * <p>getImportReferentialUpdateDateOffsetInSecond.</p>
799      *
800      * @return a int.
801      */
802     public int getImportReferentialUpdateDateOffsetInSecond() {
803         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.IMPORT_REFERENTIAL_UPDATE_DATE_OFFSET.getKey());
804     }
805 
806     /**
807      * <p>getImportReferentialStatusIncludes.</p>
808      *
809      * @return a {@link java.lang.String} object.
810      */
811     public String getImportReferentialStatusIncludes() {
812         return applicationConfig.getOption(QuadrigeConfigurationOption.IMPORT_REFERENTIAL_STATUS_INCLUDES.getKey());
813     }
814 
815     /**
816      * <p>getImportTranscribingItemTypeLbIncludes.</p>
817      *
818      * @return a {@link java.lang.String} object.
819      */
820     public String getImportTranscribingItemTypeLbIncludes() {
821         return applicationConfig.getOption(QuadrigeConfigurationOption.IMPORT_TRANSCRIBING_ITEM_TYPE_LB_INCLUDES.getKey());
822     }
823 
824     /**
825      * Get programs list, to limit synchronization (in/out) to this programs
826      *
827      * @return a {@link java.util.Set} object.
828      */
829     public Set<String> getSynchroProgramCodeIncludes() {
830         String programCodesStr = applicationConfig.getOption(QuadrigeConfigurationOption.SYNCHRO_PROGRAM_CODES_INCLUDES.getKey());
831         if (StringUtils.isBlank(programCodesStr)) {
832             return new HashSet<>();
833         }
834 
835         return Sets.newLinkedHashSet(
836                 Splitter.on(',').trimResults().omitEmptyStrings().split(programCodesStr)
837         );
838     }
839 
840     public void setSynchroProgramCodeIncludes(Set<String> programCodes) {
841         String option = CollectionUtils.isEmpty(programCodes) ? null : Joiner.on(',').join(programCodes);
842         applicationConfig.setOption(QuadrigeConfigurationOption.SYNCHRO_PROGRAM_CODES_INCLUDES.getKey(), option);
843     }
844 
845     /**
846      * <p>getConnectionProperties.</p>
847      *
848      * @return a {@link java.util.Properties} object.
849      */
850     public Properties getConnectionProperties() {
851         return Daos.getConnectionProperties(
852                 getJdbcURL(),
853                 getJdbcUsername(),
854                 getJdbcPassword(),
855                 null,
856                 getHibernateDialect(),
857                 getJdbcDriver());
858     }
859 
860     /**
861      * <p>getLiquibaseDiffTypes.</p>
862      *
863      * @return a {@link java.lang.String} object.
864      */
865     public String getLiquibaseDiffTypes() {
866         return applicationConfig.getOption(QuadrigeConfigurationOption.LIQUIBASE_DIFF_TYPES.getKey());
867     }
868 
869     /**
870      * <p>getLiquibaseOutputFile.</p>
871      *
872      * @return a {@link java.io.File} object.
873      */
874     public File getLiquibaseOutputFile() {
875         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.LIQUIBASE_OUTPUT_FILE.getKey());
876     }
877 
878     /**
879      * <p>isForceLiquibaseOutputFile.</p>
880      *
881      * @return a boolean.
882      */
883     public boolean isForceLiquibaseOutputFile() {
884         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.LIQUIBASE_FORCE_OUTPUT_FILE.getKey());
885     }
886 
887     /**
888      * <p>getServerPort.</p>
889      *
890      * @return a {@link java.lang.Integer} object.
891      */
892     public Integer getServerPort() {
893         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.SERVER_PORT.getKey());
894     }
895 
896     /**
897      * <p>getEnumerationFilesPath.</p>
898      *
899      * @return an array of {@link java.lang.String} objects.
900      */
901     public String[] getEnumerationFilesPath() {
902         String enumerationFilesPath = applicationConfig.getOption(QuadrigeConfigurationOption.DB_ENUMERATION_RESOURCE.getKey());
903         return enumerationFilesPath.split(",");
904     }
905 
906     //------------------------------------------------------------------------//
907     //--- Synchronization-related ---------------------------------------------------------//
908     //------------------------------------------------------------------------//
909 
910     /**
911      * <p>getSynchronizationSiteUrl.</p>
912      *
913      * @return a {@link java.net.URL} object.
914      */
915     public URL getSynchronizationSiteUrl() {
916         return getOptionAsURL(QuadrigeConfigurationOption.SYNCHRONIZATION_SITE_URL.getKey());
917     }
918 
919     /**
920      * <p>getSynchronizationSiteTimeout.</p>
921      *
922      * @return a {@link java.lang.Integer} object.
923      */
924     public Integer getSynchronizationSiteTimeout() {
925         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.SYNCHRONIZATION_SITE_TIMEOUT.getKey());
926     }
927 
928     /**
929      * <p>getSynchronizationRefreshTimeout.</p>
930      *
931      * @return a {@link java.lang.Integer} object.
932      */
933     public Integer getSynchronizationRefreshTimeout() {
934         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.SYNCHRONIZATION_REFRESH_TIMEOUT.getKey());
935     }
936 
937     /**
938      * <p>getSynchronizationRefreshTimeout.</p>
939      *
940      * @return a {@link java.lang.Integer} object.
941      */
942     public Integer getSynchronizationMaxRetryCount() {
943         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.SYNCHRONIZATION_RETRY_COUNT.getKey());
944     }
945 
946     /**
947      * <p>getSynchronizationRetryTimeout.</p>
948      *
949      * @return a {@link java.lang.Integer} object.
950      */
951     public Integer getSynchronizationRetryTimeout() {
952         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.SYNCHRONIZATION_RETRY_TIMEOUT.getKey());
953     }
954 
955     /**
956      * <p>getSynchronizationDirectory.</p>
957      *
958      * @return a {@link java.io.File} object.
959      */
960     public File getSynchronizationDirectory() {
961         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.SYNCHRONIZATION_DIRECTORY.getKey());
962     }
963     /**
964      * <p>getSynchroDirectory.</p>
965      *
966      * @return a {@link java.io.File} object.
967      */
968     public File getSynchroDirectory() {
969         return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.SYNCHRONIZATION_DIRECTORY.getKey());
970     }
971 
972     /**
973      * <p>isSynchronizationUsingServer.</p>
974      *
975      * @return a boolean.
976      */
977     public boolean isSynchronizationUsingServer() {
978         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.SYNCHRONIZATION_USE_SERVER.getKey());
979     }
980 
981     /**
982      * <p>getSynchroZipFilePrefix.</p>
983      *
984      * @return a {@link java.lang.String} object.
985      */
986     public String getSynchroZipFilePrefix() {
987         return applicationConfig.getOption(QuadrigeConfigurationOption.SYNCHRONIZATION_ZIP_FILE_PREFIX.getKey());
988     }
989 
990     /**
991      * <p>getExtractionDirectory.</p>
992      *
993      * @param type a {@link java.lang.String} object.
994      * @return a {@link java.io.File} object.
995      */
996     public File getExtractionDirectory(String type) {
997         switch (type.toUpperCase()) {
998             case "SINP" :
999                 return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.EXTRACTION_SINP_DIRECTORY.getKey());
1000             case "PAMPA":
1001                 return applicationConfig.getOptionAsFile(QuadrigeConfigurationOption.EXTRACTION_PAMPA_DIRECTORY.getKey());
1002         }
1003         return null;
1004     }
1005 
1006 //    public String getXmlQueryOrderedSQLTags() {
1007 //        return applicationConfig.getOption(QuadrigeConfigurationOption.XML_QUERY_ORDERED_SQL_TAGS.getKey());
1008 //    }
1009 
1010 //    public String getXmlQueryDTDFileName() {
1011 //        return applicationConfig.getOption(QuadrigeConfigurationOption.XML_QUERY_DTD_FILE_NAME.getKey());
1012 //    }
1013 
1014 //    public String getXmlQueryXSLFileName() {
1015 //        return applicationConfig.getOption(QuadrigeConfigurationOption.XML_QUERY_XSL_FILE_NAME.getKey());
1016 //    }
1017 
1018     /**
1019      * <p>getImportDataMaxRootRowCount.</p>
1020      *
1021      * @return a int.
1022      */
1023     public int getImportDataMaxRootRowCount() {
1024         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.IMPORT_DATA_MAX_ROOT_ROW_COUNT.getKey());
1025     }
1026 
1027     public String getMailSmtpHost() {
1028         return applicationConfig.getOption(QuadrigeConfigurationOption.MAIL_SMTP_HOST.getKey());
1029     }
1030 
1031     public int getMailSmtpPort() {
1032         return applicationConfig.getOptionAsInt(QuadrigeConfigurationOption.MAIL_SMTP_PORT.getKey());
1033     }
1034 
1035     public String getMailSmtpUsername() {
1036         return applicationConfig.getOption(QuadrigeConfigurationOption.MAIL_SMTP_USERNAME.getKey());
1037     }
1038 
1039     public String getMailSmtpPassword() {
1040         return applicationConfig.getOption(QuadrigeConfigurationOption.MAIL_SMTP_PASSWORD.getKey());
1041     }
1042 
1043     public String getMailSmtpSender() {
1044         return applicationConfig.getOption(QuadrigeConfigurationOption.MAIL_SMTP_SENDER.getKey());
1045     }
1046 
1047     public boolean getMailSmtpStartTLS() {
1048         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.MAIL_SMTP_STARTTLS.getKey());
1049     }
1050 
1051     public boolean getMailSmtpUseSSL() {
1052         return applicationConfig.getOptionAsBoolean(QuadrigeConfigurationOption.MAIL_SMTP_SSL.getKey());
1053     }
1054 
1055 
1056     /* -- protected methods -- */
1057 
1058     /**
1059      * <p>getOptionAsURL.</p>
1060      *
1061      * @param key a {@link java.lang.String} object.
1062      * @return a {@link java.net.URL} object.
1063      */
1064     protected URL getOptionAsURL(String key) {
1065         String urlString = applicationConfig.getOption(key);
1066 
1067         // Could be empty (e.g. demo deployment)
1068         if (StringUtils.isBlank(urlString)) {
1069             return null;
1070         }
1071 
1072         // correct end of the url string
1073         if (!urlString.endsWith("/")) {
1074             int schemeIndex = urlString.indexOf("://");
1075             int firstSlashIndex = urlString.indexOf('/', schemeIndex + 3);
1076             boolean addSlash = false;
1077             if (firstSlashIndex == -1) {
1078                 addSlash = true;
1079             }
1080             else {
1081                 int lastSlashIndex = urlString.lastIndexOf('/');
1082                 if (lastSlashIndex > firstSlashIndex) {
1083                     addSlash = urlString.indexOf('.', lastSlashIndex) == -1;
1084                 }
1085             }
1086 
1087             if (addSlash) {
1088                 urlString += '/';
1089             }
1090         }
1091 
1092         URL url = null;
1093         try {
1094             url = new URL(urlString);
1095         } catch (MalformedURLException ex) {
1096             log.error(ex.getLocalizedMessage(), ex);
1097         }
1098 
1099         return url;
1100     }
1101 }