View Javadoc
1   package fr.ifremer.adagio.synchro.config;
2   
3   /*
4    * #%L
5    * SIH-Adagio :: Core for Allegro
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2012 - 2013 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 static org.nuiton.i18n.I18n.t;
27  
28  import java.io.File;
29  import java.util.Locale;
30  import java.util.Properties;
31  import java.util.Set;
32  
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.config.ApplicationConfigHelper;
38  import org.nuiton.config.ApplicationConfigProvider;
39  import org.nuiton.config.ArgumentsParserException;
40  
41  import com.google.common.base.Charsets;
42  import com.google.common.collect.ImmutableSet;
43  
44  import fr.ifremer.adagio.synchro.SynchroTechnicalException;
45  import fr.ifremer.adagio.synchro.dao.DaoUtils;
46  
47  public class SynchroConfiguration {
48  	/** Logger. */
49  	private static final Log log = LogFactory.getLog(SynchroConfiguration.class);
50  
51  	/**
52  	 * Delegate application config.
53  	 */
54  	protected final ApplicationConfig applicationConfig;
55  
56  	private static SynchroConfiguration instance;
57  
58  	public static SynchroConfiguration getInstance() {
59  		return instance;
60  	}
61  
62  	public static void setInstance(SynchroConfiguration instance) {
63  		SynchroConfiguration.instance = instance;
64  	}
65  
66  	protected final String[] optionKeyToNotSave;
67  
68  	protected File configFile;
69  
70  	public SynchroConfiguration(ApplicationConfig applicationConfig) {
71  		super();
72  		this.applicationConfig = applicationConfig;
73  		this.optionKeyToNotSave = null;
74  	}
75  
76  	public SynchroConfiguration(String file, String... args) {
77  		super();
78  		this.applicationConfig = new ApplicationConfig();
79  		this.applicationConfig.setEncoding(Charsets.UTF_8.name());
80  		this.applicationConfig.setConfigFileName(file);
81  
82  		// get all config providers
83  		Set<ApplicationConfigProvider> providers =
84  				ApplicationConfigHelper.getProviders(null,
85  						null,
86  						null,
87  						true);
88  
89  		// load all default options
90  		ApplicationConfigHelper.loadAllDefaultOption(applicationConfig,
91  				providers);
92  
93  		// Load actions
94  		for (ApplicationConfigProvider provider : providers) {
95  			applicationConfig.loadActions(provider.getActions());
96  		}
97  
98  		// Load module actions (not in provider)
99  		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 }