/**
*
*/
package se.sics.kompics.ide.model.ast;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jdt.core.dom.ASTNode;
import se.sics.kompics.ide.Model;
import se.sics.kompics.model.kompicsComponents.Component;
import se.sics.kompics.model.kompicsComponents.ComponentDefinition;
import se.sics.kompics.model.kompicsComponents.Handler;
import se.sics.kompics.model.kompicsComponents.KompicsComponentsFactory;
import se.sics.kompics.model.kompicsComponents.KompicsComponentsPackage;
import se.sics.kompics.model.kompicsComponents.Port;
import se.sics.kompics.model.kompicsComponents.PortType;
/**
* The <code>ASTComponentDefinition</code> .
*
* @author Lars Kroll <lkr@lars-kroll.com>
* @version $Id: $
*
*/
public class ASTComponentDefinition extends ASTModelObject {
private KompicsComponentsFactory factory = KompicsComponentsFactory.eINSTANCE;
private final ComponentDefinition model;
private List<ASTPort> providedPorts = new LinkedList<ASTPort>();
private List<ASTPort> requiredPorts = new LinkedList<ASTPort>();
private ASTPort controlPort;
private List<ASTComponent> subInstances = new LinkedList<ASTComponent>();
public ASTComponentDefinition(String id, ComponentDefinition model, ASTNode node) {
super(id, node, model.eClass());
this.model = model;
model.getProvides().add(Model.controlPort.getModel());
Port cP = factory.createPort();
cP.setPortType(Model.controlPort.getModel());
cP.setProvided(true);
String pID = id + "/Port:" + Model.controlPort.getId() + ":-1";
controlPort = new ASTPort(pID, cP, node); // just set node so it can be found later
//providedPorts.add(controlPort);
Model.add(controlPort);
this.addChild(controlPort);
}
public ComponentDefinition getModel() {
return this.model;
}
/*
* (non-Javadoc)
*
* @see se.sics.kompics.ide.model.ast.ASTModelObject#getEObject()
*/
@Override
public EObject getEObject() {
return this.model;
}
/**
* @return the subInstances
*/
public List<ASTComponent> getSubInstances() {
return subInstances;
}
/*
* (non-Javadoc)
*
* @see
* se.sics.kompics.ide.model.ast.ASTModelObject#addToModel(org.eclipse.emf
* .ecore.EObject, int)
*/
@Override
public void addToModel(EObject obj, int environmentModifier) {
switch (obj.eClass().getClassifierID()) {
case KompicsComponentsPackage.COMPONENT:
model.getInstances().add((Component) obj);
break;
case KompicsComponentsPackage.HANDLER:
model.getHandlers().add((Handler) obj);
break;
case KompicsComponentsPackage.PORT_TYPE:
if (environmentModifier == ASTModelObject.PROVIDED_PORT) {
model.getProvides().add((PortType) obj);
} else if (environmentModifier == ASTModelObject.REQUIRED_PORT) {
model.getRequires().add((PortType) obj);
}
}
}
// public boolean addSubscription(String portType, ASTHandler handler, int envMod) {
// switch (envMod) {
// case ASTModelObject.REQUIRED_PORT:
// for (ASTPort p : this.requiredPorts) {
// if (p.getModel().getPortType().getType().equals(portType)) {
// p.addChild(handler);
// p.addToModel(handler.getModel(), envMod);
// return true;
// }
// }
// break;
// case ASTModelObject.PROVIDED_PORT:
// for (ASTPort p : this.providedPorts) {
// if (p.getModel().getPortType().getType().equals(portType)) {
// p.addChild(handler);
// p.addToModel(handler.getModel(), envMod);
// return true;
// }
// }
// default:
// return false;
// }
// return false;
// }
public void addProvided(ASTPort p) {
this.providedPorts.add(p);
}
public void addRequired(ASTPort p) {
this.requiredPorts.add(p);
}
public void addSubInstance(ASTComponent astc) {
this.subInstances.add(astc);
}
public ASTComponent createInstance(String variable, ASTNode node) {
controlPort.setLocationBinding(getLocationBinding());
Component c = factory.createComponent();
c.setType(model);
c.setVar(variable);
String cID = getId() + "/Component:" + variable + ":" + node.getStartPosition();
ASTComponent astc = new ASTComponent(cID, c, node);
ASTComponent existing = (ASTComponent) Model.add(astc); // in case the component already exists
if (!existing.equals(astc)) return existing;
astc.setParent(this);
this.addChild(astc);
addToModel(c, ASTModelObject.NONE);
for (ASTPort p : this.providedPorts) {
ASTPort copy = p.copy(cID, c);
c.getProvides().add(copy.getModel());
astc.addChild(copy);
copy.setParent(astc);
astc.addProvided(copy);
}
for (ASTPort p : this.requiredPorts) {
ASTPort copy = p.copy(cID, c);
c.getRequires().add(copy.getModel());
astc.addChild(copy);
copy.setParent(astc);
astc.addRequired(copy);
}
ASTPort copy = controlPort.copy(cID, c);
c.getProvides().add(copy.getModel());
astc.addChild(copy);
copy.setParent(astc);
astc.addProvided(copy);
astc.setControlPort(copy);
return astc;
}
}