/*******************************************************************************
 * Copyright (c) 2000, 2014 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.console;

import java.net.URL;

import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.ExpressionConverter;
import org.eclipse.core.expressions.ExpressionTagNames;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;

import org.eclipse.jface.resource.ImageDescriptor;

import org.eclipse.ui.IPluginContribution;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsoleFactory;
import org.osgi.framework.Bundle;

/**
 * @since 3.1
 */
public class ConsoleFactoryExtension implements IPluginContribution {

	private IConfigurationElement fConfig;
	private Expression fEnablementExpression;
	private String fLabel;
	private ImageDescriptor fImageDescriptor;
	private IConsoleFactory fFactory;

	ConsoleFactoryExtension(IConfigurationElement config) {
		fConfig = config;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
	 */
	@Override
	public String getLocalId() {
		return fConfig.getAttribute("id"); //$NON-NLS-1$
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
	 */
	@Override
	public String getPluginId() {
		return fConfig.getContributor().getName();
	}

	public boolean isEnabled() {
		try {
			Expression enablementExpression = getEnablementExpression();
			if (enablementExpression == null) {
				return true;
			}
			EvaluationContext context = new EvaluationContext(null, this);
			EvaluationResult evaluationResult = enablementExpression.evaluate(context);
			return evaluationResult != EvaluationResult.FALSE;
		} catch (CoreException e) {
			ConsolePlugin.log(e);
			return false;
		}
	}

	public Expression getEnablementExpression() throws CoreException {
		if (fEnablementExpression == null) {
			IConfigurationElement[] elements = fConfig.getChildren(ExpressionTagNames.ENABLEMENT);
			IConfigurationElement enablement = elements.length > 0 ? elements[0] : null;

			if (enablement != null) {
				fEnablementExpression = ExpressionConverter.getDefault().perform(enablement);
			}
		}
		return fEnablementExpression;
	}

	public String getLabel() {
		if (fLabel == null) {
			fLabel = fConfig.getAttribute("label"); //$NON-NLS-1$
		}
		return fLabel;
	}

	public ImageDescriptor getImageDescriptor() {
		if (fImageDescriptor == null) {
			String path = fConfig.getAttribute("icon"); //$NON-NLS-1$
			if (path != null) {
				Bundle bundle = Platform.getBundle(getPluginId());
				URL url = FileLocator.find(bundle, new Path(path), null);
				if (url != null) {
					fImageDescriptor =  ImageDescriptor.createFromURL(url);
				}
			}
		}
		return fImageDescriptor;
	}

	public IConsoleFactory createFactory() throws CoreException {
		if (fFactory == null) {
			fFactory = (IConsoleFactory) fConfig.createExecutableExtension("class"); //$NON-NLS-1$
		}
		return fFactory;
	}
}
