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