package org.kevoree.kevscript.util;
import org.kevoree.ComponentInstance;
import org.kevoree.ContainerNode;
import org.kevoree.ContainerRoot;
import org.kevoree.Port;
import org.kevoree.kevscript.KevScriptError;
import org.kevoree.kevscript.Type;
import org.kevoree.pmodeling.api.KMFContainer;
import org.waxeye.ast.IAST;
import java.util.ArrayList;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: duke
* Date: 25/11/2013
* Time: 16:43
*/
public class PortResolver {
public static List<Port> resolve(ContainerRoot model, IAST<Type> node) throws Exception {
final List<Port> resolved = new ArrayList<Port>();
if (node.getType().equals(Type.InstancePath) && node.getChildren().size() == 3) {
//Component case
String nodeName = node.getChildren().get(0).childrenAsString();
String componentName = node.getChildren().get(1).childrenAsString();
String portName = node.getChildren().get(2).childrenAsString();
List<KMFContainer> parentNodes = model.select("nodes[" + nodeName + "]");
if (parentNodes.isEmpty()){
throw new KevScriptError("Unable to find node " + componentName + " in model");
}
for (Object loopObj : parentNodes) {
ContainerNode parentNode = (ContainerNode) loopObj;
List<KMFContainer> cis = parentNode.select("components[" + componentName + "]");
if (cis.isEmpty()){
throw new KevScriptError("Unable to find component \"" + componentName + "\" in node \"" + parentNode.getName() + "\"");
}
for (Object ci : cis) {
ComponentInstance cinstance = (ComponentInstance) ci;
for (Port p : cinstance.getProvided()) {
if (p.getPortTypeRef().getName().equals(portName)) {
resolved.add(p);
}
}
for (Port p : cinstance.getRequired()) {
if (p.getPortTypeRef().getName().equals(portName)) {
resolved.add(p);
}
}
}
}
} else {
throw new KevScriptError("Bad name to resolve ports : " + node.toString());
}
if (resolved.isEmpty()) {
throw new KevScriptError("No port resolved from : " + node.toString());
}
return resolved;
}
}