All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hyperledger.composer.client.ComposerDriverManager Maven / Gradle / Ivy

/*
 * Copyright IBM Corp. 2017 All Rights Reserved.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

package org.hyperledger.composer.client;

import org.apache.commons.lang3.StringUtils;
import org.hyperledger.composer.ComposerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.CopyOnWriteArrayList;

public class ComposerDriverManager, U extends ComposerUser, C extends ComposerConnector> {
	protected final CopyOnWriteArrayList registeredDrivers;
	private static final Logger logger = LoggerFactory.getLogger(ComposerDriverManager.class);

	protected ComposerDriverManager() {
		this.registeredDrivers = new CopyOnWriteArrayList<>();
	}

	protected C getConnector(String connString, Wallet userWallet)
			throws ComposerException {
		if (StringUtils.isEmpty(connString)) {
			throw new ComposerException(ComposerException.INVALID_INPUT_ERROR, "ConnectionProfile cannot be empty");
		}

		logger.debug("getConnection(\"{}\")", connString);

		// Walk through the loaded registeredDrivers attempting to make a connection.
		// Remember the first exception that gets raised so we can reraise it.
		ComposerException reason = null;

		for (ComposerDriver driver : registeredDrivers) {
			try {
				logger.debug("trying {}", driver.getClass().getName());
				if (!driver.acceptsConnectionString(connString)) {
					continue;
				}

				C con = driver.getConnector(connString, userWallet);
				if (con != null) {
					// Success!
					logger.debug("getConnector returning {}", driver.getClass().getName());
					return con;
				}
			} catch (ComposerException ex) {
				if (reason == null) {
					reason = ex;
				}
			}

		}

		// if we got here nobody could connect.
		if (reason != null) {
			logger.debug("getConnection failed. ", reason);
			throw reason;
		}

		logger.debug("getConnection: no suitable driver found for {}", connString);
		throw new ComposerException(ComposerException.INVALID_INPUT_ERROR, "No suitable driver found for " + connString);
	}

	protected C _enroll(String connString, Wallet wallet, EnrollRequest request) throws ComposerException {
		C connector = getConnector(connString, wallet);
		request.enroll(connector);
		return connector;
	}

	protected String _register(String connString, Wallet userWallet, RegisterRequest request) throws ComposerException {
		C connector = getConnector(connString, userWallet);
		return request.register(connector);
	}

	protected C _registerAndEnroll(String connString, Wallet userWallet, RegisterRequest request) throws ComposerException {
		String secret = _register(connString, userWallet, request);
		return _enroll(connString, userWallet, request.toEnrollRequest(secret));
	}

	protected C _connect(String connString, Wallet userWallet, String userId, String affiliation)
			throws ComposerException {
		C connector = getConnector(connString, userWallet);
		connector.login(new ComposerIdentity().userID(userId).affiliation(affiliation));
		return connector;
	}

	protected synchronized void _registerDriver(D driver) {
		/* Register the driver if it has not already been added to our list */
		if (driver != null && registeredDrivers.addIfAbsent(driver)) {
			logger.info("registerDriver: {}", driver);
		}
	}

	static CopyOnWriteArrayList> drivers() {
		return ComposerDriverManagerHolder.instance.registeredDrivers;
	}

	static class ComposerDriverManagerHolder {
		static ComposerDriverManager, ComposerUser , ComposerConnector> instance = new ComposerDriverManager<>();
	}

	public static synchronized void registerDriver(ComposerDriver driver) {
		ComposerDriverManagerHolder.instance._registerDriver(driver);
	}

	public static ComposerConnection enroll(String connString, Wallet userWallet, EnrollRequest request) throws ComposerException {
		return new ComposerConnection<>(ComposerDriverManagerHolder.instance._enroll(connString, userWallet, request));
	}

	public static String register(String connString, Wallet userWallet, RegisterRequest request) throws ComposerException {
		return ComposerDriverManagerHolder.instance._register(connString, userWallet, request);
	}

	public static ComposerConnection registerAndEnroll(String connString, Wallet userWallet, RegisterRequest request) throws ComposerException {
		return new ComposerConnection<>(ComposerDriverManagerHolder.instance._registerAndEnroll(connString, userWallet, request));
	}

	public static ComposerConnection connect(String connString, Wallet userWallet, String userId, String affiliation) throws ComposerException {
		return new ComposerConnection<>(ComposerDriverManagerHolder.instance._connect(connString, userWallet, userId, affiliation));
	}
}