blob: 47a8a48dde2ab0a1c6025afb3492e5f08df2158a [file] [log] [blame]
package org.eclipse.emf.henshin.interpreter.debug;
import java.util.List;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.henshin.interpreter.EGraph;
import org.eclipse.emf.henshin.interpreter.matching.conditions.DebugApplicationCondition;
public class DebugValueEObject extends HenshinDebugValue {
private EObject value;
public DebugValueEObject(IDebugTarget target, EGraph graph, String declaredType, EObject value, int indexInDomain) {
super(target, graph, declaredType);
this.value = value;
this.indexInDomain = indexInDomain;
EObject valueEObject = (EObject) value;
if (valueEObject == null) {
valueString = "";
actualType = "";
childrenVariables = null;
} else if (isPrimitive(valueEObject)) {
valueString = valueEObject.toString();
actualType = ((EAttribute) valueEObject).getEType().getInstanceClassName();
childrenVariables = null;
} else {
// initialize the children variable array (the children variables
// themselves get initialized in getVariables())
List<EStructuralFeature> structuralFeatures = valueEObject.eClass().getEAllStructuralFeatures();
valueString = DebugApplicationCondition.retrieveValueLabel(valueEObject, graph);
actualType = valueEObject.eClass().getName();
childrenVariables = new HenshinDebugVariable[structuralFeatures.size()];
}
}
@Override
public IVariable[] getVariables() throws DebugException {
if (hasVariables()) {
EObject valueEObject = (EObject) value;
// for each child variable: calculate its child variables
List<EStructuralFeature> structuralFeatures = valueEObject.eClass().getEAllStructuralFeatures();
for (int i = 0; i < structuralFeatures.size(); i++) {
EStructuralFeature childFeature = structuralFeatures.get(i);
String nameString = childFeature.getName();
String childDeclaredType = childFeature.getEType().getName();
Object childObj = valueEObject.eGet(childFeature);
if (isPrimitive(childFeature)) {
childDeclaredType = childFeature.getEType().getInstanceClassName();
}
// get type of child object
if (childObj instanceof EObject) {
EObject childEObj = (EObject) childObj;
// get whole domain (e.g. domain for :Client could be 'charles', 'bob', 'alice')
List<EObject> domain = graph.getDomain(childEObj.eClass(), false);
int index = domain.indexOf(childEObj);
childrenVariables[i] =
new HenshinDebugVariable(
(HenshinDebugTarget) getDebugTarget(),
nameString,
new DebugValueEObject(getDebugTarget(), graph, childFeature.getEType().getName(), childEObj, index));
} else if (childObj instanceof List<?>) {
List<?> valueList = (List<?>) childObj;
// ---------------------------------------------------
childrenVariables[i] =
new HenshinDebugVariable(
(HenshinDebugTarget) getDebugTarget(),
nameString,
new DebugValueList(
(HenshinDebugTarget) getDebugTarget(),
graph,
declaredType,
valueList)
);
} else {
// here we look at type 'Object'
childrenVariables[i] =
new HenshinDebugVariable(
(HenshinDebugTarget) getDebugTarget(),
nameString,
new DebugValueObject(
(HenshinDebugTarget) getDebugTarget(),
graph,
declaredType,
childObj,
i)
);
}
}
// return the variables array
return childrenVariables;
} else {
// no variables --> return an empty list
return new HenshinDebugVariable[0];
}
}
}