/*
 * XMLManager.java
 */

package dblpconverter;

/**
 *
 * @author Gersk
 *
 * XMLManager receive the element from the SaxThread object. It's add every value
 * to the Element object.
 */


import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;


public class XMLManager extends DefaultHandler {
    
    private Window window;
    private QueryBuilder qBuilder;
    private Element element;
    private StatusBar statusBar;
    
    private SAXParserFactory parserFactory;
    private SAXParser parser;
 
    private CharArrayWriter contents; 
    private String citeLabel = "null";
    private String citeText;

    private long elementCount = 0;
    
    public XMLManager() 
    {
        parserFactory = SAXParserFactory.newInstance();
        element = new Element();
        contents = new CharArrayWriter();
        
        try 
        {
            parserFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true);
            parser = parserFactory.newSAXParser(); 
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public void setWindow(Window window)
    {
        this.window = window;
    }
    
    public void setQBuilder(QueryBuilder qBuilder)
    {
        this.qBuilder = qBuilder;
    }   
    
    public void setStatusBar(StatusBar statusBar)
    {
        this.statusBar = statusBar;
    }
    
    public void parse(InputStream is) //parse the inputstream
    {
        elementCount = 0;
        qBuilder.setTableValue(false);
        if(window.rbutton2.isSelected())
            qBuilder.createTables();
        
        try {
                try {
                    parser.parse(is, this);
                } catch(SAXException e) {
                    window.append("Error parsing : " + e);
                  }
            } catch(IOException e) {
                window.append("Error parsing : " + e);
              }        
    }
    
    public void reset()
    {
        parser.reset();
    }
    
    
    public void startDocument() 
    {

    }
    
    public void endDocument() 
    {
        window.finish();
    }
       
    public void characters(char[] ch, int start, int len)
    {
        contents.write( ch, start, len); 
    }    
    
    public void startElement(String namespaceURI,String localName, String qName, Attributes atts) 
    { 
        elementCount++;
        statusBar.setProgress(elementCount);
        contents.reset();
        
        if(qName.equals("article"))
        {    
            element.type = element.ARTICLE;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
            element.reviewid = atts.getValue(2);
            element.rating = atts.getValue(3);
        }
        
        if(qName.equals("inproceedings"))
        {    
            element.type = element.INPROCEEDINGS;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        } 
        
        if(qName.equals("proceedings"))
        {    
            element.type = element.PROCEEDINGS;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("book"))
        {    
            element.type = element.BOOK;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("incollection"))
        {    
            element.type = element.INCOLLECTION;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("phdthesis"))
        {    
            element.type = element.PHDTHESIS;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("mastersthesis"))
        {    
            element.type = element.MASTERTHESIS;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("www"))
        {    
            element.type = element.WWW;
            element.mdate = atts.getValue(0);
            element.key = atts.getValue(1);
        }
        
        if(qName.equals("series"))
        {    
            element.href_series = atts.getValue(0);
        }
        
        if(qName.equals("cite"))
        {    
            if(!(atts.getLength() == 0))
                citeLabel = atts.getValue(0);
            else
                citeLabel = "null";
        }
        
        if(qName.equals("publisher"))
        {    
            element.href_publisher = atts.getValue(0);
        }
    }
    
    public void endElement(String uri, String localName, String qName) 
    {
        if(qName.equals("author")) element.author.add(contents.toString().replace("'","''")); 
        if(qName.equals("editor")) element.editor.add(contents.toString().replace("'","''"));
        if(qName.equals("title")) element.title = contents.toString().replace("'","''"); 
        if(qName.equals("url")) element.url = contents.toString().replace("'","''"); 
        if(qName.equals("note")) element.note = contents.toString().replace("'","''"); 
        if(qName.equals("pages")) element.pages = contents.toString().replace("'","''"); 
        if(qName.equals("chapter")) element.chapter = contents.toString().replace("'","''"); 
        if(qName.equals("booktitle")) element.booktitle = contents.toString().replace("'","''"); 
        if(qName.equals("number")) element.number = contents.toString().replace("'","''"); 
        if(qName.equals("journal")) element.name = contents.toString().replace("'","''"); 
        if(qName.equals("ee")) element.ee = contents.toString().replace("'","''"); 
        if(qName.equals("isbn")) element.isbn = contents.toString().replace("'","''"); 
        if(qName.equals("crossref")) element.crossref = contents.toString().replace("'","''"); 
        if(qName.equals("cdrom")) element.cdrom = contents.toString().replace("'","''"); 
        if(qName.equals("volume")) element.volume = contents.toString().replace("'","''"); 
        if(qName.equals("year")) element.year = contents.toString().replace("'","''"); 
        if(qName.equals("month")) element.month = contents.toString().replace("'","''"); 
        if(qName.equals("href")) element.href = contents.toString().replace("'","''"); 
        if(qName.equals("series")) element.series = contents.toString().replace("'","''");
        if(qName.equals("school")) element.school = contents.toString().replace("'","''");
        if(qName.equals("publisher")) element.publisher = contents.toString().replace("'","''"); 
        if(qName.equals("address")) element.address_publisher = contents.toString().replace("'","''");
        if(qName.equals("cite")) 
        {    
            citeText = contents.toString().replace("'","''");
            if(!citeLabel.equals("null"))
                element.cites.add(new Cite(citeLabel.replace("'","''"), citeText));        
        }
        
        if(qName.equals("article") | qName.equals("inproceedings") | qName.equals("proceedings") | qName.equals("book")
            | qName.equals("incollection") | qName.equals("phdthesis") | qName.equals("mastersthesis") | qName.equals("www"))
        {    
            qBuilder.addElement(element); //add data to db or file
            element.reset();
        }  
    } 
     
    public void warning(SAXParseException exception) 
    {
        window.append("WARNING: line " + exception.getLineNumber() + ": "+ exception.getMessage());
    }
    
    public void error(SAXParseException exception) 
    {
        window.append("ERROR: line " + exception.getLineNumber() + ": " + exception.getMessage());
    }

    public void fatalError(SAXParseException exception) throws SAXException 
    {
        window.append("FATAL: line " + exception.getLineNumber() + ": " + exception.getMessage());
        throw(exception);
    }
    
    

}
