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}