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()); } } }