package model.data.xml.parsers;
import java.util.List;
import javax.xml.parsers.SAXParserFactory;
import model.data.exceptions.DataException;
import model.data.exceptions.DataLoadException;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.util.LinkedList;
/**
* AbstractParser.java
*
* @author Christopher Bertels (chbertel@uos.de)
* @date 10.09.2008
*
* Abstrakte Oberklasse aller Parser-Klassen.
*/
public abstract class AbstractParser extends DefaultHandler
{
protected int minId;
protected boolean fileParsed = false;
protected String buffer = null;
protected SAXParserFactory parserFactory;
private String mainTag;
protected List<DataException> exceptionsToThrow = new LinkedList<DataException>();
/**
* Konstruktor für AbstractParser.
*
* @param mainTag
* Das Haupt- bzw äußerste Tag in der xml-Datei.
*/
public AbstractParser(String mainTag)
{
this.parserFactory = SAXParserFactory.newInstance();
this.mainTag = mainTag;
}
/**
* Überprüft ob Exceptions in die Liste eingetragen wurden und wirft diese,
* falls vorhanden.
*
* @throws DataException
* Die Methode wirft die Exception, falls eine vorhanden ist.
*/
protected void checkForExceptions() throws DataException
{
// gucken, ob evtl. eine DataLoadException vorgemerkt wurde
if (this.exceptionsToThrow.size() > 0)
{
for (DataException ex : this.exceptionsToThrow)
{
throw ex;
}
}
}
/**
* Callback-methode. Wird aufgerufen, wenn ein XML-Element geschlossen wird.
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
{
checkForEndTag(qName.toLowerCase());
}
/**
* Überprüft beim schließen eines übergebenen Tags ob die Datei am Ende ist,
* wenn das übergebene Tag das mainTag ist.
*
* @param currentTagName
* Der aktuelle TagName, welcher beendet/geschlossen wird.
*/
private void checkForEndTag(String currentTagName)
{
if (currentTagName == this.mainTag.toLowerCase())
{
if (!this.fileParsed)
{
// eigentlich fertig.
this.fileParsed = true;
}
else
{
String msg = "Sollte eigentlich am Ende der Datei sein! Folgendes Tag war aber noch vorhanden: ";
msg += currentTagName;
// Exception merken und am Ende werfen.
this.exceptionsToThrow.add(new DataLoadException(msg));
}
}
}
/**
* Gibt die in der XML-Datei angegebene MinID zurück.
*
* @return Die MinID, die in der XML-Datei angegeben wurde.
*/
public int getMinID()
{
return this.minId;
}
}