/* * Copyright (c) 2010-2013 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.evolveum.midpoint.repo.sql.testing; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException; import com.evolveum.midpoint.repo.sql.SqlRepositoryFactory; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.configuration.Configuration; import org.apache.commons.lang.StringUtils; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.Properties; import static com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration.*; /** * This repository factory should be used for testing purposes only. It behaves like {@link com.evolveum.midpoint.repo.sql.SqlRepositoryFactory}, * but during configuration initialization it checks system properties and overrides loaded configuration * ({@link com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration}). * * @author lazyman */ public class TestSqlRepositoryFactory extends SqlRepositoryFactory { private static final Trace LOGGER = TraceManager.getTrace(TestSqlRepositoryFactory.class); public static final String PROPERTY_CONFIG = "config"; @Override public synchronized void init(Configuration configuration) throws RepositoryServiceFactoryException { String configFile = System.getProperty(PROPERTY_CONFIG); if (StringUtils.isNotEmpty(configFile)) { LOGGER.info("Overriding loaded configuration with values from '{}'", new Object[]{configFile}); updateConfigurationFromFile(configuration, configFile); } updateConfigurationFromProperties(configuration, null); super.init(configuration); } @Override public RepositoryService getRepositoryService() throws RepositoryServiceFactoryException { return new TestSqlRepositoryServiceImpl(this); } private void updateConfigurationFromFile(Configuration configuration, String filePath) throws RepositoryServiceFactoryException { Properties properties = new Properties(); try { File file = new File(filePath); LOGGER.debug("Config file absolute path '{}'.", new Object[]{file.getAbsolutePath()}); if (!file.exists() || !file.isFile() || !file.canRead()) { throw new RepositoryServiceFactoryException("Config file '" + filePath + "' doesn't exist or can't be read."); } Reader reader = new InputStreamReader(new FileInputStream(file), "utf-8"); properties.load(reader); } catch (RepositoryServiceFactoryException ex) { throw ex; } catch (Exception ex) { throw new RepositoryServiceFactoryException(ex.getMessage(), ex); } //override loaded configuration based on properties file... updateConfigurationFromProperties(configuration, properties); } private void updateConfigurationFromProperties(Configuration configuration, Properties properties) { updateConfigurationBooleanProperty(configuration, properties, PROPERTY_EMBEDDED); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_DROP_IF_EXISTS); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_AS_SERVER); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_TCP_SSL); updateConfigurationIntegerProperty(configuration, properties, PROPERTY_PORT); updateConfigurationStringProperty(configuration, properties, PROPERTY_BASE_DIR); updateConfigurationStringProperty(configuration, properties, PROPERTY_FILE_NAME); updateConfigurationStringProperty(configuration, properties, PROPERTY_DRIVER_CLASS_NAME); updateConfigurationStringProperty(configuration, properties, PROPERTY_HIBERNATE_DIALECT); updateConfigurationStringProperty(configuration, properties, PROPERTY_HIBERNATE_HBM2DDL); updateConfigurationStringProperty(configuration, properties, PROPERTY_JDBC_PASSWORD); updateConfigurationStringProperty(configuration, properties, PROPERTY_JDBC_URL); updateConfigurationStringProperty(configuration, properties, PROPERTY_JDBC_USERNAME); updateConfigurationStringProperty(configuration, properties, PROPERTY_TRANSACTION_ISOLATION); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_LOCK_FOR_UPDATE_VIA_HIBERNATE); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_LOCK_FOR_UPDATE_VIA_SQL); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_USE_READ_ONLY_TRANSACTIONS); updateConfigurationStringProperty(configuration, properties, PROPERTY_PERFORMANCE_STATISTICS_FILE); updateConfigurationStringProperty(configuration, properties, PROPERTY_PERFORMANCE_STATISTICS_LEVEL); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_ITERATIVE_SEARCH_BY_PAGING); updateConfigurationStringProperty(configuration, properties, PROPERTY_ITERATIVE_SEARCH_BY_PAGING_BATCH_SIZE); updateConfigurationBooleanProperty(configuration, properties, PROPERTY_USE_ZIP); updateConfigurationIntegerProperty(configuration, properties, PROPERTY_MIN_POOL_SIZE); updateConfigurationIntegerProperty(configuration, properties, PROPERTY_MAX_POOL_SIZE); } private void updateConfigurationIntegerProperty(Configuration configuration, Properties properties, String propertyName) { String value = properties != null ? properties.getProperty(propertyName) : System.getProperty(propertyName); if (value == null || !value.matches("[1-9]{1}[0-9]*")) { return; } int val = Integer.parseInt(value); LOGGER.info("Overriding loaded configuration with value read from system properties: {}={}", propertyName, val); configuration.setProperty(propertyName, val); } private void updateConfigurationBooleanProperty(Configuration configuration, Properties properties, String propertyName) { String value = properties != null ? properties.getProperty(propertyName) : System.getProperty(propertyName); if (value == null) { return; } boolean val = new Boolean(value).booleanValue(); LOGGER.info("Overriding loaded configuration with value read from system properties: {}={}", propertyName, val); configuration.setProperty(propertyName, val); } private void updateConfigurationStringProperty(Configuration configuration, Properties properties, String propertyName) { String value = properties != null ? properties.getProperty(propertyName) : System.getProperty(propertyName); if (value == null) { return; } LOGGER.info("Overriding loaded configuration with value read from system properties: {}={}", propertyName, value); configuration.setProperty(propertyName, value); } }