/********************************************************************************
 * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.connector.entity;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;

/**
 * ServiceConfiguration
 * 
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 * @author Canoo Engineering AG (support for arbitrary entity manager factories
 *         and connection parameters)
 *
 */
public class ServiceConfiguration {

	/**
	 * The fully qualified class name of the entity manager factory for this
	 * backend, never null.
	 */
	private final String contextFactoryClass;

	/**
	 * An unmodifiable map holding the connection parameters for this backend; never
	 * null, but possibly empty.
	 */
	private final Map<String, String> connectionParameters;

	/**
	 * Constructs a new instance with the specified properties. The specified
	 * parameter map is copied by this constructor and no reference to the original
	 * is retained.
	 * 
	 * @param entityManagerFactoryClass the fully qualified class name of the entity
	 *                                  manager factory for this backend, must not
	 *                                  be null
	 * @param connectionParameters      a map holding the connection parameters for
	 *                                  this backend, or null to use an empty map
	 *                                  instead
	 */
	public ServiceConfiguration(String contextFactoryClass, Map<String, String> connectionParameters) {
		this.contextFactoryClass = Objects.requireNonNull(contextFactoryClass,
				"Null \"contextFactoryClass\" argument passed to ServiceConfiguration constructor");
		this.connectionParameters = (connectionParameters == null ? Collections.emptyMap()
				: Collections.unmodifiableMap(new LinkedHashMap<>(connectionParameters)));
	}

	/**
	 * Returns the fully qualified class name of the entity manager factory for this
	 * backend. The result is never null.
	 * 
	 * @return the entity manager factory class name passed to the constructor,
	 *         never null
	 */
	public String getContextFactoryClass() {
		return contextFactoryClass;
	}

	/**
	 * Returns an unmodifiable map holding the connection parameters for this
	 * backend. The result is never null, but may be empty.
	 * 
	 * @return an unmodifiable copy of the connection parameter map passed to the
	 *         constructor; never null, but possibly empty
	 */
	public Map<String, String> getConnectionParameters() {
		return connectionParameters;
	}

	@Override
	public String toString() {
		return this.contextFactoryClass + "#" + connectionParameters;
	}

}
