code: package org.eclipse.emf.henshin.interpreter.debug;
  
  import org.eclipse.debug.core.DebugException;
  import org.eclipse.debug.core.model.IDebugTarget;
  import org.eclipse.debug.core.model.IValue;
  import org.eclipse.debug.core.model.IVariable;
  import org.eclipse.emf.ecore.EObject;
  import org.eclipse.emf.henshin.interpreter.matching.constraints.Variable;
  
  public class HenshinDebugVariable extends HenshinDebugElement implements IVariable {
  	
  	private String name;
  	private HenshinDebugValue value;
  	private Variable variable;
  	private final boolean isConstraintType;
  	private final boolean isConstraint;
  	
  	/**
  	 * for a variable with a primitive / human readable value
  	 */
  	public HenshinDebugVariable(IDebugTarget target, String name, String value, Variable variable) {
  		this(target, name, value, variable.typeConstraint.type.getName());
  		this.variable = variable;
  	}
  	
  	public HenshinDebugVariable(IDebugTarget target, String name, String value, String declaredType) {
  		this(target, name, new DebugValueObject(target, null, declaredType, value, -1));
  	}
  
  	/**
  	 * for a variable whose value contains child variables
  	 */
  	public HenshinDebugVariable(IDebugTarget target, String name, HenshinDebugValue value) {
  		super(target);
  		this.name = name;
  		this.value = value;
  		isConstraintType = "Constraint Type".equals(name);
  		isConstraint = "Constraint".equals(name);
  	}
  	
  	public boolean isConstraint() {
  		return isConstraint;
  	}
  	
  	public boolean isConstraintType() {
  		return isConstraintType;
  	}
  	
  	public Variable getVariable() {
  		return variable;
  	}
  
  	@Override
  	public void setValue(String expression) throws DebugException {
  		this.value = new DebugValueEObject(getDebugTarget(), null, expression, (EObject) value, -1);
  	}
  
  	@Override
  	public void setValue(IValue value) throws DebugException {
  		setValue(value.getValueString());
  	}
  
  	@Override
  	public boolean supportsValueModification() {
  		return false;
  	}
  
  	@Override
  	public boolean verifyValue(String expression) throws DebugException {
  		return false;
  	}
  
  	@Override
  	public boolean verifyValue(IValue value) throws DebugException {
  		return false;
  	}
  
  	@Override
  	public IValue getValue() throws DebugException {
  		return value;
  	}
  
  	@Override
  	public String getName() throws DebugException {
  		return name;
  	}
  
  	@Override
  	public String getReferenceTypeName() throws DebugException {
  		// TODO: Return correct string
  		return value.toString();
  	}
  
  	@Override
  	public boolean hasValueChanged() throws DebugException {
  		// maybe add this in the future
  		return false;
  	}
  
  	@Override
  	public int hashCode() {
  		//return name.hashCode()+value.hashCode();
  		return super.hashCode();
  	}
  	
  	@Override
  	public boolean equals(Object obj) {
  		if (this == obj)
  			return true;
  		if (obj == null)
  			return false;
  		if (getClass() != obj.getClass())
  			return false;
  		HenshinDebugVariable other = (HenshinDebugVariable) obj;
  		return name.equals(other.name) 
  				&& value.equals(other.value);
  	}
  }
  