package org.eclipse.gmf.tooling.runtime;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.gmf.tooling.runtime.impl.ocl.tracker.activeocl.ActiveOclTrackerFactory;
import org.eclipse.gmf.tooling.runtime.ocl.tracker.OclTrackerFactory;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

public class GMFToolingRuntimePlugin extends AbstractUIPlugin {

	public static final String ID = "org.eclipse.gmf.tooling.runtime"; //$NON-NLS-1$

	private static GMFToolingRuntimePlugin ourInstance;

	private Map<OclTrackerFactory.Type, OclTrackerFactory> myOclTrackerFactories;

	private LogHelper myLogHelper;

	public void start(BundleContext context) throws Exception {
		super.start(context);
		ourInstance = this;
		myOclTrackerFactories = loadOclTrackerFactories();
		myLogHelper = new LogHelper(this);
	}

	public void stop(BundleContext context) throws Exception {
		ourInstance = null;
		super.stop(context);
	}

	public static GMFToolingRuntimePlugin getInstance() {
		return ourInstance;
	}

	/**
	 * This is the main intended way to access the {@link OclTrackerFactory}. 
	 * This method will return the suited implementation based on the available plugins.
	 * Caller should not make any assumptions against the return implementation type.   
	 */
	public OclTrackerFactory getOclTrackerFactory() {
		OclTrackerFactory result = myOclTrackerFactories.get(OclTrackerFactory.Type.ANY);
		if (result == null) {
			result = new ActiveOclTrackerFactory();
			myOclTrackerFactories.put(OclTrackerFactory.Type.ANY, result);
		}
		return result;
	}

	/**
	 * This is the helper method allowing caller to access the specific {@link OclTrackerFactory} 
	 * implementation without adding an explicit dependency to the containing plugin. 
	 * <p> 
	 * This method will try to return the preferred implementation based on the available plugins, 
	 * but will roll back to default implementation if preferred one is not available.  
	 * Caller still is not recommended to make any assumptions about the returned implementation type.   
	 */
	public OclTrackerFactory getOclTrackerFactory(OclTrackerFactory.Type type) {
		OclTrackerFactory result = myOclTrackerFactories.get(type);
		return result != null ? result : getOclTrackerFactory();
	}

	/**
	 * @since 3.2
	 */
	public LogHelper getLogHelper() {
		return myLogHelper;
	}

	private Map<OclTrackerFactory.Type, OclTrackerFactory> loadOclTrackerFactories() {
		Map<OclTrackerFactory.Type, OclTrackerFactory> result = new HashMap<OclTrackerFactory.Type, OclTrackerFactory>();
		IExtensionRegistry registry = Platform.getExtensionRegistry();
		IExtensionPoint extensionPoint = registry.getExtensionPoint(ID + ".ocl_tracker_factory");
		IConfigurationElement points[] = extensionPoint.getConfigurationElements();
		for (IConfigurationElement point : points) {
			if ("oclTrackerFactory".equals(point.getName())) {
				Object impl;
				try {
					impl = point.createExecutableExtension("class");
				} catch (CoreException e) {
					myLogHelper.logStatus(e.getStatus());
					continue;
				}
				if (impl instanceof OclTrackerFactory) {
					OclTrackerFactory factory = (OclTrackerFactory) impl;
					result.put(factory.getImplementationType(), factory);
					if (Boolean.valueOf(point.getAttribute("default"))) {
						result.put(OclTrackerFactory.Type.ANY, factory);
					}
				}
			}
		}
		if (!result.containsKey(OclTrackerFactory.Type.DEFAULT_GMFT)) {
			result.put(OclTrackerFactory.Type.DEFAULT_GMFT, new ActiveOclTrackerFactory());
		}
		return result;
	}

}
