package org.openstreetmap.josm.plugins.directdownload;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.io.OsmApi;
import org.openstreetmap.josm.io.OsmConnection;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.tools.HttpClient;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.swing.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import static org.openstreetmap.josm.tools.I18n.tr;
public class UserTrackReader extends OsmConnection {
public List<UserTrack> getTrackList() {
final String urlString = OsmApi.getOsmApi().getBaseUrl() + "user/gpx_files";
try {
final HttpClient client = HttpClient.create(new URL(urlString));
addAuth(client);
SAXParserFactory spf = SAXParserFactory.newInstance();
TrackListHandler handler = new TrackListHandler();
//get a new instance of parser
SAXParser sp = spf.newSAXParser();
//parse the file and also register this class for call backs
try (final InputStream in = client.connect().getContent()) {
sp.parse(in, handler);
}
return handler.getResult();
} catch (java.net.MalformedURLException e) {
Main.error(e);
JOptionPane.showMessageDialog(null, tr("Invalid URL {0}", urlString));
} catch (java.io.IOException | OsmTransferException e) {
Main.error(e);
JOptionPane.showMessageDialog(null, tr("Error fetching URL {0}", urlString));
} catch (SAXException | ParserConfigurationException e) {
Main.error(e);
JOptionPane.showMessageDialog(null, tr("Error parsing data from URL {0}", urlString));
}
return new LinkedList<>();
}
private static class TrackListHandler extends DefaultHandler {
private LinkedList<UserTrack> data = new LinkedList<>();
private String cdata = "";
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
if (qName.equals("gpx_file")) {
UserTrack track = new UserTrack();
track.id = atts.getValue("id");
track.filename = atts.getValue("name");
track.datetime = atts.getValue("timestamp").replaceAll("[TZ]", " "); // TODO: do real parsing and time zone conversion
data.addFirst(track);
}
cdata = "";
}
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
cdata += new String(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("description")) {
data.getFirst().description = cdata;
}
/*
else if (qName.equals("tag")) {
data.getFirst().tags = cdata;
cdata = new String();
}
*/
}
public List<UserTrack> getResult() {
return data;
}
}
}