X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fload%2Fxml%2FXmlFileLoader.java;fp=tim%2Fprune%2Fload%2Fxml%2FXmlFileLoader.java;h=a607b22a2803b1b0cc09708ab6b6ef0390443681;hb=5625a1abadb5f2ca5f017fe7dbda1d5141cb637b;hp=0000000000000000000000000000000000000000;hpb=23959e65a6a0d581e657b07186d18b7a1ac5afeb;p=GpsPrune.git diff --git a/tim/prune/load/xml/XmlFileLoader.java b/tim/prune/load/xml/XmlFileLoader.java new file mode 100644 index 0000000..a607b22 --- /dev/null +++ b/tim/prune/load/xml/XmlFileLoader.java @@ -0,0 +1,148 @@ +package tim.prune.load.xml; + +import java.io.File; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; +import tim.prune.App; +import tim.prune.I18nManager; +import tim.prune.data.Altitude; + +/** + * Class for handling loading of Xml files, and passing the + * loaded data back to the App object + */ +public class XmlFileLoader extends DefaultHandler implements Runnable +{ + private File _file = null; + private App _app = null; + private JFrame _parentFrame = null; + private XmlHandler _handler = null; + private String _unknownType = null; + + + /** + * Constructor + * @param inApp Application object to inform of track load + * @param inParentFrame parent frame to reference for dialogs + */ + public XmlFileLoader(App inApp, JFrame inParentFrame) + { + _app = inApp; + _parentFrame = inParentFrame; + } + + + /** + * Open the selected file and show the GUI dialog + * to select load options + */ + public void openFile(File inFile) + { + _file = inFile; + _handler = null; + _unknownType = null; + // start new thread in case xml parsing is time-consuming + new Thread(this).start(); + } + + + /** + * Run method, to parse the file + * @see java.lang.Runnable#run() + */ + public void run() + { + try + { + // Construct a SAXParser and use this as a default handler + SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); + saxParser.parse(_file, this); + + // Check whether handler was properly instantiated + if (_handler == null) + { + // Wasn't either kml or gpx + JOptionPane.showMessageDialog(_parentFrame, + I18nManager.getText("error.load.unknownxml") + " " + _unknownType, + I18nManager.getText("error.load.dialogtitle"), JOptionPane.ERROR_MESSAGE); + } + else + { + // Pass information back to app + _app.informDataLoaded(_handler.getFieldArray(), _handler.getDataArray(), + Altitude.FORMAT_METRES, _file.getName()); + } + } + catch (Exception e) + { + // Show error dialog + JOptionPane.showMessageDialog(_parentFrame, + I18nManager.getText("error.load.othererror") + " " + e.getMessage(), + I18nManager.getText("error.load.dialogtitle"), JOptionPane.ERROR_MESSAGE); + } + } + + + /** + * Receive a tag + * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) + */ + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException + { + // Check for "kml" or "gpx" tags + if (_handler == null) + { + if (qName.equals("kml")) {_handler = new KmlHandler();} + else if (qName.equals("gpx")) {_handler = new GpxHandler();} + else if (_unknownType == null && qName != null && !qName.equals("")) + { + _unknownType = qName; + } + } + else + { + // Handler instantiated so pass tags on to it + _handler.startElement(uri, localName, qName, attributes); + } + super.startElement(uri, localName, qName, attributes); + } + + + /** + * Receive characters, either between or inside tags + * @see org.xml.sax.ContentHandler#characters(char[], int, int) + */ + public void characters(char[] ch, int start, int length) + throws SAXException + { + if (_handler != null) + { + // Handler instantiated so pass tags on to it + _handler.characters(ch, start, length); + } + super.characters(ch, start, length); + } + + + /** + * Receive end of element + * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) + */ + public void endElement(String uri, String localName, String qName) + throws SAXException + { + if (_handler != null) + { + // Handler instantiated so pass tags on to it + _handler.endElement(uri, localName, qName); + } + super.endElement(uri, localName, qName); + } +}