/*******************************************************************************
 * Copyright (c) 2011 University of Illinois 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: 
 * 	Albert L. Rossi - design and implementation
 ******************************************************************************/
package org.eclipse.ptp.rm.jaxb.core.variables;

import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.variables.VariablesPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.ptp.rm.jaxb.core.IJAXBNonNLSConstants;
import org.eclipse.ptp.rm.jaxb.core.IVariableMap;
import org.eclipse.ptp.rm.jaxb.core.JAXBCorePlugin;
import org.eclipse.ptp.rm.jaxb.core.data.PropertyType;

/**
 * Abstraction representing all the Property and Attribute definitions
 * associated with a resource manager configuration. This provides an
 * "environment" for dereferencing the resource manager configuration, such that
 * the values of its Properties and Attributes can reference other Properties
 * and Attributes.<br>
 * <br>
 * 
 * There are two submaps: one contains all the Properties and Attributes defined
 * in the XML configuration; a separate map contains all the Properties and
 * Attributes which are "discovered" at runtime (through tokenization of command
 * output).
 * 
 * @author arossi
 * 
 */
public class RMVariableMap implements IVariableMap, IJAXBNonNLSConstants {
	private static RMVariableMap active;

	private final Map<String, Object> variables;
	private final Map<String, Object> discovered;
	private boolean initialized;

	private RMVariableMap() {
		variables = Collections.synchronizedMap(new TreeMap<String, Object>());
		discovered = Collections.synchronizedMap(new TreeMap<String, Object>());
		initialized = false;
	}

	/**
	 * Reset the internal maps.
	 */
	public void clear() {
		variables.clear();
		discovered.clear();
		initialized = false;
	}

	/**
	 * Search the two maps for this reference. The predefined variables are
	 * searched first.
	 * 
	 * @param name
	 *            of Property or Attribute to find.
	 * @return the found Property or Attribute
	 */
	public Object get(String name) {
		Object o = variables.get(name);
		if (o == null) {
			o = discovered.get(name);
		}
		return o;
	}

	/**
	 * @return map of Properties and Attributes discovered at runtime.
	 */
	public Map<String, Object> getDiscovered() {
		return discovered;
	}

	/**
	 * Delegates to {@link #getString(String)}.
	 * 
	 * @param value
	 *            expression to resolve
	 * @return resolved expression
	 */
	public String getString(String value) {
		return getString(null, value);
	}

	/**
	 * Performs the substitution on the string.
	 * 
	 * @param value
	 *            expression to resolve
	 * @return resolved expression
	 */
	public String getString(String jobId, String value) {
		try {
			if (jobId != null) {
				value = value.replaceAll(JOB_ID_TAG, jobId);
			}
			return dereference(value);
		} catch (CoreException t) {
			JAXBCorePlugin.log(t);
		}
		return value;
	}

	/**
	 * @return map of Properties and Attributes defined in the XML
	 *         configuration.
	 */
	public Map<String, Object> getVariables() {
		return variables;
	}

	/**
	 * @return whether the map has been initialized from an XML resource manager
	 *         configuration.
	 */
	public boolean isInitialized() {
		return initialized;
	}

	/**
	 * Only creates property and adds it if value is not <code>null</code>.
	 * 
	 * @param name
	 *            of property to add
	 * @param value
	 *            of property to add
	 * @param visible
	 *            whether this property is to be made available through the user
	 *            interface (Launch Tab)
	 */
	public void maybeAddProperty(String name, Object value, boolean visible) {
		if (value == null) {
			return;
		}
		PropertyType p = new PropertyType();
		p.setName(name);
		p.setValue(value);
		p.setVisible(visible);
		variables.put(name, p);
	}

	/**
	 * Looks for property in the configuration and uses it to create a Property
	 * in the current environment. If the property is undefined or has a
	 * <code>null</code> value in the configuration, this will not overwrite a
	 * currently defined property in the environment. <br>
	 * <br>
	 * Delegates to {@link #maybeAddProperty(String, Object, boolean)}
	 * 
	 * @param key1
	 *            to map the property to in the environemnt
	 * @param key2
	 *            to search for the property in the configuration
	 * @param configuration
	 *            to search
	 * @throws CoreException
	 */
	public void maybeOverwrite(String key1, String key2, ILaunchConfiguration configuration) throws CoreException {
		Object value1 = null;
		Object value2 = null;
		PropertyType p = (PropertyType) variables.get(key1);
		if (p != null) {
			value2 = p.getValue();
		}
		value2 = configuration.getAttributes().get(key2);
		if (value2 == null) {
			maybeAddProperty(key1, value1, false);
		} else {
			maybeAddProperty(key1, value2, false);
		}
	}

	/**
	 * Places a Property or Attribute directly in the environment.
	 * 
	 * @param name
	 *            of Property or Attribute
	 * @param value
	 *            of Property or Attribute
	 */
	public void put(String name, Object value) {
		variables.put(name, value);
	}

	/**
	 * Removes a Property or Attribute. Checks first in the predefined values
	 * map, and if it does not exist there, removes from the runtime values map.
	 * 
	 * @param name
	 *            of Property or Attribute to remove
	 * @return value of Property or Attribute
	 */
	public Object remove(String name) {
		Object o = variables.remove(name);
		if (o == null) {
			o = discovered.remove(name);
		}
		return o;
	}

	/**
	 * @param initialized
	 *            whether the map has been initialized from an XML resource
	 *            manager configuration.
	 */
	public void setInitialized(boolean initialized) {
		this.initialized = initialized;
	}

	/**
	 * Calls the string substitution method on the variable manager.
	 * 
	 * @param expression
	 *            to be resolved (recursively dereferenced from the map).
	 * @return the resolved expression
	 * @throws CoreException
	 */
	private String dereference(String expression) throws CoreException {
		if (expression == null) {
			return null;
		}
		return VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(expression);
	}

	/**
	 * @return the currently active instance.
	 */
	public synchronized static RMVariableMap getActiveInstance() {
		return active;
	}

	/**
	 * @param instance
	 *            if <code>null</code>, an empty map is created, set to the
	 *            active map, and returned. Else the passed-in instance is set
	 *            and returned.
	 * @return the resulting active instance
	 */
	public synchronized static RMVariableMap setActiveInstance(RMVariableMap instance) {
		if (instance == null) {
			instance = new RMVariableMap();
		}
		RMVariableMap.active = instance;
		return RMVariableMap.active;
	}
}
