/*******************************************************************************
 * Copyright (c) 2004, 2015 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
 *******************************************************************************/
package org.eclipse.ui.internal;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor;
import org.osgi.framework.Bundle;

/**
 * The branding properties are retrieved as strings, but often used as other
 * types (e.g., <code>java.net.URL</code>s. This class provides some utility
 * functions for converting the string values to these well known classes. This
 * may be subclassed by clients that use more than just these few types.
 */
public abstract class BrandingProperties {

	/**
	 * Create an url from the argument absolute or relative path. The bundle
	 * parameter is used as the base for relative paths and is allowed to be null.
	 *
	 * @param value          the absolute or relative path
	 * @param definingBundle bundle to be used for relative paths (may be null)
	 * @return
	 */
	public static URL getUrl(String value, Bundle definingBundle) {
		try {
			if (value != null) {
				return new URL(value);
			}
		} catch (MalformedURLException e) {
			if (definingBundle != null) {
				return FileLocator.find(definingBundle, new Path(value));
			}
		}

		return null;
	}

	/**
	 * Create a descriptor from the argument absolute or relative path to an image
	 * file. bundle parameter is used as the base for relative paths and is allowed
	 * to be null.
	 *
	 * @param value          the absolute or relative path
	 * @param definingBundle bundle to be used for relative paths (may be null)
	 * @return
	 */
	public static ImageDescriptor getImage(String value, Bundle definingBundle) {
		URL url = getUrl(value, definingBundle);
		return url == null ? null : ImageDescriptor.createFromURL(url);
	}

	/**
	 * Returns a array of URL for the given property or <code>null</code>. The
	 * property value should be a comma separated list of urls (either absolute or
	 * relative to the argument bundle). Tokens that do not represent a valid url
	 * will be represented with a null entry in the returned array.
	 *
	 * @param value          value of a property that contains a comma-separated
	 *                       list of product relative urls
	 * @param definingBundle bundle to be used as base for relative paths (may be
	 *                       null)
	 * @return a URL for the given property, or <code>null</code>
	 */
	public static URL[] getURLs(String value, Bundle definingBundle) {
		if (value == null) {
			return null;
		}

		StringTokenizer tokens = new StringTokenizer(value, ","); //$NON-NLS-1$
		ArrayList<URL> array = new ArrayList<>(10);
		while (tokens.hasMoreTokens()) {
			array.add(getUrl(tokens.nextToken().trim(), definingBundle));
		}

		return array.toArray(new URL[array.size()]);
	}

	/**
	 * Returns an array of image descriptors for the given property, or
	 * <code>null</code>. The property value should be a comma separated list of
	 * image paths. Each path should either be absolute or relative to the optional
	 * bundle parameter.
	 *
	 * @param value          value of a property that contains a comma-separated
	 *                       list of product relative urls describing images
	 * @param definingBundle bundle to be used for relative paths (may be null)
	 * @return an array of image descriptors for the given property, or
	 *         <code>null</code>
	 */
	public static ImageDescriptor[] getImages(String value, Bundle definingBundle) {
		URL[] urls = getURLs(value, definingBundle);
		if (urls == null || urls.length <= 0) {
			return null;
		}

		ImageDescriptor[] images = new ImageDescriptor[urls.length];
		for (int i = 0; i < images.length; ++i) {
			images[i] = ImageDescriptor.createFromURL(urls[i]);
		}

		return images;
	}
}
