package edu.harvard.wcfia.yoshikoder.util; import java.util.Stack; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.PatternSyntaxException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import edu.harvard.wcfia.yoshikoder.dictionary.CategoryNode; import edu.harvard.wcfia.yoshikoder.dictionary.CategoryNodeImpl; import edu.harvard.wcfia.yoshikoder.dictionary.DuplicateException; import edu.harvard.wcfia.yoshikoder.dictionary.PatternEngine; import edu.harvard.wcfia.yoshikoder.dictionary.PatternEngineFactory; import edu.harvard.wcfia.yoshikoder.dictionary.PatternNode; import edu.harvard.wcfia.yoshikoder.dictionary.PatternNodeImpl; import edu.harvard.wcfia.yoshikoder.dictionary.SimpleDictionary; import edu.harvard.wcfia.yoshikoder.dictionary.YKDictionary; public class YKDictionaryHandler extends DefaultHandler { private static Logger log = Logger.getLogger(YKDictionaryHandler.class.getName()); private YKDictionary dict; private Stack stack; private boolean isRoot = true; public YKDictionaryHandler(){ stack = new Stack(); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException{ if (qName.equals("dictionary")){ dict = new SimpleDictionary("nameless"); PatternEngine peng = null; // covers a late implementation change; used to be a classforName String patengine = attributes.getValue("patternengineclassname"); if (patengine != null) peng = PatternEngineFactory.createEngine(PatternEngine.SUBSTRING); String enginetype = attributes.getValue("patternengine"); if (enginetype != null) peng = PatternEngineFactory.createEngine(enginetype); dict.setPatternEngine(peng); /* String ws = attributes.getValue("windowsize"); if (ws != null){ try { int wsi = Integer.parseInt(ws, 2); dict.setWindowSize(wsi); } catch (NumberFormatException ex){ log.log(Level.WARNING, "Could not parse windowsize " + ws, ex); dict.setWindowSize(2); } } else { dict.setWindowSize(2); } */ } else if (qName.equals("cnode")){ String name = attributes.getValue("name"); String score = attributes.getValue("score"); Double d = null; if (score != null){ try { d = new Double(Double.parseDouble(score)); } catch (NumberFormatException nfe){ // } } String desc = attributes.getValue("desc"); CategoryNode cn = new CategoryNodeImpl(name, d, desc); if (isRoot){ stack.push(cn); dict.setDictionaryRoot(cn); isRoot = false; } else { try { dict.addCategory(cn, (CategoryNode)stack.peek()); stack.push(cn); } catch (DuplicateException de){ throw new SAXException(de); } } } else if (qName.equals("pnode")){ String name = attributes.getValue("name"); String score = attributes.getValue("score"); Double d = null; if (score != null){ try { d = new Double(Double.parseDouble(score)); } catch (NumberFormatException nfe){ // } } PatternNode pn = null; try { pn = new PatternNodeImpl(name, d, dict.getPatternEngine().makeRegexp(name)); } catch (PatternSyntaxException pse){ throw new SAXException(pse); } try { dict.addPattern(pn, (CategoryNode)stack.peek()); stack.push(pn); } catch (DuplicateException de){ throw new SAXException(de); } } } public void endElement(String uri, String localName, String qName) throws SAXException{ if (qName.equals("cnode")) { stack.pop(); } else if (qName.equals("pnode")){ stack.pop(); } } public YKDictionary getDictionary(){ return dict; } }