package org.kevoree.kevscript.util;
import jet.runtime.typeinfo.JetValueParameter;
import org.kevoree.ContainerRoot;
import org.kevoree.Instance;
import org.kevoree.kevscript.Type;
import org.kevoree.modeling.api.KMFContainer;
import org.kevoree.modeling.api.util.ModelVisitor;
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 InstanceResolver {
/* Not the most efficient, but easy to maintain... */
public static List<Instance> resolve(ContainerRoot model, IAST<Type> node, List<Instance> pending) {
final List<Instance> resolved = new ArrayList<Instance>();
if (node.getType().equals(Type.NameList)) {
for (IAST<Type> child : node.getChildren()) {
resolved.addAll(resolve(model, child,pending));
}
} else {
final String name = node.childrenAsString();
model.visit(new ModelVisitor() {
@Override
public void visit(@JetValueParameter(name = "elem") KMFContainer kmfContainer, @JetValueParameter(name = "refNameInParent") String s, @JetValueParameter(name = "parent") KMFContainer kmfContainer2) {
if (kmfContainer instanceof Instance) {
Instance elem = (Instance) kmfContainer;
if(isMatch(elem,name)){
resolved.add(elem);
}
}
}
}, true, true, false);
for(Instance instance : pending){
if(isMatch(instance,name)){
resolved.add(instance);
}
}
}
return resolved;
}
private static boolean isMatch(Instance elem,String name){
if (elem.getName().equals(name)) {
return true;
} else {
if (name.contains("*")) {
if (elem.getName().matches(name.replace("*", ".*"))) {
return true;
}
}
}
return false;
}
}