com.evolveum.midpoint.repo.sql.testing.TestSqlRepositoryFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.repo.sql.testing.TestSqlRepositoryFactory.java

Source

/*
 * 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);
    }
}