/* * Copyright 2010 Tim Miller * This file is part of PaperManager * PaperManager is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package papers; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; public class PaperFileReader { String fn; ArrayList<Paper> paperList; XMLReader parser; Paper current; private boolean inPaper = false; private boolean inBib = false; private boolean inTaglist = false; private boolean inTag = false; private boolean inLabel = false; private boolean inType = false; private boolean inSummary = false; private boolean inFile = false; StringBuilder name = null; HashMap<String,Boolean> stateTracker = new HashMap<String,Boolean>(); class PaperFileHandler extends DefaultHandler{ public PaperFileHandler(){ } public void startElement(String nsURI, String strippedName, String tagName, Attributes attributes){ if(tagName.equalsIgnoreCase("paper")){ inPaper = true; current = new Paper(); paperList.add(current); }else if(tagName.equalsIgnoreCase("bibentry")){ inBib = true; }else if(tagName.equalsIgnoreCase("type")){ inType = true; name = new StringBuilder(); }else if(tagName.equalsIgnoreCase("label")){ inLabel = true; name = new StringBuilder(); }else if(tagName.equalsIgnoreCase("summary")){ inSummary = true; name = new StringBuilder(); }else if(tagName.equalsIgnoreCase("filename")){ inFile = true; name = new StringBuilder(); }else if(tagName.equalsIgnoreCase("taglist")){ // not really necessary, but keeps us out of inPaper case... inTaglist = true; }else if(tagName.equalsIgnoreCase("tag")){ inTag = true; name = new StringBuilder(); }else if(inBib){ stateTracker.put(tagName.toLowerCase(), true); name = new StringBuilder(); } } public void endElement(String nsURI, String strippedName, String tagName){ if(tagName.equalsIgnoreCase("paper")){ current = null; name = null; inPaper = false; }else if(tagName.equalsIgnoreCase("bibentry")){ inBib = false; }else if(tagName.equalsIgnoreCase("type")){ inType = false; current.setType(name.toString()); name = null; }else if(tagName.equalsIgnoreCase("label")){ inLabel = false; current.setLabel(name.toString()); name = null; }else if(tagName.equalsIgnoreCase("summary")){ inSummary = false; current.setSummary(name.toString()); name = null; }else if(tagName.equalsIgnoreCase("filename")){ inFile = false; current.setFile(new File(name.toString())); name = null; }else if(tagName.equalsIgnoreCase("taglist")){ inTaglist = false; }else if(tagName.equalsIgnoreCase("tag")){ current.addTag(name.toString()); inTag = false; }else if(inBib && stateTracker.containsKey(tagName.toLowerCase())){ stateTracker.put(tagName.toLowerCase(), false); if(name == null){ System.err.println("Error in herre."); } current.setField(tagName.toLowerCase(), name.toString()); name = null; } } public void characters(char[] ch, int start, int length){ if(name != null){ name.append(ch, start, length); } } } public PaperFileReader(String fn){ paperList = new ArrayList<Paper>(); try { parser = XMLReaderFactory.createXMLReader(); } catch (SAXException e) { System.err.println("Error building XMLReader: " + e); e.printStackTrace(); System.exit(-1); } parser.setContentHandler(new PaperFileHandler()); this.fn = fn; } public ArrayList<Paper> readFile(){ try { parser.parse(fn); } catch (SAXException e) { e.printStackTrace(); return new ArrayList<Paper>(); } catch (IOException e) { e.printStackTrace(); return new ArrayList<Paper>(); } return paperList; } }