Changeset 4521 in josm for trunk/src


Ignore:
Timestamp:
2011-10-16T23:59:38+02:00 (13 years ago)
Author:
Don-vip
Message:

fix #6960 - Download GPX traces with Ctrl+L

Location:
trunk/src/org/openstreetmap/josm
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/OpenLocationAction.java

    r4310 r4521  
    99import java.awt.event.ActionEvent;
    1010import java.awt.event.KeyEvent;
     11import java.util.ArrayList;
    1112import java.util.Collections;
    1213import java.util.LinkedList;
     
    1617import javax.swing.JCheckBox;
    1718import javax.swing.JLabel;
     19import javax.swing.JOptionPane;
    1820import javax.swing.JPanel;
     21import javax.swing.SwingUtilities;
    1922
    2023import org.openstreetmap.josm.Main;
     24import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
    2125import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
     26import org.openstreetmap.josm.actions.downloadtasks.DownloadTask;
    2227import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
    2328import org.openstreetmap.josm.gui.ExtendedDialog;
     
    3338public class OpenLocationAction extends JosmAction {
    3439
     40    protected final List<Class<? extends DownloadTask>> downloadTasks;
     41   
    3542    /**
    3643     * Create an open action. The name is "Open a file".
     
    4148                Shortcut.registerShortcut("system:open_location", tr("File: {0}", tr("Open Location...")), KeyEvent.VK_L, Shortcut.GROUP_MENU), true);
    4249        putValue("help", ht("/Action/OpenLocation"));
     50        this.downloadTasks = new ArrayList<Class<? extends DownloadTask>>();
     51        addDownloadTaskClass(DownloadOsmTask.class);
     52        addDownloadTaskClass(DownloadGpsTask.class);
    4353    }
    4454
     
    104114
    105115    /**
    106      * Open the given file.
     116     * Open the given URL.
    107117     */
    108     public void openUrl(boolean new_layer, String url) {
    109         DownloadOsmTask task = new DownloadOsmTask();
     118    public void openUrl(boolean new_layer, final String url) {
    110119        PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor(tr("Download Data"));
    111         Future<?> future = task.loadUrl(new_layer, url, monitor);
    112         Main.worker.submit(new PostDownloadHandler(task, future));
     120        DownloadTask task = null;
     121        Future<?> future = null;
     122        for (int i = 0; future == null && i < downloadTasks.size(); i++) {
     123            Class<? extends DownloadTask> taskClass = downloadTasks.get(i);
     124            if (taskClass != null) {
     125                try {
     126                    task = taskClass.getConstructor().newInstance();
     127                    if (task.acceptsUrl(url)) {
     128                        future = task.loadUrl(new_layer, url, monitor);
     129                    }
     130                } catch (Exception e) {
     131                    e.printStackTrace();
     132                }
     133            }
     134        }
     135        if (future != null) {
     136            Main.worker.submit(new PostDownloadHandler(task, future));
     137        } else {
     138            SwingUtilities.invokeLater(new Runnable() {
     139                public void run() {
     140                    JOptionPane.showMessageDialog(Main.parent, tr(
     141                            "<html>Cannot open URL ''{0}'' because no suitable download task is available.</html>",
     142                            url), tr("Download Location"), JOptionPane.ERROR_MESSAGE);
     143                }
     144            });
     145        }
     146    }
     147   
     148    public boolean addDownloadTaskClass(Class<? extends DownloadTask> taskClass) {
     149        return this.downloadTasks.add(taskClass);
    113150    }
    114151}
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java

    r4334 r4521  
    99import org.openstreetmap.josm.Main;
    1010import org.openstreetmap.josm.data.Bounds;
     11import org.openstreetmap.josm.data.Bounds.ParseMethod;
    1112import org.openstreetmap.josm.data.gpx.GpxData;
    1213import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     
    1516import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    1617import org.openstreetmap.josm.io.BoundingBoxDownloader;
     18import org.openstreetmap.josm.io.OsmServerLocationReader;
     19import org.openstreetmap.josm.io.OsmServerReader;
    1720import org.openstreetmap.josm.io.OsmTransferException;
    1821import org.xml.sax.SAXException;
     
    2124
    2225    private DownloadTask downloadTask;
     26   
     27    private static final String PATTERN_TRACE_ID = "http://.*openstreetmap.org/trace/\\p{Digit}+/data";
     28   
     29    private static final String PATTERN_TRACKPOINTS_BBOX = "http://.*/api/0.6/trackpoints\\?bbox=.*,.*,.*,.*";
    2330
    2431    public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
     
    3037    }
    3138
    32     public Future<?> loadUrl(boolean a,java.lang.String b,  ProgressMonitor progressMonitor) {
     39    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
     40        if (url != null && url.matches(PATTERN_TRACE_ID)) {
     41            downloadTask = new DownloadTask(newLayer,
     42                    new OsmServerLocationReader(url), progressMonitor);
     43            // We need submit instead of execute so we can wait for it to finish and get the error
     44            // message if necessary. If no one calls getErrorMessage() it just behaves like execute.
     45            return Main.worker.submit(downloadTask);
     46           
     47        } else if (url != null && url.matches(PATTERN_TRACKPOINTS_BBOX)) {
     48            String[] table = url.split("\\?|=|&");
     49            for (int i = 0; i<table.length; i++) {
     50                if (table[i].equals("bbox") && i<table.length-1 ) {
     51                    return download(newLayer, new Bounds(table[i+1], ",", ParseMethod.LEFT_BOTTOM_RIGHT_TOP), progressMonitor);
     52                }
     53            }
     54        }
    3355        return null;
    34         // FIXME this is not currently used
     56    }
     57
     58    /* (non-Javadoc)
     59     * @see org.openstreetmap.josm.actions.downloadtasks.DownloadTask#acceptsUrl(java.lang.String)
     60     */
     61    @Override
     62    public boolean acceptsUrl(String url) {
     63        return url != null && (url.matches(PATTERN_TRACE_ID) || url.matches(PATTERN_TRACKPOINTS_BBOX));
    3564    }
    3665
     
    4271
    4372    class DownloadTask extends PleaseWaitRunnable {
    44         private BoundingBoxDownloader reader;
     73        private OsmServerReader reader;
    4574        private GpxData rawData;
    4675        private final boolean newLayer;
    4776
    48         public DownloadTask(boolean newLayer, BoundingBoxDownloader reader, ProgressMonitor progressMonitor) {
     77        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
    4978            super(tr("Downloading GPS data"));
    5079            this.reader = reader;
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java

    r4310 r4521  
    6464        return Main.worker.submit(downloadTask);
    6565    }
     66   
     67    /* (non-Javadoc)
     68     * @see org.openstreetmap.josm.actions.downloadtasks.DownloadTask#acceptsUrl(java.lang.String)
     69     */
     70    @Override
     71    public boolean acceptsUrl(String url) {
     72        return url != null && url.matches("http://.*/api/0.6/(map|nodes?|ways?|relations?).*");
     73    }
    6674
    6775    public void cancel() {
  • trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadTask.java

    r3083 r4521  
    6565     */
    6666    Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor);
     67   
     68    /**
     69     * Returns true if the task is able to open the given URL, false otherwise.
     70     * @param url the url to download from
     71     * @return True if the task is able to open the given URL, false otherwise.
     72     */
     73    boolean acceptsUrl(String url);
    6774
    6875    /**
  • trunk/src/org/openstreetmap/josm/data/Bounds.java

    r4423 r4521  
    3030        return new LatLon(maxLat, maxLon);
    3131    }
    32 
     32   
     33    public enum ParseMethod {
     34        MINLAT_MINLON_MAXLAT_MAXLON,
     35        LEFT_BOTTOM_RIGHT_TOP
     36    }
     37   
    3338    /**
    3439     * Construct bounds out of two points
     
    6065
    6166    public Bounds(String asString, String separator) throws IllegalArgumentException {
     67        this(asString, separator, ParseMethod.MINLAT_MINLON_MAXLAT_MAXLON);
     68    }
     69
     70    public Bounds(String asString, String separator, ParseMethod parseMethod) throws IllegalArgumentException {
    6271        CheckParameterUtil.ensureParameterNotNull(asString, "asString");
    6372        String[] components = asString.split(separator);
    6473        if (components.length != 4)
    65             throw new IllegalArgumentException(MessageFormat.format("Exactly four doubles excpected in string, got {0}: {1}", components.length, asString));
     74            throw new IllegalArgumentException(MessageFormat.format("Exactly four doubles expected in string, got {0}: {1}", components.length, asString));
    6675        double[] values = new double[4];
    6776        for (int i=0; i<4; i++) {
     
    7281            }
    7382        }
    74         if (!LatLon.isValidLat(values[0]))
    75             throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", values[0]));
    76         if (!LatLon.isValidLon(values[1]))
    77             throw new IllegalArgumentException(tr("Illegal longitude value ''{0}''", values[1]));
    78         if (!LatLon.isValidLat(values[2]))
    79             throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", values[2]));
    80         if (!LatLon.isValidLon(values[3]))
    81             throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", values[3]));
    82 
    83         this.minLat = LatLon.roundToOsmPrecision(values[0]);
    84         this.minLon = LatLon.roundToOsmPrecision(values[1]);
    85         this.maxLat = LatLon.roundToOsmPrecision(values[2]);
    86         this.maxLon = LatLon.roundToOsmPrecision(values[3]);
     83       
     84        int minLatIndex;
     85        int minLonIndex;
     86        int maxLatIndex;
     87        int maxLonIndex;
     88       
     89        switch (parseMethod) {
     90            case LEFT_BOTTOM_RIGHT_TOP:
     91                minLatIndex = 1;
     92                minLonIndex = 0;
     93                maxLatIndex = 3;
     94                maxLonIndex = 2;
     95                break;
     96            case MINLAT_MINLON_MAXLAT_MAXLON:
     97            default:
     98                minLatIndex = 0;
     99                minLonIndex = 1;
     100                maxLatIndex = 2;
     101                maxLonIndex = 3;
     102        }
     103       
     104        if (!LatLon.isValidLat(values[minLatIndex]))
     105            throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", values[minLatIndex]));
     106        if (!LatLon.isValidLon(values[minLonIndex]))
     107            throw new IllegalArgumentException(tr("Illegal longitude value ''{0}''", values[minLonIndex]));
     108        if (!LatLon.isValidLat(values[maxLatIndex]))
     109            throw new IllegalArgumentException(tr("Illegal latitude value ''{0}''", values[maxLatIndex]));
     110        if (!LatLon.isValidLon(values[maxLonIndex]))
     111            throw new IllegalArgumentException(tr("Illegal longitude value ''{0}''", values[maxLonIndex]));
     112
     113        this.minLat = LatLon.roundToOsmPrecision(values[minLatIndex]);
     114        this.minLon = LatLon.roundToOsmPrecision(values[minLonIndex]);
     115        this.maxLat = LatLon.roundToOsmPrecision(values[maxLatIndex]);
     116        this.maxLon = LatLon.roundToOsmPrecision(values[maxLonIndex]);
    87117    }
    88118
  • trunk/src/org/openstreetmap/josm/io/BoundingBoxDownloader.java

    r2795 r4521  
    3636     *      ways.
    3737     */
    38     public GpxData parseRawGps(ProgressMonitor progressMonitor) throws IOException, SAXException,OsmTransferException {
     38    @Override
     39    public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
    3940        progressMonitor.beginTask("", 1);
    4041        try {
     
    7071            if (cancel)
    7172                return null;
    72             throw new SAXException("Illegal characters within the HTTP-header response.", e);
     73            throw new OsmTransferException("Illegal characters within the HTTP-header response.", e);
    7374        } catch (IOException e) {
    7475            if (cancel)
    7576                return null;
    76             throw e;
     77            throw new OsmTransferException(e);
    7778        } catch (SAXException e) {
    78             throw e;
     79            throw new OsmTransferException(e);
    7980        } catch (OsmTransferException e) {
    8081            throw e;
  • trunk/src/org/openstreetmap/josm/io/OsmServerLocationReader.java

    r3083 r4521  
    66import java.io.InputStream;
    77
     8import org.openstreetmap.josm.data.gpx.GpxData;
    89import org.openstreetmap.josm.data.osm.DataSet;
    910import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    3940            progressMonitor.finishTask();
    4041            try {
     42                activeConnection = null;
    4143                if (in != null) {
    4244                    in.close();
    4345                }
    44                 activeConnection = null;
    4546            } catch(Exception e) {/* ignore it */}
    4647        }
    4748    }
    4849
     50    @Override
     51    public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
     52        InputStream in = null;
     53        progressMonitor.beginTask(tr("Contacting Server...", 10));
     54        try {
     55            in = getInputStreamRaw(url, progressMonitor.createSubTaskMonitor(1, true));
     56            if (in == null)
     57                return null;
     58            progressMonitor.subTask(tr("Downloading OSM data..."));
     59            GpxReader reader = new GpxReader(in);
     60            reader.parse(false);
     61            GpxData result = reader.data;
     62            result.fromServer = true;
     63            return result;
     64        } catch(OsmTransferException e) {
     65            throw e;
     66        } catch (Exception e) {
     67            if (cancel)
     68                return null;
     69            throw new OsmTransferException(e);
     70        } finally {
     71            progressMonitor.finishTask();
     72            try {
     73                activeConnection = null;
     74                if (in != null) {
     75                    in.close();
     76                }
     77            } catch(Exception e) {/* ignore it */}
     78        }
     79    }
    4980}
  • trunk/src/org/openstreetmap/josm/io/OsmServerReader.java

    r4310 r4521  
    1616
    1717import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.data.gpx.GpxData;
    1819import org.openstreetmap.josm.data.osm.DataSet;
    1920import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    141142    public abstract DataSet parseOsm(ProgressMonitor progressMonitor) throws OsmTransferException;
    142143
     144    public GpxData parseRawGps(ProgressMonitor progressMonitor) throws OsmTransferException {
     145        return null;
     146    }
     147   
    143148    /**
    144149     * Returns true if this reader is adding authentication credentials to the read
Note: See TracChangeset for help on using the changeset viewer.