blob: 129f93ed262a2af950c7450aa733cd427b9db969 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2006 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.commands;
import org.eclipse.core.commands.IParameter;
import org.eclipse.core.commands.IParameterValues;
import org.eclipse.core.commands.ITypedParameter;
import org.eclipse.core.commands.ParameterType;
import org.eclipse.core.commands.ParameterValuesException;
import org.eclipse.core.commands.common.HandleObject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.ui.internal.util.Util;
/**
* <p>
* A parameter for a command. A parameter identifies a type of information that
* the command might accept. For example, a "Show View" command might accept the
* id of a view for display. This parameter also identifies possible values, for
* display in the user interface.
* </p>
* <p>
* Parameters are mutable, and can change as the command changes. Notifications
* will not be sent if the parameter itself changes. Listeners can be attached
* to the command.
* </p>
*
* @since 3.1
*/
public final class Parameter implements IParameter, ITypedParameter {
/**
* The name of the configuration element attribute contain the values. This
* is used to retrieve the executable extension
* <code>IParameterValues</code>.
*/
private static final String ATTRIBUTE_VALUES = "values"; //$NON-NLS-1$
/**
* The constant integer hash code value meaning the hash code has not yet
* been computed.
*/
private static final int HASH_CODE_NOT_COMPUTED = -1;
/**
* A factor for computing the hash code for all schemes.
*/
private static final int HASH_FACTOR = 89;
/**
* The seed for the hash code for all schemes.
*/
private static final int HASH_INITIAL = HandleObject.class.getName()
.hashCode();
/**
* The hash code for this object. This value is computed lazily, and marked
* as invalid when one of the values on which it is based changes.
*/
private transient int hashCode = HASH_CODE_NOT_COMPUTED;
/**
* The identifier for this object. This identifier should be unique across
* all objects of the same type and should never change. This value will
* never be <code>null</code>.
*/
protected final String id;
/**
* The non-externalized name of this parameter. The name is used as the in a
* name-value parameter map. This value will never be <code>null</code>.
*/
private final String name;
/**
* Whether the parameter is optional (as opposed to required).
*/
private final boolean optional;
/**
* The type for this parameter. This value may be <code>null</code> if the
* parameter is not typed.
*/
private final ParameterType parameterType;
/**
* The string representation of this object. This string is for debugging
* purposes only, and is not meant to be displayed to the user. This value
* is computed lazily, and is cleared if one of its dependent values
* changes.
*/
protected transient String string = null;
/**
* The actual <code>IParameterValues</code> implementation. This is lazily
* loaded from the <code>valuesConfigurationElement</code>, to avoid
* unnecessary class-loading.
*/
private transient IParameterValues values = null;
/**
* The configuration element providing the executable extension that will
* implement <code>IParameterValues</code>. This value will not be
* <code>null</code>.
*/
private final IConfigurationElement valuesConfigurationElement;
/**
* Constructs a new instance of <code>Parameter</code> with all of its
* values pre-defined.
*
* @param id
* The identifier for this parameter; must not be
* <code>null</code>.
* @param name
* The name for this parameter; must not be <code>null</code>.
* @param values
* The values for this parameter; must not be <code>null</code>.
* @param parameterType
* the type for this parameter; may be <code>null</code> if the
* parmeter doesn't declare type.
* @param optional
* Whether this parameter is optional (as opposed to required).
* @param commandService
* The command service from which parameter types can be
* retrieved; must not be <code>null</code>.
*/
public Parameter(final String id, final String name,
final IConfigurationElement values,
final ParameterType parameterType, final boolean optional) {
if (id == null) {
throw new NullPointerException(
"Cannot create a parameter with a null id"); //$NON-NLS-1$
}
if (name == null) {
throw new NullPointerException(
"The name of a parameter cannot be null."); //$NON-NLS-1$
}
if (values == null) {
throw new NullPointerException(
"The values for a parameter cannot be null."); //$NON-NLS-1$
}
this.id = id;
this.name = name;
this.valuesConfigurationElement = values;
this.parameterType = parameterType;
this.optional = optional;
}
/**
* Tests whether this object is equal to another object. A parameter is only
* equal to another parameter with the same properties.
*
* @param object
* The object with which to compare; may be <code>null</code>.
* @return <code>true</code> if the objects are equal; <code>false</code>
* otherwise.
*/
public final boolean equals(final Object object) {
if (this == object) {
return true;
}
if (!(object instanceof Parameter)) {
return false;
}
final Parameter parameter = (Parameter) object;
if (!Util.equals(id, parameter.id)) {
return false;
}
if (!Util.equals(name, parameter.name)) {
return false;
}
if (!Util.equals(values, parameter.values)) {
return false;
}
return Util.equals(optional, parameter.optional);
}
public final String getId() {
return id;
}
public final String getName() {
return name;
}
public final ParameterType getParameterType() {
return parameterType;
}
public final IParameterValues getValues() throws ParameterValuesException {
if (values == null) {
try {
values = (IParameterValues) valuesConfigurationElement
.createExecutableExtension(ATTRIBUTE_VALUES);
} catch (final CoreException e) {
throw new ParameterValuesException(
"Problem creating parameter values", e); //$NON-NLS-1$
} catch (final ClassCastException e) {
throw new ParameterValuesException(
"Parameter values were not an instance of IParameterValues", e); //$NON-NLS-1$
}
}
return values;
}
public final int hashCode() {
if (hashCode == HASH_CODE_NOT_COMPUTED) {
hashCode = HASH_INITIAL * HASH_FACTOR + Util.hashCode(id);
if (hashCode == HASH_CODE_NOT_COMPUTED) {
hashCode++;
}
}
return hashCode;
}
public final boolean isOptional() {
return optional;
}
public final String toString() {
if (string == null) {
final StringBuffer buffer = new StringBuffer();
buffer.append("Parameter("); //$NON-NLS-1$
buffer.append(id);
buffer.append(',');
buffer.append(name);
buffer.append(',');
buffer.append(values);
buffer.append(',');
buffer.append(optional);
buffer.append(')');
string = buffer.toString();
}
return string;
}
}