package fr.adrienbrault.idea.symfony2plugin.dic;
import fr.adrienbrault.idea.symfony2plugin.util.service.AbstractServiceParser;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class XmlTagParser extends AbstractServiceParser {
protected Set<String> list = new HashSet<>();
protected Map<String, ArrayList<String>> taggedClasses = new ConcurrentHashMap<>();
@Override
public String getXPathFilter() {
return "/container/services/service[@id]/tag[@name]";
}
public void parser(InputStream file) {
NodeList nodeList = this.parserer(file);
if(nodeList == null) {
return;
}
for (int i = 0; i < nodeList.getLength(); i++) {
Element node = (Element) nodeList.item(i);
String tagName = node.getAttribute("name");
this.list.add(tagName);
Element parentNode = (Element) node.getParentNode();
if(parentNode.hasAttribute("class")) {
this.addTaggedClass(tagName, parentNode.getAttribute("class"));
}
}
}
public Map<String, ArrayList<String>> getTaggedClasses() {
return taggedClasses;
}
@Nullable
public ArrayList<String> getTaggedClass(String tagName) {
if(!this.taggedClasses.containsKey(tagName)) {
return null;
}
return this.taggedClasses.get(tagName);
}
private void addTaggedClass(String tagName, String className) {
if(!this.taggedClasses.containsKey(tagName)) {
this.taggedClasses.put(tagName, new ArrayList<>());
}
this.taggedClasses.get(tagName).add(className);
}
public Set<String> get() {
return list;
}
}