1   package fr.ifremer.quadrige3.synchro.server.config;
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  import fr.ifremer.common.synchro.SynchroTechnicalException;
27  import fr.ifremer.common.synchro.config.SynchroConfiguration;
28  import fr.ifremer.common.synchro.config.SynchroConfigurationOption;
29  import fr.ifremer.quadrige3.core.config.QuadrigeConfiguration;
30  import fr.ifremer.quadrige3.core.config.QuadrigeConfigurationOption;
31  import fr.ifremer.quadrige3.core.dao.technical.Daos;
32  import org.apache.commons.io.FileUtils;
33  import org.apache.commons.lang3.StringUtils;
34  import org.apache.commons.logging.Log;
35  import org.apache.commons.logging.LogFactory;
36  import org.nuiton.config.ApplicationConfig;
37  import org.nuiton.i18n.I18n;
38  import org.nuiton.i18n.init.DefaultI18nInitializer;
39  import org.nuiton.i18n.init.UserI18nInitializer;
40  import org.nuiton.version.Version;
41  import org.nuiton.version.VersionBuilder;
42  
43  import javax.naming.InitialContext;
44  import javax.naming.NamingException;
45  import java.io.File;
46  import java.io.IOException;
47  import java.net.URL;
48  import java.util.Locale;
49  import java.util.Properties;
50  import java.util.TimeZone;
51  
52  
53  
54  
55  
56  public class SynchroServerConfiguration extends QuadrigeConfiguration {
57      
58      public static final String CONFIG_FILE_NAME = "synchro-server.config";
59      
60      private static final String CONFIG_FILE_ENV_PROPERTY = CONFIG_FILE_NAME;
61      
62      private static final String CONFIG_FILE_JNDI_NAME = "java:comp/env/" + CONFIG_FILE_NAME;
63      
64      
65      
66      private static final Log log = LogFactory.getLog(SynchroServerConfiguration.class);
67  
68      static {
69          instance = new SynchroServerConfiguration(getWebConfigFile());
70          initDefault();
71      }
72  
73      private static final SynchroServerConfiguration instance;
74  
75      
76  
77  
78      public static void initDefault() {
79          setInstance(instance);
80  
81          
82          SynchroConfiguration synchroConfig = new SynchroConfiguration(instance.getApplicationConfig());
83          SynchroConfiguration.setInstance(synchroConfig);
84      }
85  
86      
87  
88  
89  
90  
91      public static SynchroServerConfiguration getInstance() {
92          return instance;
93      }
94  
95      
96  
97  
98  
99  
100     public SynchroServerConfiguration(ApplicationConfig applicationConfig) {
101         super(applicationConfig);
102     }
103 
104     
105 
106 
107 
108 
109 
110     public SynchroServerConfiguration(String file, String... args) {
111         super(file, args);
112 
113         
114         try {
115             initI18n();
116         } catch (IOException e) {
117             throw new SynchroTechnicalException("i18n initialization failed", e);
118         }
119 
120         
121         try {
122             initDirectories();
123         } catch (IOException e) {
124             throw new SynchroTechnicalException("Directories initialization failed", e);
125         }
126 
127     }
128 
129     
130     @Override
131     protected void overrideExternalModulesDefaultOptions(ApplicationConfig applicationConfig) {
132         super.overrideExternalModulesDefaultOptions(applicationConfig);
133 
134         
135         applicationConfig.setDefaultOption(
136                 QuadrigeConfigurationOption.DBMS.getKey(),
137                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_DATASOURCE_TYPE.getKey()));
138         applicationConfig.setDefaultOption(
139                 QuadrigeConfigurationOption.JDBC_URL.getKey(),
140                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_URL.getKey()));
141         
142 
143             applicationConfig.setDefaultOption(
144                     QuadrigeConfigurationOption.JDBC_CATALOG.getKey(),
145                     String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_CATALOG.getKey()));
146 
147         applicationConfig.setDefaultOption(
148                 QuadrigeConfigurationOption.JDBC_SCHEMA.getKey(),
149                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_SCHEMA.getKey()));
150         applicationConfig.setDefaultOption(
151                 QuadrigeConfigurationOption.JDBC_USERNAME.getKey(),
152                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_USERNAME.getKey()));
153         applicationConfig.setDefaultOption(
154                 QuadrigeConfigurationOption.JDBC_PASSWORD.getKey(),
155                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_PASSWORD.getKey()));
156         applicationConfig.setDefaultOption(
157                 QuadrigeConfigurationOption.HIBERNATE_DIALECT.getKey(),
158                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_HIBERNATE_DIALECT.getKey()));
159         applicationConfig.setDefaultOption(
160                 QuadrigeConfigurationOption.JDBC_DRIVER.getKey(),
161                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_DRIVER.getKey()));
162 
163         
164         applicationConfig.setDefaultOption(
165                 SynchroConfigurationOption.DB_NAME.getKey(),
166                 String.format("${%s}", QuadrigeConfigurationOption.DB_NAME.getKey()));
167 
168         
169         applicationConfig.setDefaultOption(
170                 SynchroConfigurationOption.IMPORT_JDBC_URL.getKey(),
171                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_URL.getKey()));
172         
173 
174             applicationConfig.setDefaultOption(
175                     SynchroConfigurationOption.IMPORT_JDBC_CATALOG.getKey(),
176                     String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_CATALOG.getKey()));
177 
178         applicationConfig.setDefaultOption(
179                 SynchroConfigurationOption.IMPORT_JDBC_SCHEMA.getKey(),
180                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_SCHEMA.getKey()));
181         applicationConfig.setDefaultOption(
182                 SynchroConfigurationOption.IMPORT_JDBC_USERNAME.getKey(),
183                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_USERNAME.getKey()));
184         applicationConfig.setDefaultOption(
185                 SynchroConfigurationOption.IMPORT_JDBC_PASSWORD.getKey(),
186                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_PASSWORD.getKey()));
187         applicationConfig.setDefaultOption(
188                 SynchroConfigurationOption.IMPORT_HIBERNATE_DIALECT.getKey(),
189                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_HIBERNATE_DIALECT.getKey()));
190         applicationConfig.setDefaultOption(
191                 SynchroConfigurationOption.IMPORT_JDBC_DRIVER.getKey(),
192                 String.format("${%s}", SynchroServerConfigurationOption.SERVER_JDBC_DRIVER.getKey()));
193 
194         
195         applicationConfig.setDefaultOption(
196                 SynchroConfigurationOption.JDBC_URL.getKey(),
197                 String.format("${%s}", SynchroServerConfigurationOption.CLIENT_JDBC_URL.getKey()));
198         applicationConfig.setDefaultOption(
199                 SynchroConfigurationOption.JDBC_CATALOG.getKey(),
200                 SynchroServerConfigurationOption.CLIENT_JDBC_CATALOG.getDefaultValue());
201         applicationConfig.setDefaultOption(
202                 SynchroConfigurationOption.JDBC_SCHEMA.getKey(),
203                 String.format("${%s}", SynchroServerConfigurationOption.CLIENT_JDBC_SCHEMA.getKey()));
204         applicationConfig.setDefaultOption(
205                 SynchroConfigurationOption.JDBC_USERNAME.getKey(),
206                 String.format("${%s}", SynchroServerConfigurationOption.CLIENT_JDBC_USERNAME.getKey()));
207         applicationConfig.setDefaultOption(
208                 SynchroConfigurationOption.JDBC_PASSWORD.getKey(),
209                 SynchroServerConfigurationOption.CLIENT_JDBC_PASSWORD.getDefaultValue());
210         applicationConfig.setDefaultOption(
211                 SynchroConfigurationOption.HIBERNATE_DIALECT.getKey(),
212                 String.format("${%s}", SynchroServerConfigurationOption.CLIENT_HIBERNATE_DIALECT.getKey()));
213         applicationConfig.setDefaultOption(
214                 SynchroConfigurationOption.JDBC_DRIVER.getKey(),
215                 String.format("${%s}", SynchroServerConfigurationOption.CLIENT_JDBC_DRIVER.getKey()));
216 
217         
218         applicationConfig.setDefaultOption(
219                 SynchroConfigurationOption.DB_TIMEZONE.getKey(),
220                 String.format("${%s}", QuadrigeConfigurationOption.DB_TIMEZONE.getKey()));
221     }
222 
223 
224     
225 
226 
227 
228 
229     public String getVersionAsString() {
230         return getVersion().toString();
231     }
232     
233     
234 
235 
236 
237 
238     public Version getMinCompatibleVersion() {
239         
240         String versionAsString = applicationConfig.getOption(SynchroServerConfigurationOption.SYNCHRO_MIN_COMPATIBLE_VERSION.getKey());
241         if (StringUtils.isNotBlank(versionAsString)) {
242             return VersionBuilder.create(versionAsString).build();
243         }
244         return null;
245     }
246 
247     
248 
249 
250 
251 
252     public int getSynchroCorePoolSize() {
253         return applicationConfig.getOptionAsInt(SynchroServerConfigurationOption.SYNCHRO_CORE_POOL_SIZE.getKey());
254     }
255 
256     
257 
258 
259 
260 
261     public int getSynchroMaxPoolSize() {
262         return applicationConfig.getOptionAsInt(SynchroServerConfigurationOption.SYNCHRO_MAX_POOL_SIZE.getKey());
263     }
264 
265     
266 
267 
268 
269 
270     public int getSynchroQueueCapacity() {
271         return applicationConfig.getOptionAsInt(SynchroServerConfigurationOption.SYNCHRO_QUEUE_CAPACITY.getKey());
272     }
273     
274     
275 
276 
277 
278 
279     public String getSecurityMockUsername() {
280         return applicationConfig.getOption(SynchroServerConfigurationOption.SECURITY_MOCK_USERNAME.getKey());
281     }
282     
283     
284 
285 
286 
287 
288     public String getSecurityMockPassword() {
289         return applicationConfig.getOption(SynchroServerConfigurationOption.SECURITY_MOCK_PASSWORD.getKey());
290     }
291 
292     
293 
294 
295 
296 
297     public int getSecurityMockUserId() {
298         return applicationConfig.getOptionAsInt(SynchroServerConfigurationOption.SECURITY_MOCK_USER_ID.getKey());
299     }
300     
301     
302 
303 
304 
305 
306     public int getSynchroStatusIdleTimeSeconds() {
307         return applicationConfig.getOptionAsInt(SynchroServerConfigurationOption.SYNCHRO_STATUS_TIME_TO_IDLE.getKey());
308     }
309 
310     
311 
312 
313 
314 
315     public URL getUiBaseURL() {
316         return applicationConfig.getOptionAsURL(SynchroServerConfigurationOption.UI_BASE_URL.getKey());
317     }
318 
319     
320 
321 
322 
323 
324     public boolean isSynchroServiceLazy() {
325         return applicationConfig.getOptionAsBoolean(SynchroServerConfigurationOption.SYNCHRO_SERVICE_LAZY.getKey());
326     }
327 
328     public String getSynchroExportFinalizeProcedures() {
329         return applicationConfig.getOption(SynchroServerConfigurationOption.SYNCHRO_EXPORT_FINALIZE_PROCEDURES.getKey());
330     }
331 
332     
333 
334 
335 
336 
337 
338     public File getUploadDirectoryByUser(int userId) {
339         return new File(
340             getTempDirectory(),
341             String.valueOf(userId));
342     }
343 
344     
345 
346 
347 
348 
349     public Properties getClientConnectionProperties() {
350         return Daos.getConnectionProperties(
351                 getClientJdbcURL(),
352                 getClientJdbcUsername(),
353                 getClientJdbcPassword(),
354                 null,
355                 getClientHibernateDialect(),
356                 getClientJdbcDriver());
357     }
358 
359     
360 
361 
362 
363 
364     public String getClientHibernateDialect() {
365         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_HIBERNATE_DIALECT.getKey());
366     }
367 
368     
369 
370 
371 
372 
373     public String getClientJdbcDriver() {
374         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_DRIVER.getKey());
375     }
376 
377     
378 
379 
380 
381 
382     public String getClientJdbcURL() {
383         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_URL.getKey());
384     }
385 
386     
387 
388 
389 
390 
391     public String getClientJdbcCatalog() {
392         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_CATALOG.getKey());
393     }
394 
395     
396 
397 
398 
399 
400     public String getClientJdbcSchema() {
401         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_SCHEMA.getKey());
402     }
403 
404     
405 
406 
407 
408 
409     public String getClientJdbcUsername() {
410         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_USERNAME.getKey());
411     }
412 
413     
414 
415 
416 
417 
418     public String getClientJdbcPassword() {
419         return applicationConfig.getOption(SynchroServerConfigurationOption.CLIENT_JDBC_PASSWORD.getKey());
420     }
421 
422 
423     
424 
425     
426 
427 
428 
429 
430     protected static String getWebConfigFile() {
431         
432         String configFile = CONFIG_FILE_NAME;
433         if (System.getProperty(CONFIG_FILE_ENV_PROPERTY) != null) {
434             configFile = System.getProperty(CONFIG_FILE_ENV_PROPERTY);
435             configFile = configFile.replaceAll("\\\\", "/");
436         }
437         else {
438             try {
439                 InitialContext ic = new InitialContext();
440                 String jndiPathToConfFile = (String) ic.lookup(CONFIG_FILE_JNDI_NAME);
441                 if (StringUtils.isNotBlank(jndiPathToConfFile)) {
442                     configFile = jndiPathToConfFile;
443                 }
444             } catch (NamingException e) {
445                 log.warn(String.format("Error while reading JNDI initial context. Skip configuration path override, from context [%s]", CONFIG_FILE_JNDI_NAME));
446             }
447         }
448 
449         return configFile;
450     }
451 
452     
453 
454 
455 
456 
457     protected void initI18n() throws IOException {
458 
459         
460         
461         
462         File i18nDirectory = new File(getDataDirectory(), "i18n");
463         if (i18nDirectory.exists()) {
464             
465             FileUtils.cleanDirectory(i18nDirectory);
466         }
467 
468         FileUtils.forceMkdir(i18nDirectory);
469 
470         if (log.isDebugEnabled()) {
471             log.debug("I18N directory: " + i18nDirectory);
472         }
473 
474         Locale i18nLocale = getI18nLocale();
475 
476         if (log.isInfoEnabled()) {
477             log.info(I18n.t("quadrige3.synchro.server.init.i18n",
478                     i18nLocale, i18nDirectory));
479         }
480         I18n.init(new UserI18nInitializer(
481             i18nDirectory, new DefaultI18nInitializer(getI18nBundleName())),
482             i18nLocale);
483     }
484 
485     
486 
487 
488 
489 
490     protected void initDirectories() throws IOException {
491 
492         
493         log.info(I18n.t("quadrige3.synchro.server.init.data.directory", getDataDirectory()));
494 
495         
496         FileUtils.forceMkdir(getSynchronizationDirectory());
497 
498         
499         FileUtils.forceMkdir(getCacheDirectory());
500 
501         
502         File tempDirectory = getTempDirectory();
503         if (tempDirectory.exists()) {
504             
505             FileUtils.cleanDirectory(tempDirectory);
506         }
507     }
508 
509     
510 
511 
512 
513 
514     protected static String getI18nBundleName() {
515         return "quadrige3-synchro-server-i18n";
516     }
517 
518     
519 
520 
521     @Override
522     protected void initTimeZone() {
523 
524         String timeZone = applicationConfig.getOption(SynchroServerConfigurationOption.TIMEZONE.getKey());
525         if (StringUtils.isNotBlank(timeZone)) {
526             log.info(String.format("Using timezone [%s]", timeZone));
527             TimeZone.setDefault(TimeZone.getTimeZone(timeZone));
528             System.setProperty("user.timezone", timeZone);
529         } else {
530             log.info(String.format("Using default timezone [%s]", System.getProperty("user.timezone")));
531         }
532 
533         String dbTimeZone = applicationConfig.getOption(QuadrigeConfigurationOption.DB_TIMEZONE.getKey());
534         if (StringUtils.isNotBlank(dbTimeZone)) {
535             log.info(String.format("Using timezone [%s] for database", dbTimeZone));
536         } else {
537             log.info(String.format("Using default timezone [%s] for database", System.getProperty("user.timezone")));
538         }
539     }
540 
541     public void save() throws IOException {
542         applicationConfig.save(new File(getWebConfigFile()), false);
543     }
544 }