/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.internal.intro.impl.model;

import java.util.HashMap;
import java.util.Map;

/**
 * This package maintains the mapping between extension ids in the registry and extension ids
 * as defined in extension files. It also allows a configurer to change the page which will be
 * displayed when the welcome screen is shown.
 */

public class ExtensionMap {

	private static ExtensionMap instance;
	private static String startPage;
	private Map<String, String> extensions = new HashMap<>();

	private ExtensionMap() {

	}

	/**
	 * Get the one and only instance of this class
	 * @return
	 */
	static public ExtensionMap getInstance() {
		if (instance == null) {
			instance = new ExtensionMap();
		}
		return instance;
	}

	/**
	 * Save an association beteen an anchorId and pluginId
	 * @param anchorId the id of an anchor
	 * @param pluginId the plugin which contributed that anchor
	 */
	public void putPluginId(String anchorId, String pluginId) {
		if (anchorId != null) {
		    extensions.put(anchorId, pluginId);
		}
	}

	/**
	 * Lookup in which plugin
	 * @param anchorId
	 * @return the plugin which contributed that anchor
	 */
	public String getPluginId(String anchorId) {
		return (String)extensions.get(anchorId);
	}

	/**
	 * Clear the map and content page
	 */
	public void clear() {
		extensions = new HashMap<>();
		startPage = null;
	}

	/**
	 * called to determine if the configurer has overriden the start page
	 * @return the new start page or null.
	 */
	public String getStartPage() {
		return startPage;
	}

	/**
	 * Allows a configurer to override the page which is displayed when
	 * the welcome screen is first shown
	 * @param contentPage
	 */
	public void setStartPage(String contentPage) {
		startPage = contentPage;
	}

}
