Changeset 4521 in josm


Ignore:
Timestamp:
Oct 16, 2011 11:59:38 PM (19 months 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.