blob: 172320ad202089815c74bf4db2a0cc09cf76bc27 [file] [log] [blame]
package org.eclipse.emf.henshin.interpreter.debug;
import java.util.Arrays;
import java.util.List;
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.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.henshin.interpreter.EGraph;
public abstract class HenshinDebugValue extends HenshinDebugElement implements IValue {
protected EGraph graph;
protected String declaredType;
protected String actualType;
protected String valueString;
protected int indexInDomain = -1;
/**
* The children variables.
* null indicates that the value does not contain children variables
*/
protected HenshinDebugVariable[] childrenVariables;
/**
* creates a Debug Value from a value object.
* The value object should be one of the following:
* <ol>
* <li>an EObject</li>
* <li>a {@link List} of objects (in this case the same rules apply for the list elements)</li>
* <li>an object that provides a meaningful toString(), as that will be used for all other objects</>
* </ol>
* @param target the associated debug target
* @param graph an {@link EGraph} that is used to retrieve a string label for this value, or <code>null</code>
* @param valueObject the actual value. If null, the valueString will be used as value object
* @param declaredType the string representation of the value's declared type.
* @param indexInDomain the index within the domain
*/
public HenshinDebugValue(IDebugTarget target, EGraph graph, String declaredType) {
super(target);
this.graph = graph;
if (declaredType == null)
throw new IllegalArgumentException("declaredType must not be null");
this.declaredType = declaredType;
}
@Override
public String getReferenceTypeName() throws DebugException {
return actualType;
}
@Override
public String getValueString() throws DebugException {
return valueString;
}
@Override
public boolean isAllocated() throws DebugException {
return true;
}
@Override
public abstract IVariable[] getVariables() throws DebugException;
@Override
public boolean hasVariables() throws DebugException {
return childrenVariables != null;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((actualType == null) ? 0 : actualType.hashCode());
result = prime * result + Arrays.hashCode(childrenVariables);
result = prime * result + ((valueString == null) ? 0 : valueString.hashCode());
return result;
}
/**
* checks whether an EAttribute is of a primitive (meta) type
* @param attribute the attribute to check
* @return <code>true</code> if the attribute is primitive
*/
public boolean isPrimitive(EObject object) {
if (object instanceof EAttribute) {
EAttribute attribute = (EAttribute) object;
return attribute.getEType().getClassifierID() == EcorePackage.ESTRING ||
attribute.getEType().getClassifierID() == EcorePackage.EINT ||
attribute.getEType().getClassifierID() == EcorePackage.ELONG ||
attribute.getEType().getClassifierID() == EcorePackage.EFLOAT ||
attribute.getEType().getClassifierID() == EcorePackage.EDOUBLE ||
attribute.getEType().getClassifierID() == EcorePackage.EBOOLEAN;
}
return false;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
HenshinDebugValue other = (HenshinDebugValue) obj;
if (actualType == null) {
if (other.actualType != null)
return false;
} else if (!actualType.equals(other.actualType))
return false;
if (!Arrays.equals(childrenVariables, other.childrenVariables))
return false;
if (valueString == null) {
if (other.valueString != null)
return false;
} else if (!valueString.equals(other.valueString))
return false;
return true;
}
public int getIndexInDomain() {
return indexInDomain;
}
}