--- /dev/null
+package tim.prune.load.xml;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import tim.prune.App;
+import tim.prune.data.SourceInfo;
+import tim.prune.load.MediaLinkInfo;
+
+/**
+ * Class to handle the loading of zipped xml files
+ */
+public class ZipFileLoader
+{
+ /** App for callback of file loading */
+ private App _app = null;
+ /** Object to do the handling of the xml */
+ private XmlFileLoader _xmlLoader = null;
+
+ /**
+ * Constructor
+ * @param inApp App object
+ * @param inXmlLoader object to do the xml handling
+ */
+ public ZipFileLoader(App inApp, XmlFileLoader inXmlLoader)
+ {
+ _app = inApp;
+ _xmlLoader = inXmlLoader;
+ }
+
+ /**
+ * Open the selected file and select appropriate xml loader
+ * @param inFile File to open
+ */
+ public void openFile(File inFile)
+ {
+ try
+ {
+ ZipFile file = new ZipFile(inFile);
+ Enumeration<?> entries = file.entries();
+ boolean xmlFound = false;
+ while (entries.hasMoreElements() && !xmlFound)
+ {
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+ String entryName = entry.toString();
+ if (entryName != null && entryName.length() > 4)
+ {
+ String suffix = entryName.substring(entryName.length()-4).toLowerCase();
+ if (suffix.equals(".kml") || suffix.equals(".gpx") || suffix.equals(".xml"))
+ {
+ _xmlLoader.reset();
+ // Parse the stream using either Xerces or java classes
+ _xmlLoader.parseXmlStream(file.getInputStream(entry));
+ XmlHandler handler = _xmlLoader.getHandler();
+ if (handler == null) {
+ _app.showErrorMessage("error.load.dialogtitle", "error.load.othererror");
+ }
+ else
+ {
+ // Send back to app
+ SourceInfo sourceInfo = new SourceInfo(inFile,
+ (handler instanceof GpxHandler?SourceInfo.FILE_TYPE.GPX:SourceInfo.FILE_TYPE.KML));
+ _app.informDataLoaded(handler.getFieldArray(), handler.getDataArray(),
+ null, sourceInfo, handler.getTrackNameList(),
+ new MediaLinkInfo(inFile, handler.getLinkArray()));
+ xmlFound = true;
+ }
+ }
+ }
+ }
+ file.close();
+ // Check whether there was an xml file inside
+ if (!xmlFound) {
+ _app.showErrorMessage("error.load.dialogtitle", "error.load.noxmlinzip");
+ }
+ }
+ catch (Exception e) {
+ _app.showErrorMessageNoLookup("error.load.dialogtitle", e.getClass().getName() + "\n - " + e.getMessage());
+ }
+ }
+
+ /**
+ * Use the given stream to access a remote zip file
+ * @param inStream stream to use to access file
+ */
+ public void openStream(InputStream inStream)
+ {
+ try
+ {
+ ZipInputStream zis = new ZipInputStream(inStream);
+ boolean xmlFound = false;
+ while (!xmlFound && zis.available() > 0)
+ {
+ ZipEntry entry = zis.getNextEntry();
+ String entryName = entry.toString();
+ if (entryName != null && entryName.length() > 4)
+ {
+ String suffix = entryName.substring(entryName.length()-4).toLowerCase();
+ if (suffix.equals(".kml") || suffix.equals(".gpx") || suffix.equals(".xml"))
+ {
+ _xmlLoader.reset();
+ SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
+ saxParser.parse(zis, _xmlLoader);
+ XmlHandler handler = _xmlLoader.getHandler();
+ if (handler == null) {
+ _app.showErrorMessage("error.load.dialogtitle", "error.load.othererror");
+ }
+ else
+ {
+ // Send back to app
+ _app.informDataLoaded(handler.getFieldArray(), handler.getDataArray(),
+ new SourceInfo("gpsies", SourceInfo.FILE_TYPE.GPSIES),
+ handler.getTrackNameList());
+ xmlFound = true;
+ }
+ }
+ }
+ }
+ // Check whether there was an xml file inside
+ if (!xmlFound) {
+ _app.showErrorMessage("error.load.dialogtitle", "error.load.noxmlinzip");
+ }
+ }
+ catch (Exception e) {
+ System.err.println("ZipStream Error: " + e.getClass().getName() + " -message= " + e.getMessage());
+ }
+ }
+}