001package fr.ifremer.adagio.synchro.config; 002 003/* 004 * #%L 005 * SIH-Adagio :: Core for Allegro 006 * $Id:$ 007 * $HeadURL:$ 008 * %% 009 * Copyright (C) 2012 - 2013 Ifremer 010 * %% 011 * This program is free software: you can redistribute it and/or modify 012 * it under the terms of the GNU Affero General Public License as published by 013 * the Free Software Foundation, either version 3 of the License, or 014 * (at your option) any later version. 015 * 016 * This program is distributed in the hope that it will be useful, 017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 019 * GNU General Public License for more details. 020 * 021 * You should have received a copy of the GNU Affero General Public License 022 * along with this program. If not, see <http://www.gnu.org/licenses/>. 023 * #L% 024 */ 025 026import static org.nuiton.i18n.I18n.t; 027 028import java.io.File; 029import java.util.Locale; 030import java.util.Properties; 031import java.util.Set; 032 033import org.apache.commons.lang3.StringUtils; 034import org.apache.commons.logging.Log; 035import org.apache.commons.logging.LogFactory; 036import org.nuiton.config.ApplicationConfig; 037import org.nuiton.config.ApplicationConfigHelper; 038import org.nuiton.config.ApplicationConfigProvider; 039import org.nuiton.config.ArgumentsParserException; 040 041import com.google.common.base.Charsets; 042import com.google.common.collect.ImmutableSet; 043 044import fr.ifremer.adagio.synchro.SynchroTechnicalException; 045import fr.ifremer.adagio.synchro.dao.DaoUtils; 046 047public class SynchroConfiguration { 048 /** Logger. */ 049 private static final Log log = LogFactory.getLog(SynchroConfiguration.class); 050 051 /** 052 * Delegate application config. 053 */ 054 protected final ApplicationConfig applicationConfig; 055 056 private static SynchroConfiguration instance; 057 058 public static SynchroConfiguration getInstance() { 059 return instance; 060 } 061 062 public static void setInstance(SynchroConfiguration instance) { 063 SynchroConfiguration.instance = instance; 064 } 065 066 protected final String[] optionKeyToNotSave; 067 068 protected File configFile; 069 070 public SynchroConfiguration(ApplicationConfig applicationConfig) { 071 super(); 072 this.applicationConfig = applicationConfig; 073 this.optionKeyToNotSave = null; 074 } 075 076 public SynchroConfiguration(String file, String... args) { 077 super(); 078 this.applicationConfig = new ApplicationConfig(); 079 this.applicationConfig.setEncoding(Charsets.UTF_8.name()); 080 this.applicationConfig.setConfigFileName(file); 081 082 // get all config providers 083 Set<ApplicationConfigProvider> providers = 084 ApplicationConfigHelper.getProviders(null, 085 null, 086 null, 087 true); 088 089 // load all default options 090 ApplicationConfigHelper.loadAllDefaultOption(applicationConfig, 091 providers); 092 093 // Load actions 094 for (ApplicationConfigProvider provider : providers) { 095 applicationConfig.loadActions(provider.getActions()); 096 } 097 098 // Load module actions (not in provider) 099 applicationConfig.loadActions(SynchroConfigurationAction.values()); 100 101 applicationConfig.addAlias("-u", "--option", SynchroConfigurationOption.JDBC_USERNAME.getKey()); 102 applicationConfig.addAlias("--user", "--option", SynchroConfigurationOption.JDBC_USERNAME.getKey()); 103 applicationConfig.addAlias("-p", "--option", SynchroConfigurationOption.JDBC_PASSWORD.getKey()); 104 applicationConfig.addAlias("--password", "--option", SynchroConfigurationOption.JDBC_PASSWORD.getKey()); 105 applicationConfig.addAlias("-db", "--option", SynchroConfigurationOption.JDBC_URL.getKey()); 106 applicationConfig.addAlias("--database", "--option", SynchroConfigurationOption.JDBC_URL.getKey()); 107 108 applicationConfig.addAlias("-iu", "--option", SynchroConfigurationOption.IMPORT_JDBC_USERNAME.getKey()); 109 applicationConfig.addAlias("--import-user", "--option", SynchroConfigurationOption.IMPORT_JDBC_USERNAME.getKey()); 110 applicationConfig.addAlias("-ip", "--option", SynchroConfigurationOption.IMPORT_JDBC_PASSWORD.getKey()); 111 applicationConfig.addAlias("--import-password", "--option", SynchroConfigurationOption.IMPORT_JDBC_PASSWORD.getKey()); 112 applicationConfig.addAlias("-idb", "--option", SynchroConfigurationOption.IMPORT_JDBC_URL.getKey()); 113 applicationConfig.addAlias("--import-database", "--option", SynchroConfigurationOption.IMPORT_JDBC_URL.getKey()); 114 115 // Server options 116 applicationConfig.addAlias("--port", "--option", SynchroConfigurationOption.SERVER_PORT.getKey()); 117 applicationConfig.addAlias("--keystore", "--option", SynchroConfigurationOption.SERVER_SSL_KEYSTORE.getKey()); 118 119 // get all transient and final option keys 120 Set<String> optionToSkip = 121 ApplicationConfigHelper.getTransientOptionKeys(providers); 122 123 if (log.isDebugEnabled()) { 124 log.debug("Option that won't be saved: " + optionToSkip); 125 } 126 optionKeyToNotSave = optionToSkip.toArray(new String[optionToSkip.size()]); 127 128 try { 129 applicationConfig.parse(args); 130 131 } catch (ArgumentsParserException e) { 132 throw new SynchroTechnicalException(t("adagio.config.parse.error"), e); 133 } 134 135 // TODO Review this, this is very dirty to do this... 136 File allegroBasedir = applicationConfig.getOptionAsFile( 137 SynchroConfigurationOption.BASEDIR.getKey()); 138 139 if (allegroBasedir == null) { 140 allegroBasedir = new File(""); 141 } 142 if (!allegroBasedir.isAbsolute()) { 143 allegroBasedir = new File(allegroBasedir.getAbsolutePath()); 144 } 145 if (allegroBasedir.getName().equals("..")) { 146 allegroBasedir = allegroBasedir.getParentFile().getParentFile(); 147 } 148 if (allegroBasedir.getName().equals(".")) { 149 allegroBasedir = allegroBasedir.getParentFile(); 150 } 151 if (log.isInfoEnabled()) { 152 log.info("Application basedir: " + allegroBasedir); 153 } 154 applicationConfig.setOption( 155 SynchroConfigurationOption.BASEDIR.getKey(), 156 allegroBasedir.getAbsolutePath()); 157 } 158 159 public File getConfigFile() { 160 if (configFile == null) { 161 File dir = getBasedir(); 162 if (dir == null || !dir.exists()) { 163 dir = new File(applicationConfig.getUserConfigDirectory()); 164 } 165 configFile = new File(dir, applicationConfig.getConfigFileName()); 166 } 167 return configFile; 168 } 169 170 /** @return {@link SynchroConfigurationOption#BASEDIR} value */ 171 public File getBasedir() { 172 File result = applicationConfig.getOptionAsFile(SynchroConfigurationOption.BASEDIR.getKey()); 173 return result; 174 } 175 176 /** @return {@link SynchroConfigurationOption#DATA_DIRECTORY} value */ 177 public File getDataDirectory() { 178 File result = applicationConfig.getOptionAsFile(SynchroConfigurationOption.DATA_DIRECTORY.getKey()); 179 return result; 180 } 181 182 public ApplicationConfig getApplicationConfig() { 183 return applicationConfig; 184 } 185 186 public File getDbDirectory() { 187 return applicationConfig.getOptionAsFile(SynchroConfigurationOption.DB_DIRECTORY.getKey()); 188 } 189 190 public void setDbDirectory(File dbDirectory) { 191 applicationConfig.setOption(SynchroConfigurationOption.DB_DIRECTORY.getKey(), dbDirectory.getPath()); 192 } 193 194 public File getDbAttachmentDirectory() { 195 return applicationConfig.getOptionAsFile(SynchroConfigurationOption.DB_ATTACHMENT_DIRECTORY.getKey()); 196 } 197 198 public File getCacheDirectory() { 199 return applicationConfig.getOptionAsFile(SynchroConfigurationOption.DB_CACHE_DIRECTORY.getKey()); 200 } 201 202 public File getDbBackupDirectory() { 203 return applicationConfig.getOptionAsFile(SynchroConfigurationOption.DB_BACKUP_DIRECTORY.getKey()); 204 } 205 206 public String getHibernateDialect() { 207 return applicationConfig.getOption(SynchroConfigurationOption.HIBERNATE_DIALECT.getKey()); 208 } 209 210 public String getJdbcDriver() { 211 return applicationConfig.getOption(SynchroConfigurationOption.JDBC_DRIVER.getKey()); 212 } 213 214 public String getJdbcURL() { 215 return applicationConfig.getOption(SynchroConfigurationOption.JDBC_URL.getKey()); 216 } 217 218 public String getDbName() { 219 return applicationConfig.getOption(SynchroConfigurationOption.DB_NAME.getKey()); 220 } 221 222 public String getDbValidationQuery() { 223 return applicationConfig.getOption(SynchroConfigurationOption.DB_VALIDATION_QUERY.getKey()); 224 } 225 226 public String getJdbcUsername() { 227 return applicationConfig.getOption(SynchroConfigurationOption.JDBC_USERNAME.getKey()); 228 } 229 230 public String getJdbcPassword() { 231 return applicationConfig.getOption(SynchroConfigurationOption.JDBC_PASSWORD.getKey()); 232 } 233 234 public File getI18nDirectory() { 235 return applicationConfig.getOptionAsFile( 236 SynchroConfigurationOption.I18N_DIRECTORY.getKey()); 237 } 238 239 public Locale getI18nLocale() { 240 return applicationConfig.getOptionAsLocale( 241 SynchroConfigurationOption.I18N_LOCALE.getKey()); 242 } 243 244 public void setI18nLocale(Locale locale) { 245 applicationConfig.setOption(SynchroConfigurationOption.I18N_LOCALE.getKey(), locale.toString()); 246 } 247 248 public String getImportJdbcURL() { 249 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_URL.getKey()); 250 } 251 252 public String getImportJdbcUsername() { 253 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_USERNAME.getKey()); 254 } 255 256 public String getImportJdbcPassword() { 257 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_PASSWORD.getKey()); 258 } 259 260 public String getImportJdbcSchema() { 261 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_SCHEMA.getKey()); 262 } 263 264 public String getImportJdbcCatalog() { 265 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_CATALOG.getKey()); 266 } 267 268 public String getImportJdbcDriver() { 269 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_JDBC_DRIVER.getKey()); 270 } 271 272 public int getImportJdbcBatchSize() { 273 int importJdbcBatchSize = applicationConfig.getOptionAsInt(SynchroConfigurationOption.IMPORT_JDBC_BATCH_SIZE.getKey()); 274 if (importJdbcBatchSize == 0) { 275 return 1000; 276 } 277 return importJdbcBatchSize; 278 } 279 280 public String getImportHibernateDialect() { 281 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_HIBERNATE_DIALECT.getKey()); 282 } 283 284 public String getSynchronizationStatusSynchronized() { 285 return applicationConfig.getOption(SynchroConfigurationOption.SYNCHRONIZATION_STATUS_SYNCHRONIZED.getKey()); 286 } 287 288 public String getSynchronizationStatusReadyToSynchronize() { 289 return applicationConfig.getOption(SynchroConfigurationOption.SYNCHRONIZATION_STATUS_READY_TO_SYNCHRONIZE.getKey()); 290 } 291 292 public String getSynchronizationStatusDeleted() { 293 return applicationConfig.getOption(SynchroConfigurationOption.SYNCHRONIZATION_STATUS_DELETED.getKey()); 294 } 295 296 public String getSynchronizationStatusDirty() { 297 return applicationConfig.getOption(SynchroConfigurationOption.SYNCHRONIZATION_STATUS_DIRTY.getKey()); 298 } 299 300 public int getServerPort() { 301 return applicationConfig.getOptionAsInt(SynchroConfigurationOption.SERVER_PORT.getKey()); 302 } 303 304 public File getServerSslKeyStore() { 305 return applicationConfig.getOptionAsFile(SynchroConfigurationOption.SERVER_SSL_KEYSTORE.getKey()); 306 } 307 308 public Properties getConnectionProperties() { 309 return DaoUtils.getConnectionProperties( 310 getJdbcURL(), 311 getJdbcUsername(), 312 getJdbcPassword(), 313 null, 314 getHibernateDialect(), 315 getJdbcDriver()); 316 } 317 318 public Properties getImportConnectionProperties() { 319 return DaoUtils.getConnectionProperties( 320 getImportJdbcURL(), 321 getImportJdbcUsername(), 322 getImportJdbcPassword(), 323 getImportJdbcSchema(), 324 getImportHibernateDialect(), 325 getImportJdbcDriver()); 326 } 327 328 public String getImportVesselProgramCode() { 329 return applicationConfig.getOption(SynchroConfigurationOption.DEFAULT_VESSEL_PROGRAM_CODE.getKey()); 330 } 331 332 public String getImportTranscribingItemTypeIds() { 333 return applicationConfig.getOption(SynchroConfigurationOption.IMPORT_TRANSCRIBING_ITEM_TYPE_IDS.getKey()); 334 } 335 336 public Set<String> getImportDataTablesIncludes() { 337 String dataTablesStr = applicationConfig.getOption(SynchroConfigurationOption.IMPORT_TABLES_DATA_INCLUDES.getKey()); 338 Set<String> result = null; 339 if (StringUtils.isNotBlank(dataTablesStr)) { 340 result = ImmutableSet.<String> builder().add(dataTablesStr.split("\\s*,\\s*")).build(); 341 } 342 return result; 343 } 344 345 public Set<String> getImportReferentialTablesIncludes() { 346 String referentialTablesStr = applicationConfig.getOption(SynchroConfigurationOption.IMPORT_TABLES_REFERENTIAL_INCLUDES.getKey()); 347 Set<String> result = null; 348 if (StringUtils.isNotBlank(referentialTablesStr)) { 349 result = ImmutableSet.<String> builder().add(referentialTablesStr.split("\\s*,\\s*")).build(); 350 } 351 return result; 352 } 353 354}