blob: 75258e025f599664a28d7358d79024cbfe60d0da [file] [log] [blame]
package org.eclipse.emf.henshin.variability.wrapper;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.henshin.model.Action;
import org.eclipse.emf.henshin.model.Annotation;
import org.eclipse.emf.henshin.model.Edge;
import org.eclipse.emf.henshin.model.Graph;
import org.eclipse.emf.henshin.model.GraphElement;
import org.eclipse.emf.henshin.model.Node;
import org.eclipse.emf.henshin.model.impl.HenshinFactoryImpl;
/**
* This class wraps an instance of {@link org.eclipse.emf.henshin.model.Edge} and adds variability awareness to it.
* The variability awareness is enabled by adding an {@link org.eclipse.emf.henshin.model.Annotation} to the wrapped object.
*
* @author Stefan Schulz
*
*/
public class VariabilityEdge implements Edge, VariabilityGraphElement {
final Edge edge;
final Annotation presenceCondition;
static Annotation addVariabilityToEdge(Edge edge) {
EList<Annotation> annos = edge.getAnnotations();
Iterator<Annotation> it = annos.iterator();
Annotation pc = null;
while(it.hasNext()) {
Annotation anno = it.next();
if(anno.getKey().equals(VariabilityConstants.PRESENCE_CONDITION)) {
pc = anno;
break;
}
}
if(pc != null) {
return pc;
} else {
return VariabilityHelper.addAnnotation(edge, VariabilityConstants.PRESENCE_CONDITION, "");
}
}
/**
* Creates a new {@link org.eclipse.emf.henshin.model.Edge} and makes it variability aware.
*/
VariabilityEdge() {
this(HenshinFactoryImpl.eINSTANCE.createEdge());
}
/**
* Creates a new {@link org.eclipse.emf.henshin.model.Edge} between two {@link org.eclipse.emf.henshin.model.Node}s and makes it variability aware.
* The edge is automatically added to the graph of the source node if not <code>null</code>.
* @param source Source node.
* @param target Target node.
* @param type Edge type.
* @return The created edge.
*/
VariabilityEdge(Node source, Node target, EReference type) {
this(HenshinFactoryImpl.eINSTANCE.createEdge(source, target, type));
}
/**
* Adds an {@link org.eclipse.emf.henshin.model.Annotation} to the given {@link org.eclipse.emf.henshin.model.Edge} in order to enable variability awareness.
* @param edge
*/
VariabilityEdge(Edge edge) {
this.edge = edge;
this.presenceCondition = addVariabilityToEdge(edge);
}
public GraphElement getGraphElement() {
return edge;
}
/**
* Returns the presence condition of the Attribute.
* @return the presence condition.
*/
public String getPresenceCondition() {
return presenceCondition.getValue();
}
/**
* Sets the presence condition of the Attribute to the given String.
* @param condition the presence condition to be set.
*/
public void setPresenceCondition(String condition) {
presenceCondition.setValue(condition);
}
/**
* @see org.eclipse.emf.common.notify.Notifier#eAdapters()
*/
public EList<Adapter> eAdapters() {
return edge.eAdapters();
}
/**
* @see org.eclipse.emf.common.notify.Notifier#eDeliver()
*/
public boolean eDeliver() {
return edge.eDeliver();
}
/**
* @see org.eclipse.emf.common.notify.Notifier#eSetDeliver(boolean)
*/
public void eSetDeliver(boolean deliver) {
edge.eSetDeliver(deliver);
}
/**
* @see org.eclipse.emf.common.notify.Notifier#eNotify(org.eclipse.emf.common.notify.Notification)
*/
public void eNotify(Notification notification) {
edge.eNotify(notification);
}
/**
* @see org.eclipse.emf.ecore.EObject#eClass()
*/
public EClass eClass() {
return edge.eClass();
}
/**
* @see org.eclipse.emf.ecore.EObject#eResource()
*/
public Resource eResource() {
return edge.eResource();
}
/**
* @see org.eclipse.emf.ecore.EObject#eContainer()
*/
public EObject eContainer() {
return edge.eContainer();
}
/**
* @see org.eclipse.emf.ecore.EObject#eContainingFeature()
*/
public EStructuralFeature eContainingFeature() {
return edge.eContainingFeature();
}
/**
* @see org.eclipse.emf.ecore.EObject#eContainmentFeature()
*/
public EReference eContainmentFeature() {
return edge.eContainmentFeature();
}
/**
* @see org.eclipse.emf.ecore.EObject#eContents()
*/
public EList<EObject> eContents() {
return edge.eContents();
}
/**
* @see org.eclipse.emf.ecore.EObject#eAllContents()
*/
public TreeIterator<EObject> eAllContents() {
return edge.eAllContents();
}
/**
* @see org.eclipse.emf.ecore.EObject#eIsProxy()
*/
public boolean eIsProxy() {
return edge.eIsProxy();
}
/**
* @see org.eclipse.emf.ecore.EObject#eCrossReferences()
*/
public EList<EObject> eCrossReferences() {
return edge.eCrossReferences();
}
/**
* @see org.eclipse.emf.ecore.EObject#eGet(org.eclipse.emf.ecore.EStructuralFeature)
*/
public Object eGet(EStructuralFeature feature) {
return edge.eGet(feature);
}
/**
* @see org.eclipse.emf.ecore.EObject#eGet(org.eclipse.emf.ecore.EStructuralFeature, boolean)
*/
public Object eGet(EStructuralFeature feature, boolean resolve) {
return edge.eGet(feature, resolve);
}
/**
* @see org.eclipse.emf.ecore.EObject#eSet(org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object)
*/
public void eSet(EStructuralFeature feature, Object newValue) {
edge.eSet(feature, newValue);
}
/**
* @see org.eclipse.emf.ecore.EObject#eIsSet(org.eclipse.emf.ecore.EStructuralFeature)
*/
public boolean eIsSet(EStructuralFeature feature) {
return edge.eIsSet(feature);
}
/**
* @see org.eclipse.emf.ecore.EObject#eUnset(org.eclipse.emf.ecore.EStructuralFeature)
*/
public void eUnset(EStructuralFeature feature) {
edge.eUnset(feature);
}
/**
* @see org.eclipse.emf.ecore.EObject#eInvoke(org.eclipse.emf.ecore.EOperation, org.eclipse.emf.common.util.EList)
*/
public Object eInvoke(EOperation operation, EList<?> arguments) throws InvocationTargetException {
return edge.eInvoke(operation, arguments);
}
/**
* @see org.eclipse.emf.henshin.model.GraphElement#getAction()
*/
public Action getAction() {
return edge.getAction();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getActionEdge()
*/
public Edge getActionEdge() {
return edge.getActionEdge();
}
/**
* @see org.eclipse.emf.henshin.model.ModelElement#getAnnotations()
*/
public EList<Annotation> getAnnotations() {
return edge.getAnnotations();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getGraph()
*/
public Graph getGraph() {
return edge.getGraph();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getIndex()
*/
public String getIndex() {
return edge.getIndex();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getIndexConstant()
*/
public Integer getIndexConstant() {
return edge.getIndexConstant();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getSource()
*/
public Node getSource() {
return edge.getSource();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getTarget()
*/
public Node getTarget() {
return edge.getTarget();
}
/**
* @see org.eclipse.emf.henshin.model.Edge#getType()
*/
public EReference getType() {
return edge.getType();
}
/**
* @see org.eclipse.emf.henshin.model.GraphElement#setAction(org.eclipse.emf.henshin.model.Action)
*/
public void setAction(Action arg0) {
edge.setAction(arg0);
}
/**
* @see org.eclipse.emf.henshin.model.Edge#setGraph(org.eclipse.emf.henshin.model.Graph)
*/
public void setGraph(Graph arg0) {
edge.setGraph(arg0);
}
/**
* @see org.eclipse.emf.henshin.model.Edge#setIndex(java.lang.String)
*/
public void setIndex(String arg0) {
edge.setIndex(arg0);
}
/**
* @see org.eclipse.emf.henshin.model.Edge#setSource(org.eclipse.emf.henshin.model.Node)
*/
public void setSource(Node arg0) {
edge.setSource(arg0);
}
/**
* @see org.eclipse.emf.henshin.model.Edge#setTarget(org.eclipse.emf.henshin.model.Node)
*/
public void setTarget(Node arg0) {
edge.setTarget(arg0);
}
/**
* @see org.eclipse.emf.henshin.model.Edge#setType(org.eclipse.emf.ecore.EReference)
*/
public void setType(EReference arg0) {
edge.setType(arg0);
}
@Override
public int hashCode() {
return edge.hashCode();
}
@Override
public boolean equals(Object obj) {
return edge.equals(obj);
}
}