/*
 * Hibernate OGM, Domain model persistence for NoSQL datastores
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.ogm.datastore.ignite.utils;

import org.hibernate.ogm.datastore.ignite.IgniteConfigurationBuilder;

import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.binary.BinaryBasicNameMapper;
import org.apache.ignite.configuration.BinaryConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.TransactionConfiguration;
import org.apache.ignite.transactions.TransactionConcurrency;
import org.apache.ignite.transactions.TransactionIsolation;

/**
 * Ignite cache configuration for tests
 *
 * @author Victor Kadachigov
 */
public class IgniteTestConfigurationBuilder implements IgniteConfigurationBuilder {

	@Override
	public IgniteConfiguration build() {
		// disable check for new versions
		System.setProperty( IgniteSystemProperties.IGNITE_UPDATE_NOTIFIER, Boolean.FALSE.toString() );
		// disable show Ignite logo
		System.setProperty( IgniteSystemProperties.IGNITE_NO_ASCII, Boolean.TRUE.toString() );

		return createConfig();
	}

	private IgniteConfiguration createConfig() {
		IgniteConfiguration config = new IgniteConfiguration();
		config.setIgniteInstanceName( "OgmTestGrid" );
		config.setClientMode( false );
		BinaryConfiguration binaryConfiguration = new BinaryConfiguration();
		binaryConfiguration.setNameMapper( new BinaryBasicNameMapper( true ) );
		binaryConfiguration.setCompactFooter( false ); // it is necessary only for embedded collections (@ElementCollection)
		config.setBinaryConfiguration( binaryConfiguration );
		TransactionConfiguration transactionConfiguration = new TransactionConfiguration();
		// I'm going to use PESSIMISTIC here because some people had problem with it and it would be nice if tests
		// can highlight the issue. Ideally, we would want to test the different concurrency and isolation level.
		transactionConfiguration.setDefaultTxConcurrency( TransactionConcurrency.PESSIMISTIC );
		transactionConfiguration.setDefaultTxIsolation( TransactionIsolation.READ_COMMITTED );
		config.setTransactionConfiguration( transactionConfiguration );

		return config;
	}
}