/*******************************************************************************
 * Copyright (c) 2009, 2019 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Mykola Nikishov - multiple artifact checksums
 *******************************************************************************/

package org.eclipse.equinox.internal.p2.repository.helpers;

import java.io.*;
import java.security.*;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.repository.Activator;
import org.eclipse.osgi.util.NLS;

/**
 * Calculates a checksum using {@link java.security.MessageDigest}
 */
public class ChecksumProducer {

	private static final int BUFFER_SIZE = 4 * 1024;

	/**
	 * @param file should not be <code>null</code>
	 * @return MD5 checksum of the file or <code>null</code> in case of NoSuchAlgorithmException
	 * @throws IOException
	 */
	@Deprecated
	// bug #509401 - still here to not break x-friends like in bug #507193
	public static String computeMD5(File file) throws IOException {
		try {
			return produce(file, "MD5", null); //$NON-NLS-1$
		} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
			return null;
		}
	}

	/**
	 * @param file should not be <code>null</code>
	 * @param algorithm {@link java.security.MessageDigest#getInstance(String)}
	 * @param providerName {@link Provider#getName()}
	 * @return checksum of the file
	 * @throws IOException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchProviderException
	 * @see {@link java.security.MessageDigest#getInstance(String, Provider)}
	 */
	public static String produce(File file, String algorithm, String providerName) throws IOException, NoSuchAlgorithmException, NoSuchProviderException {
		MessageDigest messageDigest = getMessageDigest(algorithm, providerName);
		try (InputStream fis = new DigestInputStream(new BufferedInputStream(new FileInputStream(file)), messageDigest)) {
			byte[] buffer = new byte[BUFFER_SIZE];
			while (fis.read(buffer) != -1) {
				// consume stream to update digest
			}
			byte[] digest = messageDigest.digest();
			return ChecksumHelper.toHexString(digest);
		}
	}

	public static MessageDigest getMessageDigest(String algorithm, String providerName) throws NoSuchAlgorithmException, NoSuchProviderException {
		if (providerName == null)
			return MessageDigest.getInstance(algorithm);

		Provider provider = ServiceHelper.getService(Activator.getContext(), Provider.class, "(providerName=" + providerName + ")"); //$NON-NLS-1$ //$NON-NLS-2$
		if (provider == null)
			throw new NoSuchProviderException(NLS.bind(Messages.noSuchProvider, providerName));

		return MessageDigest.getInstance(algorithm, provider);
	}

}
