1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
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());
}
}
}
|