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

/**
 * Represents a Ant property.
 * @since 2.1
 */
public class Property {

	private String name;
	private String value;
	private String className;
	private IAntPropertyValueProvider valueProvider;
	private String pluginLabel;
	private ClassLoader loader;
	private boolean eclipseRuntime= true;

	public Property(String name, String value) {
		this.name= name;
		this.value= value;
	}

	public Property() {
	}
	
	/**
	 * Gets the name
	 * @return Returns a String
	 */
	public String getName() {
		return name;
	}

	/**
	 * Sets the name
	 * @param name The name to set
	 */
	public void setName(String name) {
		this.name= name;
	}
	
	/*
	 * @see Object#equals()
	 */	
	public boolean equals(Object other) {
		if (other.getClass().equals(getClass())) {
			Property elem= (Property)other;
			return name.equals(elem.getName());
		}
		return false;
	}
	
	/*
	 * @see Object#hashCode()
	 */
	public int hashCode() {
		return name.hashCode();
	}	
	/**
	 * Returns the value.
	 * @return String
	 */
	public String getValue() {
		if (className != null) {
			Class cls = null;
			try {
				cls = loader.loadClass(className);
			} catch (ClassNotFoundException e) {
				AntCorePlugin.log(e);
				return null;
			}
			try {
				valueProvider = (IAntPropertyValueProvider)cls.newInstance();
			} catch (InstantiationException e) {
				AntCorePlugin.log(e);
				return null;
			} catch (IllegalAccessException ex) {
				AntCorePlugin.log(ex);
				return null;
			}
			loader= null;
			className= null;
		}
		
		if (valueProvider != null) {
			return valueProvider.getAntPropertyValue(name);
		} else {
			return value;
		}
	}

	/**
	 * Sets the value.
	 * @param value The value to set
	 */
	public void setValue(String value) {
		this.value = value;
	}
	
	/**
	 * Returns whether this Ant property has been created because of an extension
	 * point definition.
	 * 
	 * @return boolean
	 * @since 3.0
	 */
	public boolean isDefault() {
		return pluginLabel != null;
	}

	/**
	 * Sets the label of the plugin that contributed this Ant property via an extension
	 * point.
	 * 
	 * @param pluginLabel The label of the plugin
	 * @since 3.0
	 */
	public void setPluginLabel(String pluginLabel) {
		this.pluginLabel = pluginLabel;
	}
	
	/**
	 * Returns the label of the plugin that contributed this Ant property via an extension
	 * point.
	 * 
	 * @return pluginLabel The label of the plugin
	 * @since 3.0
	 */
	public String getPluginLabel() {
		return this.pluginLabel;
	}
	
	/**
	 * Sets the name of the class that is an <code>IAntPropertyValueProvider</code> to be used to dynamically provide a 
	 * value for this property.
	 * Sets the class loader to load the <code>IAntPropertyValueProvider</code> to be used to dynamically provide a 
	 * value for this property.
	 * 
	 * @param className The name of the value provider class to use to resolve the value of this property
	 * @param loader The class loader to use to load the value provider class to use to resolve the value of this property
	 * @since 3.0
	 */
	public void setValueProvider(String className, ClassLoader loader) {
		this.className= className;
		this.loader= loader;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		StringBuffer buff= new StringBuffer("\""); //$NON-NLS-1$
		buff.append(getName());
		buff.append("\"= \""); //$NON-NLS-1$
		buff.append(getValue());
		buff.append("\""); //$NON-NLS-1$
		return buff.toString();
	}
	
	/**
	 * Returns whether this property requires the Eclipse runtime to be 
	 * relevant. Defaults value is <code>true</code>
	 * 
	 * @return whether this property requires the Eclipse runtime
     * @since 3.0
	 */
	public boolean isEclipseRuntimeRequired() {
		return eclipseRuntime;
	}
	
	public void setEclipseRuntimeRequired(boolean eclipseRuntime) {
		this.eclipseRuntime= eclipseRuntime;
	}
}
