package com.siberika.idea.pascal.sdk;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* Author: George Bakhtadze
* Date: 31/08/2013
*/
class DirectivesParser {
static Map<String, Map<String, Directive>> parse(@NotNull InputStream stream) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
final Map<String, Map<String, Directive>> directives = new TreeMap<String, Map<String, Directive>>();
DefaultHandler handler = new DefaultHandler() {
private String version = null;
private StringBuilder sb = new StringBuilder();
private Directive directive = new Directive();
private List<String> ids = new SmartList<String>();
public void startElement(String uri, String localName,String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("compiler")) {
version = attributes.getValue("version");
}
sb = new StringBuilder();
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("directive")) {
addDirective(directives, version, ids, directive);
directive = new Directive();
ids = new SmartList<String>();
} else if (qName.equalsIgnoreCase("id")) {
ids.add(sb.toString());
} else if (qName.equalsIgnoreCase("desc")) {
directive.desc = sb.toString();
} else if (qName.equalsIgnoreCase("value")) {
directive.addValue(sb.toString());
}
}
public void characters(char ch[], int start, int length) throws SAXException {
sb.append(ch, start, length);
}
};
saxParser.parse(stream, handler);
return directives;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static void addDirective(Map<String, Map<String, Directive>> directives, String version, List<String> ids, Directive directive) {
Map<String, Directive> dirs = directives.get(version);
if (null == dirs) {
dirs = new HashMap<String, Directive>();
}
for (String id : ids) {
dirs.put(id, directive);
}
directives.put(version, dirs);
}
}